mostlyright 1.1.3 → 1.4.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/README.md +19 -3
- package/dist/{chunk-IN2UOZYO.mjs → chunk-7XWX6QZG.mjs} +619 -175
- package/dist/chunk-7XWX6QZG.mjs.map +1 -0
- package/dist/{chunk-465FJZTS.mjs → chunk-TT6J2BKH.mjs} +2 -2
- package/dist/{chunk-465FJZTS.mjs.map → chunk-TT6J2BKH.mjs.map} +1 -1
- package/dist/{iem-asos-ZPUMH3KM.mjs → iem-asos-OLJNQPEM.mjs} +3 -3
- package/dist/index.bundle.mjs +2758 -227
- package/dist/index.bundle.mjs.map +1 -1
- package/dist/index.cjs +90 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +60 -3
- package/dist/index.d.ts +60 -3
- package/dist/index.global.js +3444 -448
- package/dist/index.global.js.map +1 -1
- package/dist/index.mjs +91 -13
- package/dist/index.mjs.map +1 -1
- package/dist/{src-NP2MZ322.mjs → src-JXVFCGSQ.mjs} +18 -4
- package/package.json +27 -5
- package/dist/chunk-IN2UOZYO.mjs.map +0 -1
- /package/dist/{iem-asos-ZPUMH3KM.mjs.map → iem-asos-OLJNQPEM.mjs.map} +0 -0
- /package/dist/{src-NP2MZ322.mjs.map → src-JXVFCGSQ.mjs.map} +0 -0
package/dist/index.global.js
CHANGED
|
@@ -35,6 +35,13 @@ var mostlyright = (() => {
|
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
37
|
|
|
38
|
+
// ../core/src/schemas/generated/forecast.station.v1.ts
|
|
39
|
+
var init_forecast_station_v1 = __esm({
|
|
40
|
+
"../core/src/schemas/generated/forecast.station.v1.ts"() {
|
|
41
|
+
"use strict";
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
38
45
|
// ../core/src/schemas/generated/settlement.cli.v1.ts
|
|
39
46
|
var init_settlement_cli_v1 = __esm({
|
|
40
47
|
"../core/src/schemas/generated/settlement.cli.v1.ts"() {
|
|
@@ -62,6 +69,7 @@ var mostlyright = (() => {
|
|
|
62
69
|
"use strict";
|
|
63
70
|
init_observation_v1();
|
|
64
71
|
init_forecast_iem_mos_v1();
|
|
72
|
+
init_forecast_station_v1();
|
|
65
73
|
init_settlement_cli_v1();
|
|
66
74
|
init_observation_ledger_v1();
|
|
67
75
|
init_observation_qc_v1();
|
|
@@ -82,7 +90,10 @@ var mostlyright = (() => {
|
|
|
82
90
|
latitude: 52.3667,
|
|
83
91
|
longitude: 13.5033,
|
|
84
92
|
name: "Berlin Brandenburg",
|
|
85
|
-
tz: "Europe/Berlin"
|
|
93
|
+
tz: "Europe/Berlin",
|
|
94
|
+
venues: [
|
|
95
|
+
"polymarket"
|
|
96
|
+
]
|
|
86
97
|
},
|
|
87
98
|
{
|
|
88
99
|
code: "EDDF",
|
|
@@ -92,7 +103,10 @@ var mostlyright = (() => {
|
|
|
92
103
|
latitude: 50.0379,
|
|
93
104
|
longitude: 8.5622,
|
|
94
105
|
name: "Frankfurt am Main",
|
|
95
|
-
tz: "Europe/Berlin"
|
|
106
|
+
tz: "Europe/Berlin",
|
|
107
|
+
venues: [
|
|
108
|
+
"polymarket"
|
|
109
|
+
]
|
|
96
110
|
},
|
|
97
111
|
{
|
|
98
112
|
code: "EDDM",
|
|
@@ -102,7 +116,10 @@ var mostlyright = (() => {
|
|
|
102
116
|
latitude: 48.3538,
|
|
103
117
|
longitude: 11.7861,
|
|
104
118
|
name: "Munich Franz Josef Strauss",
|
|
105
|
-
tz: "Europe/Berlin"
|
|
119
|
+
tz: "Europe/Berlin",
|
|
120
|
+
venues: [
|
|
121
|
+
"polymarket"
|
|
122
|
+
]
|
|
106
123
|
},
|
|
107
124
|
{
|
|
108
125
|
code: "EFHK",
|
|
@@ -112,7 +129,10 @@ var mostlyright = (() => {
|
|
|
112
129
|
latitude: 60.3172,
|
|
113
130
|
longitude: 24.9633,
|
|
114
131
|
name: "Helsinki-Vantaa",
|
|
115
|
-
tz: "Europe/Helsinki"
|
|
132
|
+
tz: "Europe/Helsinki",
|
|
133
|
+
venues: [
|
|
134
|
+
"polymarket"
|
|
135
|
+
]
|
|
116
136
|
},
|
|
117
137
|
{
|
|
118
138
|
code: "EGKK",
|
|
@@ -122,7 +142,10 @@ var mostlyright = (() => {
|
|
|
122
142
|
latitude: 51.1481,
|
|
123
143
|
longitude: -0.1903,
|
|
124
144
|
name: "London Gatwick",
|
|
125
|
-
tz: "Europe/London"
|
|
145
|
+
tz: "Europe/London",
|
|
146
|
+
venues: [
|
|
147
|
+
"polymarket"
|
|
148
|
+
]
|
|
126
149
|
},
|
|
127
150
|
{
|
|
128
151
|
code: "EGLL",
|
|
@@ -132,7 +155,10 @@ var mostlyright = (() => {
|
|
|
132
155
|
latitude: 51.4706,
|
|
133
156
|
longitude: -0.4619,
|
|
134
157
|
name: "London Heathrow",
|
|
135
|
-
tz: "Europe/London"
|
|
158
|
+
tz: "Europe/London",
|
|
159
|
+
venues: [
|
|
160
|
+
"polymarket"
|
|
161
|
+
]
|
|
136
162
|
},
|
|
137
163
|
{
|
|
138
164
|
code: "EHAM",
|
|
@@ -142,7 +168,10 @@ var mostlyright = (() => {
|
|
|
142
168
|
latitude: 52.3086,
|
|
143
169
|
longitude: 4.7639,
|
|
144
170
|
name: "Amsterdam Schiphol",
|
|
145
|
-
tz: "Europe/Amsterdam"
|
|
171
|
+
tz: "Europe/Amsterdam",
|
|
172
|
+
venues: [
|
|
173
|
+
"polymarket"
|
|
174
|
+
]
|
|
146
175
|
},
|
|
147
176
|
{
|
|
148
177
|
code: "EKCH",
|
|
@@ -152,7 +181,10 @@ var mostlyright = (() => {
|
|
|
152
181
|
latitude: 55.6181,
|
|
153
182
|
longitude: 12.6561,
|
|
154
183
|
name: "Copenhagen Kastrup",
|
|
155
|
-
tz: "Europe/Copenhagen"
|
|
184
|
+
tz: "Europe/Copenhagen",
|
|
185
|
+
venues: [
|
|
186
|
+
"polymarket"
|
|
187
|
+
]
|
|
156
188
|
},
|
|
157
189
|
{
|
|
158
190
|
code: "EPWA",
|
|
@@ -162,7 +194,10 @@ var mostlyright = (() => {
|
|
|
162
194
|
latitude: 52.1657,
|
|
163
195
|
longitude: 20.9671,
|
|
164
196
|
name: "Warsaw Chopin",
|
|
165
|
-
tz: "Europe/Warsaw"
|
|
197
|
+
tz: "Europe/Warsaw",
|
|
198
|
+
venues: [
|
|
199
|
+
"polymarket"
|
|
200
|
+
]
|
|
166
201
|
},
|
|
167
202
|
{
|
|
168
203
|
code: "ESSA",
|
|
@@ -172,7 +207,10 @@ var mostlyright = (() => {
|
|
|
172
207
|
latitude: 59.6519,
|
|
173
208
|
longitude: 17.9186,
|
|
174
209
|
name: "Stockholm Arlanda",
|
|
175
|
-
tz: "Europe/Stockholm"
|
|
210
|
+
tz: "Europe/Stockholm",
|
|
211
|
+
venues: [
|
|
212
|
+
"polymarket"
|
|
213
|
+
]
|
|
176
214
|
},
|
|
177
215
|
{
|
|
178
216
|
code: "ATL",
|
|
@@ -182,7 +220,11 @@ var mostlyright = (() => {
|
|
|
182
220
|
latitude: 33.6407,
|
|
183
221
|
longitude: -84.4277,
|
|
184
222
|
name: "Hartsfield-Jackson Atlanta International",
|
|
185
|
-
tz: "America/New_York"
|
|
223
|
+
tz: "America/New_York",
|
|
224
|
+
venues: [
|
|
225
|
+
"kalshi",
|
|
226
|
+
"polymarket"
|
|
227
|
+
]
|
|
186
228
|
},
|
|
187
229
|
{
|
|
188
230
|
code: "AUS",
|
|
@@ -192,7 +234,24 @@ var mostlyright = (() => {
|
|
|
192
234
|
latitude: 30.1975,
|
|
193
235
|
longitude: -97.6664,
|
|
194
236
|
name: "Austin-Bergstrom International",
|
|
195
|
-
tz: "America/Chicago"
|
|
237
|
+
tz: "America/Chicago",
|
|
238
|
+
venues: [
|
|
239
|
+
"kalshi",
|
|
240
|
+
"polymarket"
|
|
241
|
+
]
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
code: "BNA",
|
|
245
|
+
country: "US",
|
|
246
|
+
ghcnh_id: "USW00013897",
|
|
247
|
+
icao: "KBNA",
|
|
248
|
+
latitude: 36.1245,
|
|
249
|
+
longitude: -86.6782,
|
|
250
|
+
name: "Nashville International",
|
|
251
|
+
tz: "America/Chicago",
|
|
252
|
+
venues: [
|
|
253
|
+
"kalshi"
|
|
254
|
+
]
|
|
196
255
|
},
|
|
197
256
|
{
|
|
198
257
|
code: "BOS",
|
|
@@ -202,7 +261,24 @@ var mostlyright = (() => {
|
|
|
202
261
|
latitude: 42.3656,
|
|
203
262
|
longitude: -71.0096,
|
|
204
263
|
name: "Boston Logan International",
|
|
205
|
-
tz: "America/New_York"
|
|
264
|
+
tz: "America/New_York",
|
|
265
|
+
venues: [
|
|
266
|
+
"kalshi",
|
|
267
|
+
"polymarket"
|
|
268
|
+
]
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
code: "CVG",
|
|
272
|
+
country: "US",
|
|
273
|
+
ghcnh_id: "USW00093814",
|
|
274
|
+
icao: "KCVG",
|
|
275
|
+
latitude: 39.0488,
|
|
276
|
+
longitude: -84.6678,
|
|
277
|
+
name: "Cincinnati/Northern Kentucky International",
|
|
278
|
+
tz: "America/New_York",
|
|
279
|
+
venues: [
|
|
280
|
+
"kalshi"
|
|
281
|
+
]
|
|
206
282
|
},
|
|
207
283
|
{
|
|
208
284
|
code: "DCA",
|
|
@@ -212,7 +288,11 @@ var mostlyright = (() => {
|
|
|
212
288
|
latitude: 38.8512,
|
|
213
289
|
longitude: -77.0402,
|
|
214
290
|
name: "Washington Reagan National",
|
|
215
|
-
tz: "America/New_York"
|
|
291
|
+
tz: "America/New_York",
|
|
292
|
+
venues: [
|
|
293
|
+
"kalshi",
|
|
294
|
+
"polymarket"
|
|
295
|
+
]
|
|
216
296
|
},
|
|
217
297
|
{
|
|
218
298
|
code: "DEN",
|
|
@@ -222,7 +302,11 @@ var mostlyright = (() => {
|
|
|
222
302
|
latitude: 39.8561,
|
|
223
303
|
longitude: -104.6737,
|
|
224
304
|
name: "Denver International",
|
|
225
|
-
tz: "America/Denver"
|
|
305
|
+
tz: "America/Denver",
|
|
306
|
+
venues: [
|
|
307
|
+
"kalshi",
|
|
308
|
+
"polymarket"
|
|
309
|
+
]
|
|
226
310
|
},
|
|
227
311
|
{
|
|
228
312
|
code: "DFW",
|
|
@@ -232,7 +316,25 @@ var mostlyright = (() => {
|
|
|
232
316
|
latitude: 32.8998,
|
|
233
317
|
longitude: -97.0403,
|
|
234
318
|
name: "Dallas-Fort Worth International",
|
|
235
|
-
tz: "America/Chicago"
|
|
319
|
+
tz: "America/Chicago",
|
|
320
|
+
venues: [
|
|
321
|
+
"kalshi",
|
|
322
|
+
"polymarket"
|
|
323
|
+
]
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
code: "DTW",
|
|
327
|
+
country: "US",
|
|
328
|
+
ghcnh_id: "USW00094847",
|
|
329
|
+
icao: "KDTW",
|
|
330
|
+
latitude: 42.2124,
|
|
331
|
+
longitude: -83.3534,
|
|
332
|
+
name: "Detroit Metropolitan Wayne County",
|
|
333
|
+
tz: "America/New_York",
|
|
334
|
+
venues: [
|
|
335
|
+
"kalshi",
|
|
336
|
+
"polymarket"
|
|
337
|
+
]
|
|
236
338
|
},
|
|
237
339
|
{
|
|
238
340
|
code: "HOU",
|
|
@@ -242,7 +344,22 @@ var mostlyright = (() => {
|
|
|
242
344
|
latitude: 29.6454,
|
|
243
345
|
longitude: -95.2789,
|
|
244
346
|
name: "Houston Hobby",
|
|
245
|
-
tz: "America/Chicago"
|
|
347
|
+
tz: "America/Chicago",
|
|
348
|
+
venues: []
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
code: "IAH",
|
|
352
|
+
country: "US",
|
|
353
|
+
ghcnh_id: "USW00012960",
|
|
354
|
+
icao: "KIAH",
|
|
355
|
+
latitude: 29.9844,
|
|
356
|
+
longitude: -95.3414,
|
|
357
|
+
name: "Houston George Bush Intercontinental",
|
|
358
|
+
tz: "America/Chicago",
|
|
359
|
+
venues: [
|
|
360
|
+
"kalshi",
|
|
361
|
+
"polymarket"
|
|
362
|
+
]
|
|
246
363
|
},
|
|
247
364
|
{
|
|
248
365
|
code: "LAS",
|
|
@@ -252,7 +369,10 @@ var mostlyright = (() => {
|
|
|
252
369
|
latitude: 36.084,
|
|
253
370
|
longitude: -115.1537,
|
|
254
371
|
name: "Harry Reid (McCarran) International",
|
|
255
|
-
tz: "America/Los_Angeles"
|
|
372
|
+
tz: "America/Los_Angeles",
|
|
373
|
+
venues: [
|
|
374
|
+
"kalshi"
|
|
375
|
+
]
|
|
256
376
|
},
|
|
257
377
|
{
|
|
258
378
|
code: "LAX",
|
|
@@ -262,7 +382,11 @@ var mostlyright = (() => {
|
|
|
262
382
|
latitude: 33.9425,
|
|
263
383
|
longitude: -118.4081,
|
|
264
384
|
name: "Los Angeles International",
|
|
265
|
-
tz: "America/Los_Angeles"
|
|
385
|
+
tz: "America/Los_Angeles",
|
|
386
|
+
venues: [
|
|
387
|
+
"kalshi",
|
|
388
|
+
"polymarket"
|
|
389
|
+
]
|
|
266
390
|
},
|
|
267
391
|
{
|
|
268
392
|
code: "MDW",
|
|
@@ -272,7 +396,10 @@ var mostlyright = (() => {
|
|
|
272
396
|
latitude: 41.7868,
|
|
273
397
|
longitude: -87.7522,
|
|
274
398
|
name: "Chicago Midway International",
|
|
275
|
-
tz: "America/Chicago"
|
|
399
|
+
tz: "America/Chicago",
|
|
400
|
+
venues: [
|
|
401
|
+
"kalshi"
|
|
402
|
+
]
|
|
276
403
|
},
|
|
277
404
|
{
|
|
278
405
|
code: "MIA",
|
|
@@ -282,7 +409,11 @@ var mostlyright = (() => {
|
|
|
282
409
|
latitude: 25.7959,
|
|
283
410
|
longitude: -80.287,
|
|
284
411
|
name: "Miami International",
|
|
285
|
-
tz: "America/New_York"
|
|
412
|
+
tz: "America/New_York",
|
|
413
|
+
venues: [
|
|
414
|
+
"kalshi",
|
|
415
|
+
"polymarket"
|
|
416
|
+
]
|
|
286
417
|
},
|
|
287
418
|
{
|
|
288
419
|
code: "MSP",
|
|
@@ -292,7 +423,11 @@ var mostlyright = (() => {
|
|
|
292
423
|
latitude: 44.8848,
|
|
293
424
|
longitude: -93.2223,
|
|
294
425
|
name: "Minneapolis-St Paul International",
|
|
295
|
-
tz: "America/Chicago"
|
|
426
|
+
tz: "America/Chicago",
|
|
427
|
+
venues: [
|
|
428
|
+
"kalshi",
|
|
429
|
+
"polymarket"
|
|
430
|
+
]
|
|
296
431
|
},
|
|
297
432
|
{
|
|
298
433
|
code: "MSY",
|
|
@@ -302,7 +437,8 @@ var mostlyright = (() => {
|
|
|
302
437
|
latitude: 29.9934,
|
|
303
438
|
longitude: -90.258,
|
|
304
439
|
name: "New Orleans Louis Armstrong International",
|
|
305
|
-
tz: "America/Chicago"
|
|
440
|
+
tz: "America/Chicago",
|
|
441
|
+
venues: []
|
|
306
442
|
},
|
|
307
443
|
{
|
|
308
444
|
code: "NYC",
|
|
@@ -312,7 +448,10 @@ var mostlyright = (() => {
|
|
|
312
448
|
latitude: 40.7789,
|
|
313
449
|
longitude: -73.9692,
|
|
314
450
|
name: "Central Park, New York",
|
|
315
|
-
tz: "America/New_York"
|
|
451
|
+
tz: "America/New_York",
|
|
452
|
+
venues: [
|
|
453
|
+
"kalshi"
|
|
454
|
+
]
|
|
316
455
|
},
|
|
317
456
|
{
|
|
318
457
|
code: "OKC",
|
|
@@ -322,7 +461,8 @@ var mostlyright = (() => {
|
|
|
322
461
|
latitude: 35.3931,
|
|
323
462
|
longitude: -97.6007,
|
|
324
463
|
name: "Oklahoma City Will Rogers World",
|
|
325
|
-
tz: "America/Chicago"
|
|
464
|
+
tz: "America/Chicago",
|
|
465
|
+
venues: []
|
|
326
466
|
},
|
|
327
467
|
{
|
|
328
468
|
code: "PHL",
|
|
@@ -332,7 +472,11 @@ var mostlyright = (() => {
|
|
|
332
472
|
latitude: 39.8721,
|
|
333
473
|
longitude: -75.2411,
|
|
334
474
|
name: "Philadelphia International",
|
|
335
|
-
tz: "America/New_York"
|
|
475
|
+
tz: "America/New_York",
|
|
476
|
+
venues: [
|
|
477
|
+
"kalshi",
|
|
478
|
+
"polymarket"
|
|
479
|
+
]
|
|
336
480
|
},
|
|
337
481
|
{
|
|
338
482
|
code: "PHX",
|
|
@@ -342,7 +486,11 @@ var mostlyright = (() => {
|
|
|
342
486
|
latitude: 33.4373,
|
|
343
487
|
longitude: -112.0078,
|
|
344
488
|
name: "Phoenix Sky Harbor International",
|
|
345
|
-
tz: "America/Phoenix"
|
|
489
|
+
tz: "America/Phoenix",
|
|
490
|
+
venues: [
|
|
491
|
+
"kalshi",
|
|
492
|
+
"polymarket"
|
|
493
|
+
]
|
|
346
494
|
},
|
|
347
495
|
{
|
|
348
496
|
code: "SAT",
|
|
@@ -352,7 +500,8 @@ var mostlyright = (() => {
|
|
|
352
500
|
latitude: 29.5337,
|
|
353
501
|
longitude: -98.4698,
|
|
354
502
|
name: "San Antonio International",
|
|
355
|
-
tz: "America/Chicago"
|
|
503
|
+
tz: "America/Chicago",
|
|
504
|
+
venues: []
|
|
356
505
|
},
|
|
357
506
|
{
|
|
358
507
|
code: "SEA",
|
|
@@ -362,7 +511,11 @@ var mostlyright = (() => {
|
|
|
362
511
|
latitude: 47.4502,
|
|
363
512
|
longitude: -122.3088,
|
|
364
513
|
name: "Seattle-Tacoma International",
|
|
365
|
-
tz: "America/Los_Angeles"
|
|
514
|
+
tz: "America/Los_Angeles",
|
|
515
|
+
venues: [
|
|
516
|
+
"kalshi",
|
|
517
|
+
"polymarket"
|
|
518
|
+
]
|
|
366
519
|
},
|
|
367
520
|
{
|
|
368
521
|
code: "SFO",
|
|
@@ -372,7 +525,24 @@ var mostlyright = (() => {
|
|
|
372
525
|
latitude: 37.6213,
|
|
373
526
|
longitude: -122.379,
|
|
374
527
|
name: "San Francisco International",
|
|
375
|
-
tz: "America/Los_Angeles"
|
|
528
|
+
tz: "America/Los_Angeles",
|
|
529
|
+
venues: [
|
|
530
|
+
"kalshi",
|
|
531
|
+
"polymarket"
|
|
532
|
+
]
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
code: "SLC",
|
|
536
|
+
country: "US",
|
|
537
|
+
ghcnh_id: "USW00024127",
|
|
538
|
+
icao: "KSLC",
|
|
539
|
+
latitude: 40.7884,
|
|
540
|
+
longitude: -111.9778,
|
|
541
|
+
name: "Salt Lake City International",
|
|
542
|
+
tz: "America/Denver",
|
|
543
|
+
venues: [
|
|
544
|
+
"kalshi"
|
|
545
|
+
]
|
|
376
546
|
},
|
|
377
547
|
{
|
|
378
548
|
code: "LEBL",
|
|
@@ -382,7 +552,10 @@ var mostlyright = (() => {
|
|
|
382
552
|
latitude: 41.2974,
|
|
383
553
|
longitude: 2.0833,
|
|
384
554
|
name: "Barcelona El Prat",
|
|
385
|
-
tz: "Europe/Madrid"
|
|
555
|
+
tz: "Europe/Madrid",
|
|
556
|
+
venues: [
|
|
557
|
+
"polymarket"
|
|
558
|
+
]
|
|
386
559
|
},
|
|
387
560
|
{
|
|
388
561
|
code: "LEMD",
|
|
@@ -392,7 +565,10 @@ var mostlyright = (() => {
|
|
|
392
565
|
latitude: 40.4719,
|
|
393
566
|
longitude: -3.5626,
|
|
394
567
|
name: "Madrid Barajas",
|
|
395
|
-
tz: "Europe/Madrid"
|
|
568
|
+
tz: "Europe/Madrid",
|
|
569
|
+
venues: [
|
|
570
|
+
"polymarket"
|
|
571
|
+
]
|
|
396
572
|
},
|
|
397
573
|
{
|
|
398
574
|
code: "LFPB",
|
|
@@ -402,7 +578,10 @@ var mostlyright = (() => {
|
|
|
402
578
|
latitude: 48.9694,
|
|
403
579
|
longitude: 2.4414,
|
|
404
580
|
name: "Paris Le Bourget",
|
|
405
|
-
tz: "Europe/Paris"
|
|
581
|
+
tz: "Europe/Paris",
|
|
582
|
+
venues: [
|
|
583
|
+
"polymarket"
|
|
584
|
+
]
|
|
406
585
|
},
|
|
407
586
|
{
|
|
408
587
|
code: "LFPG",
|
|
@@ -412,7 +591,10 @@ var mostlyright = (() => {
|
|
|
412
591
|
latitude: 49.0097,
|
|
413
592
|
longitude: 2.5479,
|
|
414
593
|
name: "Paris Charles de Gaulle",
|
|
415
|
-
tz: "Europe/Paris"
|
|
594
|
+
tz: "Europe/Paris",
|
|
595
|
+
venues: [
|
|
596
|
+
"polymarket"
|
|
597
|
+
]
|
|
416
598
|
},
|
|
417
599
|
{
|
|
418
600
|
code: "LFPO",
|
|
@@ -422,7 +604,10 @@ var mostlyright = (() => {
|
|
|
422
604
|
latitude: 48.7233,
|
|
423
605
|
longitude: 2.3794,
|
|
424
606
|
name: "Paris Orly",
|
|
425
|
-
tz: "Europe/Paris"
|
|
607
|
+
tz: "Europe/Paris",
|
|
608
|
+
venues: [
|
|
609
|
+
"polymarket"
|
|
610
|
+
]
|
|
426
611
|
},
|
|
427
612
|
{
|
|
428
613
|
code: "LIMC",
|
|
@@ -432,7 +617,10 @@ var mostlyright = (() => {
|
|
|
432
617
|
latitude: 45.6306,
|
|
433
618
|
longitude: 8.7281,
|
|
434
619
|
name: "Milan Malpensa",
|
|
435
|
-
tz: "Europe/Rome"
|
|
620
|
+
tz: "Europe/Rome",
|
|
621
|
+
venues: [
|
|
622
|
+
"polymarket"
|
|
623
|
+
]
|
|
436
624
|
},
|
|
437
625
|
{
|
|
438
626
|
code: "LIRF",
|
|
@@ -442,7 +630,10 @@ var mostlyright = (() => {
|
|
|
442
630
|
latitude: 41.8003,
|
|
443
631
|
longitude: 12.2389,
|
|
444
632
|
name: "Rome Fiumicino",
|
|
445
|
-
tz: "Europe/Rome"
|
|
633
|
+
tz: "Europe/Rome",
|
|
634
|
+
venues: [
|
|
635
|
+
"polymarket"
|
|
636
|
+
]
|
|
446
637
|
},
|
|
447
638
|
{
|
|
448
639
|
code: "LOWW",
|
|
@@ -452,7 +643,10 @@ var mostlyright = (() => {
|
|
|
452
643
|
latitude: 48.1103,
|
|
453
644
|
longitude: 16.5697,
|
|
454
645
|
name: "Vienna International",
|
|
455
|
-
tz: "Europe/Vienna"
|
|
646
|
+
tz: "Europe/Vienna",
|
|
647
|
+
venues: [
|
|
648
|
+
"polymarket"
|
|
649
|
+
]
|
|
456
650
|
},
|
|
457
651
|
{
|
|
458
652
|
code: "LSZH",
|
|
@@ -462,7 +656,10 @@ var mostlyright = (() => {
|
|
|
462
656
|
latitude: 47.4647,
|
|
463
657
|
longitude: 8.5492,
|
|
464
658
|
name: "Zurich",
|
|
465
|
-
tz: "Europe/Zurich"
|
|
659
|
+
tz: "Europe/Zurich",
|
|
660
|
+
venues: [
|
|
661
|
+
"polymarket"
|
|
662
|
+
]
|
|
466
663
|
},
|
|
467
664
|
{
|
|
468
665
|
code: "NZAA",
|
|
@@ -472,7 +669,10 @@ var mostlyright = (() => {
|
|
|
472
669
|
latitude: -37.0081,
|
|
473
670
|
longitude: 174.7917,
|
|
474
671
|
name: "Auckland",
|
|
475
|
-
tz: "Pacific/Auckland"
|
|
672
|
+
tz: "Pacific/Auckland",
|
|
673
|
+
venues: [
|
|
674
|
+
"polymarket"
|
|
675
|
+
]
|
|
476
676
|
},
|
|
477
677
|
{
|
|
478
678
|
code: "NZWN",
|
|
@@ -482,7 +682,10 @@ var mostlyright = (() => {
|
|
|
482
682
|
latitude: -41.3272,
|
|
483
683
|
longitude: 174.8053,
|
|
484
684
|
name: "Wellington",
|
|
485
|
-
tz: "Pacific/Auckland"
|
|
685
|
+
tz: "Pacific/Auckland",
|
|
686
|
+
venues: [
|
|
687
|
+
"polymarket"
|
|
688
|
+
]
|
|
486
689
|
},
|
|
487
690
|
{
|
|
488
691
|
code: "OERK",
|
|
@@ -492,7 +695,10 @@ var mostlyright = (() => {
|
|
|
492
695
|
latitude: 24.9576,
|
|
493
696
|
longitude: 46.6988,
|
|
494
697
|
name: "Riyadh King Khalid International",
|
|
495
|
-
tz: "Asia/Riyadh"
|
|
698
|
+
tz: "Asia/Riyadh",
|
|
699
|
+
venues: [
|
|
700
|
+
"polymarket"
|
|
701
|
+
]
|
|
496
702
|
},
|
|
497
703
|
{
|
|
498
704
|
code: "OMDB",
|
|
@@ -502,7 +708,10 @@ var mostlyright = (() => {
|
|
|
502
708
|
latitude: 25.2532,
|
|
503
709
|
longitude: 55.3657,
|
|
504
710
|
name: "Dubai International",
|
|
505
|
-
tz: "Asia/Dubai"
|
|
711
|
+
tz: "Asia/Dubai",
|
|
712
|
+
venues: [
|
|
713
|
+
"polymarket"
|
|
714
|
+
]
|
|
506
715
|
},
|
|
507
716
|
{
|
|
508
717
|
code: "OTHH",
|
|
@@ -512,7 +721,10 @@ var mostlyright = (() => {
|
|
|
512
721
|
latitude: 25.2731,
|
|
513
722
|
longitude: 51.608,
|
|
514
723
|
name: "Doha Hamad International",
|
|
515
|
-
tz: "Asia/Qatar"
|
|
724
|
+
tz: "Asia/Qatar",
|
|
725
|
+
venues: [
|
|
726
|
+
"polymarket"
|
|
727
|
+
]
|
|
516
728
|
},
|
|
517
729
|
{
|
|
518
730
|
code: "RCTP",
|
|
@@ -522,7 +734,10 @@ var mostlyright = (() => {
|
|
|
522
734
|
latitude: 25.0777,
|
|
523
735
|
longitude: 121.2328,
|
|
524
736
|
name: "Taipei Taoyuan",
|
|
525
|
-
tz: "Asia/Taipei"
|
|
737
|
+
tz: "Asia/Taipei",
|
|
738
|
+
venues: [
|
|
739
|
+
"polymarket"
|
|
740
|
+
]
|
|
526
741
|
},
|
|
527
742
|
{
|
|
528
743
|
code: "RJAA",
|
|
@@ -532,7 +747,10 @@ var mostlyright = (() => {
|
|
|
532
747
|
latitude: 35.7647,
|
|
533
748
|
longitude: 140.3864,
|
|
534
749
|
name: "Tokyo Narita",
|
|
535
|
-
tz: "Asia/Tokyo"
|
|
750
|
+
tz: "Asia/Tokyo",
|
|
751
|
+
venues: [
|
|
752
|
+
"polymarket"
|
|
753
|
+
]
|
|
536
754
|
},
|
|
537
755
|
{
|
|
538
756
|
code: "RJTT",
|
|
@@ -542,7 +760,10 @@ var mostlyright = (() => {
|
|
|
542
760
|
latitude: 35.5522,
|
|
543
761
|
longitude: 139.78,
|
|
544
762
|
name: "Tokyo Haneda",
|
|
545
|
-
tz: "Asia/Tokyo"
|
|
763
|
+
tz: "Asia/Tokyo",
|
|
764
|
+
venues: [
|
|
765
|
+
"polymarket"
|
|
766
|
+
]
|
|
546
767
|
},
|
|
547
768
|
{
|
|
548
769
|
code: "RKSI",
|
|
@@ -552,7 +773,10 @@ var mostlyright = (() => {
|
|
|
552
773
|
latitude: 37.4691,
|
|
553
774
|
longitude: 126.4505,
|
|
554
775
|
name: "Seoul Incheon",
|
|
555
|
-
tz: "Asia/Seoul"
|
|
776
|
+
tz: "Asia/Seoul",
|
|
777
|
+
venues: [
|
|
778
|
+
"polymarket"
|
|
779
|
+
]
|
|
556
780
|
},
|
|
557
781
|
{
|
|
558
782
|
code: "SAEZ",
|
|
@@ -562,7 +786,10 @@ var mostlyright = (() => {
|
|
|
562
786
|
latitude: -34.8222,
|
|
563
787
|
longitude: -58.5358,
|
|
564
788
|
name: "Buenos Aires Ezeiza",
|
|
565
|
-
tz: "America/Argentina/Buenos_Aires"
|
|
789
|
+
tz: "America/Argentina/Buenos_Aires",
|
|
790
|
+
venues: [
|
|
791
|
+
"polymarket"
|
|
792
|
+
]
|
|
566
793
|
},
|
|
567
794
|
{
|
|
568
795
|
code: "SBGR",
|
|
@@ -572,7 +799,10 @@ var mostlyright = (() => {
|
|
|
572
799
|
latitude: -23.4356,
|
|
573
800
|
longitude: -46.4731,
|
|
574
801
|
name: "S\xE3o Paulo Guarulhos",
|
|
575
|
-
tz: "America/Sao_Paulo"
|
|
802
|
+
tz: "America/Sao_Paulo",
|
|
803
|
+
venues: [
|
|
804
|
+
"polymarket"
|
|
805
|
+
]
|
|
576
806
|
},
|
|
577
807
|
{
|
|
578
808
|
code: "UUEE",
|
|
@@ -582,7 +812,10 @@ var mostlyright = (() => {
|
|
|
582
812
|
latitude: 55.9728,
|
|
583
813
|
longitude: 37.4147,
|
|
584
814
|
name: "Moscow Sheremetyevo",
|
|
585
|
-
tz: "Europe/Moscow"
|
|
815
|
+
tz: "Europe/Moscow",
|
|
816
|
+
venues: [
|
|
817
|
+
"polymarket"
|
|
818
|
+
]
|
|
586
819
|
},
|
|
587
820
|
{
|
|
588
821
|
code: "VABB",
|
|
@@ -592,7 +825,10 @@ var mostlyright = (() => {
|
|
|
592
825
|
latitude: 19.0887,
|
|
593
826
|
longitude: 72.8679,
|
|
594
827
|
name: "Mumbai Chhatrapati Shivaji",
|
|
595
|
-
tz: "Asia/Kolkata"
|
|
828
|
+
tz: "Asia/Kolkata",
|
|
829
|
+
venues: [
|
|
830
|
+
"polymarket"
|
|
831
|
+
]
|
|
596
832
|
},
|
|
597
833
|
{
|
|
598
834
|
code: "VHHH",
|
|
@@ -602,7 +838,10 @@ var mostlyright = (() => {
|
|
|
602
838
|
latitude: 22.308,
|
|
603
839
|
longitude: 113.9185,
|
|
604
840
|
name: "Hong Kong International",
|
|
605
|
-
tz: "Asia/Hong_Kong"
|
|
841
|
+
tz: "Asia/Hong_Kong",
|
|
842
|
+
venues: [
|
|
843
|
+
"polymarket"
|
|
844
|
+
]
|
|
606
845
|
},
|
|
607
846
|
{
|
|
608
847
|
code: "VIDP",
|
|
@@ -612,7 +851,10 @@ var mostlyright = (() => {
|
|
|
612
851
|
latitude: 28.5562,
|
|
613
852
|
longitude: 77.1,
|
|
614
853
|
name: "Delhi Indira Gandhi",
|
|
615
|
-
tz: "Asia/Kolkata"
|
|
854
|
+
tz: "Asia/Kolkata",
|
|
855
|
+
venues: [
|
|
856
|
+
"polymarket"
|
|
857
|
+
]
|
|
616
858
|
},
|
|
617
859
|
{
|
|
618
860
|
code: "VTBS",
|
|
@@ -622,7 +864,10 @@ var mostlyright = (() => {
|
|
|
622
864
|
latitude: 13.69,
|
|
623
865
|
longitude: 100.7501,
|
|
624
866
|
name: "Bangkok Suvarnabhumi",
|
|
625
|
-
tz: "Asia/Bangkok"
|
|
867
|
+
tz: "Asia/Bangkok",
|
|
868
|
+
venues: [
|
|
869
|
+
"polymarket"
|
|
870
|
+
]
|
|
626
871
|
},
|
|
627
872
|
{
|
|
628
873
|
code: "WSSS",
|
|
@@ -632,7 +877,10 @@ var mostlyright = (() => {
|
|
|
632
877
|
latitude: 1.3644,
|
|
633
878
|
longitude: 103.9915,
|
|
634
879
|
name: "Singapore Changi",
|
|
635
|
-
tz: "Asia/Singapore"
|
|
880
|
+
tz: "Asia/Singapore",
|
|
881
|
+
venues: [
|
|
882
|
+
"polymarket"
|
|
883
|
+
]
|
|
636
884
|
},
|
|
637
885
|
{
|
|
638
886
|
code: "YBBN",
|
|
@@ -642,7 +890,10 @@ var mostlyright = (() => {
|
|
|
642
890
|
latitude: -27.3842,
|
|
643
891
|
longitude: 153.1175,
|
|
644
892
|
name: "Brisbane",
|
|
645
|
-
tz: "Australia/Brisbane"
|
|
893
|
+
tz: "Australia/Brisbane",
|
|
894
|
+
venues: [
|
|
895
|
+
"polymarket"
|
|
896
|
+
]
|
|
646
897
|
},
|
|
647
898
|
{
|
|
648
899
|
code: "YMML",
|
|
@@ -652,7 +903,10 @@ var mostlyright = (() => {
|
|
|
652
903
|
latitude: -37.6733,
|
|
653
904
|
longitude: 144.8433,
|
|
654
905
|
name: "Melbourne Tullamarine",
|
|
655
|
-
tz: "Australia/Melbourne"
|
|
906
|
+
tz: "Australia/Melbourne",
|
|
907
|
+
venues: [
|
|
908
|
+
"polymarket"
|
|
909
|
+
]
|
|
656
910
|
},
|
|
657
911
|
{
|
|
658
912
|
code: "YSSY",
|
|
@@ -662,7 +916,10 @@ var mostlyright = (() => {
|
|
|
662
916
|
latitude: -33.9461,
|
|
663
917
|
longitude: 151.1772,
|
|
664
918
|
name: "Sydney Kingsford Smith",
|
|
665
|
-
tz: "Australia/Sydney"
|
|
919
|
+
tz: "Australia/Sydney",
|
|
920
|
+
venues: [
|
|
921
|
+
"polymarket"
|
|
922
|
+
]
|
|
666
923
|
},
|
|
667
924
|
{
|
|
668
925
|
code: "ZBAA",
|
|
@@ -672,7 +929,10 @@ var mostlyright = (() => {
|
|
|
672
929
|
latitude: 40.0801,
|
|
673
930
|
longitude: 116.5846,
|
|
674
931
|
name: "Beijing Capital",
|
|
675
|
-
tz: "Asia/Shanghai"
|
|
932
|
+
tz: "Asia/Shanghai",
|
|
933
|
+
venues: [
|
|
934
|
+
"polymarket"
|
|
935
|
+
]
|
|
676
936
|
},
|
|
677
937
|
{
|
|
678
938
|
code: "ZSPD",
|
|
@@ -682,16 +942,22 @@ var mostlyright = (() => {
|
|
|
682
942
|
latitude: 31.1443,
|
|
683
943
|
longitude: 121.8083,
|
|
684
944
|
name: "Shanghai Pudong",
|
|
685
|
-
tz: "Asia/Shanghai"
|
|
945
|
+
tz: "Asia/Shanghai",
|
|
946
|
+
venues: [
|
|
947
|
+
"polymarket"
|
|
948
|
+
]
|
|
686
949
|
}
|
|
687
950
|
];
|
|
688
951
|
STATION_BY_CODE = /* @__PURE__ */ new Map([
|
|
689
952
|
["ATL", STATIONS[10]],
|
|
690
953
|
["AUS", STATIONS[11]],
|
|
691
|
-
["
|
|
692
|
-
["
|
|
693
|
-
["
|
|
694
|
-
["
|
|
954
|
+
["BNA", STATIONS[12]],
|
|
955
|
+
["BOS", STATIONS[13]],
|
|
956
|
+
["CVG", STATIONS[14]],
|
|
957
|
+
["DCA", STATIONS[15]],
|
|
958
|
+
["DEN", STATIONS[16]],
|
|
959
|
+
["DFW", STATIONS[17]],
|
|
960
|
+
["DTW", STATIONS[18]],
|
|
695
961
|
["EDDB", STATIONS[0]],
|
|
696
962
|
["EDDF", STATIONS[1]],
|
|
697
963
|
["EDDM", STATIONS[2]],
|
|
@@ -702,51 +968,53 @@ var mostlyright = (() => {
|
|
|
702
968
|
["EKCH", STATIONS[7]],
|
|
703
969
|
["EPWA", STATIONS[8]],
|
|
704
970
|
["ESSA", STATIONS[9]],
|
|
705
|
-
["HOU", STATIONS[
|
|
706
|
-
["
|
|
707
|
-
["
|
|
708
|
-
["
|
|
709
|
-
["
|
|
710
|
-
["
|
|
711
|
-
["
|
|
712
|
-
["
|
|
713
|
-
["
|
|
714
|
-
["
|
|
715
|
-
["
|
|
716
|
-
["
|
|
717
|
-
["
|
|
718
|
-
["
|
|
719
|
-
["
|
|
720
|
-
["
|
|
721
|
-
["
|
|
722
|
-
["
|
|
723
|
-
["
|
|
724
|
-
["
|
|
725
|
-
["
|
|
726
|
-
["
|
|
727
|
-
["
|
|
728
|
-
["
|
|
729
|
-
["
|
|
730
|
-
["
|
|
731
|
-
["
|
|
732
|
-
["
|
|
733
|
-
["
|
|
734
|
-
["
|
|
735
|
-
["
|
|
736
|
-
["
|
|
737
|
-
["
|
|
738
|
-
["
|
|
739
|
-
["
|
|
740
|
-
["
|
|
741
|
-
["
|
|
742
|
-
["
|
|
743
|
-
["
|
|
744
|
-
["
|
|
745
|
-
["
|
|
746
|
-
["
|
|
747
|
-
["
|
|
748
|
-
["
|
|
749
|
-
["
|
|
971
|
+
["HOU", STATIONS[19]],
|
|
972
|
+
["IAH", STATIONS[20]],
|
|
973
|
+
["LAS", STATIONS[21]],
|
|
974
|
+
["LAX", STATIONS[22]],
|
|
975
|
+
["LEBL", STATIONS[35]],
|
|
976
|
+
["LEMD", STATIONS[36]],
|
|
977
|
+
["LFPB", STATIONS[37]],
|
|
978
|
+
["LFPG", STATIONS[38]],
|
|
979
|
+
["LFPO", STATIONS[39]],
|
|
980
|
+
["LIMC", STATIONS[40]],
|
|
981
|
+
["LIRF", STATIONS[41]],
|
|
982
|
+
["LOWW", STATIONS[42]],
|
|
983
|
+
["LSZH", STATIONS[43]],
|
|
984
|
+
["MDW", STATIONS[23]],
|
|
985
|
+
["MIA", STATIONS[24]],
|
|
986
|
+
["MSP", STATIONS[25]],
|
|
987
|
+
["MSY", STATIONS[26]],
|
|
988
|
+
["NYC", STATIONS[27]],
|
|
989
|
+
["NZAA", STATIONS[44]],
|
|
990
|
+
["NZWN", STATIONS[45]],
|
|
991
|
+
["OERK", STATIONS[46]],
|
|
992
|
+
["OKC", STATIONS[28]],
|
|
993
|
+
["OMDB", STATIONS[47]],
|
|
994
|
+
["OTHH", STATIONS[48]],
|
|
995
|
+
["PHL", STATIONS[29]],
|
|
996
|
+
["PHX", STATIONS[30]],
|
|
997
|
+
["RCTP", STATIONS[49]],
|
|
998
|
+
["RJAA", STATIONS[50]],
|
|
999
|
+
["RJTT", STATIONS[51]],
|
|
1000
|
+
["RKSI", STATIONS[52]],
|
|
1001
|
+
["SAEZ", STATIONS[53]],
|
|
1002
|
+
["SAT", STATIONS[31]],
|
|
1003
|
+
["SBGR", STATIONS[54]],
|
|
1004
|
+
["SEA", STATIONS[32]],
|
|
1005
|
+
["SFO", STATIONS[33]],
|
|
1006
|
+
["SLC", STATIONS[34]],
|
|
1007
|
+
["UUEE", STATIONS[55]],
|
|
1008
|
+
["VABB", STATIONS[56]],
|
|
1009
|
+
["VHHH", STATIONS[57]],
|
|
1010
|
+
["VIDP", STATIONS[58]],
|
|
1011
|
+
["VTBS", STATIONS[59]],
|
|
1012
|
+
["WSSS", STATIONS[60]],
|
|
1013
|
+
["YBBN", STATIONS[61]],
|
|
1014
|
+
["YMML", STATIONS[62]],
|
|
1015
|
+
["YSSY", STATIONS[63]],
|
|
1016
|
+
["ZBAA", STATIONS[64]],
|
|
1017
|
+
["ZSPD", STATIONS[65]]
|
|
750
1018
|
]);
|
|
751
1019
|
STATION_BY_ICAO = /* @__PURE__ */ new Map([
|
|
752
1020
|
["EDDB", STATIONS[0]],
|
|
@@ -761,55 +1029,60 @@ var mostlyright = (() => {
|
|
|
761
1029
|
["ESSA", STATIONS[9]],
|
|
762
1030
|
["KATL", STATIONS[10]],
|
|
763
1031
|
["KAUS", STATIONS[11]],
|
|
764
|
-
["
|
|
765
|
-
["
|
|
766
|
-
["
|
|
767
|
-
["
|
|
768
|
-
["
|
|
769
|
-
["
|
|
770
|
-
["
|
|
771
|
-
["
|
|
772
|
-
["
|
|
773
|
-
["
|
|
774
|
-
["
|
|
775
|
-
["
|
|
776
|
-
["
|
|
777
|
-
["
|
|
778
|
-
["
|
|
779
|
-
["
|
|
780
|
-
["
|
|
781
|
-
["
|
|
782
|
-
["
|
|
783
|
-
["
|
|
784
|
-
["
|
|
785
|
-
["
|
|
786
|
-
["
|
|
787
|
-
["
|
|
788
|
-
["
|
|
789
|
-
["
|
|
790
|
-
["
|
|
791
|
-
["
|
|
792
|
-
["
|
|
793
|
-
["
|
|
794
|
-
["
|
|
795
|
-
["
|
|
796
|
-
["
|
|
797
|
-
["
|
|
798
|
-
["
|
|
799
|
-
["
|
|
800
|
-
["
|
|
801
|
-
["
|
|
802
|
-
["
|
|
803
|
-
["
|
|
804
|
-
["
|
|
805
|
-
["
|
|
806
|
-
["
|
|
807
|
-
["
|
|
808
|
-
["
|
|
809
|
-
["
|
|
810
|
-
["
|
|
811
|
-
["
|
|
812
|
-
["
|
|
1032
|
+
["KBNA", STATIONS[12]],
|
|
1033
|
+
["KBOS", STATIONS[13]],
|
|
1034
|
+
["KCVG", STATIONS[14]],
|
|
1035
|
+
["KDCA", STATIONS[15]],
|
|
1036
|
+
["KDEN", STATIONS[16]],
|
|
1037
|
+
["KDFW", STATIONS[17]],
|
|
1038
|
+
["KDTW", STATIONS[18]],
|
|
1039
|
+
["KHOU", STATIONS[19]],
|
|
1040
|
+
["KIAH", STATIONS[20]],
|
|
1041
|
+
["KLAS", STATIONS[21]],
|
|
1042
|
+
["KLAX", STATIONS[22]],
|
|
1043
|
+
["KMDW", STATIONS[23]],
|
|
1044
|
+
["KMIA", STATIONS[24]],
|
|
1045
|
+
["KMSP", STATIONS[25]],
|
|
1046
|
+
["KMSY", STATIONS[26]],
|
|
1047
|
+
["KNYC", STATIONS[27]],
|
|
1048
|
+
["KOKC", STATIONS[28]],
|
|
1049
|
+
["KPHL", STATIONS[29]],
|
|
1050
|
+
["KPHX", STATIONS[30]],
|
|
1051
|
+
["KSAT", STATIONS[31]],
|
|
1052
|
+
["KSEA", STATIONS[32]],
|
|
1053
|
+
["KSFO", STATIONS[33]],
|
|
1054
|
+
["KSLC", STATIONS[34]],
|
|
1055
|
+
["LEBL", STATIONS[35]],
|
|
1056
|
+
["LEMD", STATIONS[36]],
|
|
1057
|
+
["LFPB", STATIONS[37]],
|
|
1058
|
+
["LFPG", STATIONS[38]],
|
|
1059
|
+
["LFPO", STATIONS[39]],
|
|
1060
|
+
["LIMC", STATIONS[40]],
|
|
1061
|
+
["LIRF", STATIONS[41]],
|
|
1062
|
+
["LOWW", STATIONS[42]],
|
|
1063
|
+
["LSZH", STATIONS[43]],
|
|
1064
|
+
["NZAA", STATIONS[44]],
|
|
1065
|
+
["NZWN", STATIONS[45]],
|
|
1066
|
+
["OERK", STATIONS[46]],
|
|
1067
|
+
["OMDB", STATIONS[47]],
|
|
1068
|
+
["OTHH", STATIONS[48]],
|
|
1069
|
+
["RCTP", STATIONS[49]],
|
|
1070
|
+
["RJAA", STATIONS[50]],
|
|
1071
|
+
["RJTT", STATIONS[51]],
|
|
1072
|
+
["RKSI", STATIONS[52]],
|
|
1073
|
+
["SAEZ", STATIONS[53]],
|
|
1074
|
+
["SBGR", STATIONS[54]],
|
|
1075
|
+
["UUEE", STATIONS[55]],
|
|
1076
|
+
["VABB", STATIONS[56]],
|
|
1077
|
+
["VHHH", STATIONS[57]],
|
|
1078
|
+
["VIDP", STATIONS[58]],
|
|
1079
|
+
["VTBS", STATIONS[59]],
|
|
1080
|
+
["WSSS", STATIONS[60]],
|
|
1081
|
+
["YBBN", STATIONS[61]],
|
|
1082
|
+
["YMML", STATIONS[62]],
|
|
1083
|
+
["YSSY", STATIONS[63]],
|
|
1084
|
+
["ZBAA", STATIONS[64]],
|
|
1085
|
+
["ZSPD", STATIONS[65]]
|
|
813
1086
|
]);
|
|
814
1087
|
}
|
|
815
1088
|
});
|
|
@@ -962,13 +1235,13 @@ var mostlyright = (() => {
|
|
|
962
1235
|
}
|
|
963
1236
|
return { _repr_only: true, value: String(value) };
|
|
964
1237
|
}
|
|
965
|
-
var
|
|
1238
|
+
var MostlyRightError, SourceUnavailableError, DATA_AVAILABILITY_REASONS, DataAvailabilityError, NwpNotAvailableError, SchemaValidationError, SourceMismatchError, LeakageError, IssuedAtMissingError, OpenMeteoSeamlessLeakageError, TemporalDriftError, PayloadTooLargeError, DeferredMarketError, PolymarketEventError, TherminalError, NotFoundError, RateLimitError, ValidationError, AuthenticationError, ForbiddenError, ServerError, LiveStreamError, NoLiveDataError;
|
|
966
1239
|
var init_exceptions = __esm({
|
|
967
1240
|
"../core/src/exceptions/index.ts"() {
|
|
968
1241
|
"use strict";
|
|
969
|
-
|
|
1242
|
+
MostlyRightError = class extends Error {
|
|
970
1243
|
/** Subclass override — the stable string enum surfaced via `errorCode`. */
|
|
971
|
-
static defaultErrorCode = "
|
|
1244
|
+
static defaultErrorCode = "MOSTLYRIGHT_ERROR";
|
|
972
1245
|
errorCode;
|
|
973
1246
|
source;
|
|
974
1247
|
requestId;
|
|
@@ -1000,7 +1273,7 @@ var mostlyright = (() => {
|
|
|
1000
1273
|
return safe;
|
|
1001
1274
|
}
|
|
1002
1275
|
};
|
|
1003
|
-
SourceUnavailableError = class extends
|
|
1276
|
+
SourceUnavailableError = class extends MostlyRightError {
|
|
1004
1277
|
static defaultErrorCode = "SOURCE_UNAVAILABLE";
|
|
1005
1278
|
httpStatus;
|
|
1006
1279
|
retryable;
|
|
@@ -1026,7 +1299,66 @@ var mostlyright = (() => {
|
|
|
1026
1299
|
};
|
|
1027
1300
|
}
|
|
1028
1301
|
};
|
|
1029
|
-
|
|
1302
|
+
DATA_AVAILABILITY_REASONS = [
|
|
1303
|
+
"model_unavailable",
|
|
1304
|
+
"out_of_window",
|
|
1305
|
+
"cache_miss",
|
|
1306
|
+
"source_404",
|
|
1307
|
+
"source_5xx",
|
|
1308
|
+
"rate_limited"
|
|
1309
|
+
];
|
|
1310
|
+
DataAvailabilityError = class extends MostlyRightError {
|
|
1311
|
+
static defaultErrorCode = "DATA_AVAILABILITY";
|
|
1312
|
+
reason;
|
|
1313
|
+
hint;
|
|
1314
|
+
constructor(options) {
|
|
1315
|
+
if (!DATA_AVAILABILITY_REASONS.includes(options.reason)) {
|
|
1316
|
+
throw new RangeError(
|
|
1317
|
+
`DataAvailabilityError: unknown reason "${String(options.reason)}". Valid reasons: ${DATA_AVAILABILITY_REASONS.join(", ")}`
|
|
1318
|
+
);
|
|
1319
|
+
}
|
|
1320
|
+
if (typeof options.hint !== "string" || options.hint.length === 0) {
|
|
1321
|
+
throw new TypeError("DataAvailabilityError: hint is required and must be a non-empty string");
|
|
1322
|
+
}
|
|
1323
|
+
const message = `[${options.reason}] ${options.hint}`;
|
|
1324
|
+
super(message, options);
|
|
1325
|
+
this.reason = options.reason;
|
|
1326
|
+
this.hint = options.hint;
|
|
1327
|
+
}
|
|
1328
|
+
payload() {
|
|
1329
|
+
return {
|
|
1330
|
+
...super.payload(),
|
|
1331
|
+
reason: this.reason,
|
|
1332
|
+
hint: this.hint
|
|
1333
|
+
};
|
|
1334
|
+
}
|
|
1335
|
+
};
|
|
1336
|
+
NwpNotAvailableError = class extends DataAvailabilityError {
|
|
1337
|
+
static defaultErrorCode = "NWP_NOT_AVAILABLE";
|
|
1338
|
+
station;
|
|
1339
|
+
model;
|
|
1340
|
+
constructor(options) {
|
|
1341
|
+
const parentOpts = {
|
|
1342
|
+
reason: "model_unavailable",
|
|
1343
|
+
hint: options.hint,
|
|
1344
|
+
source: options.source ?? `nwp.${options.model}`
|
|
1345
|
+
};
|
|
1346
|
+
if (options.requestId !== void 0 && options.requestId !== null) {
|
|
1347
|
+
parentOpts.requestId = options.requestId;
|
|
1348
|
+
}
|
|
1349
|
+
super(parentOpts);
|
|
1350
|
+
this.station = options.station;
|
|
1351
|
+
this.model = options.model;
|
|
1352
|
+
}
|
|
1353
|
+
payload() {
|
|
1354
|
+
return {
|
|
1355
|
+
...super.payload(),
|
|
1356
|
+
station: this.station,
|
|
1357
|
+
model: this.model
|
|
1358
|
+
};
|
|
1359
|
+
}
|
|
1360
|
+
};
|
|
1361
|
+
SchemaValidationError = class extends MostlyRightError {
|
|
1030
1362
|
static defaultErrorCode = "SCHEMA_VALIDATION_FAILED";
|
|
1031
1363
|
schemaId;
|
|
1032
1364
|
violations;
|
|
@@ -1049,7 +1381,7 @@ var mostlyright = (() => {
|
|
|
1049
1381
|
};
|
|
1050
1382
|
}
|
|
1051
1383
|
};
|
|
1052
|
-
SourceMismatchError = class extends
|
|
1384
|
+
SourceMismatchError = class extends MostlyRightError {
|
|
1053
1385
|
static defaultErrorCode = "SOURCE_MISMATCH";
|
|
1054
1386
|
/** Canonical role-name vocabulary (design.md §R). */
|
|
1055
1387
|
static VALID_ROLES = /* @__PURE__ */ new Set([
|
|
@@ -1078,7 +1410,7 @@ var mostlyright = (() => {
|
|
|
1078
1410
|
};
|
|
1079
1411
|
}
|
|
1080
1412
|
};
|
|
1081
|
-
LeakageError = class extends
|
|
1413
|
+
LeakageError = class extends MostlyRightError {
|
|
1082
1414
|
static defaultErrorCode = "LEAKAGE_DETECTED";
|
|
1083
1415
|
asOf;
|
|
1084
1416
|
violatingCount;
|
|
@@ -1098,7 +1430,50 @@ var mostlyright = (() => {
|
|
|
1098
1430
|
};
|
|
1099
1431
|
}
|
|
1100
1432
|
};
|
|
1101
|
-
|
|
1433
|
+
IssuedAtMissingError = class extends SchemaValidationError {
|
|
1434
|
+
static defaultErrorCode = "ISSUED_AT_MISSING";
|
|
1435
|
+
violatingCountRows;
|
|
1436
|
+
constructor(message, options = {}) {
|
|
1437
|
+
super(message, {
|
|
1438
|
+
...options,
|
|
1439
|
+
schemaId: "schema.forecast.station.v1",
|
|
1440
|
+
violations: [{ column: "issued_at", rule: "non_null" }]
|
|
1441
|
+
});
|
|
1442
|
+
this.violatingCountRows = options.violatingCount ?? 0;
|
|
1443
|
+
}
|
|
1444
|
+
payload() {
|
|
1445
|
+
return {
|
|
1446
|
+
...super.payload(),
|
|
1447
|
+
name: "IssuedAtMissingError",
|
|
1448
|
+
violating_count: this.violatingCountRows,
|
|
1449
|
+
origin_issue: "Tarabcak/mostlyright#70"
|
|
1450
|
+
};
|
|
1451
|
+
}
|
|
1452
|
+
};
|
|
1453
|
+
OpenMeteoSeamlessLeakageError = class extends LeakageError {
|
|
1454
|
+
static defaultErrorCode = "OPEN_METEO_SEAMLESS_LEAKAGE";
|
|
1455
|
+
model;
|
|
1456
|
+
endpointUrl;
|
|
1457
|
+
constructor(message, options) {
|
|
1458
|
+
super(message, {
|
|
1459
|
+
...options,
|
|
1460
|
+
asOf: options.asOf ?? "(seamless-endpoint-refused-before-fetch)",
|
|
1461
|
+
violatingCount: 0
|
|
1462
|
+
});
|
|
1463
|
+
this.model = options.model;
|
|
1464
|
+
this.endpointUrl = options.endpointUrl;
|
|
1465
|
+
}
|
|
1466
|
+
payload() {
|
|
1467
|
+
return {
|
|
1468
|
+
...super.payload(),
|
|
1469
|
+
name: "OpenMeteoSeamlessLeakageError",
|
|
1470
|
+
model: this.model,
|
|
1471
|
+
endpoint_url: this.endpointUrl,
|
|
1472
|
+
origin_issue: "Tarabcak/mostlyright#70"
|
|
1473
|
+
};
|
|
1474
|
+
}
|
|
1475
|
+
};
|
|
1476
|
+
TemporalDriftError = class extends MostlyRightError {
|
|
1102
1477
|
static defaultErrorCode = "TEMPORAL_DRIFT";
|
|
1103
1478
|
schemaId;
|
|
1104
1479
|
assertedRange;
|
|
@@ -1121,7 +1496,7 @@ var mostlyright = (() => {
|
|
|
1121
1496
|
};
|
|
1122
1497
|
}
|
|
1123
1498
|
};
|
|
1124
|
-
PayloadTooLargeError = class extends
|
|
1499
|
+
PayloadTooLargeError = class extends MostlyRightError {
|
|
1125
1500
|
static defaultErrorCode = "PAYLOAD_TOO_LARGE";
|
|
1126
1501
|
declaredSize;
|
|
1127
1502
|
limit;
|
|
@@ -1141,13 +1516,13 @@ var mostlyright = (() => {
|
|
|
1141
1516
|
};
|
|
1142
1517
|
}
|
|
1143
1518
|
};
|
|
1144
|
-
DeferredMarketError = class extends
|
|
1519
|
+
DeferredMarketError = class extends MostlyRightError {
|
|
1145
1520
|
static defaultErrorCode = "DEFERRED_MARKET";
|
|
1146
1521
|
};
|
|
1147
|
-
PolymarketEventError = class extends
|
|
1522
|
+
PolymarketEventError = class extends MostlyRightError {
|
|
1148
1523
|
static defaultErrorCode = "POLYMARKET_EVENT_INVALID";
|
|
1149
1524
|
};
|
|
1150
|
-
TherminalError = class extends
|
|
1525
|
+
TherminalError = class extends MostlyRightError {
|
|
1151
1526
|
static defaultErrorCode = "HTTP_ERROR";
|
|
1152
1527
|
statusCode;
|
|
1153
1528
|
constructor(message, options = {}) {
|
|
@@ -1206,13 +1581,13 @@ var mostlyright = (() => {
|
|
|
1206
1581
|
super(message, { ...options, statusCode: options.statusCode ?? 500 });
|
|
1207
1582
|
}
|
|
1208
1583
|
};
|
|
1209
|
-
LiveStreamError = class extends
|
|
1584
|
+
LiveStreamError = class extends MostlyRightError {
|
|
1210
1585
|
static defaultErrorCode = "LIVE_STREAM_ERROR";
|
|
1211
1586
|
};
|
|
1212
1587
|
NoLiveDataError = class extends LiveStreamError {
|
|
1213
1588
|
static defaultErrorCode = "NO_LIVE_DATA";
|
|
1214
1589
|
station;
|
|
1215
|
-
constructor(message
|
|
1590
|
+
constructor(message, options) {
|
|
1216
1591
|
super(message, { ...options, source: options.source });
|
|
1217
1592
|
this.station = options.station;
|
|
1218
1593
|
}
|
|
@@ -1470,6 +1845,76 @@ var mostlyright = (() => {
|
|
|
1470
1845
|
}
|
|
1471
1846
|
});
|
|
1472
1847
|
|
|
1848
|
+
// ../core/src/stations/index.ts
|
|
1849
|
+
var StationCatalog, CATALOG;
|
|
1850
|
+
var init_stations2 = __esm({
|
|
1851
|
+
"../core/src/stations/index.ts"() {
|
|
1852
|
+
"use strict";
|
|
1853
|
+
init_stations();
|
|
1854
|
+
StationCatalog = class {
|
|
1855
|
+
stations;
|
|
1856
|
+
byCode;
|
|
1857
|
+
byIcao;
|
|
1858
|
+
constructor(stations = STATIONS) {
|
|
1859
|
+
this.stations = stations;
|
|
1860
|
+
if (stations === STATIONS) {
|
|
1861
|
+
this.byCode = STATION_BY_CODE;
|
|
1862
|
+
this.byIcao = STATION_BY_ICAO;
|
|
1863
|
+
} else {
|
|
1864
|
+
const byCode = /* @__PURE__ */ new Map();
|
|
1865
|
+
const byIcao = /* @__PURE__ */ new Map();
|
|
1866
|
+
for (const s of stations) {
|
|
1867
|
+
if (s.code !== null) byCode.set(s.code, s);
|
|
1868
|
+
byIcao.set(s.icao, s);
|
|
1869
|
+
}
|
|
1870
|
+
this.byCode = byCode;
|
|
1871
|
+
this.byIcao = byIcao;
|
|
1872
|
+
}
|
|
1873
|
+
}
|
|
1874
|
+
/**
|
|
1875
|
+
* Return the station for `code` (registry code or ICAO).
|
|
1876
|
+
* @throws if no station matches.
|
|
1877
|
+
*/
|
|
1878
|
+
get(code) {
|
|
1879
|
+
const station = this.byCode.get(code) ?? this.byIcao.get(code);
|
|
1880
|
+
if (station === void 0) {
|
|
1881
|
+
throw new Error(
|
|
1882
|
+
`Unknown station ${JSON.stringify(code)}. Expected a registry code (e.g. "NYC", "EGLL") or a 4-letter ICAO (e.g. "KNYC").`
|
|
1883
|
+
);
|
|
1884
|
+
}
|
|
1885
|
+
return station;
|
|
1886
|
+
}
|
|
1887
|
+
/** Stations tagged with `venue` (e.g. "kalshi"), sorted by ICAO. */
|
|
1888
|
+
filterByVenue(venue) {
|
|
1889
|
+
return this.stations.filter((s) => s.venues.includes(venue)).sort((a, b) => a.icao.localeCompare(b.icao));
|
|
1890
|
+
}
|
|
1891
|
+
/** Stations whose ISO 3166-1 alpha-2 `country` matches, sorted by ICAO. */
|
|
1892
|
+
filterByCountry(country) {
|
|
1893
|
+
return this.stations.filter((s) => s.country === country).sort((a, b) => a.icao.localeCompare(b.icao));
|
|
1894
|
+
}
|
|
1895
|
+
/** Union of all venue tags present in the catalog. */
|
|
1896
|
+
venues() {
|
|
1897
|
+
const out = /* @__PURE__ */ new Set();
|
|
1898
|
+
for (const s of this.stations) {
|
|
1899
|
+
for (const v of s.venues) out.add(v);
|
|
1900
|
+
}
|
|
1901
|
+
return out;
|
|
1902
|
+
}
|
|
1903
|
+
/** True iff `code` resolves to a station (by registry code or ICAO). */
|
|
1904
|
+
has(code) {
|
|
1905
|
+
return this.byCode.has(code) || this.byIcao.has(code);
|
|
1906
|
+
}
|
|
1907
|
+
get size() {
|
|
1908
|
+
return this.stations.length;
|
|
1909
|
+
}
|
|
1910
|
+
[Symbol.iterator]() {
|
|
1911
|
+
return this.stations[Symbol.iterator]();
|
|
1912
|
+
}
|
|
1913
|
+
};
|
|
1914
|
+
CATALOG = new StationCatalog();
|
|
1915
|
+
}
|
|
1916
|
+
});
|
|
1917
|
+
|
|
1473
1918
|
// ../core/src/internal/http.ts
|
|
1474
1919
|
function sleep(ms, signal) {
|
|
1475
1920
|
return new Promise((resolve, reject) => {
|
|
@@ -1627,15 +2072,22 @@ var mostlyright = (() => {
|
|
|
1627
2072
|
var src_exports = {};
|
|
1628
2073
|
__export(src_exports, {
|
|
1629
2074
|
AuthenticationError: () => AuthenticationError,
|
|
2075
|
+
CATALOG: () => CATALOG,
|
|
1630
2076
|
CLIMATE_REPORT_TYPE_PRIORITY: () => CLIMATE_REPORT_TYPE_PRIORITY,
|
|
2077
|
+
DATA_AVAILABILITY_REASONS: () => DATA_AVAILABILITY_REASONS,
|
|
2078
|
+
DataAvailabilityError: () => DataAvailabilityError,
|
|
1631
2079
|
DeferredMarketError: () => DeferredMarketError,
|
|
1632
2080
|
ForbiddenError: () => ForbiddenError,
|
|
2081
|
+
IssuedAtMissingError: () => IssuedAtMissingError,
|
|
1633
2082
|
LIVE_V1_POLICY: () => LIVE_V1_POLICY,
|
|
1634
2083
|
LeakageError: () => LeakageError,
|
|
1635
2084
|
LiveStreamError: () => LiveStreamError,
|
|
2085
|
+
MostlyRightError: () => MostlyRightError,
|
|
1636
2086
|
NoLiveDataError: () => NoLiveDataError,
|
|
1637
2087
|
NotFoundError: () => NotFoundError,
|
|
2088
|
+
NwpNotAvailableError: () => NwpNotAvailableError,
|
|
1638
2089
|
OBSERVATION_SOURCE_PRIORITY: () => OBSERVATION_SOURCE_PRIORITY,
|
|
2090
|
+
OpenMeteoSeamlessLeakageError: () => OpenMeteoSeamlessLeakageError,
|
|
1639
2091
|
PayloadTooLargeError: () => PayloadTooLargeError,
|
|
1640
2092
|
PolymarketEventError: () => PolymarketEventError,
|
|
1641
2093
|
QC_ALPHA_RULES: () => QC_ALPHA_RULES,
|
|
@@ -1648,9 +2100,9 @@ var mostlyright = (() => {
|
|
|
1648
2100
|
ServerError: () => ServerError,
|
|
1649
2101
|
SourceMismatchError: () => SourceMismatchError,
|
|
1650
2102
|
SourceUnavailableError: () => SourceUnavailableError,
|
|
2103
|
+
StationCatalog: () => StationCatalog,
|
|
1651
2104
|
TemporalDriftError: () => TemporalDriftError,
|
|
1652
2105
|
TherminalError: () => TherminalError,
|
|
1653
|
-
TradewindsError: () => TradewindsError,
|
|
1654
2106
|
ValidationError: () => ValidationError,
|
|
1655
2107
|
_CLI_PUBLICATION_DELAY_HOURS: () => _CLI_PUBLICATION_DELAY_HOURS,
|
|
1656
2108
|
_JAN_REF: () => _JAN_REF,
|
|
@@ -1679,6 +2131,7 @@ var mostlyright = (() => {
|
|
|
1679
2131
|
init_generated2();
|
|
1680
2132
|
init_exceptions();
|
|
1681
2133
|
init_snapshot();
|
|
2134
|
+
init_stations2();
|
|
1682
2135
|
init_http();
|
|
1683
2136
|
version = "0.0.0";
|
|
1684
2137
|
}
|
|
@@ -2322,8 +2775,8 @@ var mostlyright = (() => {
|
|
|
2322
2775
|
const key = header[c];
|
|
2323
2776
|
row[key] = (cells[c] ?? "").trim();
|
|
2324
2777
|
}
|
|
2325
|
-
const
|
|
2326
|
-
if (
|
|
2778
|
+
const obs2 = iemToObservation(row, opts);
|
|
2779
|
+
if (obs2 !== null) out.push(obs2);
|
|
2327
2780
|
}
|
|
2328
2781
|
return out;
|
|
2329
2782
|
}
|
|
@@ -2348,6 +2801,7 @@ var mostlyright = (() => {
|
|
|
2348
2801
|
MODE2_SOURCES: () => MODE2_SOURCES,
|
|
2349
2802
|
NoLiveDataError: () => NoLiveDataError,
|
|
2350
2803
|
POLITE_FLOORS_S: () => POLITE_FLOORS_S,
|
|
2804
|
+
Preprocessing: () => Preprocessing,
|
|
2351
2805
|
SELECTOR_NAMES: () => SELECTOR_NAMES,
|
|
2352
2806
|
SOURCE_ALIASES: () => SOURCE_ALIASES,
|
|
2353
2807
|
SOURCE_IDENTITY_TAGS: () => SOURCE_IDENTITY_TAGS,
|
|
@@ -2356,6 +2810,7 @@ var mostlyright = (() => {
|
|
|
2356
2810
|
assertSourceIdentity: () => assertSourceIdentity,
|
|
2357
2811
|
buildOverrideWarning: () => buildOverrideWarning,
|
|
2358
2812
|
core: () => src_exports,
|
|
2813
|
+
dailyExtremes: () => dailyExtremes,
|
|
2359
2814
|
discover: () => discover,
|
|
2360
2815
|
helloCore: () => helloCore,
|
|
2361
2816
|
helloMarkets: () => helloMarkets,
|
|
@@ -2364,6 +2819,8 @@ var mostlyright = (() => {
|
|
|
2364
2819
|
isMode2Source: () => isMode2Source,
|
|
2365
2820
|
latest: () => latest,
|
|
2366
2821
|
markets: () => src_exports3,
|
|
2822
|
+
obs: () => obs,
|
|
2823
|
+
preprocessing: () => preprocessing_exports,
|
|
2367
2824
|
research: () => research,
|
|
2368
2825
|
researchBySource: () => researchBySource,
|
|
2369
2826
|
resolveCity: () => resolveCity,
|
|
@@ -2395,12 +2852,18 @@ var mostlyright = (() => {
|
|
|
2395
2852
|
LiveStreamError: () => LiveStreamError,
|
|
2396
2853
|
NCEI_POLITE_DELAY_MS: () => NCEI_POLITE_DELAY_MS,
|
|
2397
2854
|
NoLiveDataError: () => NoLiveDataError,
|
|
2855
|
+
OPEN_METEO_LIVE_URL: () => OPEN_METEO_LIVE_URL,
|
|
2856
|
+
OPEN_METEO_MODELS: () => OPEN_METEO_MODELS,
|
|
2857
|
+
OPEN_METEO_PREVIOUS_RUNS_URL: () => OPEN_METEO_PREVIOUS_RUNS_URL,
|
|
2858
|
+
OPEN_METEO_SEAMLESS_URL: () => OPEN_METEO_SEAMLESS_URL,
|
|
2859
|
+
OPEN_METEO_SINGLE_RUNS_URL: () => OPEN_METEO_SINGLE_RUNS_URL,
|
|
2398
2860
|
POLITE_FLOORS_S: () => POLITE_FLOORS_S,
|
|
2399
2861
|
SOURCE_IDENTITY_TAGS: () => SOURCE_IDENTITY_TAGS,
|
|
2400
2862
|
SSID_COLUMNS: () => SSID_COLUMNS,
|
|
2401
2863
|
SUPPORTED_SOURCES: () => SUPPORTED_SOURCES,
|
|
2402
2864
|
awcToObservation: () => awcToObservation,
|
|
2403
2865
|
buildIemUrl: () => buildIemUrl,
|
|
2866
|
+
dailyExtremes: () => dailyExtremes,
|
|
2404
2867
|
downloadCli: () => downloadCli,
|
|
2405
2868
|
downloadCliRange: () => downloadCliRange,
|
|
2406
2869
|
downloadGhcnh: () => downloadGhcnh,
|
|
@@ -2419,12 +2882,15 @@ var mostlyright = (() => {
|
|
|
2419
2882
|
latest: () => latest,
|
|
2420
2883
|
mapCloudCover: () => mapCloudCover,
|
|
2421
2884
|
mergeClimate: () => mergeClimate,
|
|
2885
|
+
obs: () => obs,
|
|
2886
|
+
openMeteoForecasts: () => openMeteoForecasts,
|
|
2422
2887
|
parseAwcVisibility: () => parseAwcVisibility,
|
|
2423
2888
|
parseCliRecord: () => parseCliRecord,
|
|
2424
2889
|
parseCliResponse: () => parseCliResponse,
|
|
2425
2890
|
parseGhcnhPsv: () => parseGhcnhPsv,
|
|
2426
2891
|
parseGhcnhRow: () => parseGhcnhRow,
|
|
2427
2892
|
parseIemCsv: () => parseIemCsv,
|
|
2893
|
+
resolveAutoStrategy: () => resolveAutoStrategy,
|
|
2428
2894
|
sourceTag: () => sourceTag,
|
|
2429
2895
|
stream: () => stream,
|
|
2430
2896
|
validatePollSeconds: () => validatePollSeconds,
|
|
@@ -2626,10 +3092,10 @@ var mostlyright = (() => {
|
|
|
2626
3092
|
if (!product) return "preliminary";
|
|
2627
3093
|
const issued = parseProductTimestamp(product);
|
|
2628
3094
|
if (issued === null) return "preliminary";
|
|
2629
|
-
const
|
|
2630
|
-
if (
|
|
3095
|
+
const obs2 = parseObservationDate(observationDate);
|
|
3096
|
+
if (obs2 === null) return "preliminary";
|
|
2631
3097
|
const issuedDayUtc = Date.UTC(issued.getUTCFullYear(), issued.getUTCMonth(), issued.getUTCDate());
|
|
2632
|
-
const obsDayUtc =
|
|
3098
|
+
const obsDayUtc = obs2.getTime();
|
|
2633
3099
|
const deltaDays = Math.round((issuedDayUtc - obsDayUtc) / 864e5);
|
|
2634
3100
|
if (deltaDays <= 0) return "preliminary";
|
|
2635
3101
|
if (deltaDays === 1) {
|
|
@@ -3005,8 +3471,8 @@ var mostlyright = (() => {
|
|
|
3005
3471
|
const key = header[c];
|
|
3006
3472
|
row[key] = c < cells.length ? cells[c] : "";
|
|
3007
3473
|
}
|
|
3008
|
-
const
|
|
3009
|
-
if (
|
|
3474
|
+
const obs2 = parseGhcnhRow(row);
|
|
3475
|
+
if (obs2 !== null) out.push(obs2);
|
|
3010
3476
|
}
|
|
3011
3477
|
return out;
|
|
3012
3478
|
}
|
|
@@ -3075,8 +3541,8 @@ var mostlyright = (() => {
|
|
|
3075
3541
|
if (s.length === 3) return `K${s}`;
|
|
3076
3542
|
return s;
|
|
3077
3543
|
}
|
|
3078
|
-
function asLiveObservation(
|
|
3079
|
-
return { ...
|
|
3544
|
+
function asLiveObservation(obs2, tag) {
|
|
3545
|
+
return { ...obs2, source: tag };
|
|
3080
3546
|
}
|
|
3081
3547
|
async function fetchAwcLatest(station) {
|
|
3082
3548
|
const icao = normalizeStation(station);
|
|
@@ -3084,9 +3550,9 @@ var mostlyright = (() => {
|
|
|
3084
3550
|
const tag = sourceTag("awc");
|
|
3085
3551
|
const rows = [];
|
|
3086
3552
|
for (const m of raw) {
|
|
3087
|
-
const
|
|
3088
|
-
if (
|
|
3089
|
-
rows.push(asLiveObservation(
|
|
3553
|
+
const obs2 = awcToObservation(m);
|
|
3554
|
+
if (obs2 !== null) {
|
|
3555
|
+
rows.push(asLiveObservation(obs2, tag));
|
|
3090
3556
|
}
|
|
3091
3557
|
}
|
|
3092
3558
|
return rows;
|
|
@@ -3142,8 +3608,8 @@ var mostlyright = (() => {
|
|
|
3142
3608
|
const response = await fetchWithRetry2(url);
|
|
3143
3609
|
const csv = await response.text();
|
|
3144
3610
|
const override = reportType === 3 ? "METAR" : "SPECI";
|
|
3145
|
-
const
|
|
3146
|
-
for (const row of
|
|
3611
|
+
const obs2 = parseIemCsv2(csv, { observationTypeOverride: override });
|
|
3612
|
+
for (const row of obs2) {
|
|
3147
3613
|
rows.push(asLiveObservation(row, tag));
|
|
3148
3614
|
}
|
|
3149
3615
|
}
|
|
@@ -3359,72 +3825,2082 @@ var mostlyright = (() => {
|
|
|
3359
3825
|
}
|
|
3360
3826
|
|
|
3361
3827
|
// ../weather/src/forecasts/nwp-stub.ts
|
|
3362
|
-
|
|
3363
|
-
|
|
3364
|
-
|
|
3828
|
+
init_src();
|
|
3829
|
+
var IEM_MOS_COVERED_STATIONS = /* @__PURE__ */ new Set([
|
|
3830
|
+
"KNYC",
|
|
3831
|
+
"KLAX",
|
|
3832
|
+
"KORD",
|
|
3833
|
+
"KMIA",
|
|
3834
|
+
"KDEN",
|
|
3835
|
+
"KSEA",
|
|
3836
|
+
"KATL"
|
|
3837
|
+
]);
|
|
3838
|
+
function buildHint(station, model) {
|
|
3839
|
+
const hasMosCoverage = IEM_MOS_COVERED_STATIONS.has(station.toUpperCase());
|
|
3840
|
+
const mosLine = hasMosCoverage ? `Workaround for ${station}: iemMosForecasts("${station}", ...) is available (IEM MOS catalog covers this station).` : `Workaround: this station has no IEM MOS coverage; use the Python SDK's mostlyright.forecast_nwp() in v1.x.`;
|
|
3841
|
+
return `forecastNwp(${station}, "${model}") is a v1.x stub. Browser GRIB2 decode is not production-ready in May 2026 (no eccodes / cfgrib equivalent for the browser; WASM compile time + bundle size make it impractical for v1.x). ${mosLine} See https://mostlyright.md/docs/sdk/typescript/nwp-forecasts/ for the architectural reason + v2.0+ tracking.`;
|
|
3842
|
+
}
|
|
3843
|
+
async function forecastNwp(station, model, _opts = {}) {
|
|
3844
|
+
throw new NwpNotAvailableError({
|
|
3845
|
+
station,
|
|
3846
|
+
model,
|
|
3847
|
+
hint: buildHint(station, model)
|
|
3848
|
+
});
|
|
3849
|
+
}
|
|
3850
|
+
|
|
3851
|
+
// ../weather/src/forecasts/open-meteo.ts
|
|
3852
|
+
init_src();
|
|
3853
|
+
|
|
3854
|
+
// ../weather/src/forecasts/open-meteo-models.ts
|
|
3855
|
+
var OPEN_METEO_MODELS = /* @__PURE__ */ new Set([
|
|
3856
|
+
// NCEP (8)
|
|
3857
|
+
"gfs_seamless",
|
|
3858
|
+
"gfs_global",
|
|
3859
|
+
"gfs_graphcast025",
|
|
3860
|
+
"aigfs025",
|
|
3861
|
+
"hgefs025",
|
|
3862
|
+
"ncep_hrrr_conus",
|
|
3863
|
+
"ncep_nbm_conus",
|
|
3864
|
+
"ncep_nam_conus",
|
|
3865
|
+
// ECMWF (3)
|
|
3866
|
+
"ecmwf_ifs025",
|
|
3867
|
+
"ecmwf_ifs_hres",
|
|
3868
|
+
"ecmwf_aifs025_single",
|
|
3869
|
+
// DWD (5)
|
|
3870
|
+
"dwd_icon_seamless",
|
|
3871
|
+
"dwd_icon_global",
|
|
3872
|
+
"dwd_icon_eu",
|
|
3873
|
+
"dwd_icon_d2",
|
|
3874
|
+
"dwd_icon_d2_15min",
|
|
3875
|
+
// Météo-France (6)
|
|
3876
|
+
"meteofrance_seamless",
|
|
3877
|
+
"meteofrance_arpege_world025",
|
|
3878
|
+
"meteofrance_arpege_europe",
|
|
3879
|
+
"meteofrance_arome_france0025",
|
|
3880
|
+
"meteofrance_arome_france_hd",
|
|
3881
|
+
"meteofrance_arome_france_hd_15min",
|
|
3882
|
+
// Asia + Oceania (8)
|
|
3883
|
+
"jma_seamless",
|
|
3884
|
+
"jma_gsm",
|
|
3885
|
+
"jma_msm",
|
|
3886
|
+
"kma_seamless",
|
|
3887
|
+
"kma_gdps",
|
|
3888
|
+
"kma_ldps",
|
|
3889
|
+
"cma_grapes_global",
|
|
3890
|
+
"bom_access_global",
|
|
3891
|
+
// Europe (3)
|
|
3892
|
+
"ukmo_global_deterministic_10km",
|
|
3893
|
+
"ukmo_uk_deterministic_2km",
|
|
3894
|
+
"metno_nordic_pp",
|
|
3895
|
+
// GEM Canada (3)
|
|
3896
|
+
"cmc_gem_gdps",
|
|
3897
|
+
"cmc_gem_rdps",
|
|
3898
|
+
"cmc_gem_hrdps"
|
|
3899
|
+
]);
|
|
3900
|
+
var SIX_HOURLY = [0, 6, 12, 18];
|
|
3901
|
+
var THREE_HOURLY = [0, 3, 6, 9, 12, 15, 18, 21];
|
|
3902
|
+
var HOURLY = Array.from({ length: 24 }, (_, i) => i);
|
|
3903
|
+
var TWELVE_HOURLY = [0, 12];
|
|
3904
|
+
var CYCLE_HOURS = /* @__PURE__ */ new Map([
|
|
3905
|
+
// NCEP
|
|
3906
|
+
["gfs_seamless", SIX_HOURLY],
|
|
3907
|
+
["gfs_global", SIX_HOURLY],
|
|
3908
|
+
["gfs_graphcast025", SIX_HOURLY],
|
|
3909
|
+
["aigfs025", SIX_HOURLY],
|
|
3910
|
+
["hgefs025", SIX_HOURLY],
|
|
3911
|
+
["ncep_hrrr_conus", HOURLY],
|
|
3912
|
+
["ncep_nbm_conus", HOURLY],
|
|
3913
|
+
["ncep_nam_conus", SIX_HOURLY],
|
|
3914
|
+
// ECMWF
|
|
3915
|
+
["ecmwf_ifs025", SIX_HOURLY],
|
|
3916
|
+
["ecmwf_ifs_hres", SIX_HOURLY],
|
|
3917
|
+
["ecmwf_aifs025_single", SIX_HOURLY],
|
|
3918
|
+
// DWD
|
|
3919
|
+
["dwd_icon_seamless", SIX_HOURLY],
|
|
3920
|
+
["dwd_icon_global", SIX_HOURLY],
|
|
3921
|
+
["dwd_icon_eu", SIX_HOURLY],
|
|
3922
|
+
["dwd_icon_d2", THREE_HOURLY],
|
|
3923
|
+
["dwd_icon_d2_15min", THREE_HOURLY],
|
|
3924
|
+
// Météo-France
|
|
3925
|
+
["meteofrance_seamless", SIX_HOURLY],
|
|
3926
|
+
["meteofrance_arpege_world025", SIX_HOURLY],
|
|
3927
|
+
["meteofrance_arpege_europe", SIX_HOURLY],
|
|
3928
|
+
["meteofrance_arome_france0025", THREE_HOURLY],
|
|
3929
|
+
["meteofrance_arome_france_hd", THREE_HOURLY],
|
|
3930
|
+
["meteofrance_arome_france_hd_15min", THREE_HOURLY],
|
|
3931
|
+
// Asia + Oceania
|
|
3932
|
+
["jma_seamless", SIX_HOURLY],
|
|
3933
|
+
["jma_gsm", SIX_HOURLY],
|
|
3934
|
+
["jma_msm", THREE_HOURLY],
|
|
3935
|
+
["kma_seamless", SIX_HOURLY],
|
|
3936
|
+
["kma_gdps", SIX_HOURLY],
|
|
3937
|
+
["kma_ldps", THREE_HOURLY],
|
|
3938
|
+
["cma_grapes_global", SIX_HOURLY],
|
|
3939
|
+
["bom_access_global", SIX_HOURLY],
|
|
3940
|
+
// Europe
|
|
3941
|
+
["ukmo_global_deterministic_10km", SIX_HOURLY],
|
|
3942
|
+
["ukmo_uk_deterministic_2km", THREE_HOURLY],
|
|
3943
|
+
["metno_nordic_pp", HOURLY],
|
|
3944
|
+
// GEM Canada
|
|
3945
|
+
["cmc_gem_gdps", TWELVE_HOURLY],
|
|
3946
|
+
["cmc_gem_rdps", SIX_HOURLY],
|
|
3947
|
+
["cmc_gem_hrdps", SIX_HOURLY]
|
|
3948
|
+
]);
|
|
3949
|
+
var PUBLISH_LAG_HOURS = /* @__PURE__ */ new Map([
|
|
3950
|
+
// NCEP — global 6h, regional/mesoscale 2h
|
|
3951
|
+
["gfs_seamless", 6],
|
|
3952
|
+
["gfs_global", 6],
|
|
3953
|
+
["gfs_graphcast025", 6],
|
|
3954
|
+
["aigfs025", 6],
|
|
3955
|
+
["hgefs025", 6],
|
|
3956
|
+
["ncep_hrrr_conus", 2],
|
|
3957
|
+
["ncep_nbm_conus", 2],
|
|
3958
|
+
["ncep_nam_conus", 2],
|
|
3959
|
+
// ECMWF — global 6h
|
|
3960
|
+
["ecmwf_ifs025", 6],
|
|
3961
|
+
["ecmwf_ifs_hres", 6],
|
|
3962
|
+
["ecmwf_aifs025_single", 6],
|
|
3963
|
+
// DWD
|
|
3964
|
+
["dwd_icon_seamless", 4],
|
|
3965
|
+
["dwd_icon_global", 4],
|
|
3966
|
+
["dwd_icon_eu", 4],
|
|
3967
|
+
["dwd_icon_d2", 2],
|
|
3968
|
+
["dwd_icon_d2_15min", 2],
|
|
3969
|
+
// Météo-France
|
|
3970
|
+
["meteofrance_seamless", 4],
|
|
3971
|
+
["meteofrance_arpege_world025", 6],
|
|
3972
|
+
["meteofrance_arpege_europe", 4],
|
|
3973
|
+
["meteofrance_arome_france0025", 2],
|
|
3974
|
+
["meteofrance_arome_france_hd", 2],
|
|
3975
|
+
["meteofrance_arome_france_hd_15min", 2],
|
|
3976
|
+
// Asia + Oceania
|
|
3977
|
+
["jma_seamless", 6],
|
|
3978
|
+
["jma_gsm", 6],
|
|
3979
|
+
["jma_msm", 2],
|
|
3980
|
+
["kma_seamless", 6],
|
|
3981
|
+
["kma_gdps", 6],
|
|
3982
|
+
["kma_ldps", 2],
|
|
3983
|
+
["cma_grapes_global", 6],
|
|
3984
|
+
["bom_access_global", 6],
|
|
3985
|
+
// Europe
|
|
3986
|
+
["ukmo_global_deterministic_10km", 6],
|
|
3987
|
+
["ukmo_uk_deterministic_2km", 2],
|
|
3988
|
+
["metno_nordic_pp", 2],
|
|
3989
|
+
// GEM Canada
|
|
3990
|
+
["cmc_gem_gdps", 6],
|
|
3991
|
+
["cmc_gem_rdps", 4],
|
|
3992
|
+
["cmc_gem_hrdps", 2]
|
|
3993
|
+
]);
|
|
3994
|
+
function floorToCycleMs(valueUtcMs, cycleHours) {
|
|
3995
|
+
if (cycleHours.length === 0) {
|
|
3996
|
+
throw new Error("cycleHours must be non-empty");
|
|
3997
|
+
}
|
|
3998
|
+
const d = new Date(valueUtcMs);
|
|
3999
|
+
const hour = d.getUTCHours();
|
|
4000
|
+
const sorted = [...cycleHours].sort((a, b) => a - b);
|
|
4001
|
+
const candidates = sorted.filter((h) => h <= hour);
|
|
4002
|
+
if (candidates.length > 0) {
|
|
4003
|
+
const targetHour = candidates[candidates.length - 1];
|
|
4004
|
+
return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), targetHour, 0, 0, 0);
|
|
4005
|
+
}
|
|
4006
|
+
const lastCycle = sorted[sorted.length - 1];
|
|
4007
|
+
const prior = new Date(valueUtcMs - 864e5);
|
|
4008
|
+
return Date.UTC(
|
|
4009
|
+
prior.getUTCFullYear(),
|
|
4010
|
+
prior.getUTCMonth(),
|
|
4011
|
+
prior.getUTCDate(),
|
|
4012
|
+
lastCycle,
|
|
4013
|
+
0,
|
|
4014
|
+
0,
|
|
4015
|
+
0
|
|
3365
4016
|
);
|
|
3366
4017
|
}
|
|
4018
|
+
function issuedAtFromPreviousDayMs(validAtUtcMs, N, cycleHours) {
|
|
4019
|
+
if (N < 1 || N > 7) {
|
|
4020
|
+
throw new Error(`N must be in 1..7 (Open-Meteo previous_dayN limit); got ${N}`);
|
|
4021
|
+
}
|
|
4022
|
+
return floorToCycleMs(validAtUtcMs - N * 864e5, cycleHours);
|
|
4023
|
+
}
|
|
4024
|
+
function issuedAtFromLiveCycleMathMs(nowUtcMs, publishLagHours, cycleHours) {
|
|
4025
|
+
return floorToCycleMs(nowUtcMs - publishLagHours * 36e5, cycleHours);
|
|
4026
|
+
}
|
|
3367
4027
|
|
|
3368
|
-
// ../weather/src/
|
|
3369
|
-
var
|
|
3370
|
-
|
|
3371
|
-
|
|
4028
|
+
// ../weather/src/forecasts/open-meteo.ts
|
|
4029
|
+
var OPEN_METEO_PREVIOUS_RUNS_URL = "https://previous-runs-api.open-meteo.com/v1/forecast";
|
|
4030
|
+
var OPEN_METEO_SINGLE_RUNS_URL = "https://single-runs-api.open-meteo.com/v1/forecast";
|
|
4031
|
+
var OPEN_METEO_LIVE_URL = "https://api.open-meteo.com/v1/forecast";
|
|
4032
|
+
var OPEN_METEO_SEAMLESS_URL = "https://historical-forecast-api.open-meteo.com/v1/forecast";
|
|
4033
|
+
var VALID_MODES = /* @__PURE__ */ new Set(["training", "live", "seamless"]);
|
|
4034
|
+
var HOURLY_VARIABLES = [
|
|
4035
|
+
"temperature_2m",
|
|
4036
|
+
"dew_point_2m",
|
|
4037
|
+
"apparent_temperature",
|
|
4038
|
+
"wind_speed_10m",
|
|
4039
|
+
"wind_direction_10m",
|
|
4040
|
+
"wind_gusts_10m",
|
|
4041
|
+
"precipitation",
|
|
4042
|
+
"precipitation_probability",
|
|
4043
|
+
"cloud_cover",
|
|
4044
|
+
"surface_pressure",
|
|
4045
|
+
"pressure_msl",
|
|
4046
|
+
"shortwave_radiation",
|
|
4047
|
+
"direct_radiation",
|
|
4048
|
+
"cape",
|
|
4049
|
+
"freezing_level_height",
|
|
4050
|
+
"snow_depth",
|
|
4051
|
+
"visibility",
|
|
4052
|
+
"weather_code"
|
|
4053
|
+
];
|
|
4054
|
+
var STATION_COORDS = /* @__PURE__ */ new Map([
|
|
4055
|
+
["KNYC", { lat: 40.78, lon: -73.97 }],
|
|
4056
|
+
["KORD", { lat: 41.98, lon: -87.9 }],
|
|
4057
|
+
["KDEN", { lat: 39.86, lon: -104.67 }],
|
|
4058
|
+
["KMIA", { lat: 25.79, lon: -80.29 }],
|
|
4059
|
+
["KSEA", { lat: 47.45, lon: -122.31 }]
|
|
4060
|
+
]);
|
|
4061
|
+
function resolveCoords(station) {
|
|
4062
|
+
const coords = STATION_COORDS.get(station);
|
|
4063
|
+
if (coords) return coords;
|
|
4064
|
+
throw new Error(
|
|
4065
|
+
`openMeteoForecasts: station=${JSON.stringify(station)} not in built-in coords table; add to STATION_COORDS`
|
|
4066
|
+
);
|
|
4067
|
+
}
|
|
4068
|
+
function buildHourlyParam(endpoint) {
|
|
4069
|
+
if (endpoint === OPEN_METEO_PREVIOUS_RUNS_URL) {
|
|
4070
|
+
return HOURLY_VARIABLES.map((v) => `${v}_previous_day1`).join(",");
|
|
4071
|
+
}
|
|
4072
|
+
return HOURLY_VARIABLES.join(",");
|
|
4073
|
+
}
|
|
4074
|
+
function dispatchEndpoint(mode, opts) {
|
|
4075
|
+
if (mode === "training") {
|
|
4076
|
+
return opts.issuedAt ? OPEN_METEO_SINGLE_RUNS_URL : OPEN_METEO_PREVIOUS_RUNS_URL;
|
|
4077
|
+
}
|
|
4078
|
+
if (mode === "live") {
|
|
4079
|
+
return OPEN_METEO_LIVE_URL;
|
|
4080
|
+
}
|
|
4081
|
+
if (mode === "seamless") {
|
|
4082
|
+
if (!opts.allowLeakage) {
|
|
4083
|
+
throw new OpenMeteoSeamlessLeakageError(
|
|
4084
|
+
"Open-Meteo seamless endpoint is banned for training data (see Tarabcak/mostlyright#70). Pass allowLeakage: true to opt in; LeakageDetector will still reject these rows when asOf is asserted.",
|
|
4085
|
+
{
|
|
4086
|
+
model: opts.model,
|
|
4087
|
+
endpointUrl: OPEN_METEO_SEAMLESS_URL
|
|
4088
|
+
}
|
|
4089
|
+
);
|
|
4090
|
+
}
|
|
4091
|
+
return OPEN_METEO_SEAMLESS_URL;
|
|
4092
|
+
}
|
|
4093
|
+
throw new Error(`openMeteoForecasts: unknown mode ${JSON.stringify(mode)}`);
|
|
4094
|
+
}
|
|
4095
|
+
function isoIfNotNull(ms) {
|
|
4096
|
+
return ms === null ? null : new Date(ms).toISOString();
|
|
4097
|
+
}
|
|
4098
|
+
function maybeNumber2(value) {
|
|
4099
|
+
if (value === null || value === void 0) return null;
|
|
4100
|
+
const n = typeof value === "number" ? value : Number(value);
|
|
4101
|
+
return Number.isFinite(n) ? n : null;
|
|
4102
|
+
}
|
|
4103
|
+
function pickHourlyValue(hourly, key, isPreviousRuns, idx) {
|
|
4104
|
+
const arr = isPreviousRuns ? hourly[`${key}_previous_day1`] ?? hourly[key] : hourly[key];
|
|
4105
|
+
if (!Array.isArray(arr) || idx >= arr.length) return null;
|
|
4106
|
+
return arr[idx];
|
|
4107
|
+
}
|
|
4108
|
+
async function openMeteoForecasts(station, fromDate, toDate, opts = {}) {
|
|
4109
|
+
const model = opts.model ?? "gfs_global";
|
|
4110
|
+
if (!OPEN_METEO_MODELS.has(model)) {
|
|
4111
|
+
throw new Error(
|
|
4112
|
+
`openMeteoForecasts: model must be one of OPEN_METEO_MODELS (36 keys); got ${JSON.stringify(model)}`
|
|
4113
|
+
);
|
|
4114
|
+
}
|
|
4115
|
+
const mode = opts.mode ?? "training";
|
|
4116
|
+
if (!VALID_MODES.has(mode)) {
|
|
4117
|
+
throw new Error(
|
|
4118
|
+
`openMeteoForecasts: mode must be one of training,live,seamless; got ${JSON.stringify(mode)}`
|
|
4119
|
+
);
|
|
4120
|
+
}
|
|
4121
|
+
const endpoint = dispatchEndpoint(mode, {
|
|
4122
|
+
allowLeakage: opts.allowLeakage ?? false,
|
|
4123
|
+
model,
|
|
4124
|
+
issuedAt: opts.issuedAt
|
|
4125
|
+
});
|
|
4126
|
+
const { lat, lon } = resolveCoords(station);
|
|
4127
|
+
const params = new URLSearchParams();
|
|
4128
|
+
params.set("latitude", String(lat));
|
|
4129
|
+
params.set("longitude", String(lon));
|
|
4130
|
+
params.set("start_date", fromDate);
|
|
4131
|
+
params.set("end_date", toDate);
|
|
4132
|
+
params.set("hourly", buildHourlyParam(endpoint));
|
|
4133
|
+
params.set("models", model);
|
|
4134
|
+
params.set("timezone", "UTC");
|
|
4135
|
+
if (endpoint === OPEN_METEO_SINGLE_RUNS_URL && opts.issuedAt) {
|
|
4136
|
+
params.set("run", opts.issuedAt);
|
|
4137
|
+
}
|
|
4138
|
+
const fetchFn = opts.fetchFn ?? fetch;
|
|
4139
|
+
const url = `${endpoint}?${params.toString()}`;
|
|
4140
|
+
const resp = await fetchFn(url);
|
|
4141
|
+
if (resp.status === 404) return [];
|
|
4142
|
+
if (!resp.ok) {
|
|
4143
|
+
throw new Error(`openMeteoForecasts: HTTP ${resp.status} on ${url}`);
|
|
4144
|
+
}
|
|
4145
|
+
const payload = await resp.json();
|
|
4146
|
+
const hourly = payload.hourly ?? {};
|
|
4147
|
+
const times = hourly.time ?? [];
|
|
4148
|
+
if (times.length === 0) return [];
|
|
4149
|
+
let source;
|
|
4150
|
+
if (endpoint === OPEN_METEO_PREVIOUS_RUNS_URL) {
|
|
4151
|
+
source = "open_meteo.previous_runs";
|
|
4152
|
+
} else if (endpoint === OPEN_METEO_SINGLE_RUNS_URL) {
|
|
4153
|
+
source = "open_meteo.single_run";
|
|
4154
|
+
} else if (endpoint === OPEN_METEO_LIVE_URL) {
|
|
4155
|
+
source = "open_meteo.live";
|
|
4156
|
+
} else {
|
|
4157
|
+
source = "open_meteo.seamless";
|
|
4158
|
+
}
|
|
4159
|
+
const cycleHours = CYCLE_HOURS.get(model) ?? [0, 6, 12, 18];
|
|
4160
|
+
const publishLag = PUBLISH_LAG_HOURS.get(model) ?? 6;
|
|
4161
|
+
const retrievedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
4162
|
+
const nowMs = Date.now();
|
|
4163
|
+
const rows = [];
|
|
4164
|
+
for (let i = 0; i < times.length; i++) {
|
|
4165
|
+
const tIso = times[i] ?? "";
|
|
4166
|
+
if (!tIso) continue;
|
|
4167
|
+
const validAtMs = Date.parse(tIso.endsWith("Z") || tIso.includes("+") ? tIso : `${tIso}Z`);
|
|
4168
|
+
let issuedAtMs;
|
|
4169
|
+
if (source === "open_meteo.previous_runs") {
|
|
4170
|
+
issuedAtMs = issuedAtFromPreviousDayMs(validAtMs, 1, cycleHours);
|
|
4171
|
+
} else if (source === "open_meteo.single_run") {
|
|
4172
|
+
issuedAtMs = opts.issuedAt ? Date.parse(
|
|
4173
|
+
opts.issuedAt.endsWith("Z") || opts.issuedAt.includes("+") ? opts.issuedAt : `${opts.issuedAt}Z`
|
|
4174
|
+
) : null;
|
|
4175
|
+
} else if (source === "open_meteo.live") {
|
|
4176
|
+
issuedAtMs = issuedAtFromLiveCycleMathMs(nowMs, publishLag, cycleHours);
|
|
4177
|
+
} else {
|
|
4178
|
+
issuedAtMs = null;
|
|
4179
|
+
}
|
|
4180
|
+
const validAtIso = new Date(validAtMs).toISOString();
|
|
4181
|
+
const forecastHour = issuedAtMs === null ? null : Math.round((validAtMs - issuedAtMs) / 36e5);
|
|
4182
|
+
const isPrev = source === "open_meteo.previous_runs";
|
|
4183
|
+
const h = hourly;
|
|
4184
|
+
const popPct = maybeNumber2(pickHourlyValue(h, "precipitation_probability", isPrev, i));
|
|
4185
|
+
rows.push({
|
|
4186
|
+
station,
|
|
4187
|
+
model,
|
|
4188
|
+
issuedAt: isoIfNotNull(issuedAtMs),
|
|
4189
|
+
validAt: validAtIso,
|
|
4190
|
+
forecastHour,
|
|
4191
|
+
tempC: maybeNumber2(pickHourlyValue(h, "temperature_2m", isPrev, i)),
|
|
4192
|
+
dewPointC: maybeNumber2(pickHourlyValue(h, "dew_point_2m", isPrev, i)),
|
|
4193
|
+
apparentTempC: maybeNumber2(pickHourlyValue(h, "apparent_temperature", isPrev, i)),
|
|
4194
|
+
windSpeedMs: maybeNumber2(pickHourlyValue(h, "wind_speed_10m", isPrev, i)),
|
|
4195
|
+
windDirDeg: maybeNumber2(pickHourlyValue(h, "wind_direction_10m", isPrev, i)),
|
|
4196
|
+
windGustsMs: maybeNumber2(pickHourlyValue(h, "wind_gusts_10m", isPrev, i)),
|
|
4197
|
+
precipProbability: popPct === null ? null : popPct / 100,
|
|
4198
|
+
precipitationMm: maybeNumber2(pickHourlyValue(h, "precipitation", isPrev, i)),
|
|
4199
|
+
cloudCoverPct: maybeNumber2(pickHourlyValue(h, "cloud_cover", isPrev, i)),
|
|
4200
|
+
surfacePressureHpa: maybeNumber2(pickHourlyValue(h, "surface_pressure", isPrev, i)),
|
|
4201
|
+
pressureMslHpa: maybeNumber2(pickHourlyValue(h, "pressure_msl", isPrev, i)),
|
|
4202
|
+
shortwaveRadiationWm2: maybeNumber2(pickHourlyValue(h, "shortwave_radiation", isPrev, i)),
|
|
4203
|
+
directRadiationWm2: maybeNumber2(pickHourlyValue(h, "direct_radiation", isPrev, i)),
|
|
4204
|
+
capeJkg: maybeNumber2(pickHourlyValue(h, "cape", isPrev, i)),
|
|
4205
|
+
freezingLevelM: maybeNumber2(pickHourlyValue(h, "freezing_level_height", isPrev, i)),
|
|
4206
|
+
snowDepthM: maybeNumber2(pickHourlyValue(h, "snow_depth", isPrev, i)),
|
|
4207
|
+
visibilityM: maybeNumber2(pickHourlyValue(h, "visibility", isPrev, i)),
|
|
4208
|
+
weatherCode: maybeNumber2(pickHourlyValue(h, "weather_code", isPrev, i)),
|
|
4209
|
+
source,
|
|
4210
|
+
retrievedAt
|
|
4211
|
+
});
|
|
4212
|
+
}
|
|
4213
|
+
return rows;
|
|
3372
4214
|
}
|
|
3373
4215
|
|
|
3374
|
-
// ../
|
|
3375
|
-
|
|
3376
|
-
__export(src_exports3, {
|
|
3377
|
-
ContractIdError: () => ContractIdError,
|
|
3378
|
-
KALSHI_SETTLEMENT_STATIONS: () => KALSHI_SETTLEMENT_STATIONS,
|
|
3379
|
-
KNOWN_WRONG_STATIONS: () => KNOWN_WRONG_STATIONS,
|
|
3380
|
-
POLYMARKET_CITY_STATIONS: () => POLYMARKET_CITY_STATIONS,
|
|
3381
|
-
helloMarkets: () => helloMarkets,
|
|
3382
|
-
kalshiNhighResolve: () => kalshiNhighResolve,
|
|
3383
|
-
kalshiNlowResolve: () => kalshiNlowResolve,
|
|
3384
|
-
kalshiSettlementFor: () => kalshiSettlementFor,
|
|
3385
|
-
version: () => version3
|
|
3386
|
-
});
|
|
4216
|
+
// ../weather/src/dailyExtremes.ts
|
|
4217
|
+
init_src();
|
|
3387
4218
|
|
|
3388
|
-
// ../
|
|
3389
|
-
var
|
|
3390
|
-
|
|
3391
|
-
|
|
3392
|
-
|
|
4219
|
+
// ../core/dist/discovery/index.mjs
|
|
4220
|
+
var STATIONS2 = [
|
|
4221
|
+
{
|
|
4222
|
+
code: "EDDB",
|
|
4223
|
+
country: "DE",
|
|
4224
|
+
ghcnh_id: null,
|
|
4225
|
+
icao: "EDDB",
|
|
4226
|
+
latitude: 52.3667,
|
|
4227
|
+
longitude: 13.5033,
|
|
4228
|
+
name: "Berlin Brandenburg",
|
|
4229
|
+
tz: "Europe/Berlin",
|
|
4230
|
+
venues: [
|
|
4231
|
+
"polymarket"
|
|
4232
|
+
]
|
|
3393
4233
|
},
|
|
3394
|
-
|
|
3395
|
-
|
|
3396
|
-
|
|
4234
|
+
{
|
|
4235
|
+
code: "EDDF",
|
|
4236
|
+
country: "DE",
|
|
4237
|
+
ghcnh_id: null,
|
|
4238
|
+
icao: "EDDF",
|
|
4239
|
+
latitude: 50.0379,
|
|
4240
|
+
longitude: 8.5622,
|
|
4241
|
+
name: "Frankfurt am Main",
|
|
4242
|
+
tz: "Europe/Berlin",
|
|
4243
|
+
venues: [
|
|
4244
|
+
"polymarket"
|
|
4245
|
+
]
|
|
3397
4246
|
},
|
|
3398
|
-
|
|
3399
|
-
|
|
3400
|
-
|
|
4247
|
+
{
|
|
4248
|
+
code: "EDDM",
|
|
4249
|
+
country: "DE",
|
|
4250
|
+
ghcnh_id: null,
|
|
4251
|
+
icao: "EDDM",
|
|
4252
|
+
latitude: 48.3538,
|
|
4253
|
+
longitude: 11.7861,
|
|
4254
|
+
name: "Munich Franz Josef Strauss",
|
|
4255
|
+
tz: "Europe/Berlin",
|
|
4256
|
+
venues: [
|
|
4257
|
+
"polymarket"
|
|
4258
|
+
]
|
|
3401
4259
|
},
|
|
3402
|
-
|
|
3403
|
-
|
|
3404
|
-
|
|
4260
|
+
{
|
|
4261
|
+
code: "EFHK",
|
|
4262
|
+
country: "FI",
|
|
4263
|
+
ghcnh_id: null,
|
|
4264
|
+
icao: "EFHK",
|
|
4265
|
+
latitude: 60.3172,
|
|
4266
|
+
longitude: 24.9633,
|
|
4267
|
+
name: "Helsinki-Vantaa",
|
|
4268
|
+
tz: "Europe/Helsinki",
|
|
4269
|
+
venues: [
|
|
4270
|
+
"polymarket"
|
|
4271
|
+
]
|
|
3405
4272
|
},
|
|
3406
|
-
|
|
3407
|
-
|
|
3408
|
-
|
|
4273
|
+
{
|
|
4274
|
+
code: "EGKK",
|
|
4275
|
+
country: "GB",
|
|
4276
|
+
ghcnh_id: null,
|
|
4277
|
+
icao: "EGKK",
|
|
4278
|
+
latitude: 51.1481,
|
|
4279
|
+
longitude: -0.1903,
|
|
4280
|
+
name: "London Gatwick",
|
|
4281
|
+
tz: "Europe/London",
|
|
4282
|
+
venues: [
|
|
4283
|
+
"polymarket"
|
|
4284
|
+
]
|
|
3409
4285
|
},
|
|
3410
|
-
|
|
3411
|
-
|
|
3412
|
-
|
|
4286
|
+
{
|
|
4287
|
+
code: "EGLL",
|
|
4288
|
+
country: "GB",
|
|
4289
|
+
ghcnh_id: null,
|
|
4290
|
+
icao: "EGLL",
|
|
4291
|
+
latitude: 51.4706,
|
|
4292
|
+
longitude: -0.4619,
|
|
4293
|
+
name: "London Heathrow",
|
|
4294
|
+
tz: "Europe/London",
|
|
4295
|
+
venues: [
|
|
4296
|
+
"polymarket"
|
|
4297
|
+
]
|
|
3413
4298
|
},
|
|
3414
|
-
|
|
3415
|
-
|
|
3416
|
-
|
|
4299
|
+
{
|
|
4300
|
+
code: "EHAM",
|
|
4301
|
+
country: "NL",
|
|
4302
|
+
ghcnh_id: null,
|
|
4303
|
+
icao: "EHAM",
|
|
4304
|
+
latitude: 52.3086,
|
|
4305
|
+
longitude: 4.7639,
|
|
4306
|
+
name: "Amsterdam Schiphol",
|
|
4307
|
+
tz: "Europe/Amsterdam",
|
|
4308
|
+
venues: [
|
|
4309
|
+
"polymarket"
|
|
4310
|
+
]
|
|
3417
4311
|
},
|
|
3418
|
-
|
|
3419
|
-
|
|
3420
|
-
|
|
4312
|
+
{
|
|
4313
|
+
code: "EKCH",
|
|
4314
|
+
country: "DK",
|
|
4315
|
+
ghcnh_id: null,
|
|
4316
|
+
icao: "EKCH",
|
|
4317
|
+
latitude: 55.6181,
|
|
4318
|
+
longitude: 12.6561,
|
|
4319
|
+
name: "Copenhagen Kastrup",
|
|
4320
|
+
tz: "Europe/Copenhagen",
|
|
4321
|
+
venues: [
|
|
4322
|
+
"polymarket"
|
|
4323
|
+
]
|
|
3421
4324
|
},
|
|
3422
|
-
|
|
3423
|
-
|
|
3424
|
-
|
|
4325
|
+
{
|
|
4326
|
+
code: "EPWA",
|
|
4327
|
+
country: "PL",
|
|
4328
|
+
ghcnh_id: null,
|
|
4329
|
+
icao: "EPWA",
|
|
4330
|
+
latitude: 52.1657,
|
|
4331
|
+
longitude: 20.9671,
|
|
4332
|
+
name: "Warsaw Chopin",
|
|
4333
|
+
tz: "Europe/Warsaw",
|
|
4334
|
+
venues: [
|
|
4335
|
+
"polymarket"
|
|
4336
|
+
]
|
|
3425
4337
|
},
|
|
3426
|
-
|
|
3427
|
-
|
|
4338
|
+
{
|
|
4339
|
+
code: "ESSA",
|
|
4340
|
+
country: "SE",
|
|
4341
|
+
ghcnh_id: null,
|
|
4342
|
+
icao: "ESSA",
|
|
4343
|
+
latitude: 59.6519,
|
|
4344
|
+
longitude: 17.9186,
|
|
4345
|
+
name: "Stockholm Arlanda",
|
|
4346
|
+
tz: "Europe/Stockholm",
|
|
4347
|
+
venues: [
|
|
4348
|
+
"polymarket"
|
|
4349
|
+
]
|
|
4350
|
+
},
|
|
4351
|
+
{
|
|
4352
|
+
code: "ATL",
|
|
4353
|
+
country: "US",
|
|
4354
|
+
ghcnh_id: "USW00013874",
|
|
4355
|
+
icao: "KATL",
|
|
4356
|
+
latitude: 33.6407,
|
|
4357
|
+
longitude: -84.4277,
|
|
4358
|
+
name: "Hartsfield-Jackson Atlanta International",
|
|
4359
|
+
tz: "America/New_York",
|
|
4360
|
+
venues: [
|
|
4361
|
+
"kalshi",
|
|
4362
|
+
"polymarket"
|
|
4363
|
+
]
|
|
4364
|
+
},
|
|
4365
|
+
{
|
|
4366
|
+
code: "AUS",
|
|
4367
|
+
country: "US",
|
|
4368
|
+
ghcnh_id: "USW00013904",
|
|
4369
|
+
icao: "KAUS",
|
|
4370
|
+
latitude: 30.1975,
|
|
4371
|
+
longitude: -97.6664,
|
|
4372
|
+
name: "Austin-Bergstrom International",
|
|
4373
|
+
tz: "America/Chicago",
|
|
4374
|
+
venues: [
|
|
4375
|
+
"kalshi",
|
|
4376
|
+
"polymarket"
|
|
4377
|
+
]
|
|
4378
|
+
},
|
|
4379
|
+
{
|
|
4380
|
+
code: "BNA",
|
|
4381
|
+
country: "US",
|
|
4382
|
+
ghcnh_id: "USW00013897",
|
|
4383
|
+
icao: "KBNA",
|
|
4384
|
+
latitude: 36.1245,
|
|
4385
|
+
longitude: -86.6782,
|
|
4386
|
+
name: "Nashville International",
|
|
4387
|
+
tz: "America/Chicago",
|
|
4388
|
+
venues: [
|
|
4389
|
+
"kalshi"
|
|
4390
|
+
]
|
|
4391
|
+
},
|
|
4392
|
+
{
|
|
4393
|
+
code: "BOS",
|
|
4394
|
+
country: "US",
|
|
4395
|
+
ghcnh_id: "USW00014739",
|
|
4396
|
+
icao: "KBOS",
|
|
4397
|
+
latitude: 42.3656,
|
|
4398
|
+
longitude: -71.0096,
|
|
4399
|
+
name: "Boston Logan International",
|
|
4400
|
+
tz: "America/New_York",
|
|
4401
|
+
venues: [
|
|
4402
|
+
"kalshi",
|
|
4403
|
+
"polymarket"
|
|
4404
|
+
]
|
|
4405
|
+
},
|
|
4406
|
+
{
|
|
4407
|
+
code: "CVG",
|
|
4408
|
+
country: "US",
|
|
4409
|
+
ghcnh_id: "USW00093814",
|
|
4410
|
+
icao: "KCVG",
|
|
4411
|
+
latitude: 39.0488,
|
|
4412
|
+
longitude: -84.6678,
|
|
4413
|
+
name: "Cincinnati/Northern Kentucky International",
|
|
4414
|
+
tz: "America/New_York",
|
|
4415
|
+
venues: [
|
|
4416
|
+
"kalshi"
|
|
4417
|
+
]
|
|
4418
|
+
},
|
|
4419
|
+
{
|
|
4420
|
+
code: "DCA",
|
|
4421
|
+
country: "US",
|
|
4422
|
+
ghcnh_id: "USW00013743",
|
|
4423
|
+
icao: "KDCA",
|
|
4424
|
+
latitude: 38.8512,
|
|
4425
|
+
longitude: -77.0402,
|
|
4426
|
+
name: "Washington Reagan National",
|
|
4427
|
+
tz: "America/New_York",
|
|
4428
|
+
venues: [
|
|
4429
|
+
"kalshi",
|
|
4430
|
+
"polymarket"
|
|
4431
|
+
]
|
|
4432
|
+
},
|
|
4433
|
+
{
|
|
4434
|
+
code: "DEN",
|
|
4435
|
+
country: "US",
|
|
4436
|
+
ghcnh_id: "USW00003017",
|
|
4437
|
+
icao: "KDEN",
|
|
4438
|
+
latitude: 39.8561,
|
|
4439
|
+
longitude: -104.6737,
|
|
4440
|
+
name: "Denver International",
|
|
4441
|
+
tz: "America/Denver",
|
|
4442
|
+
venues: [
|
|
4443
|
+
"kalshi",
|
|
4444
|
+
"polymarket"
|
|
4445
|
+
]
|
|
4446
|
+
},
|
|
4447
|
+
{
|
|
4448
|
+
code: "DFW",
|
|
4449
|
+
country: "US",
|
|
4450
|
+
ghcnh_id: "USW00003927",
|
|
4451
|
+
icao: "KDFW",
|
|
4452
|
+
latitude: 32.8998,
|
|
4453
|
+
longitude: -97.0403,
|
|
4454
|
+
name: "Dallas-Fort Worth International",
|
|
4455
|
+
tz: "America/Chicago",
|
|
4456
|
+
venues: [
|
|
4457
|
+
"kalshi",
|
|
4458
|
+
"polymarket"
|
|
4459
|
+
]
|
|
4460
|
+
},
|
|
4461
|
+
{
|
|
4462
|
+
code: "DTW",
|
|
4463
|
+
country: "US",
|
|
4464
|
+
ghcnh_id: "USW00094847",
|
|
4465
|
+
icao: "KDTW",
|
|
4466
|
+
latitude: 42.2124,
|
|
4467
|
+
longitude: -83.3534,
|
|
4468
|
+
name: "Detroit Metropolitan Wayne County",
|
|
4469
|
+
tz: "America/New_York",
|
|
4470
|
+
venues: [
|
|
4471
|
+
"kalshi",
|
|
4472
|
+
"polymarket"
|
|
4473
|
+
]
|
|
4474
|
+
},
|
|
4475
|
+
{
|
|
4476
|
+
code: "HOU",
|
|
4477
|
+
country: "US",
|
|
4478
|
+
ghcnh_id: "USW00012918",
|
|
4479
|
+
icao: "KHOU",
|
|
4480
|
+
latitude: 29.6454,
|
|
4481
|
+
longitude: -95.2789,
|
|
4482
|
+
name: "Houston Hobby",
|
|
4483
|
+
tz: "America/Chicago",
|
|
4484
|
+
venues: []
|
|
4485
|
+
},
|
|
4486
|
+
{
|
|
4487
|
+
code: "IAH",
|
|
4488
|
+
country: "US",
|
|
4489
|
+
ghcnh_id: "USW00012960",
|
|
4490
|
+
icao: "KIAH",
|
|
4491
|
+
latitude: 29.9844,
|
|
4492
|
+
longitude: -95.3414,
|
|
4493
|
+
name: "Houston George Bush Intercontinental",
|
|
4494
|
+
tz: "America/Chicago",
|
|
4495
|
+
venues: [
|
|
4496
|
+
"kalshi",
|
|
4497
|
+
"polymarket"
|
|
4498
|
+
]
|
|
4499
|
+
},
|
|
4500
|
+
{
|
|
4501
|
+
code: "LAS",
|
|
4502
|
+
country: "US",
|
|
4503
|
+
ghcnh_id: "USW00023169",
|
|
4504
|
+
icao: "KLAS",
|
|
4505
|
+
latitude: 36.084,
|
|
4506
|
+
longitude: -115.1537,
|
|
4507
|
+
name: "Harry Reid (McCarran) International",
|
|
4508
|
+
tz: "America/Los_Angeles",
|
|
4509
|
+
venues: [
|
|
4510
|
+
"kalshi"
|
|
4511
|
+
]
|
|
4512
|
+
},
|
|
4513
|
+
{
|
|
4514
|
+
code: "LAX",
|
|
4515
|
+
country: "US",
|
|
4516
|
+
ghcnh_id: "USW00023174",
|
|
4517
|
+
icao: "KLAX",
|
|
4518
|
+
latitude: 33.9425,
|
|
4519
|
+
longitude: -118.4081,
|
|
4520
|
+
name: "Los Angeles International",
|
|
4521
|
+
tz: "America/Los_Angeles",
|
|
4522
|
+
venues: [
|
|
4523
|
+
"kalshi",
|
|
4524
|
+
"polymarket"
|
|
4525
|
+
]
|
|
4526
|
+
},
|
|
4527
|
+
{
|
|
4528
|
+
code: "MDW",
|
|
4529
|
+
country: "US",
|
|
4530
|
+
ghcnh_id: "USW00014819",
|
|
4531
|
+
icao: "KMDW",
|
|
4532
|
+
latitude: 41.7868,
|
|
4533
|
+
longitude: -87.7522,
|
|
4534
|
+
name: "Chicago Midway International",
|
|
4535
|
+
tz: "America/Chicago",
|
|
4536
|
+
venues: [
|
|
4537
|
+
"kalshi"
|
|
4538
|
+
]
|
|
4539
|
+
},
|
|
4540
|
+
{
|
|
4541
|
+
code: "MIA",
|
|
4542
|
+
country: "US",
|
|
4543
|
+
ghcnh_id: "USW00012839",
|
|
4544
|
+
icao: "KMIA",
|
|
4545
|
+
latitude: 25.7959,
|
|
4546
|
+
longitude: -80.287,
|
|
4547
|
+
name: "Miami International",
|
|
4548
|
+
tz: "America/New_York",
|
|
4549
|
+
venues: [
|
|
4550
|
+
"kalshi",
|
|
4551
|
+
"polymarket"
|
|
4552
|
+
]
|
|
4553
|
+
},
|
|
4554
|
+
{
|
|
4555
|
+
code: "MSP",
|
|
4556
|
+
country: "US",
|
|
4557
|
+
ghcnh_id: "USW00014922",
|
|
4558
|
+
icao: "KMSP",
|
|
4559
|
+
latitude: 44.8848,
|
|
4560
|
+
longitude: -93.2223,
|
|
4561
|
+
name: "Minneapolis-St Paul International",
|
|
4562
|
+
tz: "America/Chicago",
|
|
4563
|
+
venues: [
|
|
4564
|
+
"kalshi",
|
|
4565
|
+
"polymarket"
|
|
4566
|
+
]
|
|
4567
|
+
},
|
|
4568
|
+
{
|
|
4569
|
+
code: "MSY",
|
|
4570
|
+
country: "US",
|
|
4571
|
+
ghcnh_id: "USW00012916",
|
|
4572
|
+
icao: "KMSY",
|
|
4573
|
+
latitude: 29.9934,
|
|
4574
|
+
longitude: -90.258,
|
|
4575
|
+
name: "New Orleans Louis Armstrong International",
|
|
4576
|
+
tz: "America/Chicago",
|
|
4577
|
+
venues: []
|
|
4578
|
+
},
|
|
4579
|
+
{
|
|
4580
|
+
code: "NYC",
|
|
4581
|
+
country: "US",
|
|
4582
|
+
ghcnh_id: "USW00094728",
|
|
4583
|
+
icao: "KNYC",
|
|
4584
|
+
latitude: 40.7789,
|
|
4585
|
+
longitude: -73.9692,
|
|
4586
|
+
name: "Central Park, New York",
|
|
4587
|
+
tz: "America/New_York",
|
|
4588
|
+
venues: [
|
|
4589
|
+
"kalshi"
|
|
4590
|
+
]
|
|
4591
|
+
},
|
|
4592
|
+
{
|
|
4593
|
+
code: "OKC",
|
|
4594
|
+
country: "US",
|
|
4595
|
+
ghcnh_id: "USW00013967",
|
|
4596
|
+
icao: "KOKC",
|
|
4597
|
+
latitude: 35.3931,
|
|
4598
|
+
longitude: -97.6007,
|
|
4599
|
+
name: "Oklahoma City Will Rogers World",
|
|
4600
|
+
tz: "America/Chicago",
|
|
4601
|
+
venues: []
|
|
4602
|
+
},
|
|
4603
|
+
{
|
|
4604
|
+
code: "PHL",
|
|
4605
|
+
country: "US",
|
|
4606
|
+
ghcnh_id: "USW00013739",
|
|
4607
|
+
icao: "KPHL",
|
|
4608
|
+
latitude: 39.8721,
|
|
4609
|
+
longitude: -75.2411,
|
|
4610
|
+
name: "Philadelphia International",
|
|
4611
|
+
tz: "America/New_York",
|
|
4612
|
+
venues: [
|
|
4613
|
+
"kalshi",
|
|
4614
|
+
"polymarket"
|
|
4615
|
+
]
|
|
4616
|
+
},
|
|
4617
|
+
{
|
|
4618
|
+
code: "PHX",
|
|
4619
|
+
country: "US",
|
|
4620
|
+
ghcnh_id: "USW00023183",
|
|
4621
|
+
icao: "KPHX",
|
|
4622
|
+
latitude: 33.4373,
|
|
4623
|
+
longitude: -112.0078,
|
|
4624
|
+
name: "Phoenix Sky Harbor International",
|
|
4625
|
+
tz: "America/Phoenix",
|
|
4626
|
+
venues: [
|
|
4627
|
+
"kalshi",
|
|
4628
|
+
"polymarket"
|
|
4629
|
+
]
|
|
4630
|
+
},
|
|
4631
|
+
{
|
|
4632
|
+
code: "SAT",
|
|
4633
|
+
country: "US",
|
|
4634
|
+
ghcnh_id: "USW00012921",
|
|
4635
|
+
icao: "KSAT",
|
|
4636
|
+
latitude: 29.5337,
|
|
4637
|
+
longitude: -98.4698,
|
|
4638
|
+
name: "San Antonio International",
|
|
4639
|
+
tz: "America/Chicago",
|
|
4640
|
+
venues: []
|
|
4641
|
+
},
|
|
4642
|
+
{
|
|
4643
|
+
code: "SEA",
|
|
4644
|
+
country: "US",
|
|
4645
|
+
ghcnh_id: "USW00024233",
|
|
4646
|
+
icao: "KSEA",
|
|
4647
|
+
latitude: 47.4502,
|
|
4648
|
+
longitude: -122.3088,
|
|
4649
|
+
name: "Seattle-Tacoma International",
|
|
4650
|
+
tz: "America/Los_Angeles",
|
|
4651
|
+
venues: [
|
|
4652
|
+
"kalshi",
|
|
4653
|
+
"polymarket"
|
|
4654
|
+
]
|
|
4655
|
+
},
|
|
4656
|
+
{
|
|
4657
|
+
code: "SFO",
|
|
4658
|
+
country: "US",
|
|
4659
|
+
ghcnh_id: "USW00023234",
|
|
4660
|
+
icao: "KSFO",
|
|
4661
|
+
latitude: 37.6213,
|
|
4662
|
+
longitude: -122.379,
|
|
4663
|
+
name: "San Francisco International",
|
|
4664
|
+
tz: "America/Los_Angeles",
|
|
4665
|
+
venues: [
|
|
4666
|
+
"kalshi",
|
|
4667
|
+
"polymarket"
|
|
4668
|
+
]
|
|
4669
|
+
},
|
|
4670
|
+
{
|
|
4671
|
+
code: "SLC",
|
|
4672
|
+
country: "US",
|
|
4673
|
+
ghcnh_id: "USW00024127",
|
|
4674
|
+
icao: "KSLC",
|
|
4675
|
+
latitude: 40.7884,
|
|
4676
|
+
longitude: -111.9778,
|
|
4677
|
+
name: "Salt Lake City International",
|
|
4678
|
+
tz: "America/Denver",
|
|
4679
|
+
venues: [
|
|
4680
|
+
"kalshi"
|
|
4681
|
+
]
|
|
4682
|
+
},
|
|
4683
|
+
{
|
|
4684
|
+
code: "LEBL",
|
|
4685
|
+
country: "ES",
|
|
4686
|
+
ghcnh_id: null,
|
|
4687
|
+
icao: "LEBL",
|
|
4688
|
+
latitude: 41.2974,
|
|
4689
|
+
longitude: 2.0833,
|
|
4690
|
+
name: "Barcelona El Prat",
|
|
4691
|
+
tz: "Europe/Madrid",
|
|
4692
|
+
venues: [
|
|
4693
|
+
"polymarket"
|
|
4694
|
+
]
|
|
4695
|
+
},
|
|
4696
|
+
{
|
|
4697
|
+
code: "LEMD",
|
|
4698
|
+
country: "ES",
|
|
4699
|
+
ghcnh_id: null,
|
|
4700
|
+
icao: "LEMD",
|
|
4701
|
+
latitude: 40.4719,
|
|
4702
|
+
longitude: -3.5626,
|
|
4703
|
+
name: "Madrid Barajas",
|
|
4704
|
+
tz: "Europe/Madrid",
|
|
4705
|
+
venues: [
|
|
4706
|
+
"polymarket"
|
|
4707
|
+
]
|
|
4708
|
+
},
|
|
4709
|
+
{
|
|
4710
|
+
code: "LFPB",
|
|
4711
|
+
country: "FR",
|
|
4712
|
+
ghcnh_id: null,
|
|
4713
|
+
icao: "LFPB",
|
|
4714
|
+
latitude: 48.9694,
|
|
4715
|
+
longitude: 2.4414,
|
|
4716
|
+
name: "Paris Le Bourget",
|
|
4717
|
+
tz: "Europe/Paris",
|
|
4718
|
+
venues: [
|
|
4719
|
+
"polymarket"
|
|
4720
|
+
]
|
|
4721
|
+
},
|
|
4722
|
+
{
|
|
4723
|
+
code: "LFPG",
|
|
4724
|
+
country: "FR",
|
|
4725
|
+
ghcnh_id: null,
|
|
4726
|
+
icao: "LFPG",
|
|
4727
|
+
latitude: 49.0097,
|
|
4728
|
+
longitude: 2.5479,
|
|
4729
|
+
name: "Paris Charles de Gaulle",
|
|
4730
|
+
tz: "Europe/Paris",
|
|
4731
|
+
venues: [
|
|
4732
|
+
"polymarket"
|
|
4733
|
+
]
|
|
4734
|
+
},
|
|
4735
|
+
{
|
|
4736
|
+
code: "LFPO",
|
|
4737
|
+
country: "FR",
|
|
4738
|
+
ghcnh_id: null,
|
|
4739
|
+
icao: "LFPO",
|
|
4740
|
+
latitude: 48.7233,
|
|
4741
|
+
longitude: 2.3794,
|
|
4742
|
+
name: "Paris Orly",
|
|
4743
|
+
tz: "Europe/Paris",
|
|
4744
|
+
venues: [
|
|
4745
|
+
"polymarket"
|
|
4746
|
+
]
|
|
4747
|
+
},
|
|
4748
|
+
{
|
|
4749
|
+
code: "LIMC",
|
|
4750
|
+
country: "IT",
|
|
4751
|
+
ghcnh_id: null,
|
|
4752
|
+
icao: "LIMC",
|
|
4753
|
+
latitude: 45.6306,
|
|
4754
|
+
longitude: 8.7281,
|
|
4755
|
+
name: "Milan Malpensa",
|
|
4756
|
+
tz: "Europe/Rome",
|
|
4757
|
+
venues: [
|
|
4758
|
+
"polymarket"
|
|
4759
|
+
]
|
|
4760
|
+
},
|
|
4761
|
+
{
|
|
4762
|
+
code: "LIRF",
|
|
4763
|
+
country: "IT",
|
|
4764
|
+
ghcnh_id: null,
|
|
4765
|
+
icao: "LIRF",
|
|
4766
|
+
latitude: 41.8003,
|
|
4767
|
+
longitude: 12.2389,
|
|
4768
|
+
name: "Rome Fiumicino",
|
|
4769
|
+
tz: "Europe/Rome",
|
|
4770
|
+
venues: [
|
|
4771
|
+
"polymarket"
|
|
4772
|
+
]
|
|
4773
|
+
},
|
|
4774
|
+
{
|
|
4775
|
+
code: "LOWW",
|
|
4776
|
+
country: "AT",
|
|
4777
|
+
ghcnh_id: null,
|
|
4778
|
+
icao: "LOWW",
|
|
4779
|
+
latitude: 48.1103,
|
|
4780
|
+
longitude: 16.5697,
|
|
4781
|
+
name: "Vienna International",
|
|
4782
|
+
tz: "Europe/Vienna",
|
|
4783
|
+
venues: [
|
|
4784
|
+
"polymarket"
|
|
4785
|
+
]
|
|
4786
|
+
},
|
|
4787
|
+
{
|
|
4788
|
+
code: "LSZH",
|
|
4789
|
+
country: "CH",
|
|
4790
|
+
ghcnh_id: null,
|
|
4791
|
+
icao: "LSZH",
|
|
4792
|
+
latitude: 47.4647,
|
|
4793
|
+
longitude: 8.5492,
|
|
4794
|
+
name: "Zurich",
|
|
4795
|
+
tz: "Europe/Zurich",
|
|
4796
|
+
venues: [
|
|
4797
|
+
"polymarket"
|
|
4798
|
+
]
|
|
4799
|
+
},
|
|
4800
|
+
{
|
|
4801
|
+
code: "NZAA",
|
|
4802
|
+
country: "NZ",
|
|
4803
|
+
ghcnh_id: null,
|
|
4804
|
+
icao: "NZAA",
|
|
4805
|
+
latitude: -37.0081,
|
|
4806
|
+
longitude: 174.7917,
|
|
4807
|
+
name: "Auckland",
|
|
4808
|
+
tz: "Pacific/Auckland",
|
|
4809
|
+
venues: [
|
|
4810
|
+
"polymarket"
|
|
4811
|
+
]
|
|
4812
|
+
},
|
|
4813
|
+
{
|
|
4814
|
+
code: "NZWN",
|
|
4815
|
+
country: "NZ",
|
|
4816
|
+
ghcnh_id: null,
|
|
4817
|
+
icao: "NZWN",
|
|
4818
|
+
latitude: -41.3272,
|
|
4819
|
+
longitude: 174.8053,
|
|
4820
|
+
name: "Wellington",
|
|
4821
|
+
tz: "Pacific/Auckland",
|
|
4822
|
+
venues: [
|
|
4823
|
+
"polymarket"
|
|
4824
|
+
]
|
|
4825
|
+
},
|
|
4826
|
+
{
|
|
4827
|
+
code: "OERK",
|
|
4828
|
+
country: "SA",
|
|
4829
|
+
ghcnh_id: null,
|
|
4830
|
+
icao: "OERK",
|
|
4831
|
+
latitude: 24.9576,
|
|
4832
|
+
longitude: 46.6988,
|
|
4833
|
+
name: "Riyadh King Khalid International",
|
|
4834
|
+
tz: "Asia/Riyadh",
|
|
4835
|
+
venues: [
|
|
4836
|
+
"polymarket"
|
|
4837
|
+
]
|
|
4838
|
+
},
|
|
4839
|
+
{
|
|
4840
|
+
code: "OMDB",
|
|
4841
|
+
country: "AE",
|
|
4842
|
+
ghcnh_id: null,
|
|
4843
|
+
icao: "OMDB",
|
|
4844
|
+
latitude: 25.2532,
|
|
4845
|
+
longitude: 55.3657,
|
|
4846
|
+
name: "Dubai International",
|
|
4847
|
+
tz: "Asia/Dubai",
|
|
4848
|
+
venues: [
|
|
4849
|
+
"polymarket"
|
|
4850
|
+
]
|
|
4851
|
+
},
|
|
4852
|
+
{
|
|
4853
|
+
code: "OTHH",
|
|
4854
|
+
country: "QA",
|
|
4855
|
+
ghcnh_id: null,
|
|
4856
|
+
icao: "OTHH",
|
|
4857
|
+
latitude: 25.2731,
|
|
4858
|
+
longitude: 51.608,
|
|
4859
|
+
name: "Doha Hamad International",
|
|
4860
|
+
tz: "Asia/Qatar",
|
|
4861
|
+
venues: [
|
|
4862
|
+
"polymarket"
|
|
4863
|
+
]
|
|
4864
|
+
},
|
|
4865
|
+
{
|
|
4866
|
+
code: "RCTP",
|
|
4867
|
+
country: "TW",
|
|
4868
|
+
ghcnh_id: null,
|
|
4869
|
+
icao: "RCTP",
|
|
4870
|
+
latitude: 25.0777,
|
|
4871
|
+
longitude: 121.2328,
|
|
4872
|
+
name: "Taipei Taoyuan",
|
|
4873
|
+
tz: "Asia/Taipei",
|
|
4874
|
+
venues: [
|
|
4875
|
+
"polymarket"
|
|
4876
|
+
]
|
|
4877
|
+
},
|
|
4878
|
+
{
|
|
4879
|
+
code: "RJAA",
|
|
4880
|
+
country: "JP",
|
|
4881
|
+
ghcnh_id: null,
|
|
4882
|
+
icao: "RJAA",
|
|
4883
|
+
latitude: 35.7647,
|
|
4884
|
+
longitude: 140.3864,
|
|
4885
|
+
name: "Tokyo Narita",
|
|
4886
|
+
tz: "Asia/Tokyo",
|
|
4887
|
+
venues: [
|
|
4888
|
+
"polymarket"
|
|
4889
|
+
]
|
|
4890
|
+
},
|
|
4891
|
+
{
|
|
4892
|
+
code: "RJTT",
|
|
4893
|
+
country: "JP",
|
|
4894
|
+
ghcnh_id: null,
|
|
4895
|
+
icao: "RJTT",
|
|
4896
|
+
latitude: 35.5522,
|
|
4897
|
+
longitude: 139.78,
|
|
4898
|
+
name: "Tokyo Haneda",
|
|
4899
|
+
tz: "Asia/Tokyo",
|
|
4900
|
+
venues: [
|
|
4901
|
+
"polymarket"
|
|
4902
|
+
]
|
|
4903
|
+
},
|
|
4904
|
+
{
|
|
4905
|
+
code: "RKSI",
|
|
4906
|
+
country: "KR",
|
|
4907
|
+
ghcnh_id: null,
|
|
4908
|
+
icao: "RKSI",
|
|
4909
|
+
latitude: 37.4691,
|
|
4910
|
+
longitude: 126.4505,
|
|
4911
|
+
name: "Seoul Incheon",
|
|
4912
|
+
tz: "Asia/Seoul",
|
|
4913
|
+
venues: [
|
|
4914
|
+
"polymarket"
|
|
4915
|
+
]
|
|
4916
|
+
},
|
|
4917
|
+
{
|
|
4918
|
+
code: "SAEZ",
|
|
4919
|
+
country: "AR",
|
|
4920
|
+
ghcnh_id: null,
|
|
4921
|
+
icao: "SAEZ",
|
|
4922
|
+
latitude: -34.8222,
|
|
4923
|
+
longitude: -58.5358,
|
|
4924
|
+
name: "Buenos Aires Ezeiza",
|
|
4925
|
+
tz: "America/Argentina/Buenos_Aires",
|
|
4926
|
+
venues: [
|
|
4927
|
+
"polymarket"
|
|
4928
|
+
]
|
|
4929
|
+
},
|
|
4930
|
+
{
|
|
4931
|
+
code: "SBGR",
|
|
4932
|
+
country: "BR",
|
|
4933
|
+
ghcnh_id: null,
|
|
4934
|
+
icao: "SBGR",
|
|
4935
|
+
latitude: -23.4356,
|
|
4936
|
+
longitude: -46.4731,
|
|
4937
|
+
name: "S\xE3o Paulo Guarulhos",
|
|
4938
|
+
tz: "America/Sao_Paulo",
|
|
4939
|
+
venues: [
|
|
4940
|
+
"polymarket"
|
|
4941
|
+
]
|
|
4942
|
+
},
|
|
4943
|
+
{
|
|
4944
|
+
code: "UUEE",
|
|
4945
|
+
country: "RU",
|
|
4946
|
+
ghcnh_id: null,
|
|
4947
|
+
icao: "UUEE",
|
|
4948
|
+
latitude: 55.9728,
|
|
4949
|
+
longitude: 37.4147,
|
|
4950
|
+
name: "Moscow Sheremetyevo",
|
|
4951
|
+
tz: "Europe/Moscow",
|
|
4952
|
+
venues: [
|
|
4953
|
+
"polymarket"
|
|
4954
|
+
]
|
|
4955
|
+
},
|
|
4956
|
+
{
|
|
4957
|
+
code: "VABB",
|
|
4958
|
+
country: "IN",
|
|
4959
|
+
ghcnh_id: null,
|
|
4960
|
+
icao: "VABB",
|
|
4961
|
+
latitude: 19.0887,
|
|
4962
|
+
longitude: 72.8679,
|
|
4963
|
+
name: "Mumbai Chhatrapati Shivaji",
|
|
4964
|
+
tz: "Asia/Kolkata",
|
|
4965
|
+
venues: [
|
|
4966
|
+
"polymarket"
|
|
4967
|
+
]
|
|
4968
|
+
},
|
|
4969
|
+
{
|
|
4970
|
+
code: "VHHH",
|
|
4971
|
+
country: "HK",
|
|
4972
|
+
ghcnh_id: null,
|
|
4973
|
+
icao: "VHHH",
|
|
4974
|
+
latitude: 22.308,
|
|
4975
|
+
longitude: 113.9185,
|
|
4976
|
+
name: "Hong Kong International",
|
|
4977
|
+
tz: "Asia/Hong_Kong",
|
|
4978
|
+
venues: [
|
|
4979
|
+
"polymarket"
|
|
4980
|
+
]
|
|
4981
|
+
},
|
|
4982
|
+
{
|
|
4983
|
+
code: "VIDP",
|
|
4984
|
+
country: "IN",
|
|
4985
|
+
ghcnh_id: null,
|
|
4986
|
+
icao: "VIDP",
|
|
4987
|
+
latitude: 28.5562,
|
|
4988
|
+
longitude: 77.1,
|
|
4989
|
+
name: "Delhi Indira Gandhi",
|
|
4990
|
+
tz: "Asia/Kolkata",
|
|
4991
|
+
venues: [
|
|
4992
|
+
"polymarket"
|
|
4993
|
+
]
|
|
4994
|
+
},
|
|
4995
|
+
{
|
|
4996
|
+
code: "VTBS",
|
|
4997
|
+
country: "TH",
|
|
4998
|
+
ghcnh_id: null,
|
|
4999
|
+
icao: "VTBS",
|
|
5000
|
+
latitude: 13.69,
|
|
5001
|
+
longitude: 100.7501,
|
|
5002
|
+
name: "Bangkok Suvarnabhumi",
|
|
5003
|
+
tz: "Asia/Bangkok",
|
|
5004
|
+
venues: [
|
|
5005
|
+
"polymarket"
|
|
5006
|
+
]
|
|
5007
|
+
},
|
|
5008
|
+
{
|
|
5009
|
+
code: "WSSS",
|
|
5010
|
+
country: "SG",
|
|
5011
|
+
ghcnh_id: null,
|
|
5012
|
+
icao: "WSSS",
|
|
5013
|
+
latitude: 1.3644,
|
|
5014
|
+
longitude: 103.9915,
|
|
5015
|
+
name: "Singapore Changi",
|
|
5016
|
+
tz: "Asia/Singapore",
|
|
5017
|
+
venues: [
|
|
5018
|
+
"polymarket"
|
|
5019
|
+
]
|
|
5020
|
+
},
|
|
5021
|
+
{
|
|
5022
|
+
code: "YBBN",
|
|
5023
|
+
country: "AU",
|
|
5024
|
+
ghcnh_id: null,
|
|
5025
|
+
icao: "YBBN",
|
|
5026
|
+
latitude: -27.3842,
|
|
5027
|
+
longitude: 153.1175,
|
|
5028
|
+
name: "Brisbane",
|
|
5029
|
+
tz: "Australia/Brisbane",
|
|
5030
|
+
venues: [
|
|
5031
|
+
"polymarket"
|
|
5032
|
+
]
|
|
5033
|
+
},
|
|
5034
|
+
{
|
|
5035
|
+
code: "YMML",
|
|
5036
|
+
country: "AU",
|
|
5037
|
+
ghcnh_id: null,
|
|
5038
|
+
icao: "YMML",
|
|
5039
|
+
latitude: -37.6733,
|
|
5040
|
+
longitude: 144.8433,
|
|
5041
|
+
name: "Melbourne Tullamarine",
|
|
5042
|
+
tz: "Australia/Melbourne",
|
|
5043
|
+
venues: [
|
|
5044
|
+
"polymarket"
|
|
5045
|
+
]
|
|
5046
|
+
},
|
|
5047
|
+
{
|
|
5048
|
+
code: "YSSY",
|
|
5049
|
+
country: "AU",
|
|
5050
|
+
ghcnh_id: null,
|
|
5051
|
+
icao: "YSSY",
|
|
5052
|
+
latitude: -33.9461,
|
|
5053
|
+
longitude: 151.1772,
|
|
5054
|
+
name: "Sydney Kingsford Smith",
|
|
5055
|
+
tz: "Australia/Sydney",
|
|
5056
|
+
venues: [
|
|
5057
|
+
"polymarket"
|
|
5058
|
+
]
|
|
5059
|
+
},
|
|
5060
|
+
{
|
|
5061
|
+
code: "ZBAA",
|
|
5062
|
+
country: "CN",
|
|
5063
|
+
ghcnh_id: null,
|
|
5064
|
+
icao: "ZBAA",
|
|
5065
|
+
latitude: 40.0801,
|
|
5066
|
+
longitude: 116.5846,
|
|
5067
|
+
name: "Beijing Capital",
|
|
5068
|
+
tz: "Asia/Shanghai",
|
|
5069
|
+
venues: [
|
|
5070
|
+
"polymarket"
|
|
5071
|
+
]
|
|
5072
|
+
},
|
|
5073
|
+
{
|
|
5074
|
+
code: "ZSPD",
|
|
5075
|
+
country: "CN",
|
|
5076
|
+
ghcnh_id: null,
|
|
5077
|
+
icao: "ZSPD",
|
|
5078
|
+
latitude: 31.1443,
|
|
5079
|
+
longitude: 121.8083,
|
|
5080
|
+
name: "Shanghai Pudong",
|
|
5081
|
+
tz: "Asia/Shanghai",
|
|
5082
|
+
venues: [
|
|
5083
|
+
"polymarket"
|
|
5084
|
+
]
|
|
5085
|
+
}
|
|
5086
|
+
];
|
|
5087
|
+
var STATION_BY_CODE2 = /* @__PURE__ */ new Map([
|
|
5088
|
+
["ATL", STATIONS2[10]],
|
|
5089
|
+
["AUS", STATIONS2[11]],
|
|
5090
|
+
["BNA", STATIONS2[12]],
|
|
5091
|
+
["BOS", STATIONS2[13]],
|
|
5092
|
+
["CVG", STATIONS2[14]],
|
|
5093
|
+
["DCA", STATIONS2[15]],
|
|
5094
|
+
["DEN", STATIONS2[16]],
|
|
5095
|
+
["DFW", STATIONS2[17]],
|
|
5096
|
+
["DTW", STATIONS2[18]],
|
|
5097
|
+
["EDDB", STATIONS2[0]],
|
|
5098
|
+
["EDDF", STATIONS2[1]],
|
|
5099
|
+
["EDDM", STATIONS2[2]],
|
|
5100
|
+
["EFHK", STATIONS2[3]],
|
|
5101
|
+
["EGKK", STATIONS2[4]],
|
|
5102
|
+
["EGLL", STATIONS2[5]],
|
|
5103
|
+
["EHAM", STATIONS2[6]],
|
|
5104
|
+
["EKCH", STATIONS2[7]],
|
|
5105
|
+
["EPWA", STATIONS2[8]],
|
|
5106
|
+
["ESSA", STATIONS2[9]],
|
|
5107
|
+
["HOU", STATIONS2[19]],
|
|
5108
|
+
["IAH", STATIONS2[20]],
|
|
5109
|
+
["LAS", STATIONS2[21]],
|
|
5110
|
+
["LAX", STATIONS2[22]],
|
|
5111
|
+
["LEBL", STATIONS2[35]],
|
|
5112
|
+
["LEMD", STATIONS2[36]],
|
|
5113
|
+
["LFPB", STATIONS2[37]],
|
|
5114
|
+
["LFPG", STATIONS2[38]],
|
|
5115
|
+
["LFPO", STATIONS2[39]],
|
|
5116
|
+
["LIMC", STATIONS2[40]],
|
|
5117
|
+
["LIRF", STATIONS2[41]],
|
|
5118
|
+
["LOWW", STATIONS2[42]],
|
|
5119
|
+
["LSZH", STATIONS2[43]],
|
|
5120
|
+
["MDW", STATIONS2[23]],
|
|
5121
|
+
["MIA", STATIONS2[24]],
|
|
5122
|
+
["MSP", STATIONS2[25]],
|
|
5123
|
+
["MSY", STATIONS2[26]],
|
|
5124
|
+
["NYC", STATIONS2[27]],
|
|
5125
|
+
["NZAA", STATIONS2[44]],
|
|
5126
|
+
["NZWN", STATIONS2[45]],
|
|
5127
|
+
["OERK", STATIONS2[46]],
|
|
5128
|
+
["OKC", STATIONS2[28]],
|
|
5129
|
+
["OMDB", STATIONS2[47]],
|
|
5130
|
+
["OTHH", STATIONS2[48]],
|
|
5131
|
+
["PHL", STATIONS2[29]],
|
|
5132
|
+
["PHX", STATIONS2[30]],
|
|
5133
|
+
["RCTP", STATIONS2[49]],
|
|
5134
|
+
["RJAA", STATIONS2[50]],
|
|
5135
|
+
["RJTT", STATIONS2[51]],
|
|
5136
|
+
["RKSI", STATIONS2[52]],
|
|
5137
|
+
["SAEZ", STATIONS2[53]],
|
|
5138
|
+
["SAT", STATIONS2[31]],
|
|
5139
|
+
["SBGR", STATIONS2[54]],
|
|
5140
|
+
["SEA", STATIONS2[32]],
|
|
5141
|
+
["SFO", STATIONS2[33]],
|
|
5142
|
+
["SLC", STATIONS2[34]],
|
|
5143
|
+
["UUEE", STATIONS2[55]],
|
|
5144
|
+
["VABB", STATIONS2[56]],
|
|
5145
|
+
["VHHH", STATIONS2[57]],
|
|
5146
|
+
["VIDP", STATIONS2[58]],
|
|
5147
|
+
["VTBS", STATIONS2[59]],
|
|
5148
|
+
["WSSS", STATIONS2[60]],
|
|
5149
|
+
["YBBN", STATIONS2[61]],
|
|
5150
|
+
["YMML", STATIONS2[62]],
|
|
5151
|
+
["YSSY", STATIONS2[63]],
|
|
5152
|
+
["ZBAA", STATIONS2[64]],
|
|
5153
|
+
["ZSPD", STATIONS2[65]]
|
|
5154
|
+
]);
|
|
5155
|
+
var STATION_BY_ICAO2 = /* @__PURE__ */ new Map([
|
|
5156
|
+
["EDDB", STATIONS2[0]],
|
|
5157
|
+
["EDDF", STATIONS2[1]],
|
|
5158
|
+
["EDDM", STATIONS2[2]],
|
|
5159
|
+
["EFHK", STATIONS2[3]],
|
|
5160
|
+
["EGKK", STATIONS2[4]],
|
|
5161
|
+
["EGLL", STATIONS2[5]],
|
|
5162
|
+
["EHAM", STATIONS2[6]],
|
|
5163
|
+
["EKCH", STATIONS2[7]],
|
|
5164
|
+
["EPWA", STATIONS2[8]],
|
|
5165
|
+
["ESSA", STATIONS2[9]],
|
|
5166
|
+
["KATL", STATIONS2[10]],
|
|
5167
|
+
["KAUS", STATIONS2[11]],
|
|
5168
|
+
["KBNA", STATIONS2[12]],
|
|
5169
|
+
["KBOS", STATIONS2[13]],
|
|
5170
|
+
["KCVG", STATIONS2[14]],
|
|
5171
|
+
["KDCA", STATIONS2[15]],
|
|
5172
|
+
["KDEN", STATIONS2[16]],
|
|
5173
|
+
["KDFW", STATIONS2[17]],
|
|
5174
|
+
["KDTW", STATIONS2[18]],
|
|
5175
|
+
["KHOU", STATIONS2[19]],
|
|
5176
|
+
["KIAH", STATIONS2[20]],
|
|
5177
|
+
["KLAS", STATIONS2[21]],
|
|
5178
|
+
["KLAX", STATIONS2[22]],
|
|
5179
|
+
["KMDW", STATIONS2[23]],
|
|
5180
|
+
["KMIA", STATIONS2[24]],
|
|
5181
|
+
["KMSP", STATIONS2[25]],
|
|
5182
|
+
["KMSY", STATIONS2[26]],
|
|
5183
|
+
["KNYC", STATIONS2[27]],
|
|
5184
|
+
["KOKC", STATIONS2[28]],
|
|
5185
|
+
["KPHL", STATIONS2[29]],
|
|
5186
|
+
["KPHX", STATIONS2[30]],
|
|
5187
|
+
["KSAT", STATIONS2[31]],
|
|
5188
|
+
["KSEA", STATIONS2[32]],
|
|
5189
|
+
["KSFO", STATIONS2[33]],
|
|
5190
|
+
["KSLC", STATIONS2[34]],
|
|
5191
|
+
["LEBL", STATIONS2[35]],
|
|
5192
|
+
["LEMD", STATIONS2[36]],
|
|
5193
|
+
["LFPB", STATIONS2[37]],
|
|
5194
|
+
["LFPG", STATIONS2[38]],
|
|
5195
|
+
["LFPO", STATIONS2[39]],
|
|
5196
|
+
["LIMC", STATIONS2[40]],
|
|
5197
|
+
["LIRF", STATIONS2[41]],
|
|
5198
|
+
["LOWW", STATIONS2[42]],
|
|
5199
|
+
["LSZH", STATIONS2[43]],
|
|
5200
|
+
["NZAA", STATIONS2[44]],
|
|
5201
|
+
["NZWN", STATIONS2[45]],
|
|
5202
|
+
["OERK", STATIONS2[46]],
|
|
5203
|
+
["OMDB", STATIONS2[47]],
|
|
5204
|
+
["OTHH", STATIONS2[48]],
|
|
5205
|
+
["RCTP", STATIONS2[49]],
|
|
5206
|
+
["RJAA", STATIONS2[50]],
|
|
5207
|
+
["RJTT", STATIONS2[51]],
|
|
5208
|
+
["RKSI", STATIONS2[52]],
|
|
5209
|
+
["SAEZ", STATIONS2[53]],
|
|
5210
|
+
["SBGR", STATIONS2[54]],
|
|
5211
|
+
["UUEE", STATIONS2[55]],
|
|
5212
|
+
["VABB", STATIONS2[56]],
|
|
5213
|
+
["VHHH", STATIONS2[57]],
|
|
5214
|
+
["VIDP", STATIONS2[58]],
|
|
5215
|
+
["VTBS", STATIONS2[59]],
|
|
5216
|
+
["WSSS", STATIONS2[60]],
|
|
5217
|
+
["YBBN", STATIONS2[61]],
|
|
5218
|
+
["YMML", STATIONS2[62]],
|
|
5219
|
+
["YSSY", STATIONS2[63]],
|
|
5220
|
+
["ZBAA", STATIONS2[64]],
|
|
5221
|
+
["ZSPD", STATIONS2[65]]
|
|
5222
|
+
]);
|
|
5223
|
+
var LOW_COVERAGE_THRESHOLD = 12;
|
|
5224
|
+
var PARTS_CACHE = /* @__PURE__ */ new Map();
|
|
5225
|
+
function getDateFormatter(tz) {
|
|
5226
|
+
let f = PARTS_CACHE.get(tz);
|
|
5227
|
+
if (f === void 0) {
|
|
5228
|
+
f = new Intl.DateTimeFormat("en-US", {
|
|
5229
|
+
timeZone: tz,
|
|
5230
|
+
year: "numeric",
|
|
5231
|
+
month: "2-digit",
|
|
5232
|
+
day: "2-digit"
|
|
5233
|
+
});
|
|
5234
|
+
PARTS_CACHE.set(tz, f);
|
|
5235
|
+
}
|
|
5236
|
+
return f;
|
|
5237
|
+
}
|
|
5238
|
+
function localDateFor(instant, tz) {
|
|
5239
|
+
const parts = getDateFormatter(tz).formatToParts(instant);
|
|
5240
|
+
let y = "";
|
|
5241
|
+
let m = "";
|
|
5242
|
+
let d = "";
|
|
5243
|
+
for (const p of parts) {
|
|
5244
|
+
if (p.type === "year") y = p.value;
|
|
5245
|
+
else if (p.type === "month") m = p.value;
|
|
5246
|
+
else if (p.type === "day") d = p.value;
|
|
5247
|
+
}
|
|
5248
|
+
return `${y}-${m}-${d}`;
|
|
5249
|
+
}
|
|
5250
|
+
function parseInstant(observed) {
|
|
5251
|
+
if (observed === void 0 || observed === null || observed.length === 0) {
|
|
5252
|
+
return null;
|
|
5253
|
+
}
|
|
5254
|
+
const ms = Date.parse(observed);
|
|
5255
|
+
if (Number.isNaN(ms)) return null;
|
|
5256
|
+
return new Date(ms);
|
|
5257
|
+
}
|
|
5258
|
+
function roundHalfUp(value, places) {
|
|
5259
|
+
if (!Number.isFinite(value)) return value;
|
|
5260
|
+
const scale = 10 ** places;
|
|
5261
|
+
const sign = value < 0 ? -1 : 1;
|
|
5262
|
+
const abs = Math.abs(value);
|
|
5263
|
+
const rounded = Math.floor(abs * scale + 0.5 + abs * 1e-12) / scale;
|
|
5264
|
+
return sign * rounded;
|
|
5265
|
+
}
|
|
5266
|
+
function cToF(c) {
|
|
5267
|
+
return c * 1.8 + 32;
|
|
5268
|
+
}
|
|
5269
|
+
function internationalDailyExtremes(rows, opts) {
|
|
5270
|
+
const tz = opts.stationTz;
|
|
5271
|
+
if (typeof tz !== "string" || tz.length === 0) {
|
|
5272
|
+
throw new RangeError("internationalDailyExtremes: stationTz is required (non-empty string)");
|
|
5273
|
+
}
|
|
5274
|
+
const precision = opts.precision ?? 0;
|
|
5275
|
+
const minObs = opts.minObs ?? LOW_COVERAGE_THRESHOLD;
|
|
5276
|
+
try {
|
|
5277
|
+
getDateFormatter(tz);
|
|
5278
|
+
} catch (e) {
|
|
5279
|
+
throw new RangeError(
|
|
5280
|
+
`internationalDailyExtremes: invalid stationTz ${JSON.stringify(tz)}: ${e.message}`
|
|
5281
|
+
);
|
|
5282
|
+
}
|
|
5283
|
+
const byLocalDate = /* @__PURE__ */ new Map();
|
|
5284
|
+
for (const row of rows) {
|
|
5285
|
+
const instant = parseInstant(row.observed_at);
|
|
5286
|
+
if (instant === null) continue;
|
|
5287
|
+
const localDate = localDateFor(instant, tz);
|
|
5288
|
+
let bucket = byLocalDate.get(localDate);
|
|
5289
|
+
if (bucket === void 0) {
|
|
5290
|
+
bucket = { temps: [], precipMm: 0 };
|
|
5291
|
+
byLocalDate.set(localDate, bucket);
|
|
5292
|
+
}
|
|
5293
|
+
const t = row.temp_c;
|
|
5294
|
+
if (typeof t === "number" && Number.isFinite(t)) {
|
|
5295
|
+
bucket.temps.push({ value: t, source: row.source ?? null });
|
|
5296
|
+
}
|
|
5297
|
+
const p = row.precip_mm_1h;
|
|
5298
|
+
if (typeof p === "number" && Number.isFinite(p)) {
|
|
5299
|
+
bucket.precipMm += p;
|
|
5300
|
+
}
|
|
5301
|
+
}
|
|
5302
|
+
const out = [];
|
|
5303
|
+
const sortedDates = [...byLocalDate.keys()].sort();
|
|
5304
|
+
for (const localDate of sortedDates) {
|
|
5305
|
+
const bucket = byLocalDate.get(localDate);
|
|
5306
|
+
if (bucket === void 0) continue;
|
|
5307
|
+
const nObs = bucket.temps.length;
|
|
5308
|
+
let tempMinC = null;
|
|
5309
|
+
let tempMaxC = null;
|
|
5310
|
+
let tempMeanC = null;
|
|
5311
|
+
let sourceTmin = null;
|
|
5312
|
+
let sourceTmax = null;
|
|
5313
|
+
if (nObs > 0 && nObs >= minObs) {
|
|
5314
|
+
let minIdx = 0;
|
|
5315
|
+
let maxIdx = 0;
|
|
5316
|
+
let sum = 0;
|
|
5317
|
+
for (let i = 0; i < bucket.temps.length; i += 1) {
|
|
5318
|
+
const v = bucket.temps[i];
|
|
5319
|
+
sum += v.value;
|
|
5320
|
+
const minRow2 = bucket.temps[minIdx];
|
|
5321
|
+
const maxRow2 = bucket.temps[maxIdx];
|
|
5322
|
+
if (v.value < minRow2.value) minIdx = i;
|
|
5323
|
+
if (v.value > maxRow2.value) maxIdx = i;
|
|
5324
|
+
}
|
|
5325
|
+
const mean = sum / nObs;
|
|
5326
|
+
const minRow = bucket.temps[minIdx];
|
|
5327
|
+
const maxRow = bucket.temps[maxIdx];
|
|
5328
|
+
tempMinC = roundHalfUp(minRow.value, precision);
|
|
5329
|
+
tempMaxC = roundHalfUp(maxRow.value, precision);
|
|
5330
|
+
tempMeanC = roundHalfUp(mean, precision);
|
|
5331
|
+
sourceTmin = minRow.source;
|
|
5332
|
+
sourceTmax = maxRow.source;
|
|
5333
|
+
}
|
|
5334
|
+
out.push(
|
|
5335
|
+
Object.freeze({
|
|
5336
|
+
localDate,
|
|
5337
|
+
nObs,
|
|
5338
|
+
tempMinC,
|
|
5339
|
+
tempMaxC,
|
|
5340
|
+
tempMeanC,
|
|
5341
|
+
tempMinF: tempMinC === null ? null : roundHalfUp(cToF(tempMinC), precision),
|
|
5342
|
+
tempMaxF: tempMaxC === null ? null : roundHalfUp(cToF(tempMaxC), precision),
|
|
5343
|
+
precipMm: roundHalfUp(bucket.precipMm, 4),
|
|
5344
|
+
sourceTmin,
|
|
5345
|
+
sourceTmax
|
|
5346
|
+
})
|
|
5347
|
+
);
|
|
5348
|
+
}
|
|
5349
|
+
return out;
|
|
5350
|
+
}
|
|
5351
|
+
var BUILT_IN_SCHEMAS = Object.freeze([
|
|
5352
|
+
{
|
|
5353
|
+
id: "schema.observation.v1",
|
|
5354
|
+
title: "schema.observation.v1",
|
|
5355
|
+
columnCount: 20,
|
|
5356
|
+
columns: [
|
|
5357
|
+
{ name: "dew_point_c", description: "units: celsius \u2014 bounded", nullable: true },
|
|
5358
|
+
{ name: "event_time", description: "observation valid time", nullable: false },
|
|
5359
|
+
{
|
|
5360
|
+
name: "metar_raw",
|
|
5361
|
+
description: "raw METAR text if source has it; null for AWC JSON (structured-only)",
|
|
5362
|
+
nullable: true
|
|
5363
|
+
},
|
|
5364
|
+
{
|
|
5365
|
+
name: "observation_type",
|
|
5366
|
+
description: "METAR | SPECI; defaults METAR when source can't distinguish (e.g. AWC JSON)",
|
|
5367
|
+
nullable: false
|
|
5368
|
+
},
|
|
5369
|
+
{
|
|
5370
|
+
name: "precip_mm_1h",
|
|
5371
|
+
description: "units: mm \u2014 hourly precip (METAR p01i, converted from inches)",
|
|
5372
|
+
nullable: true
|
|
5373
|
+
},
|
|
5374
|
+
{
|
|
5375
|
+
name: "sky_base_1_m",
|
|
5376
|
+
description: "units: meters \u2014 first cloud layer base height (converted from feet)",
|
|
5377
|
+
nullable: true
|
|
5378
|
+
},
|
|
5379
|
+
{ name: "sky_base_2_m", description: "units: meters", nullable: true },
|
|
5380
|
+
{ name: "sky_base_3_m", description: "units: meters", nullable: true },
|
|
5381
|
+
{ name: "sky_base_4_m", description: "units: meters", nullable: true },
|
|
5382
|
+
{ name: "sky_cover_1", description: "first cloud layer cover code", nullable: true },
|
|
5383
|
+
{ name: "sky_cover_2", description: "second layer; null if not present", nullable: true },
|
|
5384
|
+
{ name: "sky_cover_3", description: "third layer; null if not present", nullable: true },
|
|
5385
|
+
{ name: "sky_cover_4", description: "fourth layer; null if not present", nullable: true },
|
|
5386
|
+
{
|
|
5387
|
+
name: "slp_hpa",
|
|
5388
|
+
description: "units: hPa \u2014 sea-level pressure (canonical aviation unit, not converted across modes)",
|
|
5389
|
+
nullable: true
|
|
5390
|
+
},
|
|
5391
|
+
{ name: "station", description: "ICAO/ASOS station ID (e.g. KORD)", nullable: false },
|
|
5392
|
+
{
|
|
5393
|
+
name: "temp_c",
|
|
5394
|
+
description: "units: celsius \u2014 bounded TEMP_MIN_C..TEMP_MAX_C",
|
|
5395
|
+
nullable: true
|
|
5396
|
+
},
|
|
5397
|
+
{
|
|
5398
|
+
name: "visibility_m",
|
|
5399
|
+
description: "units: meters \u2014 converted from statute miles",
|
|
5400
|
+
nullable: true
|
|
5401
|
+
},
|
|
5402
|
+
{
|
|
5403
|
+
name: "wind_dir_deg",
|
|
5404
|
+
description: "units: degrees \u2014 0-360, bounded",
|
|
5405
|
+
nullable: true
|
|
5406
|
+
},
|
|
5407
|
+
{ name: "wind_gust_ms", description: "units: m/s \u2014 converted from kt", nullable: true },
|
|
5408
|
+
{ name: "wind_speed_ms", description: "units: m/s \u2014 converted from kt", nullable: true }
|
|
5409
|
+
]
|
|
5410
|
+
},
|
|
5411
|
+
{
|
|
5412
|
+
id: "schema.forecast.iem_mos.v1",
|
|
5413
|
+
title: "schema.forecast.iem_mos.v1",
|
|
5414
|
+
columnCount: 11,
|
|
5415
|
+
columns: [
|
|
5416
|
+
{ name: "dew_point_c", description: "units: celsius", nullable: true },
|
|
5417
|
+
{
|
|
5418
|
+
name: "forecast_hour",
|
|
5419
|
+
description: "units: hours \u2014 (valid_at - issued_at).total_seconds() / 3600",
|
|
5420
|
+
nullable: false
|
|
5421
|
+
},
|
|
5422
|
+
{
|
|
5423
|
+
name: "issued_at",
|
|
5424
|
+
description: "model run time (from source `runtime` field)",
|
|
5425
|
+
nullable: false
|
|
5426
|
+
},
|
|
5427
|
+
{ name: "model", description: "e.g. NBE, GFS, LAV, MET", nullable: false },
|
|
5428
|
+
{
|
|
5429
|
+
name: "precip_probability",
|
|
5430
|
+
description: "units: probability \u2014 bounded [0, 1]",
|
|
5431
|
+
nullable: true
|
|
5432
|
+
},
|
|
5433
|
+
{
|
|
5434
|
+
name: "sky_cover_pct",
|
|
5435
|
+
description: "units: percent \u2014 bounded [0, 100]",
|
|
5436
|
+
nullable: true
|
|
5437
|
+
},
|
|
5438
|
+
{ name: "station", description: "", nullable: false },
|
|
5439
|
+
{ name: "temp_c", description: "units: celsius", nullable: true },
|
|
5440
|
+
{
|
|
5441
|
+
name: "valid_at",
|
|
5442
|
+
description: "forecast target time (from source `ftime`)",
|
|
5443
|
+
nullable: false
|
|
5444
|
+
},
|
|
5445
|
+
{ name: "wind_dir_deg", description: "units: degrees", nullable: true },
|
|
5446
|
+
{ name: "wind_speed_ms", description: "units: m/s", nullable: true }
|
|
5447
|
+
]
|
|
5448
|
+
},
|
|
5449
|
+
{
|
|
5450
|
+
id: "schema.settlement.cli.v1",
|
|
5451
|
+
title: "schema.settlement.cli.v1",
|
|
5452
|
+
columnCount: 12,
|
|
5453
|
+
columns: [
|
|
5454
|
+
{
|
|
5455
|
+
name: "cli_data_quality",
|
|
5456
|
+
description: "NWS CLI data-quality marker (Pitfall 6/16). Allows downstream code to filter or weight settlement rows by issuer quality without re-parsing the product header.",
|
|
5457
|
+
nullable: false
|
|
5458
|
+
},
|
|
5459
|
+
{
|
|
5460
|
+
name: "event_time",
|
|
5461
|
+
description: "00:00 local time on observation_date converted to UTC; for sort/join only",
|
|
5462
|
+
nullable: false
|
|
5463
|
+
},
|
|
5464
|
+
{
|
|
5465
|
+
name: "observation_date",
|
|
5466
|
+
description: "local climate day per NWS convention (no timezone applied to the date itself)",
|
|
5467
|
+
nullable: false
|
|
5468
|
+
},
|
|
5469
|
+
{ name: "precipitation_in", description: "units: inches", nullable: true },
|
|
5470
|
+
{
|
|
5471
|
+
name: "product_release_time",
|
|
5472
|
+
description: "parsed from CLI product header (_climate.py::_parse_product_timestamp)",
|
|
5473
|
+
nullable: false
|
|
5474
|
+
},
|
|
5475
|
+
{
|
|
5476
|
+
name: "report_type",
|
|
5477
|
+
description: "preliminary | final | correction; dedup priority preliminary < final < correction",
|
|
5478
|
+
nullable: false
|
|
5479
|
+
},
|
|
5480
|
+
{
|
|
5481
|
+
name: "settlement_finality",
|
|
5482
|
+
description: "provisional | final | superseded. Kalshi NHIGH/NLOW settlement contractually requires 'final'; 'provisional' values are kept for early-look research only.",
|
|
5483
|
+
nullable: false
|
|
5484
|
+
},
|
|
5485
|
+
{ name: "snowfall_in", description: "units: inches", nullable: true },
|
|
5486
|
+
{ name: "station", description: "ICAO/ASOS station ID", nullable: false },
|
|
5487
|
+
{
|
|
5488
|
+
name: "station_tz",
|
|
5489
|
+
description: "IANA timezone for the station (e.g. America/Chicago for KORD). Required for local-climate-day semantics; see \xA7U.",
|
|
5490
|
+
nullable: false
|
|
5491
|
+
},
|
|
5492
|
+
{
|
|
5493
|
+
name: "temp_max_F",
|
|
5494
|
+
description: "units: fahrenheit \u2014 daily high (uppercase F for consistency with obs imperial mode)",
|
|
5495
|
+
nullable: true
|
|
5496
|
+
},
|
|
5497
|
+
{ name: "temp_min_F", description: "units: fahrenheit \u2014 daily low", nullable: true }
|
|
5498
|
+
]
|
|
5499
|
+
},
|
|
5500
|
+
{
|
|
5501
|
+
id: "schema.observation_ledger.v1",
|
|
5502
|
+
title: "schema.observation_ledger.v1",
|
|
5503
|
+
columnCount: 15,
|
|
5504
|
+
columns: [
|
|
5505
|
+
{ name: "as_of_time", description: "", nullable: true },
|
|
5506
|
+
{ name: "dewpoint_c", description: "units: celsius", nullable: true },
|
|
5507
|
+
{ name: "ingestion_id", description: "", nullable: true },
|
|
5508
|
+
{ name: "observation_kind", description: "", nullable: true },
|
|
5509
|
+
{
|
|
5510
|
+
name: "observation_quality",
|
|
5511
|
+
description: "Lineage row-quality flag per LINEAGE-01; distinct from qc_status enum slot AND distinct from the obs_qc_status bitmask column per QC-05.",
|
|
5512
|
+
nullable: true
|
|
5513
|
+
},
|
|
5514
|
+
{ name: "observation_type", description: "", nullable: false },
|
|
5515
|
+
{ name: "observed_at", description: "", nullable: false },
|
|
5516
|
+
{ name: "parser_name", description: "", nullable: true },
|
|
5517
|
+
{ name: "parser_version", description: "", nullable: true },
|
|
5518
|
+
{ name: "provenance", description: "", nullable: true },
|
|
5519
|
+
{ name: "qc_status", description: "", nullable: true },
|
|
5520
|
+
{
|
|
5521
|
+
name: "source",
|
|
5522
|
+
description: "ncei reserved per D-2.1-09; never written in v0.1.0.",
|
|
5523
|
+
nullable: false
|
|
5524
|
+
},
|
|
5525
|
+
{ name: "source_received_at", description: "", nullable: true },
|
|
5526
|
+
{ name: "station_code", description: "", nullable: false },
|
|
5527
|
+
{ name: "temp_c", description: "units: celsius", nullable: true }
|
|
5528
|
+
]
|
|
5529
|
+
},
|
|
5530
|
+
{
|
|
5531
|
+
id: "schema.observation_qc.v1",
|
|
5532
|
+
title: "schema.observation_qc.v1",
|
|
5533
|
+
columnCount: 13,
|
|
5534
|
+
columns: [
|
|
5535
|
+
{ name: "as_of_time", description: "", nullable: true },
|
|
5536
|
+
{
|
|
5537
|
+
name: "detector_metadata",
|
|
5538
|
+
description: "JSON-serialized detector payload; shape per qc_system.",
|
|
5539
|
+
nullable: true
|
|
5540
|
+
},
|
|
5541
|
+
{
|
|
5542
|
+
name: "field",
|
|
5543
|
+
description: "Observation column the rule evaluated (e.g. temp_c).",
|
|
5544
|
+
nullable: false
|
|
5545
|
+
},
|
|
5546
|
+
{ name: "flag", description: "", nullable: false },
|
|
5547
|
+
{ name: "ingestion_id", description: "", nullable: true },
|
|
5548
|
+
{ name: "observation_kind", description: "", nullable: true },
|
|
5549
|
+
{ name: "observed_at", description: "", nullable: false },
|
|
5550
|
+
{ name: "parser_name", description: "", nullable: true },
|
|
5551
|
+
{ name: "qc_system", description: "", nullable: false },
|
|
5552
|
+
{ name: "qc_version", description: "", nullable: false },
|
|
5553
|
+
{ name: "rule_id", description: "", nullable: false },
|
|
5554
|
+
{ name: "source", description: "", nullable: false },
|
|
5555
|
+
{ name: "station_code", description: "", nullable: false }
|
|
5556
|
+
]
|
|
5557
|
+
}
|
|
5558
|
+
]);
|
|
5559
|
+
function deepFreezeSchema(info) {
|
|
5560
|
+
const frozenCols = Object.freeze(info.columns.map((c) => Object.freeze({ ...c })));
|
|
5561
|
+
return Object.freeze({ ...info, columns: frozenCols });
|
|
5562
|
+
}
|
|
5563
|
+
var REGISTRY = new Map(
|
|
5564
|
+
BUILT_IN_SCHEMAS.map((info) => [info.id, deepFreezeSchema(info)])
|
|
5565
|
+
);
|
|
5566
|
+
var FEATURE_NAMES = Object.freeze([
|
|
5567
|
+
"calendarFeatures",
|
|
5568
|
+
"clipOutliers",
|
|
5569
|
+
"diff",
|
|
5570
|
+
"diff2",
|
|
5571
|
+
"heatIndex",
|
|
5572
|
+
"lag",
|
|
5573
|
+
"rolling",
|
|
5574
|
+
"spread",
|
|
5575
|
+
"windChill"
|
|
5576
|
+
]);
|
|
5577
|
+
|
|
5578
|
+
// ../weather/src/dailyExtremes.ts
|
|
5579
|
+
init_iem_asos();
|
|
5580
|
+
init_awc();
|
|
5581
|
+
init_iem();
|
|
5582
|
+
var LOW_COVERAGE_THRESHOLD2 = 12;
|
|
5583
|
+
function addUtcDays(iso, days) {
|
|
5584
|
+
const [yStr, mStr, dStr] = iso.split("-");
|
|
5585
|
+
const dt = new Date(Date.UTC(Number(yStr), Number(mStr) - 1, Number(dStr)));
|
|
5586
|
+
dt.setUTCDate(dt.getUTCDate() + days);
|
|
5587
|
+
const yyyy = dt.getUTCFullYear();
|
|
5588
|
+
const mm = String(dt.getUTCMonth() + 1).padStart(2, "0");
|
|
5589
|
+
const dd = String(dt.getUTCDate()).padStart(2, "0");
|
|
5590
|
+
return `${yyyy}-${mm}-${dd}`;
|
|
5591
|
+
}
|
|
5592
|
+
function lookupStation(icao) {
|
|
5593
|
+
const upper = icao.toUpperCase();
|
|
5594
|
+
for (const s of STATIONS) {
|
|
5595
|
+
if (s.icao === upper) {
|
|
5596
|
+
return { tz: s.tz, isUs: s.country === "US" };
|
|
5597
|
+
}
|
|
5598
|
+
}
|
|
5599
|
+
throw new Error(`dailyExtremes: station "${icao}" not in registry \u2014 check STATIONS catalog`);
|
|
5600
|
+
}
|
|
5601
|
+
function cToF2(c) {
|
|
5602
|
+
if (c === null) return null;
|
|
5603
|
+
return c * (9 / 5) + 32;
|
|
5604
|
+
}
|
|
5605
|
+
function roundHalfUp2(value, decimals) {
|
|
5606
|
+
const m = 10 ** decimals;
|
|
5607
|
+
return Math.round(value * m) / m;
|
|
5608
|
+
}
|
|
5609
|
+
async function fetchIemAsosObservations(station, fromDate, toDate) {
|
|
5610
|
+
const fromYear = Number.parseInt(fromDate.slice(0, 4), 10);
|
|
5611
|
+
const toYear = Number.parseInt(toDate.slice(0, 4), 10);
|
|
5612
|
+
const out = [];
|
|
5613
|
+
for (let year = fromYear; year <= toYear; year++) {
|
|
5614
|
+
const chunks = await downloadIemAsos(station, `${year}-01-01`, `${year}-12-31`, {
|
|
5615
|
+
reportType: 3,
|
|
5616
|
+
politenessMs: 1e3
|
|
5617
|
+
});
|
|
5618
|
+
for (const chunk of chunks) {
|
|
5619
|
+
const parsed = parseIemCsv(chunk.csv, { observationTypeOverride: "METAR" });
|
|
5620
|
+
for (const row of parsed) {
|
|
5621
|
+
const obsDate = row.observed_at.slice(0, 10);
|
|
5622
|
+
if (obsDate >= fromDate && obsDate <= toDate) {
|
|
5623
|
+
const precipInches = row.precip_1hr_inches ?? null;
|
|
5624
|
+
out.push({
|
|
5625
|
+
observed_at: row.observed_at,
|
|
5626
|
+
temp_c: row.temp_c ?? null,
|
|
5627
|
+
precip_mm_1h: precipInches !== null ? precipInches * 25.4 : null,
|
|
5628
|
+
source: row.source
|
|
5629
|
+
});
|
|
5630
|
+
}
|
|
5631
|
+
}
|
|
5632
|
+
}
|
|
5633
|
+
}
|
|
5634
|
+
return out;
|
|
5635
|
+
}
|
|
5636
|
+
async function fetchAwcObservations(station, fromDate, toDate) {
|
|
5637
|
+
const raw = await fetchAwcMetars([station]);
|
|
5638
|
+
const out = [];
|
|
5639
|
+
for (const r of raw) {
|
|
5640
|
+
const obs2 = awcToObservation(r);
|
|
5641
|
+
if (obs2 === null) continue;
|
|
5642
|
+
const obsDate = obs2.observed_at.slice(0, 10);
|
|
5643
|
+
if (obsDate >= fromDate && obsDate <= toDate) {
|
|
5644
|
+
const precipInches = obs2.precip_1hr_inches ?? null;
|
|
5645
|
+
out.push({
|
|
5646
|
+
observed_at: obs2.observed_at,
|
|
5647
|
+
temp_c: obs2.temp_c ?? null,
|
|
5648
|
+
precip_mm_1h: precipInches !== null ? precipInches * 25.4 : null,
|
|
5649
|
+
source: obs2.source
|
|
5650
|
+
});
|
|
5651
|
+
}
|
|
5652
|
+
}
|
|
5653
|
+
return out;
|
|
5654
|
+
}
|
|
5655
|
+
async function fetchForMode(station, fromDate, toDate, mode) {
|
|
5656
|
+
switch (mode) {
|
|
5657
|
+
case "iem_only":
|
|
5658
|
+
return fetchIemAsosObservations(station, fromDate, toDate);
|
|
5659
|
+
case "awc_only":
|
|
5660
|
+
return fetchAwcObservations(station, fromDate, toDate);
|
|
5661
|
+
case "live_v1": {
|
|
5662
|
+
const [iem, awc] = await Promise.all([
|
|
5663
|
+
fetchIemAsosObservations(station, fromDate, toDate),
|
|
5664
|
+
fetchAwcObservations(station, fromDate, toDate).catch(() => [])
|
|
5665
|
+
]);
|
|
5666
|
+
return [...iem, ...awc];
|
|
5667
|
+
}
|
|
5668
|
+
default: {
|
|
5669
|
+
const _exhaustive = mode;
|
|
5670
|
+
throw new TypeError(`dailyExtremes: unknown merge mode "${String(_exhaustive)}"`);
|
|
5671
|
+
}
|
|
5672
|
+
}
|
|
5673
|
+
}
|
|
5674
|
+
function projectRow(station, d, isUs) {
|
|
5675
|
+
const lowCoverage = d.nObs < LOW_COVERAGE_THRESHOLD2;
|
|
5676
|
+
const decimals = isUs ? 0 : 1;
|
|
5677
|
+
const precipIn = d.precipMm !== null && d.precipMm !== void 0 ? roundHalfUp2(d.precipMm / 25.4, 2) : null;
|
|
5678
|
+
if (lowCoverage) {
|
|
5679
|
+
return {
|
|
5680
|
+
date: d.localDate,
|
|
5681
|
+
station,
|
|
5682
|
+
tmin_f: null,
|
|
5683
|
+
tmax_f: null,
|
|
5684
|
+
tmean_f: null,
|
|
5685
|
+
precip_in: precipIn,
|
|
5686
|
+
low_coverage: true,
|
|
5687
|
+
n_obs: d.nObs
|
|
5688
|
+
};
|
|
5689
|
+
}
|
|
5690
|
+
return {
|
|
5691
|
+
date: d.localDate,
|
|
5692
|
+
station,
|
|
5693
|
+
tmin_f: d.tempMinF !== null ? roundHalfUp2(d.tempMinF, decimals) : null,
|
|
5694
|
+
tmax_f: d.tempMaxF !== null ? roundHalfUp2(d.tempMaxF, decimals) : null,
|
|
5695
|
+
tmean_f: d.tempMeanC !== null ? roundHalfUp2(cToF2(d.tempMeanC), decimals) : null,
|
|
5696
|
+
precip_in: precipIn,
|
|
5697
|
+
low_coverage: false,
|
|
5698
|
+
n_obs: d.nObs
|
|
5699
|
+
};
|
|
5700
|
+
}
|
|
5701
|
+
async function dailyExtremes(station, fromDate, toDate, opts = {}) {
|
|
5702
|
+
const { tz, isUs } = lookupStation(station);
|
|
5703
|
+
const merge = opts.merge ?? "live_v1";
|
|
5704
|
+
const fetchFrom = addUtcDays(fromDate, -1);
|
|
5705
|
+
const fetchTo = addUtcDays(toDate, 1);
|
|
5706
|
+
const rows = await fetchForMode(station, fetchFrom, fetchTo, merge);
|
|
5707
|
+
const extremes = internationalDailyExtremes(rows, {
|
|
5708
|
+
stationTz: tz,
|
|
5709
|
+
precision: isUs ? 1 : 0
|
|
5710
|
+
});
|
|
5711
|
+
return extremes.filter((d) => d.localDate >= fromDate && d.localDate <= toDate).map((d) => projectRow(station.toUpperCase(), d, isUs));
|
|
5712
|
+
}
|
|
5713
|
+
|
|
5714
|
+
// ../weather/src/obs.ts
|
|
5715
|
+
init_src();
|
|
5716
|
+
init_iem_asos();
|
|
5717
|
+
init_awc();
|
|
5718
|
+
init_iem();
|
|
5719
|
+
function daysBetween(fromDate, toDate) {
|
|
5720
|
+
const from = Date.UTC(
|
|
5721
|
+
Number.parseInt(fromDate.slice(0, 4), 10),
|
|
5722
|
+
Number.parseInt(fromDate.slice(5, 7), 10) - 1,
|
|
5723
|
+
Number.parseInt(fromDate.slice(8, 10), 10)
|
|
5724
|
+
);
|
|
5725
|
+
const to = Date.UTC(
|
|
5726
|
+
Number.parseInt(toDate.slice(0, 4), 10),
|
|
5727
|
+
Number.parseInt(toDate.slice(5, 7), 10) - 1,
|
|
5728
|
+
Number.parseInt(toDate.slice(8, 10), 10)
|
|
5729
|
+
);
|
|
5730
|
+
return Math.round((to - from) / (24 * 60 * 60 * 1e3)) + 1;
|
|
5731
|
+
}
|
|
5732
|
+
function resolveAutoStrategy(fromDate, toDate) {
|
|
5733
|
+
return daysBetween(fromDate, toDate) <= 7 ? "exact_window" : "warm_cache";
|
|
5734
|
+
}
|
|
5735
|
+
function inchesToMm(inches) {
|
|
5736
|
+
if (inches === null || inches === void 0) return null;
|
|
5737
|
+
return inches * 25.4;
|
|
5738
|
+
}
|
|
5739
|
+
function mbToInhg(mb) {
|
|
5740
|
+
if (mb === null || mb === void 0) return null;
|
|
5741
|
+
return mb * 0.029529983071445;
|
|
5742
|
+
}
|
|
5743
|
+
function fromObservation(o) {
|
|
5744
|
+
const tempC = o.temp_c ?? null;
|
|
5745
|
+
const dewC = o.dewpoint_c ?? null;
|
|
5746
|
+
return {
|
|
5747
|
+
station: o.station_code,
|
|
5748
|
+
observed_at: o.observed_at,
|
|
5749
|
+
source: o.source,
|
|
5750
|
+
temp_c: tempC,
|
|
5751
|
+
temp_f: tempC !== null ? tempC * (9 / 5) + 32 : null,
|
|
5752
|
+
dewpoint_c: dewC,
|
|
5753
|
+
dewpoint_f: dewC !== null ? dewC * (9 / 5) + 32 : null,
|
|
5754
|
+
wind_speed_kts: o.wind_speed_kt ?? null,
|
|
5755
|
+
wind_direction_deg: o.wind_dir_degrees ?? null,
|
|
5756
|
+
pressure_inhg: mbToInhg(o.sea_level_pressure_mb),
|
|
5757
|
+
precip_mm_1h: inchesToMm(o.precip_1hr_inches),
|
|
5758
|
+
raw_metar: o.raw_metar ?? null
|
|
5759
|
+
};
|
|
5760
|
+
}
|
|
5761
|
+
async function fetchIemForWindow(station, fromDate, toDate, resolvedStrategy) {
|
|
5762
|
+
const out = [];
|
|
5763
|
+
if (resolvedStrategy === "exact_window") {
|
|
5764
|
+
const chunks = await downloadIemAsos(station, fromDate, toDate, {
|
|
5765
|
+
reportType: 3,
|
|
5766
|
+
politenessMs: 1e3
|
|
5767
|
+
});
|
|
5768
|
+
for (const chunk of chunks) {
|
|
5769
|
+
const rows = parseIemCsv(chunk.csv, { observationTypeOverride: "METAR" });
|
|
5770
|
+
for (const r of rows) {
|
|
5771
|
+
const d = r.observed_at.slice(0, 10);
|
|
5772
|
+
if (d >= fromDate && d <= toDate) out.push(fromObservation(r));
|
|
5773
|
+
}
|
|
5774
|
+
}
|
|
5775
|
+
return out;
|
|
5776
|
+
}
|
|
5777
|
+
const fromYear = Number.parseInt(fromDate.slice(0, 4), 10);
|
|
5778
|
+
const toYear = Number.parseInt(toDate.slice(0, 4), 10);
|
|
5779
|
+
for (let year = fromYear; year <= toYear; year++) {
|
|
5780
|
+
const chunks = await downloadIemAsos(station, `${year}-01-01`, `${year}-12-31`, {
|
|
5781
|
+
reportType: 3,
|
|
5782
|
+
politenessMs: 1e3
|
|
5783
|
+
});
|
|
5784
|
+
for (const chunk of chunks) {
|
|
5785
|
+
const rows = parseIemCsv(chunk.csv, { observationTypeOverride: "METAR" });
|
|
5786
|
+
for (const r of rows) {
|
|
5787
|
+
const d = r.observed_at.slice(0, 10);
|
|
5788
|
+
if (d >= fromDate && d <= toDate) out.push(fromObservation(r));
|
|
5789
|
+
}
|
|
5790
|
+
}
|
|
5791
|
+
}
|
|
5792
|
+
return out;
|
|
5793
|
+
}
|
|
5794
|
+
async function fetchAwcForWindow(station, fromDate, toDate) {
|
|
5795
|
+
const raw = await fetchAwcMetars([station]);
|
|
5796
|
+
const out = [];
|
|
5797
|
+
for (const r of raw) {
|
|
5798
|
+
const obs2 = awcToObservation(r);
|
|
5799
|
+
if (obs2 === null) continue;
|
|
5800
|
+
const d = obs2.observed_at.slice(0, 10);
|
|
5801
|
+
if (d >= fromDate && d <= toDate) out.push(fromObservation(obs2));
|
|
5802
|
+
}
|
|
5803
|
+
return out;
|
|
5804
|
+
}
|
|
5805
|
+
async function fetchByStrategy(station, fromDate, toDate, resolvedStrategy, source) {
|
|
5806
|
+
const wantsIem = source === null || source === void 0 || source === "iem";
|
|
5807
|
+
const wantsAwc = source === null || source === void 0 || source === "awc";
|
|
5808
|
+
const tasks = [];
|
|
5809
|
+
if (wantsIem) tasks.push(fetchIemForWindow(station, fromDate, toDate, resolvedStrategy));
|
|
5810
|
+
if (wantsAwc) tasks.push(fetchAwcForWindow(station, fromDate, toDate).catch(() => []));
|
|
5811
|
+
const results = await Promise.all(tasks);
|
|
5812
|
+
return results.flat();
|
|
5813
|
+
}
|
|
5814
|
+
async function obs(station, fromDate, toDate, opts = {}) {
|
|
5815
|
+
const strategy = opts.strategy ?? "auto";
|
|
5816
|
+
const source = opts.source ?? null;
|
|
5817
|
+
if (source === "ghcnh") {
|
|
5818
|
+
throw new DataAvailabilityError({
|
|
5819
|
+
reason: "model_unavailable",
|
|
5820
|
+
source: "obs.ghcnh",
|
|
5821
|
+
hint: "source='ghcnh' is a valid Python `obs()` filter but the GHCNh fetcher path is not yet wired in the TypeScript SDK. Use source='iem' or source='awc' (or omit `source` for merged) until the TS GHCNh fetcher ships."
|
|
5822
|
+
});
|
|
5823
|
+
}
|
|
5824
|
+
if (strategy === "hosted") {
|
|
5825
|
+
throw new DataAvailabilityError({
|
|
5826
|
+
reason: "model_unavailable",
|
|
5827
|
+
source: "obs-hosted-stub",
|
|
5828
|
+
hint: "hosted ingest API ships in v0.2.x \u2014 use strategy='exact_window' or 'warm_cache' for v1.x. See https://mostlyright.md/docs/sdk/typescript/ingest-strategies"
|
|
5829
|
+
});
|
|
5830
|
+
}
|
|
5831
|
+
let resolved;
|
|
5832
|
+
if (strategy === "auto") {
|
|
5833
|
+
resolved = resolveAutoStrategy(fromDate, toDate);
|
|
5834
|
+
} else if (strategy === "exact_window" || strategy === "warm_cache") {
|
|
5835
|
+
resolved = strategy;
|
|
5836
|
+
} else {
|
|
5837
|
+
throw new TypeError(
|
|
5838
|
+
`obs: unknown strategy "${String(strategy)}" \u2014 expected one of: auto, exact_window, warm_cache, hosted`
|
|
5839
|
+
);
|
|
5840
|
+
}
|
|
5841
|
+
return fetchByStrategy(station, fromDate, toDate, resolved, source);
|
|
5842
|
+
}
|
|
5843
|
+
|
|
5844
|
+
// ../weather/src/index.ts
|
|
5845
|
+
var version2 = "0.0.0";
|
|
5846
|
+
function helloWeather() {
|
|
5847
|
+
return "hello @mostlyrightmd/weather";
|
|
5848
|
+
}
|
|
5849
|
+
|
|
5850
|
+
// ../markets/src/index.ts
|
|
5851
|
+
var src_exports3 = {};
|
|
5852
|
+
__export(src_exports3, {
|
|
5853
|
+
ContractIdError: () => ContractIdError,
|
|
5854
|
+
KALSHI_SETTLEMENT_STATIONS: () => KALSHI_SETTLEMENT_STATIONS,
|
|
5855
|
+
KNOWN_WRONG_STATIONS: () => KNOWN_WRONG_STATIONS,
|
|
5856
|
+
POLYMARKET_CITY_STATIONS: () => POLYMARKET_CITY_STATIONS,
|
|
5857
|
+
helloMarkets: () => helloMarkets,
|
|
5858
|
+
kalshiNhighResolve: () => kalshiNhighResolve,
|
|
5859
|
+
kalshiNlowResolve: () => kalshiNlowResolve,
|
|
5860
|
+
kalshiSettlementFor: () => kalshiSettlementFor,
|
|
5861
|
+
version: () => version3
|
|
5862
|
+
});
|
|
5863
|
+
|
|
5864
|
+
// ../markets/src/data/generated/kalshi-stations.ts
|
|
5865
|
+
var KALSHI_SETTLEMENT_STATIONS = {
|
|
5866
|
+
ATL: {
|
|
5867
|
+
citation: "https://kalshi.com/markets/khighatl (Atlanta Hartsfield-Jackson)",
|
|
5868
|
+
station: "KATL"
|
|
5869
|
+
},
|
|
5870
|
+
AUS: {
|
|
5871
|
+
citation: "https://kalshi.com/markets/khighaus (Austin-Bergstrom; the only Austin station Kalshi cites)",
|
|
5872
|
+
station: "KAUS"
|
|
5873
|
+
},
|
|
5874
|
+
BNA: {
|
|
5875
|
+
citation: "https://kalshi.com/markets/khighbna (Nashville International)",
|
|
5876
|
+
station: "KBNA"
|
|
5877
|
+
},
|
|
5878
|
+
BOS: {
|
|
5879
|
+
citation: "https://kalshi.com/markets/khighbos (Boston Logan)",
|
|
5880
|
+
station: "KBOS"
|
|
5881
|
+
},
|
|
5882
|
+
CHI: {
|
|
5883
|
+
citation: "https://kalshi.com/markets/khighchi (Midway, NOT ORD)",
|
|
5884
|
+
station: "KMDW"
|
|
5885
|
+
},
|
|
5886
|
+
CVG: {
|
|
5887
|
+
citation: "https://kalshi.com/markets/khighcvg (Cincinnati/Northern Kentucky International)",
|
|
5888
|
+
station: "KCVG"
|
|
5889
|
+
},
|
|
5890
|
+
DAL: {
|
|
5891
|
+
citation: "https://kalshi.com/markets/khighdal (DFW, NOT Love Field)",
|
|
5892
|
+
station: "KDFW"
|
|
5893
|
+
},
|
|
5894
|
+
DCA: {
|
|
5895
|
+
citation: "https://kalshi.com/markets/khighdca (Reagan National, NOT Dulles or BWI)",
|
|
5896
|
+
station: "KDCA"
|
|
5897
|
+
},
|
|
5898
|
+
DEN: {
|
|
5899
|
+
citation: "https://kalshi.com/markets/khighden (Denver International)",
|
|
5900
|
+
station: "KDEN"
|
|
5901
|
+
},
|
|
5902
|
+
DTW: {
|
|
5903
|
+
citation: "https://kalshi.com/markets/khighdtw (Detroit Metropolitan)",
|
|
3428
5904
|
station: "KDTW"
|
|
3429
5905
|
},
|
|
3430
5906
|
HOU: {
|
|
@@ -3466,6 +5942,10 @@ var mostlyright = (() => {
|
|
|
3466
5942
|
SLC: {
|
|
3467
5943
|
citation: "https://kalshi.com/markets/khighslc (Salt Lake City International)",
|
|
3468
5944
|
station: "KSLC"
|
|
5945
|
+
},
|
|
5946
|
+
TLV: {
|
|
5947
|
+
citation: "https://kalshi.com/markets/kxhightlv (Harry Reid/McCarran; settles vs NWS CLILAS)",
|
|
5948
|
+
station: "KLAS"
|
|
3469
5949
|
}
|
|
3470
5950
|
};
|
|
3471
5951
|
var KNOWN_WRONG_STATIONS = /* @__PURE__ */ new Set([
|
|
@@ -4057,10 +6537,11 @@ var mostlyright = (() => {
|
|
|
4057
6537
|
}
|
|
4058
6538
|
}));
|
|
4059
6539
|
|
|
4060
|
-
// ../core/dist/internal/chunk-
|
|
6540
|
+
// ../core/dist/internal/chunk-QDQSYUFW.mjs
|
|
4061
6541
|
function lockKeyFor(key) {
|
|
4062
6542
|
return `mostlyright:cache:lock:${key}`;
|
|
4063
6543
|
}
|
|
6544
|
+
var CACHE_SCHEMA_VERSION = "v2-phase18-integer-f";
|
|
4064
6545
|
var MemoryStore = class {
|
|
4065
6546
|
#entries = /* @__PURE__ */ new Map();
|
|
4066
6547
|
#chain = /* @__PURE__ */ new Map();
|
|
@@ -4207,7 +6688,71 @@ var mostlyright = (() => {
|
|
|
4207
6688
|
return next;
|
|
4208
6689
|
}
|
|
4209
6690
|
};
|
|
4210
|
-
var
|
|
6691
|
+
var VERSION_FIELD = "_cache_schema_version";
|
|
6692
|
+
function isVersionedEntry(v) {
|
|
6693
|
+
if (v === null || typeof v !== "object") return false;
|
|
6694
|
+
if (!(VERSION_FIELD in v)) return false;
|
|
6695
|
+
return typeof v[VERSION_FIELD] === "string";
|
|
6696
|
+
}
|
|
6697
|
+
function hasListKeys(s) {
|
|
6698
|
+
return typeof s.listKeys === "function";
|
|
6699
|
+
}
|
|
6700
|
+
var VersionedCacheStore = class {
|
|
6701
|
+
#inner;
|
|
6702
|
+
#version;
|
|
6703
|
+
constructor(inner, version5) {
|
|
6704
|
+
if (typeof version5 !== "string" || version5.length === 0) {
|
|
6705
|
+
throw new TypeError("versionedCacheStore: version must be a non-empty string");
|
|
6706
|
+
}
|
|
6707
|
+
this.#inner = inner;
|
|
6708
|
+
this.#version = version5;
|
|
6709
|
+
}
|
|
6710
|
+
/**
|
|
6711
|
+
* Test/diagnostics seam: return the underlying store so tests can assert
|
|
6712
|
+
* which concrete backend `defaultCacheStore()` selected. NOT a production
|
|
6713
|
+
* API — production code MUST use the wrapped store so version
|
|
6714
|
+
* invalidation fires on stale reads.
|
|
6715
|
+
*
|
|
6716
|
+
* @internal
|
|
6717
|
+
*/
|
|
6718
|
+
__peekInner() {
|
|
6719
|
+
return this.#inner;
|
|
6720
|
+
}
|
|
6721
|
+
async get(key) {
|
|
6722
|
+
const raw = await this.#inner.get(key);
|
|
6723
|
+
if (raw === null) return null;
|
|
6724
|
+
if (!isVersionedEntry(raw)) {
|
|
6725
|
+
return null;
|
|
6726
|
+
}
|
|
6727
|
+
if (raw._cache_schema_version !== this.#version) {
|
|
6728
|
+
return null;
|
|
6729
|
+
}
|
|
6730
|
+
return raw.value;
|
|
6731
|
+
}
|
|
6732
|
+
async set(key, value, opts) {
|
|
6733
|
+
const wrapped = {
|
|
6734
|
+
value,
|
|
6735
|
+
[VERSION_FIELD]: this.#version
|
|
6736
|
+
};
|
|
6737
|
+
await this.#inner.set(key, wrapped, opts);
|
|
6738
|
+
}
|
|
6739
|
+
async delete(key) {
|
|
6740
|
+
await this.#inner.delete(key);
|
|
6741
|
+
}
|
|
6742
|
+
async withLock(key, fn) {
|
|
6743
|
+
return this.#inner.withLock(key, fn);
|
|
6744
|
+
}
|
|
6745
|
+
async listKeys(prefix) {
|
|
6746
|
+
if (hasListKeys(this.#inner)) {
|
|
6747
|
+
return this.#inner.listKeys(prefix);
|
|
6748
|
+
}
|
|
6749
|
+
return Object.freeze([]);
|
|
6750
|
+
}
|
|
6751
|
+
};
|
|
6752
|
+
function versionedCacheStore(inner, version5) {
|
|
6753
|
+
return new VersionedCacheStore(inner, version5);
|
|
6754
|
+
}
|
|
6755
|
+
var STATIONS3 = [
|
|
4211
6756
|
{
|
|
4212
6757
|
code: "EDDB",
|
|
4213
6758
|
country: "DE",
|
|
@@ -4216,7 +6761,10 @@ var mostlyright = (() => {
|
|
|
4216
6761
|
latitude: 52.3667,
|
|
4217
6762
|
longitude: 13.5033,
|
|
4218
6763
|
name: "Berlin Brandenburg",
|
|
4219
|
-
tz: "Europe/Berlin"
|
|
6764
|
+
tz: "Europe/Berlin",
|
|
6765
|
+
venues: [
|
|
6766
|
+
"polymarket"
|
|
6767
|
+
]
|
|
4220
6768
|
},
|
|
4221
6769
|
{
|
|
4222
6770
|
code: "EDDF",
|
|
@@ -4226,7 +6774,10 @@ var mostlyright = (() => {
|
|
|
4226
6774
|
latitude: 50.0379,
|
|
4227
6775
|
longitude: 8.5622,
|
|
4228
6776
|
name: "Frankfurt am Main",
|
|
4229
|
-
tz: "Europe/Berlin"
|
|
6777
|
+
tz: "Europe/Berlin",
|
|
6778
|
+
venues: [
|
|
6779
|
+
"polymarket"
|
|
6780
|
+
]
|
|
4230
6781
|
},
|
|
4231
6782
|
{
|
|
4232
6783
|
code: "EDDM",
|
|
@@ -4236,7 +6787,10 @@ var mostlyright = (() => {
|
|
|
4236
6787
|
latitude: 48.3538,
|
|
4237
6788
|
longitude: 11.7861,
|
|
4238
6789
|
name: "Munich Franz Josef Strauss",
|
|
4239
|
-
tz: "Europe/Berlin"
|
|
6790
|
+
tz: "Europe/Berlin",
|
|
6791
|
+
venues: [
|
|
6792
|
+
"polymarket"
|
|
6793
|
+
]
|
|
4240
6794
|
},
|
|
4241
6795
|
{
|
|
4242
6796
|
code: "EFHK",
|
|
@@ -4246,7 +6800,10 @@ var mostlyright = (() => {
|
|
|
4246
6800
|
latitude: 60.3172,
|
|
4247
6801
|
longitude: 24.9633,
|
|
4248
6802
|
name: "Helsinki-Vantaa",
|
|
4249
|
-
tz: "Europe/Helsinki"
|
|
6803
|
+
tz: "Europe/Helsinki",
|
|
6804
|
+
venues: [
|
|
6805
|
+
"polymarket"
|
|
6806
|
+
]
|
|
4250
6807
|
},
|
|
4251
6808
|
{
|
|
4252
6809
|
code: "EGKK",
|
|
@@ -4256,7 +6813,10 @@ var mostlyright = (() => {
|
|
|
4256
6813
|
latitude: 51.1481,
|
|
4257
6814
|
longitude: -0.1903,
|
|
4258
6815
|
name: "London Gatwick",
|
|
4259
|
-
tz: "Europe/London"
|
|
6816
|
+
tz: "Europe/London",
|
|
6817
|
+
venues: [
|
|
6818
|
+
"polymarket"
|
|
6819
|
+
]
|
|
4260
6820
|
},
|
|
4261
6821
|
{
|
|
4262
6822
|
code: "EGLL",
|
|
@@ -4266,7 +6826,10 @@ var mostlyright = (() => {
|
|
|
4266
6826
|
latitude: 51.4706,
|
|
4267
6827
|
longitude: -0.4619,
|
|
4268
6828
|
name: "London Heathrow",
|
|
4269
|
-
tz: "Europe/London"
|
|
6829
|
+
tz: "Europe/London",
|
|
6830
|
+
venues: [
|
|
6831
|
+
"polymarket"
|
|
6832
|
+
]
|
|
4270
6833
|
},
|
|
4271
6834
|
{
|
|
4272
6835
|
code: "EHAM",
|
|
@@ -4276,7 +6839,10 @@ var mostlyright = (() => {
|
|
|
4276
6839
|
latitude: 52.3086,
|
|
4277
6840
|
longitude: 4.7639,
|
|
4278
6841
|
name: "Amsterdam Schiphol",
|
|
4279
|
-
tz: "Europe/Amsterdam"
|
|
6842
|
+
tz: "Europe/Amsterdam",
|
|
6843
|
+
venues: [
|
|
6844
|
+
"polymarket"
|
|
6845
|
+
]
|
|
4280
6846
|
},
|
|
4281
6847
|
{
|
|
4282
6848
|
code: "EKCH",
|
|
@@ -4286,7 +6852,10 @@ var mostlyright = (() => {
|
|
|
4286
6852
|
latitude: 55.6181,
|
|
4287
6853
|
longitude: 12.6561,
|
|
4288
6854
|
name: "Copenhagen Kastrup",
|
|
4289
|
-
tz: "Europe/Copenhagen"
|
|
6855
|
+
tz: "Europe/Copenhagen",
|
|
6856
|
+
venues: [
|
|
6857
|
+
"polymarket"
|
|
6858
|
+
]
|
|
4290
6859
|
},
|
|
4291
6860
|
{
|
|
4292
6861
|
code: "EPWA",
|
|
@@ -4296,7 +6865,10 @@ var mostlyright = (() => {
|
|
|
4296
6865
|
latitude: 52.1657,
|
|
4297
6866
|
longitude: 20.9671,
|
|
4298
6867
|
name: "Warsaw Chopin",
|
|
4299
|
-
tz: "Europe/Warsaw"
|
|
6868
|
+
tz: "Europe/Warsaw",
|
|
6869
|
+
venues: [
|
|
6870
|
+
"polymarket"
|
|
6871
|
+
]
|
|
4300
6872
|
},
|
|
4301
6873
|
{
|
|
4302
6874
|
code: "ESSA",
|
|
@@ -4306,7 +6878,10 @@ var mostlyright = (() => {
|
|
|
4306
6878
|
latitude: 59.6519,
|
|
4307
6879
|
longitude: 17.9186,
|
|
4308
6880
|
name: "Stockholm Arlanda",
|
|
4309
|
-
tz: "Europe/Stockholm"
|
|
6881
|
+
tz: "Europe/Stockholm",
|
|
6882
|
+
venues: [
|
|
6883
|
+
"polymarket"
|
|
6884
|
+
]
|
|
4310
6885
|
},
|
|
4311
6886
|
{
|
|
4312
6887
|
code: "ATL",
|
|
@@ -4316,7 +6891,11 @@ var mostlyright = (() => {
|
|
|
4316
6891
|
latitude: 33.6407,
|
|
4317
6892
|
longitude: -84.4277,
|
|
4318
6893
|
name: "Hartsfield-Jackson Atlanta International",
|
|
4319
|
-
tz: "America/New_York"
|
|
6894
|
+
tz: "America/New_York",
|
|
6895
|
+
venues: [
|
|
6896
|
+
"kalshi",
|
|
6897
|
+
"polymarket"
|
|
6898
|
+
]
|
|
4320
6899
|
},
|
|
4321
6900
|
{
|
|
4322
6901
|
code: "AUS",
|
|
@@ -4326,7 +6905,24 @@ var mostlyright = (() => {
|
|
|
4326
6905
|
latitude: 30.1975,
|
|
4327
6906
|
longitude: -97.6664,
|
|
4328
6907
|
name: "Austin-Bergstrom International",
|
|
4329
|
-
tz: "America/Chicago"
|
|
6908
|
+
tz: "America/Chicago",
|
|
6909
|
+
venues: [
|
|
6910
|
+
"kalshi",
|
|
6911
|
+
"polymarket"
|
|
6912
|
+
]
|
|
6913
|
+
},
|
|
6914
|
+
{
|
|
6915
|
+
code: "BNA",
|
|
6916
|
+
country: "US",
|
|
6917
|
+
ghcnh_id: "USW00013897",
|
|
6918
|
+
icao: "KBNA",
|
|
6919
|
+
latitude: 36.1245,
|
|
6920
|
+
longitude: -86.6782,
|
|
6921
|
+
name: "Nashville International",
|
|
6922
|
+
tz: "America/Chicago",
|
|
6923
|
+
venues: [
|
|
6924
|
+
"kalshi"
|
|
6925
|
+
]
|
|
4330
6926
|
},
|
|
4331
6927
|
{
|
|
4332
6928
|
code: "BOS",
|
|
@@ -4336,7 +6932,24 @@ var mostlyright = (() => {
|
|
|
4336
6932
|
latitude: 42.3656,
|
|
4337
6933
|
longitude: -71.0096,
|
|
4338
6934
|
name: "Boston Logan International",
|
|
4339
|
-
tz: "America/New_York"
|
|
6935
|
+
tz: "America/New_York",
|
|
6936
|
+
venues: [
|
|
6937
|
+
"kalshi",
|
|
6938
|
+
"polymarket"
|
|
6939
|
+
]
|
|
6940
|
+
},
|
|
6941
|
+
{
|
|
6942
|
+
code: "CVG",
|
|
6943
|
+
country: "US",
|
|
6944
|
+
ghcnh_id: "USW00093814",
|
|
6945
|
+
icao: "KCVG",
|
|
6946
|
+
latitude: 39.0488,
|
|
6947
|
+
longitude: -84.6678,
|
|
6948
|
+
name: "Cincinnati/Northern Kentucky International",
|
|
6949
|
+
tz: "America/New_York",
|
|
6950
|
+
venues: [
|
|
6951
|
+
"kalshi"
|
|
6952
|
+
]
|
|
4340
6953
|
},
|
|
4341
6954
|
{
|
|
4342
6955
|
code: "DCA",
|
|
@@ -4346,7 +6959,11 @@ var mostlyright = (() => {
|
|
|
4346
6959
|
latitude: 38.8512,
|
|
4347
6960
|
longitude: -77.0402,
|
|
4348
6961
|
name: "Washington Reagan National",
|
|
4349
|
-
tz: "America/New_York"
|
|
6962
|
+
tz: "America/New_York",
|
|
6963
|
+
venues: [
|
|
6964
|
+
"kalshi",
|
|
6965
|
+
"polymarket"
|
|
6966
|
+
]
|
|
4350
6967
|
},
|
|
4351
6968
|
{
|
|
4352
6969
|
code: "DEN",
|
|
@@ -4356,7 +6973,11 @@ var mostlyright = (() => {
|
|
|
4356
6973
|
latitude: 39.8561,
|
|
4357
6974
|
longitude: -104.6737,
|
|
4358
6975
|
name: "Denver International",
|
|
4359
|
-
tz: "America/Denver"
|
|
6976
|
+
tz: "America/Denver",
|
|
6977
|
+
venues: [
|
|
6978
|
+
"kalshi",
|
|
6979
|
+
"polymarket"
|
|
6980
|
+
]
|
|
4360
6981
|
},
|
|
4361
6982
|
{
|
|
4362
6983
|
code: "DFW",
|
|
@@ -4366,7 +6987,25 @@ var mostlyright = (() => {
|
|
|
4366
6987
|
latitude: 32.8998,
|
|
4367
6988
|
longitude: -97.0403,
|
|
4368
6989
|
name: "Dallas-Fort Worth International",
|
|
4369
|
-
tz: "America/Chicago"
|
|
6990
|
+
tz: "America/Chicago",
|
|
6991
|
+
venues: [
|
|
6992
|
+
"kalshi",
|
|
6993
|
+
"polymarket"
|
|
6994
|
+
]
|
|
6995
|
+
},
|
|
6996
|
+
{
|
|
6997
|
+
code: "DTW",
|
|
6998
|
+
country: "US",
|
|
6999
|
+
ghcnh_id: "USW00094847",
|
|
7000
|
+
icao: "KDTW",
|
|
7001
|
+
latitude: 42.2124,
|
|
7002
|
+
longitude: -83.3534,
|
|
7003
|
+
name: "Detroit Metropolitan Wayne County",
|
|
7004
|
+
tz: "America/New_York",
|
|
7005
|
+
venues: [
|
|
7006
|
+
"kalshi",
|
|
7007
|
+
"polymarket"
|
|
7008
|
+
]
|
|
4370
7009
|
},
|
|
4371
7010
|
{
|
|
4372
7011
|
code: "HOU",
|
|
@@ -4376,7 +7015,22 @@ var mostlyright = (() => {
|
|
|
4376
7015
|
latitude: 29.6454,
|
|
4377
7016
|
longitude: -95.2789,
|
|
4378
7017
|
name: "Houston Hobby",
|
|
4379
|
-
tz: "America/Chicago"
|
|
7018
|
+
tz: "America/Chicago",
|
|
7019
|
+
venues: []
|
|
7020
|
+
},
|
|
7021
|
+
{
|
|
7022
|
+
code: "IAH",
|
|
7023
|
+
country: "US",
|
|
7024
|
+
ghcnh_id: "USW00012960",
|
|
7025
|
+
icao: "KIAH",
|
|
7026
|
+
latitude: 29.9844,
|
|
7027
|
+
longitude: -95.3414,
|
|
7028
|
+
name: "Houston George Bush Intercontinental",
|
|
7029
|
+
tz: "America/Chicago",
|
|
7030
|
+
venues: [
|
|
7031
|
+
"kalshi",
|
|
7032
|
+
"polymarket"
|
|
7033
|
+
]
|
|
4380
7034
|
},
|
|
4381
7035
|
{
|
|
4382
7036
|
code: "LAS",
|
|
@@ -4386,7 +7040,10 @@ var mostlyright = (() => {
|
|
|
4386
7040
|
latitude: 36.084,
|
|
4387
7041
|
longitude: -115.1537,
|
|
4388
7042
|
name: "Harry Reid (McCarran) International",
|
|
4389
|
-
tz: "America/Los_Angeles"
|
|
7043
|
+
tz: "America/Los_Angeles",
|
|
7044
|
+
venues: [
|
|
7045
|
+
"kalshi"
|
|
7046
|
+
]
|
|
4390
7047
|
},
|
|
4391
7048
|
{
|
|
4392
7049
|
code: "LAX",
|
|
@@ -4396,7 +7053,11 @@ var mostlyright = (() => {
|
|
|
4396
7053
|
latitude: 33.9425,
|
|
4397
7054
|
longitude: -118.4081,
|
|
4398
7055
|
name: "Los Angeles International",
|
|
4399
|
-
tz: "America/Los_Angeles"
|
|
7056
|
+
tz: "America/Los_Angeles",
|
|
7057
|
+
venues: [
|
|
7058
|
+
"kalshi",
|
|
7059
|
+
"polymarket"
|
|
7060
|
+
]
|
|
4400
7061
|
},
|
|
4401
7062
|
{
|
|
4402
7063
|
code: "MDW",
|
|
@@ -4406,7 +7067,10 @@ var mostlyright = (() => {
|
|
|
4406
7067
|
latitude: 41.7868,
|
|
4407
7068
|
longitude: -87.7522,
|
|
4408
7069
|
name: "Chicago Midway International",
|
|
4409
|
-
tz: "America/Chicago"
|
|
7070
|
+
tz: "America/Chicago",
|
|
7071
|
+
venues: [
|
|
7072
|
+
"kalshi"
|
|
7073
|
+
]
|
|
4410
7074
|
},
|
|
4411
7075
|
{
|
|
4412
7076
|
code: "MIA",
|
|
@@ -4416,7 +7080,11 @@ var mostlyright = (() => {
|
|
|
4416
7080
|
latitude: 25.7959,
|
|
4417
7081
|
longitude: -80.287,
|
|
4418
7082
|
name: "Miami International",
|
|
4419
|
-
tz: "America/New_York"
|
|
7083
|
+
tz: "America/New_York",
|
|
7084
|
+
venues: [
|
|
7085
|
+
"kalshi",
|
|
7086
|
+
"polymarket"
|
|
7087
|
+
]
|
|
4420
7088
|
},
|
|
4421
7089
|
{
|
|
4422
7090
|
code: "MSP",
|
|
@@ -4426,7 +7094,11 @@ var mostlyright = (() => {
|
|
|
4426
7094
|
latitude: 44.8848,
|
|
4427
7095
|
longitude: -93.2223,
|
|
4428
7096
|
name: "Minneapolis-St Paul International",
|
|
4429
|
-
tz: "America/Chicago"
|
|
7097
|
+
tz: "America/Chicago",
|
|
7098
|
+
venues: [
|
|
7099
|
+
"kalshi",
|
|
7100
|
+
"polymarket"
|
|
7101
|
+
]
|
|
4430
7102
|
},
|
|
4431
7103
|
{
|
|
4432
7104
|
code: "MSY",
|
|
@@ -4436,7 +7108,8 @@ var mostlyright = (() => {
|
|
|
4436
7108
|
latitude: 29.9934,
|
|
4437
7109
|
longitude: -90.258,
|
|
4438
7110
|
name: "New Orleans Louis Armstrong International",
|
|
4439
|
-
tz: "America/Chicago"
|
|
7111
|
+
tz: "America/Chicago",
|
|
7112
|
+
venues: []
|
|
4440
7113
|
},
|
|
4441
7114
|
{
|
|
4442
7115
|
code: "NYC",
|
|
@@ -4446,7 +7119,10 @@ var mostlyright = (() => {
|
|
|
4446
7119
|
latitude: 40.7789,
|
|
4447
7120
|
longitude: -73.9692,
|
|
4448
7121
|
name: "Central Park, New York",
|
|
4449
|
-
tz: "America/New_York"
|
|
7122
|
+
tz: "America/New_York",
|
|
7123
|
+
venues: [
|
|
7124
|
+
"kalshi"
|
|
7125
|
+
]
|
|
4450
7126
|
},
|
|
4451
7127
|
{
|
|
4452
7128
|
code: "OKC",
|
|
@@ -4456,7 +7132,8 @@ var mostlyright = (() => {
|
|
|
4456
7132
|
latitude: 35.3931,
|
|
4457
7133
|
longitude: -97.6007,
|
|
4458
7134
|
name: "Oklahoma City Will Rogers World",
|
|
4459
|
-
tz: "America/Chicago"
|
|
7135
|
+
tz: "America/Chicago",
|
|
7136
|
+
venues: []
|
|
4460
7137
|
},
|
|
4461
7138
|
{
|
|
4462
7139
|
code: "PHL",
|
|
@@ -4466,7 +7143,11 @@ var mostlyright = (() => {
|
|
|
4466
7143
|
latitude: 39.8721,
|
|
4467
7144
|
longitude: -75.2411,
|
|
4468
7145
|
name: "Philadelphia International",
|
|
4469
|
-
tz: "America/New_York"
|
|
7146
|
+
tz: "America/New_York",
|
|
7147
|
+
venues: [
|
|
7148
|
+
"kalshi",
|
|
7149
|
+
"polymarket"
|
|
7150
|
+
]
|
|
4470
7151
|
},
|
|
4471
7152
|
{
|
|
4472
7153
|
code: "PHX",
|
|
@@ -4476,7 +7157,11 @@ var mostlyright = (() => {
|
|
|
4476
7157
|
latitude: 33.4373,
|
|
4477
7158
|
longitude: -112.0078,
|
|
4478
7159
|
name: "Phoenix Sky Harbor International",
|
|
4479
|
-
tz: "America/Phoenix"
|
|
7160
|
+
tz: "America/Phoenix",
|
|
7161
|
+
venues: [
|
|
7162
|
+
"kalshi",
|
|
7163
|
+
"polymarket"
|
|
7164
|
+
]
|
|
4480
7165
|
},
|
|
4481
7166
|
{
|
|
4482
7167
|
code: "SAT",
|
|
@@ -4486,7 +7171,8 @@ var mostlyright = (() => {
|
|
|
4486
7171
|
latitude: 29.5337,
|
|
4487
7172
|
longitude: -98.4698,
|
|
4488
7173
|
name: "San Antonio International",
|
|
4489
|
-
tz: "America/Chicago"
|
|
7174
|
+
tz: "America/Chicago",
|
|
7175
|
+
venues: []
|
|
4490
7176
|
},
|
|
4491
7177
|
{
|
|
4492
7178
|
code: "SEA",
|
|
@@ -4496,7 +7182,11 @@ var mostlyright = (() => {
|
|
|
4496
7182
|
latitude: 47.4502,
|
|
4497
7183
|
longitude: -122.3088,
|
|
4498
7184
|
name: "Seattle-Tacoma International",
|
|
4499
|
-
tz: "America/Los_Angeles"
|
|
7185
|
+
tz: "America/Los_Angeles",
|
|
7186
|
+
venues: [
|
|
7187
|
+
"kalshi",
|
|
7188
|
+
"polymarket"
|
|
7189
|
+
]
|
|
4500
7190
|
},
|
|
4501
7191
|
{
|
|
4502
7192
|
code: "SFO",
|
|
@@ -4506,7 +7196,24 @@ var mostlyright = (() => {
|
|
|
4506
7196
|
latitude: 37.6213,
|
|
4507
7197
|
longitude: -122.379,
|
|
4508
7198
|
name: "San Francisco International",
|
|
4509
|
-
tz: "America/Los_Angeles"
|
|
7199
|
+
tz: "America/Los_Angeles",
|
|
7200
|
+
venues: [
|
|
7201
|
+
"kalshi",
|
|
7202
|
+
"polymarket"
|
|
7203
|
+
]
|
|
7204
|
+
},
|
|
7205
|
+
{
|
|
7206
|
+
code: "SLC",
|
|
7207
|
+
country: "US",
|
|
7208
|
+
ghcnh_id: "USW00024127",
|
|
7209
|
+
icao: "KSLC",
|
|
7210
|
+
latitude: 40.7884,
|
|
7211
|
+
longitude: -111.9778,
|
|
7212
|
+
name: "Salt Lake City International",
|
|
7213
|
+
tz: "America/Denver",
|
|
7214
|
+
venues: [
|
|
7215
|
+
"kalshi"
|
|
7216
|
+
]
|
|
4510
7217
|
},
|
|
4511
7218
|
{
|
|
4512
7219
|
code: "LEBL",
|
|
@@ -4516,7 +7223,10 @@ var mostlyright = (() => {
|
|
|
4516
7223
|
latitude: 41.2974,
|
|
4517
7224
|
longitude: 2.0833,
|
|
4518
7225
|
name: "Barcelona El Prat",
|
|
4519
|
-
tz: "Europe/Madrid"
|
|
7226
|
+
tz: "Europe/Madrid",
|
|
7227
|
+
venues: [
|
|
7228
|
+
"polymarket"
|
|
7229
|
+
]
|
|
4520
7230
|
},
|
|
4521
7231
|
{
|
|
4522
7232
|
code: "LEMD",
|
|
@@ -4526,7 +7236,10 @@ var mostlyright = (() => {
|
|
|
4526
7236
|
latitude: 40.4719,
|
|
4527
7237
|
longitude: -3.5626,
|
|
4528
7238
|
name: "Madrid Barajas",
|
|
4529
|
-
tz: "Europe/Madrid"
|
|
7239
|
+
tz: "Europe/Madrid",
|
|
7240
|
+
venues: [
|
|
7241
|
+
"polymarket"
|
|
7242
|
+
]
|
|
4530
7243
|
},
|
|
4531
7244
|
{
|
|
4532
7245
|
code: "LFPB",
|
|
@@ -4536,7 +7249,10 @@ var mostlyright = (() => {
|
|
|
4536
7249
|
latitude: 48.9694,
|
|
4537
7250
|
longitude: 2.4414,
|
|
4538
7251
|
name: "Paris Le Bourget",
|
|
4539
|
-
tz: "Europe/Paris"
|
|
7252
|
+
tz: "Europe/Paris",
|
|
7253
|
+
venues: [
|
|
7254
|
+
"polymarket"
|
|
7255
|
+
]
|
|
4540
7256
|
},
|
|
4541
7257
|
{
|
|
4542
7258
|
code: "LFPG",
|
|
@@ -4546,7 +7262,10 @@ var mostlyright = (() => {
|
|
|
4546
7262
|
latitude: 49.0097,
|
|
4547
7263
|
longitude: 2.5479,
|
|
4548
7264
|
name: "Paris Charles de Gaulle",
|
|
4549
|
-
tz: "Europe/Paris"
|
|
7265
|
+
tz: "Europe/Paris",
|
|
7266
|
+
venues: [
|
|
7267
|
+
"polymarket"
|
|
7268
|
+
]
|
|
4550
7269
|
},
|
|
4551
7270
|
{
|
|
4552
7271
|
code: "LFPO",
|
|
@@ -4556,7 +7275,10 @@ var mostlyright = (() => {
|
|
|
4556
7275
|
latitude: 48.7233,
|
|
4557
7276
|
longitude: 2.3794,
|
|
4558
7277
|
name: "Paris Orly",
|
|
4559
|
-
tz: "Europe/Paris"
|
|
7278
|
+
tz: "Europe/Paris",
|
|
7279
|
+
venues: [
|
|
7280
|
+
"polymarket"
|
|
7281
|
+
]
|
|
4560
7282
|
},
|
|
4561
7283
|
{
|
|
4562
7284
|
code: "LIMC",
|
|
@@ -4566,7 +7288,10 @@ var mostlyright = (() => {
|
|
|
4566
7288
|
latitude: 45.6306,
|
|
4567
7289
|
longitude: 8.7281,
|
|
4568
7290
|
name: "Milan Malpensa",
|
|
4569
|
-
tz: "Europe/Rome"
|
|
7291
|
+
tz: "Europe/Rome",
|
|
7292
|
+
venues: [
|
|
7293
|
+
"polymarket"
|
|
7294
|
+
]
|
|
4570
7295
|
},
|
|
4571
7296
|
{
|
|
4572
7297
|
code: "LIRF",
|
|
@@ -4576,7 +7301,10 @@ var mostlyright = (() => {
|
|
|
4576
7301
|
latitude: 41.8003,
|
|
4577
7302
|
longitude: 12.2389,
|
|
4578
7303
|
name: "Rome Fiumicino",
|
|
4579
|
-
tz: "Europe/Rome"
|
|
7304
|
+
tz: "Europe/Rome",
|
|
7305
|
+
venues: [
|
|
7306
|
+
"polymarket"
|
|
7307
|
+
]
|
|
4580
7308
|
},
|
|
4581
7309
|
{
|
|
4582
7310
|
code: "LOWW",
|
|
@@ -4586,7 +7314,10 @@ var mostlyright = (() => {
|
|
|
4586
7314
|
latitude: 48.1103,
|
|
4587
7315
|
longitude: 16.5697,
|
|
4588
7316
|
name: "Vienna International",
|
|
4589
|
-
tz: "Europe/Vienna"
|
|
7317
|
+
tz: "Europe/Vienna",
|
|
7318
|
+
venues: [
|
|
7319
|
+
"polymarket"
|
|
7320
|
+
]
|
|
4590
7321
|
},
|
|
4591
7322
|
{
|
|
4592
7323
|
code: "LSZH",
|
|
@@ -4596,7 +7327,10 @@ var mostlyright = (() => {
|
|
|
4596
7327
|
latitude: 47.4647,
|
|
4597
7328
|
longitude: 8.5492,
|
|
4598
7329
|
name: "Zurich",
|
|
4599
|
-
tz: "Europe/Zurich"
|
|
7330
|
+
tz: "Europe/Zurich",
|
|
7331
|
+
venues: [
|
|
7332
|
+
"polymarket"
|
|
7333
|
+
]
|
|
4600
7334
|
},
|
|
4601
7335
|
{
|
|
4602
7336
|
code: "NZAA",
|
|
@@ -4606,7 +7340,10 @@ var mostlyright = (() => {
|
|
|
4606
7340
|
latitude: -37.0081,
|
|
4607
7341
|
longitude: 174.7917,
|
|
4608
7342
|
name: "Auckland",
|
|
4609
|
-
tz: "Pacific/Auckland"
|
|
7343
|
+
tz: "Pacific/Auckland",
|
|
7344
|
+
venues: [
|
|
7345
|
+
"polymarket"
|
|
7346
|
+
]
|
|
4610
7347
|
},
|
|
4611
7348
|
{
|
|
4612
7349
|
code: "NZWN",
|
|
@@ -4616,7 +7353,10 @@ var mostlyright = (() => {
|
|
|
4616
7353
|
latitude: -41.3272,
|
|
4617
7354
|
longitude: 174.8053,
|
|
4618
7355
|
name: "Wellington",
|
|
4619
|
-
tz: "Pacific/Auckland"
|
|
7356
|
+
tz: "Pacific/Auckland",
|
|
7357
|
+
venues: [
|
|
7358
|
+
"polymarket"
|
|
7359
|
+
]
|
|
4620
7360
|
},
|
|
4621
7361
|
{
|
|
4622
7362
|
code: "OERK",
|
|
@@ -4626,7 +7366,10 @@ var mostlyright = (() => {
|
|
|
4626
7366
|
latitude: 24.9576,
|
|
4627
7367
|
longitude: 46.6988,
|
|
4628
7368
|
name: "Riyadh King Khalid International",
|
|
4629
|
-
tz: "Asia/Riyadh"
|
|
7369
|
+
tz: "Asia/Riyadh",
|
|
7370
|
+
venues: [
|
|
7371
|
+
"polymarket"
|
|
7372
|
+
]
|
|
4630
7373
|
},
|
|
4631
7374
|
{
|
|
4632
7375
|
code: "OMDB",
|
|
@@ -4636,7 +7379,10 @@ var mostlyright = (() => {
|
|
|
4636
7379
|
latitude: 25.2532,
|
|
4637
7380
|
longitude: 55.3657,
|
|
4638
7381
|
name: "Dubai International",
|
|
4639
|
-
tz: "Asia/Dubai"
|
|
7382
|
+
tz: "Asia/Dubai",
|
|
7383
|
+
venues: [
|
|
7384
|
+
"polymarket"
|
|
7385
|
+
]
|
|
4640
7386
|
},
|
|
4641
7387
|
{
|
|
4642
7388
|
code: "OTHH",
|
|
@@ -4646,7 +7392,10 @@ var mostlyright = (() => {
|
|
|
4646
7392
|
latitude: 25.2731,
|
|
4647
7393
|
longitude: 51.608,
|
|
4648
7394
|
name: "Doha Hamad International",
|
|
4649
|
-
tz: "Asia/Qatar"
|
|
7395
|
+
tz: "Asia/Qatar",
|
|
7396
|
+
venues: [
|
|
7397
|
+
"polymarket"
|
|
7398
|
+
]
|
|
4650
7399
|
},
|
|
4651
7400
|
{
|
|
4652
7401
|
code: "RCTP",
|
|
@@ -4656,7 +7405,10 @@ var mostlyright = (() => {
|
|
|
4656
7405
|
latitude: 25.0777,
|
|
4657
7406
|
longitude: 121.2328,
|
|
4658
7407
|
name: "Taipei Taoyuan",
|
|
4659
|
-
tz: "Asia/Taipei"
|
|
7408
|
+
tz: "Asia/Taipei",
|
|
7409
|
+
venues: [
|
|
7410
|
+
"polymarket"
|
|
7411
|
+
]
|
|
4660
7412
|
},
|
|
4661
7413
|
{
|
|
4662
7414
|
code: "RJAA",
|
|
@@ -4666,7 +7418,10 @@ var mostlyright = (() => {
|
|
|
4666
7418
|
latitude: 35.7647,
|
|
4667
7419
|
longitude: 140.3864,
|
|
4668
7420
|
name: "Tokyo Narita",
|
|
4669
|
-
tz: "Asia/Tokyo"
|
|
7421
|
+
tz: "Asia/Tokyo",
|
|
7422
|
+
venues: [
|
|
7423
|
+
"polymarket"
|
|
7424
|
+
]
|
|
4670
7425
|
},
|
|
4671
7426
|
{
|
|
4672
7427
|
code: "RJTT",
|
|
@@ -4676,7 +7431,10 @@ var mostlyright = (() => {
|
|
|
4676
7431
|
latitude: 35.5522,
|
|
4677
7432
|
longitude: 139.78,
|
|
4678
7433
|
name: "Tokyo Haneda",
|
|
4679
|
-
tz: "Asia/Tokyo"
|
|
7434
|
+
tz: "Asia/Tokyo",
|
|
7435
|
+
venues: [
|
|
7436
|
+
"polymarket"
|
|
7437
|
+
]
|
|
4680
7438
|
},
|
|
4681
7439
|
{
|
|
4682
7440
|
code: "RKSI",
|
|
@@ -4686,7 +7444,10 @@ var mostlyright = (() => {
|
|
|
4686
7444
|
latitude: 37.4691,
|
|
4687
7445
|
longitude: 126.4505,
|
|
4688
7446
|
name: "Seoul Incheon",
|
|
4689
|
-
tz: "Asia/Seoul"
|
|
7447
|
+
tz: "Asia/Seoul",
|
|
7448
|
+
venues: [
|
|
7449
|
+
"polymarket"
|
|
7450
|
+
]
|
|
4690
7451
|
},
|
|
4691
7452
|
{
|
|
4692
7453
|
code: "SAEZ",
|
|
@@ -4696,7 +7457,10 @@ var mostlyright = (() => {
|
|
|
4696
7457
|
latitude: -34.8222,
|
|
4697
7458
|
longitude: -58.5358,
|
|
4698
7459
|
name: "Buenos Aires Ezeiza",
|
|
4699
|
-
tz: "America/Argentina/Buenos_Aires"
|
|
7460
|
+
tz: "America/Argentina/Buenos_Aires",
|
|
7461
|
+
venues: [
|
|
7462
|
+
"polymarket"
|
|
7463
|
+
]
|
|
4700
7464
|
},
|
|
4701
7465
|
{
|
|
4702
7466
|
code: "SBGR",
|
|
@@ -4706,7 +7470,10 @@ var mostlyright = (() => {
|
|
|
4706
7470
|
latitude: -23.4356,
|
|
4707
7471
|
longitude: -46.4731,
|
|
4708
7472
|
name: "S\xE3o Paulo Guarulhos",
|
|
4709
|
-
tz: "America/Sao_Paulo"
|
|
7473
|
+
tz: "America/Sao_Paulo",
|
|
7474
|
+
venues: [
|
|
7475
|
+
"polymarket"
|
|
7476
|
+
]
|
|
4710
7477
|
},
|
|
4711
7478
|
{
|
|
4712
7479
|
code: "UUEE",
|
|
@@ -4716,7 +7483,10 @@ var mostlyright = (() => {
|
|
|
4716
7483
|
latitude: 55.9728,
|
|
4717
7484
|
longitude: 37.4147,
|
|
4718
7485
|
name: "Moscow Sheremetyevo",
|
|
4719
|
-
tz: "Europe/Moscow"
|
|
7486
|
+
tz: "Europe/Moscow",
|
|
7487
|
+
venues: [
|
|
7488
|
+
"polymarket"
|
|
7489
|
+
]
|
|
4720
7490
|
},
|
|
4721
7491
|
{
|
|
4722
7492
|
code: "VABB",
|
|
@@ -4726,7 +7496,10 @@ var mostlyright = (() => {
|
|
|
4726
7496
|
latitude: 19.0887,
|
|
4727
7497
|
longitude: 72.8679,
|
|
4728
7498
|
name: "Mumbai Chhatrapati Shivaji",
|
|
4729
|
-
tz: "Asia/Kolkata"
|
|
7499
|
+
tz: "Asia/Kolkata",
|
|
7500
|
+
venues: [
|
|
7501
|
+
"polymarket"
|
|
7502
|
+
]
|
|
4730
7503
|
},
|
|
4731
7504
|
{
|
|
4732
7505
|
code: "VHHH",
|
|
@@ -4736,7 +7509,10 @@ var mostlyright = (() => {
|
|
|
4736
7509
|
latitude: 22.308,
|
|
4737
7510
|
longitude: 113.9185,
|
|
4738
7511
|
name: "Hong Kong International",
|
|
4739
|
-
tz: "Asia/Hong_Kong"
|
|
7512
|
+
tz: "Asia/Hong_Kong",
|
|
7513
|
+
venues: [
|
|
7514
|
+
"polymarket"
|
|
7515
|
+
]
|
|
4740
7516
|
},
|
|
4741
7517
|
{
|
|
4742
7518
|
code: "VIDP",
|
|
@@ -4746,7 +7522,10 @@ var mostlyright = (() => {
|
|
|
4746
7522
|
latitude: 28.5562,
|
|
4747
7523
|
longitude: 77.1,
|
|
4748
7524
|
name: "Delhi Indira Gandhi",
|
|
4749
|
-
tz: "Asia/Kolkata"
|
|
7525
|
+
tz: "Asia/Kolkata",
|
|
7526
|
+
venues: [
|
|
7527
|
+
"polymarket"
|
|
7528
|
+
]
|
|
4750
7529
|
},
|
|
4751
7530
|
{
|
|
4752
7531
|
code: "VTBS",
|
|
@@ -4756,7 +7535,10 @@ var mostlyright = (() => {
|
|
|
4756
7535
|
latitude: 13.69,
|
|
4757
7536
|
longitude: 100.7501,
|
|
4758
7537
|
name: "Bangkok Suvarnabhumi",
|
|
4759
|
-
tz: "Asia/Bangkok"
|
|
7538
|
+
tz: "Asia/Bangkok",
|
|
7539
|
+
venues: [
|
|
7540
|
+
"polymarket"
|
|
7541
|
+
]
|
|
4760
7542
|
},
|
|
4761
7543
|
{
|
|
4762
7544
|
code: "WSSS",
|
|
@@ -4766,7 +7548,10 @@ var mostlyright = (() => {
|
|
|
4766
7548
|
latitude: 1.3644,
|
|
4767
7549
|
longitude: 103.9915,
|
|
4768
7550
|
name: "Singapore Changi",
|
|
4769
|
-
tz: "Asia/Singapore"
|
|
7551
|
+
tz: "Asia/Singapore",
|
|
7552
|
+
venues: [
|
|
7553
|
+
"polymarket"
|
|
7554
|
+
]
|
|
4770
7555
|
},
|
|
4771
7556
|
{
|
|
4772
7557
|
code: "YBBN",
|
|
@@ -4776,7 +7561,10 @@ var mostlyright = (() => {
|
|
|
4776
7561
|
latitude: -27.3842,
|
|
4777
7562
|
longitude: 153.1175,
|
|
4778
7563
|
name: "Brisbane",
|
|
4779
|
-
tz: "Australia/Brisbane"
|
|
7564
|
+
tz: "Australia/Brisbane",
|
|
7565
|
+
venues: [
|
|
7566
|
+
"polymarket"
|
|
7567
|
+
]
|
|
4780
7568
|
},
|
|
4781
7569
|
{
|
|
4782
7570
|
code: "YMML",
|
|
@@ -4786,7 +7574,10 @@ var mostlyright = (() => {
|
|
|
4786
7574
|
latitude: -37.6733,
|
|
4787
7575
|
longitude: 144.8433,
|
|
4788
7576
|
name: "Melbourne Tullamarine",
|
|
4789
|
-
tz: "Australia/Melbourne"
|
|
7577
|
+
tz: "Australia/Melbourne",
|
|
7578
|
+
venues: [
|
|
7579
|
+
"polymarket"
|
|
7580
|
+
]
|
|
4790
7581
|
},
|
|
4791
7582
|
{
|
|
4792
7583
|
code: "YSSY",
|
|
@@ -4796,7 +7587,10 @@ var mostlyright = (() => {
|
|
|
4796
7587
|
latitude: -33.9461,
|
|
4797
7588
|
longitude: 151.1772,
|
|
4798
7589
|
name: "Sydney Kingsford Smith",
|
|
4799
|
-
tz: "Australia/Sydney"
|
|
7590
|
+
tz: "Australia/Sydney",
|
|
7591
|
+
venues: [
|
|
7592
|
+
"polymarket"
|
|
7593
|
+
]
|
|
4800
7594
|
},
|
|
4801
7595
|
{
|
|
4802
7596
|
code: "ZBAA",
|
|
@@ -4806,7 +7600,10 @@ var mostlyright = (() => {
|
|
|
4806
7600
|
latitude: 40.0801,
|
|
4807
7601
|
longitude: 116.5846,
|
|
4808
7602
|
name: "Beijing Capital",
|
|
4809
|
-
tz: "Asia/Shanghai"
|
|
7603
|
+
tz: "Asia/Shanghai",
|
|
7604
|
+
venues: [
|
|
7605
|
+
"polymarket"
|
|
7606
|
+
]
|
|
4810
7607
|
},
|
|
4811
7608
|
{
|
|
4812
7609
|
code: "ZSPD",
|
|
@@ -4816,134 +7613,147 @@ var mostlyright = (() => {
|
|
|
4816
7613
|
latitude: 31.1443,
|
|
4817
7614
|
longitude: 121.8083,
|
|
4818
7615
|
name: "Shanghai Pudong",
|
|
4819
|
-
tz: "Asia/Shanghai"
|
|
7616
|
+
tz: "Asia/Shanghai",
|
|
7617
|
+
venues: [
|
|
7618
|
+
"polymarket"
|
|
7619
|
+
]
|
|
4820
7620
|
}
|
|
4821
7621
|
];
|
|
4822
|
-
var
|
|
4823
|
-
["ATL",
|
|
4824
|
-
["AUS",
|
|
4825
|
-
["
|
|
4826
|
-
["
|
|
4827
|
-
["
|
|
4828
|
-
["
|
|
4829
|
-
["
|
|
4830
|
-
["
|
|
4831
|
-
["
|
|
4832
|
-
["
|
|
4833
|
-
["
|
|
4834
|
-
["
|
|
4835
|
-
["
|
|
4836
|
-
["
|
|
4837
|
-
["
|
|
4838
|
-
["
|
|
4839
|
-
["
|
|
4840
|
-
["
|
|
4841
|
-
["
|
|
4842
|
-
["
|
|
4843
|
-
["
|
|
4844
|
-
["
|
|
4845
|
-
["
|
|
4846
|
-
["
|
|
4847
|
-
["
|
|
4848
|
-
["
|
|
4849
|
-
["
|
|
4850
|
-
["
|
|
4851
|
-
["
|
|
4852
|
-
["
|
|
4853
|
-
["
|
|
4854
|
-
["
|
|
4855
|
-
["
|
|
4856
|
-
["
|
|
4857
|
-
["
|
|
4858
|
-
["
|
|
4859
|
-
["
|
|
4860
|
-
["
|
|
4861
|
-
["
|
|
4862
|
-
["
|
|
4863
|
-
["
|
|
4864
|
-
["
|
|
4865
|
-
["
|
|
4866
|
-
["
|
|
4867
|
-
["
|
|
4868
|
-
["
|
|
4869
|
-
["
|
|
4870
|
-
["
|
|
4871
|
-
["
|
|
4872
|
-
["
|
|
4873
|
-
["
|
|
4874
|
-
["
|
|
4875
|
-
["
|
|
4876
|
-
["
|
|
4877
|
-
["
|
|
4878
|
-
["
|
|
4879
|
-
["
|
|
4880
|
-
["
|
|
4881
|
-
["
|
|
4882
|
-
["
|
|
4883
|
-
["
|
|
7622
|
+
var STATION_BY_CODE3 = /* @__PURE__ */ new Map([
|
|
7623
|
+
["ATL", STATIONS3[10]],
|
|
7624
|
+
["AUS", STATIONS3[11]],
|
|
7625
|
+
["BNA", STATIONS3[12]],
|
|
7626
|
+
["BOS", STATIONS3[13]],
|
|
7627
|
+
["CVG", STATIONS3[14]],
|
|
7628
|
+
["DCA", STATIONS3[15]],
|
|
7629
|
+
["DEN", STATIONS3[16]],
|
|
7630
|
+
["DFW", STATIONS3[17]],
|
|
7631
|
+
["DTW", STATIONS3[18]],
|
|
7632
|
+
["EDDB", STATIONS3[0]],
|
|
7633
|
+
["EDDF", STATIONS3[1]],
|
|
7634
|
+
["EDDM", STATIONS3[2]],
|
|
7635
|
+
["EFHK", STATIONS3[3]],
|
|
7636
|
+
["EGKK", STATIONS3[4]],
|
|
7637
|
+
["EGLL", STATIONS3[5]],
|
|
7638
|
+
["EHAM", STATIONS3[6]],
|
|
7639
|
+
["EKCH", STATIONS3[7]],
|
|
7640
|
+
["EPWA", STATIONS3[8]],
|
|
7641
|
+
["ESSA", STATIONS3[9]],
|
|
7642
|
+
["HOU", STATIONS3[19]],
|
|
7643
|
+
["IAH", STATIONS3[20]],
|
|
7644
|
+
["LAS", STATIONS3[21]],
|
|
7645
|
+
["LAX", STATIONS3[22]],
|
|
7646
|
+
["LEBL", STATIONS3[35]],
|
|
7647
|
+
["LEMD", STATIONS3[36]],
|
|
7648
|
+
["LFPB", STATIONS3[37]],
|
|
7649
|
+
["LFPG", STATIONS3[38]],
|
|
7650
|
+
["LFPO", STATIONS3[39]],
|
|
7651
|
+
["LIMC", STATIONS3[40]],
|
|
7652
|
+
["LIRF", STATIONS3[41]],
|
|
7653
|
+
["LOWW", STATIONS3[42]],
|
|
7654
|
+
["LSZH", STATIONS3[43]],
|
|
7655
|
+
["MDW", STATIONS3[23]],
|
|
7656
|
+
["MIA", STATIONS3[24]],
|
|
7657
|
+
["MSP", STATIONS3[25]],
|
|
7658
|
+
["MSY", STATIONS3[26]],
|
|
7659
|
+
["NYC", STATIONS3[27]],
|
|
7660
|
+
["NZAA", STATIONS3[44]],
|
|
7661
|
+
["NZWN", STATIONS3[45]],
|
|
7662
|
+
["OERK", STATIONS3[46]],
|
|
7663
|
+
["OKC", STATIONS3[28]],
|
|
7664
|
+
["OMDB", STATIONS3[47]],
|
|
7665
|
+
["OTHH", STATIONS3[48]],
|
|
7666
|
+
["PHL", STATIONS3[29]],
|
|
7667
|
+
["PHX", STATIONS3[30]],
|
|
7668
|
+
["RCTP", STATIONS3[49]],
|
|
7669
|
+
["RJAA", STATIONS3[50]],
|
|
7670
|
+
["RJTT", STATIONS3[51]],
|
|
7671
|
+
["RKSI", STATIONS3[52]],
|
|
7672
|
+
["SAEZ", STATIONS3[53]],
|
|
7673
|
+
["SAT", STATIONS3[31]],
|
|
7674
|
+
["SBGR", STATIONS3[54]],
|
|
7675
|
+
["SEA", STATIONS3[32]],
|
|
7676
|
+
["SFO", STATIONS3[33]],
|
|
7677
|
+
["SLC", STATIONS3[34]],
|
|
7678
|
+
["UUEE", STATIONS3[55]],
|
|
7679
|
+
["VABB", STATIONS3[56]],
|
|
7680
|
+
["VHHH", STATIONS3[57]],
|
|
7681
|
+
["VIDP", STATIONS3[58]],
|
|
7682
|
+
["VTBS", STATIONS3[59]],
|
|
7683
|
+
["WSSS", STATIONS3[60]],
|
|
7684
|
+
["YBBN", STATIONS3[61]],
|
|
7685
|
+
["YMML", STATIONS3[62]],
|
|
7686
|
+
["YSSY", STATIONS3[63]],
|
|
7687
|
+
["ZBAA", STATIONS3[64]],
|
|
7688
|
+
["ZSPD", STATIONS3[65]]
|
|
4884
7689
|
]);
|
|
4885
|
-
var
|
|
4886
|
-
["EDDB",
|
|
4887
|
-
["EDDF",
|
|
4888
|
-
["EDDM",
|
|
4889
|
-
["EFHK",
|
|
4890
|
-
["EGKK",
|
|
4891
|
-
["EGLL",
|
|
4892
|
-
["EHAM",
|
|
4893
|
-
["EKCH",
|
|
4894
|
-
["EPWA",
|
|
4895
|
-
["ESSA",
|
|
4896
|
-
["KATL",
|
|
4897
|
-
["KAUS",
|
|
4898
|
-
["
|
|
4899
|
-
["
|
|
4900
|
-
["
|
|
4901
|
-
["
|
|
4902
|
-
["
|
|
4903
|
-
["
|
|
4904
|
-
["
|
|
4905
|
-
["
|
|
4906
|
-
["
|
|
4907
|
-
["
|
|
4908
|
-
["
|
|
4909
|
-
["
|
|
4910
|
-
["
|
|
4911
|
-
["
|
|
4912
|
-
["
|
|
4913
|
-
["
|
|
4914
|
-
["
|
|
4915
|
-
["
|
|
4916
|
-
["
|
|
4917
|
-
["
|
|
4918
|
-
["
|
|
4919
|
-
["
|
|
4920
|
-
["
|
|
4921
|
-
["
|
|
4922
|
-
["
|
|
4923
|
-
["
|
|
4924
|
-
["
|
|
4925
|
-
["
|
|
4926
|
-
["
|
|
4927
|
-
["
|
|
4928
|
-
["
|
|
4929
|
-
["
|
|
4930
|
-
["
|
|
4931
|
-
["
|
|
4932
|
-
["
|
|
4933
|
-
["
|
|
4934
|
-
["
|
|
4935
|
-
["
|
|
4936
|
-
["
|
|
4937
|
-
["
|
|
4938
|
-
["
|
|
4939
|
-
["
|
|
4940
|
-
["
|
|
4941
|
-
["
|
|
4942
|
-
["
|
|
4943
|
-
["
|
|
4944
|
-
["
|
|
4945
|
-
["
|
|
4946
|
-
["
|
|
7690
|
+
var STATION_BY_ICAO3 = /* @__PURE__ */ new Map([
|
|
7691
|
+
["EDDB", STATIONS3[0]],
|
|
7692
|
+
["EDDF", STATIONS3[1]],
|
|
7693
|
+
["EDDM", STATIONS3[2]],
|
|
7694
|
+
["EFHK", STATIONS3[3]],
|
|
7695
|
+
["EGKK", STATIONS3[4]],
|
|
7696
|
+
["EGLL", STATIONS3[5]],
|
|
7697
|
+
["EHAM", STATIONS3[6]],
|
|
7698
|
+
["EKCH", STATIONS3[7]],
|
|
7699
|
+
["EPWA", STATIONS3[8]],
|
|
7700
|
+
["ESSA", STATIONS3[9]],
|
|
7701
|
+
["KATL", STATIONS3[10]],
|
|
7702
|
+
["KAUS", STATIONS3[11]],
|
|
7703
|
+
["KBNA", STATIONS3[12]],
|
|
7704
|
+
["KBOS", STATIONS3[13]],
|
|
7705
|
+
["KCVG", STATIONS3[14]],
|
|
7706
|
+
["KDCA", STATIONS3[15]],
|
|
7707
|
+
["KDEN", STATIONS3[16]],
|
|
7708
|
+
["KDFW", STATIONS3[17]],
|
|
7709
|
+
["KDTW", STATIONS3[18]],
|
|
7710
|
+
["KHOU", STATIONS3[19]],
|
|
7711
|
+
["KIAH", STATIONS3[20]],
|
|
7712
|
+
["KLAS", STATIONS3[21]],
|
|
7713
|
+
["KLAX", STATIONS3[22]],
|
|
7714
|
+
["KMDW", STATIONS3[23]],
|
|
7715
|
+
["KMIA", STATIONS3[24]],
|
|
7716
|
+
["KMSP", STATIONS3[25]],
|
|
7717
|
+
["KMSY", STATIONS3[26]],
|
|
7718
|
+
["KNYC", STATIONS3[27]],
|
|
7719
|
+
["KOKC", STATIONS3[28]],
|
|
7720
|
+
["KPHL", STATIONS3[29]],
|
|
7721
|
+
["KPHX", STATIONS3[30]],
|
|
7722
|
+
["KSAT", STATIONS3[31]],
|
|
7723
|
+
["KSEA", STATIONS3[32]],
|
|
7724
|
+
["KSFO", STATIONS3[33]],
|
|
7725
|
+
["KSLC", STATIONS3[34]],
|
|
7726
|
+
["LEBL", STATIONS3[35]],
|
|
7727
|
+
["LEMD", STATIONS3[36]],
|
|
7728
|
+
["LFPB", STATIONS3[37]],
|
|
7729
|
+
["LFPG", STATIONS3[38]],
|
|
7730
|
+
["LFPO", STATIONS3[39]],
|
|
7731
|
+
["LIMC", STATIONS3[40]],
|
|
7732
|
+
["LIRF", STATIONS3[41]],
|
|
7733
|
+
["LOWW", STATIONS3[42]],
|
|
7734
|
+
["LSZH", STATIONS3[43]],
|
|
7735
|
+
["NZAA", STATIONS3[44]],
|
|
7736
|
+
["NZWN", STATIONS3[45]],
|
|
7737
|
+
["OERK", STATIONS3[46]],
|
|
7738
|
+
["OMDB", STATIONS3[47]],
|
|
7739
|
+
["OTHH", STATIONS3[48]],
|
|
7740
|
+
["RCTP", STATIONS3[49]],
|
|
7741
|
+
["RJAA", STATIONS3[50]],
|
|
7742
|
+
["RJTT", STATIONS3[51]],
|
|
7743
|
+
["RKSI", STATIONS3[52]],
|
|
7744
|
+
["SAEZ", STATIONS3[53]],
|
|
7745
|
+
["SBGR", STATIONS3[54]],
|
|
7746
|
+
["UUEE", STATIONS3[55]],
|
|
7747
|
+
["VABB", STATIONS3[56]],
|
|
7748
|
+
["VHHH", STATIONS3[57]],
|
|
7749
|
+
["VIDP", STATIONS3[58]],
|
|
7750
|
+
["VTBS", STATIONS3[59]],
|
|
7751
|
+
["WSSS", STATIONS3[60]],
|
|
7752
|
+
["YBBN", STATIONS3[61]],
|
|
7753
|
+
["YMML", STATIONS3[62]],
|
|
7754
|
+
["YSSY", STATIONS3[63]],
|
|
7755
|
+
["ZBAA", STATIONS3[64]],
|
|
7756
|
+
["ZSPD", STATIONS3[65]]
|
|
4947
7757
|
]);
|
|
4948
7758
|
var _STATION_TZ2 = Object.freeze({
|
|
4949
7759
|
// Eastern (UTC-5 standard / UTC-4 DST)
|
|
@@ -5090,13 +7900,13 @@ var mostlyright = (() => {
|
|
|
5090
7900
|
}
|
|
5091
7901
|
function _lstOffsetHoursFor(station) {
|
|
5092
7902
|
const upper = station.trim().toUpperCase();
|
|
5093
|
-
const byCode =
|
|
7903
|
+
const byCode = STATION_BY_CODE3.get(upper);
|
|
5094
7904
|
if (byCode !== void 0) return _lstOffsetHours2(byCode.tz);
|
|
5095
|
-
const byIcao =
|
|
7905
|
+
const byIcao = STATION_BY_ICAO3.get(upper);
|
|
5096
7906
|
if (byIcao !== void 0) return _lstOffsetHours2(byIcao.tz);
|
|
5097
7907
|
if (upper.length === 4 && upper.startsWith("K")) {
|
|
5098
7908
|
const stripped = upper.slice(1);
|
|
5099
|
-
const retry =
|
|
7909
|
+
const retry = STATION_BY_CODE3.get(stripped);
|
|
5100
7910
|
if (retry !== void 0) return _lstOffsetHours2(retry.tz);
|
|
5101
7911
|
}
|
|
5102
7912
|
throw new RangeError(`unknown station: ${JSON.stringify(station)}`);
|
|
@@ -5168,8 +7978,8 @@ var mostlyright = (() => {
|
|
|
5168
7978
|
|
|
5169
7979
|
// ../core/dist/internal/cache/index.browser.mjs
|
|
5170
7980
|
async function defaultCacheStore() {
|
|
5171
|
-
|
|
5172
|
-
return
|
|
7981
|
+
const inner = typeof indexedDB !== "undefined" ? new IndexedDBStore() : new MemoryStore();
|
|
7982
|
+
return versionedCacheStore(inner, CACHE_SCHEMA_VERSION);
|
|
5173
7983
|
}
|
|
5174
7984
|
|
|
5175
7985
|
// ../core/dist/internal/pairs.mjs
|
|
@@ -5355,9 +8165,9 @@ var mostlyright = (() => {
|
|
|
5355
8165
|
);
|
|
5356
8166
|
return new Date(marketCloseAsUtcMs - offsetHours * 36e5);
|
|
5357
8167
|
}
|
|
5358
|
-
function collectNonNull(
|
|
8168
|
+
function collectNonNull(obs2, key) {
|
|
5359
8169
|
const out = [];
|
|
5360
|
-
for (const o of
|
|
8170
|
+
for (const o of obs2) {
|
|
5361
8171
|
const v = o[key];
|
|
5362
8172
|
if (typeof v === "number" && Number.isFinite(v)) out.push(v);
|
|
5363
8173
|
}
|
|
@@ -5452,13 +8262,68 @@ var mostlyright = (() => {
|
|
|
5452
8262
|
function buildPairs(station, dates, observationsByDate, climateByDate, opts = {}) {
|
|
5453
8263
|
const out = [];
|
|
5454
8264
|
for (const date of dates) {
|
|
5455
|
-
const
|
|
8265
|
+
const obs2 = observationsByDate[date] ?? [];
|
|
5456
8266
|
const climate = climateByDate[date] ?? null;
|
|
5457
|
-
out.push(buildPairsRow(date, station,
|
|
8267
|
+
out.push(buildPairsRow(date, station, obs2, climate, opts));
|
|
5458
8268
|
}
|
|
5459
8269
|
return Object.freeze(out);
|
|
5460
8270
|
}
|
|
5461
8271
|
|
|
8272
|
+
// src/research.types.ts
|
|
8273
|
+
var KNOWN_RESEARCH_OPTION_KEYS = /* @__PURE__ */ new Set([
|
|
8274
|
+
// Pre-Phase-21 fetcher controls.
|
|
8275
|
+
"signal",
|
|
8276
|
+
"awcHours",
|
|
8277
|
+
"iemPolitenessMs",
|
|
8278
|
+
"ghcnhPolitenessMs",
|
|
8279
|
+
"cliPolitenessMs",
|
|
8280
|
+
"now",
|
|
8281
|
+
"cache",
|
|
8282
|
+
// Pre-Phase-21 selectors.
|
|
8283
|
+
"city",
|
|
8284
|
+
"contract",
|
|
8285
|
+
"contracts",
|
|
8286
|
+
"stationOverride",
|
|
8287
|
+
"sources",
|
|
8288
|
+
"source",
|
|
8289
|
+
"includeTrades",
|
|
8290
|
+
"onWarning",
|
|
8291
|
+
// Phase 21 21-01: Python-parity composable kwargs.
|
|
8292
|
+
"include_forecast",
|
|
8293
|
+
"forecast_model",
|
|
8294
|
+
"forecast_models",
|
|
8295
|
+
"qc",
|
|
8296
|
+
"tz_override",
|
|
8297
|
+
"backend",
|
|
8298
|
+
"return_type"
|
|
8299
|
+
]);
|
|
8300
|
+
function validateResearchKwargs(opts) {
|
|
8301
|
+
const present = (v) => v !== void 0 && v !== null;
|
|
8302
|
+
for (const key of Object.keys(opts)) {
|
|
8303
|
+
if (!KNOWN_RESEARCH_OPTION_KEYS.has(key)) {
|
|
8304
|
+
throw new TypeError(
|
|
8305
|
+
`research(): unknown option key ${JSON.stringify(key)}. Valid keys: ${[...KNOWN_RESEARCH_OPTION_KEYS].sort().join(", ")}`
|
|
8306
|
+
);
|
|
8307
|
+
}
|
|
8308
|
+
}
|
|
8309
|
+
if (present(opts.sources) && present(opts.source)) {
|
|
8310
|
+
throw new TypeError(
|
|
8311
|
+
"research(): sources= and source= are mutually exclusive \u2014 use `sources=` for the LIVE_V1 multi-source selector or `source=` for a single-source query, not both"
|
|
8312
|
+
);
|
|
8313
|
+
}
|
|
8314
|
+
if (present(opts.forecast_model) && present(opts.forecast_models)) {
|
|
8315
|
+
throw new TypeError(
|
|
8316
|
+
"research(): forecast_model= and forecast_models= are mutually exclusive \u2014 use `forecast_models=` for multi-model fan-out or `forecast_model=` for a single model, not both"
|
|
8317
|
+
);
|
|
8318
|
+
}
|
|
8319
|
+
const wantsForecast = present(opts.forecast_model) || present(opts.forecast_models);
|
|
8320
|
+
if (wantsForecast && opts.include_forecast !== true) {
|
|
8321
|
+
throw new TypeError(
|
|
8322
|
+
"research(): forecast_model=/forecast_models= require include_forecast=true; the model filter is otherwise silently ignored"
|
|
8323
|
+
);
|
|
8324
|
+
}
|
|
8325
|
+
}
|
|
8326
|
+
|
|
5462
8327
|
// src/research.ts
|
|
5463
8328
|
var AWC_MAX_HOURS2 = 168;
|
|
5464
8329
|
async function resolveCache(opts) {
|
|
@@ -5726,9 +8591,9 @@ var mostlyright = (() => {
|
|
|
5726
8591
|
}
|
|
5727
8592
|
}
|
|
5728
8593
|
}
|
|
5729
|
-
for (const
|
|
5730
|
-
const obsDate =
|
|
5731
|
-
if (obsDate >= fromDate && obsDate <= extendedTo) acc.push(
|
|
8594
|
+
for (const obs2 of monthRows) {
|
|
8595
|
+
const obsDate = obs2.observed_at.slice(0, 10);
|
|
8596
|
+
if (obsDate >= fromDate && obsDate <= extendedTo) acc.push(obs2);
|
|
5732
8597
|
}
|
|
5733
8598
|
}
|
|
5734
8599
|
return acc;
|
|
@@ -5799,14 +8664,22 @@ var mostlyright = (() => {
|
|
|
5799
8664
|
}
|
|
5800
8665
|
}
|
|
5801
8666
|
}
|
|
5802
|
-
for (const
|
|
5803
|
-
const obsDate =
|
|
5804
|
-
if (obsDate >= fromDate && obsDate <= extendedTo) acc.push(
|
|
8667
|
+
for (const obs2 of monthRows) {
|
|
8668
|
+
const obsDate = obs2.observed_at.slice(0, 10);
|
|
8669
|
+
if (obsDate >= fromDate && obsDate <= extendedTo) acc.push(obs2);
|
|
5805
8670
|
}
|
|
5806
8671
|
}
|
|
5807
8672
|
return acc;
|
|
5808
8673
|
}
|
|
5809
8674
|
async function research(station, fromDate, toDate, opts = {}) {
|
|
8675
|
+
validateResearchKwargs(opts);
|
|
8676
|
+
if (opts.backend === "polars") {
|
|
8677
|
+
throw new DataAvailabilityError({
|
|
8678
|
+
reason: "model_unavailable",
|
|
8679
|
+
hint: 'polars backend not available in TypeScript SDK; use Python (mostlyrightmd) for backend="polars". TS returns plain object arrays.',
|
|
8680
|
+
source: "research.backend"
|
|
8681
|
+
});
|
|
8682
|
+
}
|
|
5810
8683
|
const hasCity = typeof opts.city === "string" && opts.city.length > 0;
|
|
5811
8684
|
const hasContract = typeof opts.contract === "string" && opts.contract.length > 0;
|
|
5812
8685
|
const hasContracts = Array.isArray(opts.contracts) && opts.contracts.length > 0;
|
|
@@ -5882,8 +8755,8 @@ var mostlyright = (() => {
|
|
|
5882
8755
|
if (opts.signal !== void 0) awcOpts.signal = opts.signal;
|
|
5883
8756
|
const awcRaw = await fetchAwcMetars([resolved.icao], awcOpts);
|
|
5884
8757
|
for (const m of awcRaw) {
|
|
5885
|
-
const
|
|
5886
|
-
if (
|
|
8758
|
+
const obs2 = awcToObservation(m);
|
|
8759
|
+
if (obs2 !== null) awcRows.push(obs2);
|
|
5887
8760
|
}
|
|
5888
8761
|
}
|
|
5889
8762
|
const iemRows = await fetchIemAsosWithCache(
|
|
@@ -5914,8 +8787,8 @@ var mostlyright = (() => {
|
|
|
5914
8787
|
const observationsByDate = {};
|
|
5915
8788
|
const dateLo = dates[0] ?? "";
|
|
5916
8789
|
const dateHi = dates[dates.length - 1] ?? "";
|
|
5917
|
-
for (const
|
|
5918
|
-
const settleDate = observedSettlementDate(
|
|
8790
|
+
for (const obs2 of merged) {
|
|
8791
|
+
const settleDate = observedSettlementDate(obs2.observed_at, resolved.code);
|
|
5919
8792
|
if (settleDate === null) continue;
|
|
5920
8793
|
if (settleDate < dateLo || settleDate > dateHi) continue;
|
|
5921
8794
|
let bucket = observationsByDate[settleDate];
|
|
@@ -5923,7 +8796,7 @@ var mostlyright = (() => {
|
|
|
5923
8796
|
bucket = [];
|
|
5924
8797
|
observationsByDate[settleDate] = bucket;
|
|
5925
8798
|
}
|
|
5926
|
-
bucket.push(
|
|
8799
|
+
bucket.push(obs2);
|
|
5927
8800
|
}
|
|
5928
8801
|
const climateByDate = {};
|
|
5929
8802
|
for (const cli of mergedClimate) {
|
|
@@ -6058,8 +8931,8 @@ var mostlyright = (() => {
|
|
|
6058
8931
|
const raw = await fetchAwcMetars([resolved.icao], awcOpts);
|
|
6059
8932
|
const parsed = [];
|
|
6060
8933
|
for (const m of raw) {
|
|
6061
|
-
const
|
|
6062
|
-
if (
|
|
8934
|
+
const obs2 = awcToObservation(m);
|
|
8935
|
+
if (obs2 !== null) parsed.push(obs2);
|
|
6063
8936
|
}
|
|
6064
8937
|
rows = parsed.filter((r) => {
|
|
6065
8938
|
const d = r.observed_at.slice(0, 10);
|
|
@@ -6351,6 +9224,129 @@ var mostlyright = (() => {
|
|
|
6351
9224
|
|
|
6352
9225
|
// src/index.ts
|
|
6353
9226
|
init_src();
|
|
9227
|
+
|
|
9228
|
+
// ../core/dist/preprocessing/index.mjs
|
|
9229
|
+
var preprocessing_exports = {};
|
|
9230
|
+
__export(preprocessing_exports, {
|
|
9231
|
+
PHYSICS_BOUNDS: () => PHYSICS_BOUNDS,
|
|
9232
|
+
clipOutliers: () => clipOutliers,
|
|
9233
|
+
iemCrosscheck: () => crosscheckIemGhcnh
|
|
9234
|
+
});
|
|
9235
|
+
var PHYSICS_BOUNDS = /* @__PURE__ */ new Map([
|
|
9236
|
+
["temp_c", [-89, 57]],
|
|
9237
|
+
["dew_point_c", [-89, 35]],
|
|
9238
|
+
["dewpoint_c", [-89, 35]],
|
|
9239
|
+
["wind_speed_ms", [0, 100]],
|
|
9240
|
+
["wind_speed_kt", [0, 200]],
|
|
9241
|
+
["wind_dir_deg", [0, 360]],
|
|
9242
|
+
["wind_dir_degrees", [0, 360]],
|
|
9243
|
+
["slp_hpa", [870, 1085]],
|
|
9244
|
+
["sea_level_pressure_mb", [870, 1085]],
|
|
9245
|
+
["relative_humidity_pct_2m", [0, 100]],
|
|
9246
|
+
["precip_mm_1h", [0, 305]]
|
|
9247
|
+
]);
|
|
9248
|
+
function clipOutliers(rows, col, opts = {}) {
|
|
9249
|
+
const std = opts.std ?? 3;
|
|
9250
|
+
const key = `${col}_clipped`;
|
|
9251
|
+
let lo;
|
|
9252
|
+
let hi;
|
|
9253
|
+
let passThrough = false;
|
|
9254
|
+
if (opts.bounds !== void 0) {
|
|
9255
|
+
[lo, hi] = opts.bounds;
|
|
9256
|
+
} else if (PHYSICS_BOUNDS.has(col)) {
|
|
9257
|
+
const b = PHYSICS_BOUNDS.get(col);
|
|
9258
|
+
if (b === void 0) {
|
|
9259
|
+
throw new Error(`PHYSICS_BOUNDS.get(${col}) unexpectedly undefined`);
|
|
9260
|
+
}
|
|
9261
|
+
[lo, hi] = b;
|
|
9262
|
+
} else {
|
|
9263
|
+
if (!Number.isFinite(std) || std <= 0) {
|
|
9264
|
+
throw new RangeError(
|
|
9265
|
+
`clipOutliers: std must be > 0 for the sigma fallback (got ${std}); pass bounds=[lo, hi] or use a physics-default column`
|
|
9266
|
+
);
|
|
9267
|
+
}
|
|
9268
|
+
const vals = [];
|
|
9269
|
+
for (const r of rows) {
|
|
9270
|
+
const v = r?.[col];
|
|
9271
|
+
if (typeof v === "number" && Number.isFinite(v)) vals.push(v);
|
|
9272
|
+
}
|
|
9273
|
+
if (vals.length < 2) {
|
|
9274
|
+
passThrough = true;
|
|
9275
|
+
lo = Number.NEGATIVE_INFINITY;
|
|
9276
|
+
hi = Number.POSITIVE_INFINITY;
|
|
9277
|
+
} else {
|
|
9278
|
+
const mu = vals.reduce((a, b) => a + b, 0) / vals.length;
|
|
9279
|
+
const sumSq = vals.reduce((a, b) => a + (b - mu) ** 2, 0);
|
|
9280
|
+
const sigma = Math.sqrt(sumSq / (vals.length - 1));
|
|
9281
|
+
if (sigma === 0 || !Number.isFinite(sigma)) {
|
|
9282
|
+
passThrough = true;
|
|
9283
|
+
lo = Number.NEGATIVE_INFINITY;
|
|
9284
|
+
hi = Number.POSITIVE_INFINITY;
|
|
9285
|
+
} else {
|
|
9286
|
+
lo = mu - std * sigma;
|
|
9287
|
+
hi = mu + std * sigma;
|
|
9288
|
+
}
|
|
9289
|
+
}
|
|
9290
|
+
}
|
|
9291
|
+
const out = [];
|
|
9292
|
+
for (const r of rows) {
|
|
9293
|
+
const v = r?.[col];
|
|
9294
|
+
let clipped;
|
|
9295
|
+
if (typeof v === "number" && Number.isFinite(v)) {
|
|
9296
|
+
clipped = passThrough ? v : Math.min(Math.max(v, lo), hi);
|
|
9297
|
+
} else {
|
|
9298
|
+
clipped = null;
|
|
9299
|
+
}
|
|
9300
|
+
out.push({ ...r, [key]: clipped });
|
|
9301
|
+
}
|
|
9302
|
+
return out;
|
|
9303
|
+
}
|
|
9304
|
+
function crosscheckIemGhcnh(iemRows, ghcnhRows, opts = {}) {
|
|
9305
|
+
const tolC = opts.tolC ?? 2;
|
|
9306
|
+
if (iemRows.length === 0 || ghcnhRows.length === 0) return [];
|
|
9307
|
+
for (const r of iemRows) {
|
|
9308
|
+
if (typeof r?.station !== "string" || typeof r?.eventTime !== "string") {
|
|
9309
|
+
throw new Error(
|
|
9310
|
+
"crosscheckIemGhcnh: iem rows must carry 'station' (string) and 'eventTime' (string) keys"
|
|
9311
|
+
);
|
|
9312
|
+
}
|
|
9313
|
+
}
|
|
9314
|
+
for (const r of ghcnhRows) {
|
|
9315
|
+
if (typeof r?.station !== "string" || typeof r?.eventTime !== "string") {
|
|
9316
|
+
throw new Error(
|
|
9317
|
+
"crosscheckIemGhcnh: ghcnh rows must carry 'station' (string) and 'eventTime' (string) keys"
|
|
9318
|
+
);
|
|
9319
|
+
}
|
|
9320
|
+
}
|
|
9321
|
+
const iemMap = /* @__PURE__ */ new Map();
|
|
9322
|
+
for (const r of iemRows) {
|
|
9323
|
+
const key = `${r.station}|${r.eventTime}`;
|
|
9324
|
+
iemMap.set(key, r);
|
|
9325
|
+
}
|
|
9326
|
+
const out = [];
|
|
9327
|
+
for (const g of ghcnhRows) {
|
|
9328
|
+
const key = `${g.station}|${g.eventTime}`;
|
|
9329
|
+
const i = iemMap.get(key);
|
|
9330
|
+
if (i === void 0) continue;
|
|
9331
|
+
const iT = typeof i.temp_c === "number" && Number.isFinite(i.temp_c) ? i.temp_c : null;
|
|
9332
|
+
const gT = typeof g.temp_c === "number" && Number.isFinite(g.temp_c) ? g.temp_c : null;
|
|
9333
|
+
if (iT === null || gT === null) continue;
|
|
9334
|
+
const delta = Math.abs(iT - gT);
|
|
9335
|
+
if (delta > tolC) {
|
|
9336
|
+
out.push({
|
|
9337
|
+
station: g.station,
|
|
9338
|
+
eventTime: g.eventTime,
|
|
9339
|
+
tempCIem: iT,
|
|
9340
|
+
tempCGhcnh: gT,
|
|
9341
|
+
deltaC: delta
|
|
9342
|
+
});
|
|
9343
|
+
}
|
|
9344
|
+
}
|
|
9345
|
+
return out;
|
|
9346
|
+
}
|
|
9347
|
+
|
|
9348
|
+
// src/index.ts
|
|
9349
|
+
var Preprocessing = preprocessing_exports;
|
|
6354
9350
|
var version4 = "0.0.0";
|
|
6355
9351
|
return __toCommonJS(index_exports);
|
|
6356
9352
|
})();
|