next-geo-block 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,651 @@
1
+ // src/index.ts
2
+ import { NextResponse } from "next/server";
3
+
4
+ // src/tz-country.ts
5
+ var TZ_TO_COUNTRY = {
6
+ // --- Africa ---
7
+ "Africa/Abidjan": "CI",
8
+ "Africa/Accra": "GH",
9
+ "Africa/Addis_Ababa": "ET",
10
+ "Africa/Algiers": "DZ",
11
+ "Africa/Asmara": "ER",
12
+ "Africa/Bamako": "ML",
13
+ "Africa/Bangui": "CF",
14
+ "Africa/Banjul": "GM",
15
+ "Africa/Bissau": "GW",
16
+ "Africa/Blantyre": "MW",
17
+ "Africa/Brazzaville": "CG",
18
+ "Africa/Bujumbura": "BI",
19
+ "Africa/Cairo": "EG",
20
+ "Africa/Casablanca": "MA",
21
+ "Africa/Ceuta": "ES",
22
+ "Africa/Conakry": "GN",
23
+ "Africa/Dakar": "SN",
24
+ "Africa/Dar_es_Salaam": "TZ",
25
+ "Africa/Djibouti": "DJ",
26
+ "Africa/Douala": "CM",
27
+ "Africa/El_Aaiun": "EH",
28
+ "Africa/Freetown": "SL",
29
+ "Africa/Gaborone": "BW",
30
+ "Africa/Harare": "ZW",
31
+ "Africa/Johannesburg": "ZA",
32
+ "Africa/Juba": "SS",
33
+ "Africa/Kampala": "UG",
34
+ "Africa/Khartoum": "SD",
35
+ "Africa/Kigali": "RW",
36
+ "Africa/Kinshasa": "CD",
37
+ "Africa/Lagos": "NG",
38
+ "Africa/Libreville": "GA",
39
+ "Africa/Lome": "TG",
40
+ "Africa/Luanda": "AO",
41
+ "Africa/Lubumbashi": "CD",
42
+ "Africa/Lusaka": "ZM",
43
+ "Africa/Malabo": "GQ",
44
+ "Africa/Maputo": "MZ",
45
+ "Africa/Maseru": "LS",
46
+ "Africa/Mbabane": "SZ",
47
+ "Africa/Mogadishu": "SO",
48
+ "Africa/Monrovia": "LR",
49
+ "Africa/Nairobi": "KE",
50
+ "Africa/Ndjamena": "TD",
51
+ "Africa/Niamey": "NE",
52
+ "Africa/Nouakchott": "MR",
53
+ "Africa/Ouagadougou": "BF",
54
+ "Africa/Porto-Novo": "BJ",
55
+ "Africa/Sao_Tome": "ST",
56
+ "Africa/Tripoli": "LY",
57
+ "Africa/Tunis": "TN",
58
+ "Africa/Windhoek": "NA",
59
+ // --- Americas ---
60
+ "America/Adak": "US",
61
+ "America/Anchorage": "US",
62
+ "America/Anguilla": "AI",
63
+ "America/Antigua": "AG",
64
+ "America/Araguaina": "BR",
65
+ "America/Argentina/Buenos_Aires": "AR",
66
+ "America/Argentina/Catamarca": "AR",
67
+ "America/Argentina/Cordoba": "AR",
68
+ "America/Argentina/Jujuy": "AR",
69
+ "America/Argentina/La_Rioja": "AR",
70
+ "America/Argentina/Mendoza": "AR",
71
+ "America/Argentina/Rio_Gallegos": "AR",
72
+ "America/Argentina/Salta": "AR",
73
+ "America/Argentina/San_Juan": "AR",
74
+ "America/Argentina/San_Luis": "AR",
75
+ "America/Argentina/Tucuman": "AR",
76
+ "America/Argentina/Ushuaia": "AR",
77
+ "America/Aruba": "AW",
78
+ "America/Asuncion": "PY",
79
+ "America/Atikokan": "CA",
80
+ "America/Bahia": "BR",
81
+ "America/Bahia_Banderas": "MX",
82
+ "America/Barbados": "BB",
83
+ "America/Belem": "BR",
84
+ "America/Belize": "BZ",
85
+ "America/Blanc-Sablon": "CA",
86
+ "America/Boa_Vista": "BR",
87
+ "America/Bogota": "CO",
88
+ "America/Boise": "US",
89
+ "America/Cambridge_Bay": "CA",
90
+ "America/Campo_Grande": "BR",
91
+ "America/Cancun": "MX",
92
+ "America/Caracas": "VE",
93
+ "America/Cayenne": "GF",
94
+ "America/Cayman": "KY",
95
+ "America/Chicago": "US",
96
+ "America/Chihuahua": "MX",
97
+ "America/Ciudad_Juarez": "MX",
98
+ "America/Costa_Rica": "CR",
99
+ "America/Creston": "CA",
100
+ "America/Cuiaba": "BR",
101
+ "America/Curacao": "CW",
102
+ "America/Danmarkshavn": "GL",
103
+ "America/Dawson": "CA",
104
+ "America/Dawson_Creek": "CA",
105
+ "America/Denver": "US",
106
+ "America/Detroit": "US",
107
+ "America/Dominica": "DM",
108
+ "America/Edmonton": "CA",
109
+ "America/Eirunepe": "BR",
110
+ "America/El_Salvador": "SV",
111
+ "America/Fort_Nelson": "CA",
112
+ "America/Fortaleza": "BR",
113
+ "America/Glace_Bay": "CA",
114
+ "America/Goose_Bay": "CA",
115
+ "America/Grand_Turk": "TC",
116
+ "America/Grenada": "GD",
117
+ "America/Guadeloupe": "GP",
118
+ "America/Guatemala": "GT",
119
+ "America/Guayaquil": "EC",
120
+ "America/Guyana": "GY",
121
+ "America/Halifax": "CA",
122
+ "America/Havana": "CU",
123
+ "America/Hermosillo": "MX",
124
+ "America/Indiana/Indianapolis": "US",
125
+ "America/Indiana/Knox": "US",
126
+ "America/Indiana/Marengo": "US",
127
+ "America/Indiana/Petersburg": "US",
128
+ "America/Indiana/Tell_City": "US",
129
+ "America/Indiana/Vevay": "US",
130
+ "America/Indiana/Vincennes": "US",
131
+ "America/Indiana/Winamac": "US",
132
+ "America/Inuvik": "CA",
133
+ "America/Iqaluit": "CA",
134
+ "America/Jamaica": "JM",
135
+ "America/Juneau": "US",
136
+ "America/Kentucky/Louisville": "US",
137
+ "America/Kentucky/Monticello": "US",
138
+ "America/Kralendijk": "BQ",
139
+ "America/La_Paz": "BO",
140
+ "America/Lima": "PE",
141
+ "America/Los_Angeles": "US",
142
+ "America/Lower_Princes": "SX",
143
+ "America/Maceio": "BR",
144
+ "America/Managua": "NI",
145
+ "America/Manaus": "BR",
146
+ "America/Marigot": "MF",
147
+ "America/Martinique": "MQ",
148
+ "America/Matamoros": "MX",
149
+ "America/Mazatlan": "MX",
150
+ "America/Menominee": "US",
151
+ "America/Merida": "MX",
152
+ "America/Metlakatla": "US",
153
+ "America/Mexico_City": "MX",
154
+ "America/Miquelon": "PM",
155
+ "America/Moncton": "CA",
156
+ "America/Monterrey": "MX",
157
+ "America/Montevideo": "UY",
158
+ "America/Montserrat": "MS",
159
+ "America/Nassau": "BS",
160
+ "America/New_York": "US",
161
+ "America/Nome": "US",
162
+ "America/Noronha": "BR",
163
+ "America/North_Dakota/Beulah": "US",
164
+ "America/North_Dakota/Center": "US",
165
+ "America/North_Dakota/New_Salem": "US",
166
+ "America/Nuuk": "GL",
167
+ "America/Ojinaga": "MX",
168
+ "America/Panama": "PA",
169
+ "America/Paramaribo": "SR",
170
+ "America/Phoenix": "US",
171
+ "America/Port-au-Prince": "HT",
172
+ "America/Port_of_Spain": "TT",
173
+ "America/Porto_Velho": "BR",
174
+ "America/Puerto_Rico": "PR",
175
+ "America/Punta_Arenas": "CL",
176
+ "America/Rankin_Inlet": "CA",
177
+ "America/Recife": "BR",
178
+ "America/Regina": "CA",
179
+ "America/Resolute": "CA",
180
+ "America/Rio_Branco": "BR",
181
+ "America/Santarem": "BR",
182
+ "America/Santiago": "CL",
183
+ "America/Santo_Domingo": "DO",
184
+ "America/Sao_Paulo": "BR",
185
+ "America/Scoresbysund": "GL",
186
+ "America/Sitka": "US",
187
+ "America/St_Barthelemy": "BL",
188
+ "America/St_Johns": "CA",
189
+ "America/St_Kitts": "KN",
190
+ "America/St_Lucia": "LC",
191
+ "America/St_Thomas": "VI",
192
+ "America/St_Vincent": "VC",
193
+ "America/Swift_Current": "CA",
194
+ "America/Tegucigalpa": "HN",
195
+ "America/Thule": "GL",
196
+ "America/Tijuana": "MX",
197
+ "America/Toronto": "CA",
198
+ "America/Tortola": "VG",
199
+ "America/Vancouver": "CA",
200
+ "America/Whitehorse": "CA",
201
+ "America/Winnipeg": "CA",
202
+ "America/Yakutat": "US",
203
+ // --- Antarctica / Arctic ---
204
+ "Antarctica/Casey": "AQ",
205
+ "Antarctica/Davis": "AQ",
206
+ "Antarctica/DumontDUrville": "AQ",
207
+ "Antarctica/Macquarie": "AU",
208
+ "Antarctica/Mawson": "AQ",
209
+ "Antarctica/McMurdo": "AQ",
210
+ "Antarctica/Palmer": "AQ",
211
+ "Antarctica/Rothera": "AQ",
212
+ "Antarctica/Syowa": "AQ",
213
+ "Antarctica/Troll": "AQ",
214
+ "Antarctica/Vostok": "AQ",
215
+ "Arctic/Longyearbyen": "SJ",
216
+ // --- Asia ---
217
+ "Asia/Aden": "YE",
218
+ "Asia/Almaty": "KZ",
219
+ "Asia/Amman": "JO",
220
+ "Asia/Anadyr": "RU",
221
+ "Asia/Aqtau": "KZ",
222
+ "Asia/Aqtobe": "KZ",
223
+ "Asia/Ashgabat": "TM",
224
+ "Asia/Atyrau": "KZ",
225
+ "Asia/Baghdad": "IQ",
226
+ "Asia/Bahrain": "BH",
227
+ "Asia/Baku": "AZ",
228
+ "Asia/Bangkok": "TH",
229
+ "Asia/Barnaul": "RU",
230
+ "Asia/Beirut": "LB",
231
+ "Asia/Bishkek": "KG",
232
+ "Asia/Brunei": "BN",
233
+ "Asia/Chita": "RU",
234
+ "Asia/Choibalsan": "MN",
235
+ "Asia/Colombo": "LK",
236
+ "Asia/Damascus": "SY",
237
+ "Asia/Dhaka": "BD",
238
+ "Asia/Dili": "TL",
239
+ "Asia/Dubai": "AE",
240
+ "Asia/Dushanbe": "TJ",
241
+ "Asia/Famagusta": "CY",
242
+ "Asia/Gaza": "PS",
243
+ "Asia/Hebron": "PS",
244
+ "Asia/Ho_Chi_Minh": "VN",
245
+ "Asia/Hong_Kong": "HK",
246
+ "Asia/Hovd": "MN",
247
+ "Asia/Irkutsk": "RU",
248
+ "Asia/Jakarta": "ID",
249
+ "Asia/Jayapura": "ID",
250
+ "Asia/Jerusalem": "IL",
251
+ "Asia/Kabul": "AF",
252
+ "Asia/Kamchatka": "RU",
253
+ "Asia/Karachi": "PK",
254
+ "Asia/Kathmandu": "NP",
255
+ "Asia/Khandyga": "RU",
256
+ "Asia/Kolkata": "IN",
257
+ "Asia/Krasnoyarsk": "RU",
258
+ "Asia/Kuala_Lumpur": "MY",
259
+ "Asia/Kuching": "MY",
260
+ "Asia/Kuwait": "KW",
261
+ "Asia/Macau": "MO",
262
+ "Asia/Magadan": "RU",
263
+ "Asia/Makassar": "ID",
264
+ "Asia/Manila": "PH",
265
+ "Asia/Muscat": "OM",
266
+ "Asia/Nicosia": "CY",
267
+ "Asia/Novokuznetsk": "RU",
268
+ "Asia/Novosibirsk": "RU",
269
+ "Asia/Omsk": "RU",
270
+ "Asia/Oral": "KZ",
271
+ "Asia/Phnom_Penh": "KH",
272
+ "Asia/Pontianak": "ID",
273
+ "Asia/Pyongyang": "KP",
274
+ "Asia/Qatar": "QA",
275
+ "Asia/Qostanay": "KZ",
276
+ "Asia/Qyzylorda": "KZ",
277
+ "Asia/Riyadh": "SA",
278
+ "Asia/Sakhalin": "RU",
279
+ "Asia/Samarkand": "UZ",
280
+ "Asia/Seoul": "KR",
281
+ "Asia/Shanghai": "CN",
282
+ "Asia/Singapore": "SG",
283
+ "Asia/Srednekolymsk": "RU",
284
+ "Asia/Taipei": "TW",
285
+ "Asia/Tashkent": "UZ",
286
+ "Asia/Tbilisi": "GE",
287
+ "Asia/Tehran": "IR",
288
+ "Asia/Thimphu": "BT",
289
+ "Asia/Tokyo": "JP",
290
+ "Asia/Tomsk": "RU",
291
+ "Asia/Ulaanbaatar": "MN",
292
+ "Asia/Urumqi": "CN",
293
+ "Asia/Ust-Nera": "RU",
294
+ "Asia/Vientiane": "LA",
295
+ "Asia/Vladivostok": "RU",
296
+ "Asia/Yakutsk": "RU",
297
+ "Asia/Yangon": "MM",
298
+ "Asia/Yekaterinburg": "RU",
299
+ "Asia/Yerevan": "AM",
300
+ // --- Atlantic ---
301
+ "Atlantic/Azores": "PT",
302
+ "Atlantic/Bermuda": "BM",
303
+ "Atlantic/Canary": "ES",
304
+ "Atlantic/Cape_Verde": "CV",
305
+ "Atlantic/Faroe": "FO",
306
+ "Atlantic/Madeira": "PT",
307
+ "Atlantic/Reykjavik": "IS",
308
+ "Atlantic/South_Georgia": "GS",
309
+ "Atlantic/St_Helena": "SH",
310
+ "Atlantic/Stanley": "FK",
311
+ // --- Australia ---
312
+ "Australia/Adelaide": "AU",
313
+ "Australia/Brisbane": "AU",
314
+ "Australia/Broken_Hill": "AU",
315
+ "Australia/Darwin": "AU",
316
+ "Australia/Eucla": "AU",
317
+ "Australia/Hobart": "AU",
318
+ "Australia/Lindeman": "AU",
319
+ "Australia/Lord_Howe": "AU",
320
+ "Australia/Melbourne": "AU",
321
+ "Australia/Perth": "AU",
322
+ "Australia/Sydney": "AU",
323
+ // --- Europe ---
324
+ "Europe/Amsterdam": "NL",
325
+ "Europe/Andorra": "AD",
326
+ "Europe/Astrakhan": "RU",
327
+ "Europe/Athens": "GR",
328
+ "Europe/Belgrade": "RS",
329
+ "Europe/Berlin": "DE",
330
+ "Europe/Bratislava": "SK",
331
+ "Europe/Brussels": "BE",
332
+ "Europe/Bucharest": "RO",
333
+ "Europe/Budapest": "HU",
334
+ "Europe/Busingen": "DE",
335
+ "Europe/Chisinau": "MD",
336
+ "Europe/Copenhagen": "DK",
337
+ "Europe/Dublin": "IE",
338
+ "Europe/Gibraltar": "GI",
339
+ "Europe/Guernsey": "GG",
340
+ "Europe/Helsinki": "FI",
341
+ "Europe/Isle_of_Man": "IM",
342
+ "Europe/Istanbul": "TR",
343
+ "Europe/Jersey": "JE",
344
+ "Europe/Kaliningrad": "RU",
345
+ "Europe/Kirov": "RU",
346
+ "Europe/Kyiv": "UA",
347
+ "Europe/Lisbon": "PT",
348
+ "Europe/Ljubljana": "SI",
349
+ "Europe/London": "GB",
350
+ "Europe/Luxembourg": "LU",
351
+ "Europe/Madrid": "ES",
352
+ "Europe/Malta": "MT",
353
+ "Europe/Mariehamn": "AX",
354
+ "Europe/Minsk": "BY",
355
+ "Europe/Monaco": "MC",
356
+ "Europe/Moscow": "RU",
357
+ "Europe/Oslo": "NO",
358
+ "Europe/Paris": "FR",
359
+ "Europe/Podgorica": "ME",
360
+ "Europe/Prague": "CZ",
361
+ "Europe/Riga": "LV",
362
+ "Europe/Rome": "IT",
363
+ "Europe/Samara": "RU",
364
+ "Europe/San_Marino": "SM",
365
+ "Europe/Sarajevo": "BA",
366
+ "Europe/Saratov": "RU",
367
+ "Europe/Simferopol": "RU",
368
+ "Europe/Skopje": "MK",
369
+ "Europe/Sofia": "BG",
370
+ "Europe/Stockholm": "SE",
371
+ "Europe/Tallinn": "EE",
372
+ "Europe/Tirane": "AL",
373
+ "Europe/Ulyanovsk": "RU",
374
+ "Europe/Vaduz": "LI",
375
+ "Europe/Vatican": "VA",
376
+ "Europe/Vienna": "AT",
377
+ "Europe/Vilnius": "LT",
378
+ "Europe/Volgograd": "RU",
379
+ "Europe/Warsaw": "PL",
380
+ "Europe/Zagreb": "HR",
381
+ "Europe/Zurich": "CH",
382
+ // --- Indian Ocean ---
383
+ "Indian/Antananarivo": "MG",
384
+ "Indian/Chagos": "IO",
385
+ "Indian/Christmas": "CX",
386
+ "Indian/Cocos": "CC",
387
+ "Indian/Comoro": "KM",
388
+ "Indian/Kerguelen": "TF",
389
+ "Indian/Mahe": "SC",
390
+ "Indian/Maldives": "MV",
391
+ "Indian/Mauritius": "MU",
392
+ "Indian/Mayotte": "YT",
393
+ "Indian/Reunion": "RE",
394
+ // --- Pacific ---
395
+ "Pacific/Apia": "WS",
396
+ "Pacific/Auckland": "NZ",
397
+ "Pacific/Bougainville": "PG",
398
+ "Pacific/Chatham": "NZ",
399
+ "Pacific/Chuuk": "FM",
400
+ "Pacific/Easter": "CL",
401
+ "Pacific/Efate": "VU",
402
+ "Pacific/Fakaofo": "TK",
403
+ "Pacific/Fiji": "FJ",
404
+ "Pacific/Funafuti": "TV",
405
+ "Pacific/Galapagos": "EC",
406
+ "Pacific/Gambier": "PF",
407
+ "Pacific/Guadalcanal": "SB",
408
+ "Pacific/Guam": "GU",
409
+ "Pacific/Honolulu": "US",
410
+ "Pacific/Kanton": "KI",
411
+ "Pacific/Kiritimati": "KI",
412
+ "Pacific/Kosrae": "FM",
413
+ "Pacific/Kwajalein": "MH",
414
+ "Pacific/Majuro": "MH",
415
+ "Pacific/Marquesas": "PF",
416
+ "Pacific/Midway": "UM",
417
+ "Pacific/Nauru": "NR",
418
+ "Pacific/Niue": "NU",
419
+ "Pacific/Norfolk": "NF",
420
+ "Pacific/Noumea": "NC",
421
+ "Pacific/Pago_Pago": "AS",
422
+ "Pacific/Palau": "PW",
423
+ "Pacific/Pitcairn": "PN",
424
+ "Pacific/Pohnpei": "FM",
425
+ "Pacific/Port_Moresby": "PG",
426
+ "Pacific/Rarotonga": "CK",
427
+ "Pacific/Saipan": "MP",
428
+ "Pacific/Tahiti": "PF",
429
+ "Pacific/Tarawa": "KI",
430
+ "Pacific/Tongatapu": "TO",
431
+ "Pacific/Wake": "UM",
432
+ "Pacific/Wallis": "WF",
433
+ // --- Legacy aliases (still emitted by some browsers / older clients) ---
434
+ "Asia/Calcutta": "IN",
435
+ "Asia/Katmandu": "NP",
436
+ "Asia/Rangoon": "MM",
437
+ "Asia/Saigon": "VN",
438
+ "Asia/Chongqing": "CN",
439
+ "Asia/Harbin": "CN",
440
+ "Asia/Kashgar": "CN",
441
+ "Asia/Macao": "MO",
442
+ "Asia/Tel_Aviv": "IL",
443
+ "Asia/Thimbu": "BT",
444
+ "Asia/Ulan_Bator": "MN",
445
+ "Atlantic/Faeroe": "FO",
446
+ "Atlantic/Jan_Mayen": "SJ",
447
+ "Australia/ACT": "AU",
448
+ "Australia/Canberra": "AU",
449
+ "Australia/LHI": "AU",
450
+ "Australia/NSW": "AU",
451
+ "Australia/North": "AU",
452
+ "Australia/Queensland": "AU",
453
+ "Australia/South": "AU",
454
+ "Australia/Tasmania": "AU",
455
+ "Australia/Victoria": "AU",
456
+ "Australia/West": "AU",
457
+ "Australia/Yancowinna": "AU",
458
+ "America/Argentina/ComodRivadavia": "AR",
459
+ "America/Buenos_Aires": "AR",
460
+ "America/Catamarca": "AR",
461
+ "America/Cordoba": "AR",
462
+ "America/Jujuy": "AR",
463
+ "America/Mendoza": "AR",
464
+ "America/Rosario": "AR",
465
+ "America/Indianapolis": "US",
466
+ "America/Indiana": "US",
467
+ "America/Kentucky/Louisville_legacy": "US",
468
+ "America/Knox_IN": "US",
469
+ "America/Louisville": "US",
470
+ "America/Fort_Wayne": "US",
471
+ "America/Atka": "US",
472
+ "America/Shiprock": "US",
473
+ "America/Ensenada": "MX",
474
+ "America/Rosario_BR": "BR",
475
+ "America/Porto_Acre": "BR",
476
+ "America/Coral_Harbour": "CA",
477
+ "America/Montreal": "CA",
478
+ "America/Nipigon": "CA",
479
+ "America/Pangnirtung": "CA",
480
+ "America/Rainy_River": "CA",
481
+ "America/Thunder_Bay": "CA",
482
+ "America/Yellowknife": "CA",
483
+ "America/Virgin": "VI",
484
+ "America/Godthab": "GL",
485
+ "Europe/Belfast": "GB",
486
+ "Europe/Kiev": "UA",
487
+ "Europe/Nicosia": "CY",
488
+ "Europe/Tiraspol": "MD",
489
+ "Europe/Uzhgorod": "UA",
490
+ "Europe/Zaporozhye": "UA",
491
+ "Pacific/Enderbury": "KI",
492
+ "Pacific/Johnston": "US",
493
+ "Pacific/Ponape": "FM",
494
+ "Pacific/Samoa": "AS",
495
+ "Pacific/Truk": "FM",
496
+ "Pacific/Yap": "FM",
497
+ "Africa/Asmera": "ER",
498
+ "Africa/Timbuktu": "ML",
499
+ "Iceland": "IS",
500
+ "Egypt": "EG",
501
+ "Eire": "IE",
502
+ "GB": "GB",
503
+ "GB-Eire": "GB",
504
+ "Hongkong": "HK",
505
+ "Israel": "IL",
506
+ "Jamaica": "JM",
507
+ "Japan": "JP",
508
+ "Libya": "LY",
509
+ "Navajo": "US",
510
+ "Poland": "PL",
511
+ "Portugal": "PT",
512
+ "PRC": "CN",
513
+ "ROC": "TW",
514
+ "ROK": "KR",
515
+ "Singapore": "SG",
516
+ "Turkey": "TR"
517
+ };
518
+ function timezoneToCountry(tz) {
519
+ if (!tz) return void 0;
520
+ const direct = TZ_TO_COUNTRY[tz];
521
+ if (direct) return direct;
522
+ if (tz === "UTC" || tz === "GMT" || tz.startsWith("Etc/")) return void 0;
523
+ return void 0;
524
+ }
525
+
526
+ // src/index.ts
527
+ var DEFAULT_HEADERS = [
528
+ "x-vercel-ip-country",
529
+ "cf-ipcountry",
530
+ "x-country-code"
531
+ ];
532
+ var DEFAULT_TZ_COOKIE = "client_tz";
533
+ var DEFAULT_TZ_HEADER = "x-client-timezone";
534
+ function getCountry(request, extraHeaders = []) {
535
+ for (const header of [...extraHeaders, ...DEFAULT_HEADERS]) {
536
+ const value = request.headers.get(header);
537
+ if (!value) continue;
538
+ const code = value.toUpperCase();
539
+ if (code === "XX") continue;
540
+ return code;
541
+ }
542
+ return void 0;
543
+ }
544
+ function normalizeTimezoneFallback(fb) {
545
+ if (!fb) return void 0;
546
+ if (fb === true) {
547
+ return {
548
+ cookie: DEFAULT_TZ_COOKIE,
549
+ header: DEFAULT_TZ_HEADER,
550
+ resolve: timezoneToCountry
551
+ };
552
+ }
553
+ return {
554
+ cookie: fb.cookie ?? DEFAULT_TZ_COOKIE,
555
+ header: fb.header ?? DEFAULT_TZ_HEADER,
556
+ resolve: fb.resolve ?? timezoneToCountry
557
+ };
558
+ }
559
+ function getCountryFromTimezone(request, cfg) {
560
+ const raw = request.cookies.get(cfg.cookie)?.value ?? request.headers.get(cfg.header) ?? void 0;
561
+ if (!raw) return void 0;
562
+ let tz;
563
+ try {
564
+ tz = decodeURIComponent(raw);
565
+ } catch {
566
+ tz = raw;
567
+ }
568
+ const country = cfg.resolve(tz);
569
+ return country ? country.toUpperCase() : void 0;
570
+ }
571
+ function patternToRegex(pattern) {
572
+ let body = pattern;
573
+ let suffix = "";
574
+ const trailing = body.match(/\/\*\*?$/);
575
+ if (trailing) {
576
+ body = body.slice(0, -trailing[0].length);
577
+ suffix = "(?:/.*)?";
578
+ }
579
+ const escaped = body.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, "[^/]+");
580
+ return new RegExp(`^${escaped}${suffix}/?$`);
581
+ }
582
+ function compileRules(rules) {
583
+ return rules.map((rule) => ({
584
+ matchers: rule.paths.map(
585
+ (p) => p instanceof RegExp ? p : patternToRegex(p)
586
+ ),
587
+ block: new Set(rule.block.map((c) => c.toUpperCase())),
588
+ source: rule
589
+ }));
590
+ }
591
+ function matchRule(compiled, pathname) {
592
+ return compiled.find(
593
+ (rule) => rule.matchers.some((re) => re.test(pathname))
594
+ );
595
+ }
596
+ function createGeoBlock(options) {
597
+ const compiled = compileRules(options.rules);
598
+ const blockedPath = options.blockedPath === void 0 ? "/blocked" : options.blockedPath;
599
+ const failOpen = options.failOpen ?? true;
600
+ const extraHeaders = options.countryHeaders ?? [];
601
+ const tzFallback = normalizeTimezoneFallback(options.fallbackTimezone);
602
+ return async function geoBlock(request) {
603
+ const pathname = request.nextUrl.pathname;
604
+ const rule = matchRule(compiled, pathname);
605
+ if (!rule) return NextResponse.next();
606
+ let country = getCountry(request, extraHeaders);
607
+ let source = "header";
608
+ if (!country && tzFallback) {
609
+ const tzCountry = getCountryFromTimezone(request, tzFallback);
610
+ if (tzCountry) {
611
+ country = tzCountry;
612
+ source = "timezone";
613
+ }
614
+ }
615
+ if (!country) {
616
+ if (failOpen) return NextResponse.next();
617
+ return blockResponse(request, rule.source, "", source, options, blockedPath);
618
+ }
619
+ if (rule.block.has(country)) {
620
+ return blockResponse(
621
+ request,
622
+ rule.source,
623
+ country,
624
+ source,
625
+ options,
626
+ blockedPath
627
+ );
628
+ }
629
+ return NextResponse.next();
630
+ };
631
+ }
632
+ async function blockResponse(request, matchedRule, country, source, options, blockedPath) {
633
+ if (options.onBlock) {
634
+ return options.onBlock({
635
+ request,
636
+ country,
637
+ pathname: request.nextUrl.pathname,
638
+ matchedRule,
639
+ source
640
+ });
641
+ }
642
+ if (blockedPath) {
643
+ return NextResponse.rewrite(new URL(blockedPath, request.url));
644
+ }
645
+ return new NextResponse("Not available in your region", { status: 451 });
646
+ }
647
+ export {
648
+ createGeoBlock,
649
+ getCountry,
650
+ timezoneToCountry
651
+ };