@bicharts/shape-core 0.1.12 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/chunk-2LR73DNS.mjs +2 -0
  2. package/dist/chunk-3UOCZ2D6.mjs +2 -0
  3. package/dist/chunk-GY54KQLP.mjs +2 -0
  4. package/dist/chunk-NWDPA7DG.mjs +2 -0
  5. package/dist/chunk-QEH7WTLB.mjs +2 -0
  6. package/dist/chunk-WBEROMBG.mjs +2 -0
  7. package/dist/chunk-XWCQ7BJB.mjs +2 -0
  8. package/dist/formatDetector.mjs +1 -7
  9. package/dist/geoDetector.mjs +1 -14
  10. package/dist/geoPoint.mjs +1 -23
  11. package/dist/index.mjs +1 -250
  12. package/dist/indexedText.mjs +1 -23
  13. package/dist/models.mjs +0 -1
  14. package/dist/monthNames.mjs +1 -9
  15. package/dist/ordinalDetector.mjs +1 -11
  16. package/dist/util.mjs +1 -11
  17. package/package.json +2 -2
  18. package/dist/chunk-ICDJLWEM.mjs +0 -83
  19. package/dist/chunk-ICDJLWEM.mjs.map +0 -7
  20. package/dist/chunk-NGV56PGT.mjs +0 -787
  21. package/dist/chunk-NGV56PGT.mjs.map +0 -7
  22. package/dist/chunk-QTEE53OQ.mjs +0 -205
  23. package/dist/chunk-QTEE53OQ.mjs.map +0 -7
  24. package/dist/chunk-RZAZ7PZK.mjs +0 -31
  25. package/dist/chunk-RZAZ7PZK.mjs.map +0 -7
  26. package/dist/chunk-VHWC3THS.mjs +0 -572
  27. package/dist/chunk-VHWC3THS.mjs.map +0 -7
  28. package/dist/chunk-VLMGGCN4.mjs +0 -36
  29. package/dist/chunk-VLMGGCN4.mjs.map +0 -7
  30. package/dist/chunk-YJVU7G63.mjs +0 -559
  31. package/dist/chunk-YJVU7G63.mjs.map +0 -7
  32. package/dist/formatDetector.mjs.map +0 -7
  33. package/dist/geoDetector.mjs.map +0 -7
  34. package/dist/geoPoint.mjs.map +0 -7
  35. package/dist/index.mjs.map +0 -7
  36. package/dist/indexedText.mjs.map +0 -7
  37. package/dist/models.mjs.map +0 -7
  38. package/dist/monthNames.mjs.map +0 -7
  39. package/dist/ordinalDetector.mjs.map +0 -7
  40. package/dist/util.mjs.map +0 -7
@@ -1,559 +0,0 @@
1
- /*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */
2
- import {
3
- isKnownCity,
4
- normalizePlaceName
5
- } from "./chunk-QTEE53OQ.mjs";
6
-
7
- // src/geoDetector.ts
8
- var ISO_3166_PAIRS = "AD AND,AE ARE,AF AFG,AG ATG,AI AIA,AL ALB,AM ARM,AO AGO,AQ ATA,AR ARG,AS ASM,AT AUT,AU AUS,AW ABW,AX ALA,AZ AZE,BA BIH,BB BRB,BD BGD,BE BEL,BF BFA,BG BGR,BH BHR,BI BDI,BJ BEN,BL BLM,BM BMU,BN BRN,BO BOL,BQ BES,BR BRA,BS BHS,BT BTN,BV BVT,BW BWA,BY BLR,BZ BLZ,CA CAN,CC CCK,CD COD,CF CAF,CG COG,CH CHE,CI CIV,CK COK,CL CHL,CM CMR,CN CHN,CO COL,CR CRI,CU CUB,CV CPV,CW CUW,CX CXR,CY CYP,CZ CZE,DE DEU,DJ DJI,DK DNK,DM DMA,DO DOM,DZ DZA,EC ECU,EE EST,EG EGY,EH ESH,ER ERI,ES ESP,ET ETH,FI FIN,FJ FJI,FK FLK,FM FSM,FO FRO,FR FRA,GA GAB,GB GBR,GD GRD,GE GEO,GF GUF,GG GGY,GH GHA,GI GIB,GL GRL,GM GMB,GN GIN,GP GLP,GQ GNQ,GR GRC,GS SGS,GT GTM,GU GUM,GW GNB,GY GUY,HK HKG,HM HMD,HN HND,HR HRV,HT HTI,HU HUN,ID IDN,IE IRL,IL ISR,IM IMN,IN IND,IO IOT,IQ IRQ,IR IRN,IS ISL,IT ITA,JE JEY,JM JAM,JO JOR,JP JPN,KE KEN,KG KGZ,KH KHM,KI KIR,KM COM,KN KNA,KP PRK,KR KOR,KW KWT,KY CYM,KZ KAZ,LA LAO,LB LBN,LC LCA,LI LIE,LK LKA,LR LBR,LS LSO,LT LTU,LU LUX,LV LVA,LY LBY,MA MAR,MC MCO,MD MDA,ME MNE,MF MAF,MG MDG,MH MHL,MK MKD,ML MLI,MM MMR,MN MNG,MO MAC,MP MNP,MQ MTQ,MR MRT,MS MSR,MT MLT,MU MUS,MV MDV,MW MWI,MX MEX,MY MYS,MZ MOZ,NA NAM,NC NCL,NE NER,NF NFK,NG NGA,NI NIC,NL NLD,NO NOR,NP NPL,NR NRU,NU NIU,NZ NZL,OM OMN,PA PAN,PE PER,PF PYF,PG PNG,PH PHL,PK PAK,PL POL,PM SPM,PN PCN,PR PRI,PS PSE,PT PRT,PW PLW,PY PRY,QA QAT,RE REU,RO ROU,RS SRB,RU RUS,RW RWA,SA SAU,SB SLB,SC SYC,SD SDN,SE SWE,SG SGP,SH SHN,SI SVN,SJ SJM,SK SVK,SL SLE,SM SMR,SN SEN,SO SOM,SR SUR,SS SSD,ST STP,SV SLV,SX SXM,SY SYR,SZ SWZ,TC TCA,TD TCD,TF ATF,TG TGO,TH THA,TJ TJK,TK TKL,TL TLS,TM TKM,TN TUN,TO TON,TR TUR,TT TTO,TV TUV,TW TWN,TZ TZA,UA UKR,UG UGA,UM UMI,US USA,UY URY,UZ UZB,VA VAT,VC VCT,VE VEN,VG VGB,VI VIR,VN VNM,VU VUT,WF WLF,WS WSM,YE YEM,YT MYT,ZA ZAF,ZM ZMB,ZW ZWE";
9
- var ISO2_TO_ISO3 = (() => {
10
- const m = /* @__PURE__ */ new Map();
11
- for (const pair of ISO_3166_PAIRS.split(",")) {
12
- const [a2, a3] = pair.split(" ");
13
- if (a2 && a3) m.set(a2, a3);
14
- }
15
- return m;
16
- })();
17
- var ISO2_SET = new Set(ISO2_TO_ISO3.keys());
18
- var ISO3_SET = new Set(ISO2_TO_ISO3.values());
19
- var SUPPORTED_LANGS = [
20
- "en",
21
- "fr",
22
- "es",
23
- "de",
24
- "it",
25
- "pt",
26
- "ru",
27
- "ja",
28
- "zh",
29
- "ko",
30
- "ar",
31
- "hi",
32
- "tr",
33
- "pl",
34
- "he",
35
- "nl",
36
- "sv",
37
- "fi",
38
- "no",
39
- "da",
40
- "cs",
41
- "el",
42
- "uk",
43
- "ro",
44
- "id",
45
- "vi",
46
- "th"
47
- ];
48
- var COUNTRY_ALIAS_OVERLAY = {
49
- "usa": "USA",
50
- "u.s.": "USA",
51
- "u.s.a.": "USA",
52
- "us": "USA",
53
- "america": "USA",
54
- "united states of america": "USA",
55
- "the united states": "USA",
56
- "uk": "GBR",
57
- "u.k.": "GBR",
58
- "great britain": "GBR",
59
- "britain": "GBR",
60
- "england": "GBR",
61
- "south korea": "KOR",
62
- "north korea": "PRK",
63
- "korea": "KOR",
64
- "ivory coast": "CIV",
65
- "cote d ivoire": "CIV",
66
- "vietnam": "VNM",
67
- "laos": "LAO",
68
- "syria": "SYR",
69
- "iran": "IRN",
70
- "russia": "RUS",
71
- "moldova": "MDA",
72
- "tanzania": "TZA",
73
- "bolivia": "BOL",
74
- "venezuela": "VEN",
75
- "brunei": "BRN",
76
- "czech republic": "CZE",
77
- "czechia": "CZE",
78
- "slovakia": "SVK",
79
- "uae": "ARE",
80
- "united arab emirates": "ARE",
81
- "drc": "COD",
82
- "dr congo": "COD",
83
- "democratic republic of the congo": "COD",
84
- "republic of the congo": "COG",
85
- "congo": "COG",
86
- "swaziland": "SWZ",
87
- "eswatini": "SWZ",
88
- "cape verde": "CPV",
89
- "cabo verde": "CPV",
90
- "burma": "MMR",
91
- "myanmar": "MMR",
92
- "holland": "NLD",
93
- "the netherlands": "NLD",
94
- "netherlands": "NLD",
95
- "vatican": "VAT",
96
- "vatican city": "VAT",
97
- "palestine": "PSE",
98
- "macau": "MAC",
99
- "macao": "MAC",
100
- "hong kong": "HKG",
101
- "taiwan": "TWN",
102
- "turkey": "TUR",
103
- "turkiye": "TUR",
104
- "macedonia": "MKD",
105
- "north macedonia": "MKD",
106
- "gambia": "GMB",
107
- "the gambia": "GMB",
108
- "bahamas": "BHS",
109
- "the bahamas": "BHS",
110
- "east timor": "TLS",
111
- "timor leste": "TLS"
112
- };
113
- var US_STATE_PAIRS = [
114
- ["AL", "Alabama"],
115
- ["AK", "Alaska"],
116
- ["AZ", "Arizona"],
117
- ["AR", "Arkansas"],
118
- ["CA", "California"],
119
- ["CO", "Colorado"],
120
- ["CT", "Connecticut"],
121
- ["DE", "Delaware"],
122
- ["FL", "Florida"],
123
- ["GA", "Georgia"],
124
- ["HI", "Hawaii"],
125
- ["ID", "Idaho"],
126
- ["IL", "Illinois"],
127
- ["IN", "Indiana"],
128
- ["IA", "Iowa"],
129
- ["KS", "Kansas"],
130
- ["KY", "Kentucky"],
131
- ["LA", "Louisiana"],
132
- ["ME", "Maine"],
133
- ["MD", "Maryland"],
134
- ["MA", "Massachusetts"],
135
- ["MI", "Michigan"],
136
- ["MN", "Minnesota"],
137
- ["MS", "Mississippi"],
138
- ["MO", "Missouri"],
139
- ["MT", "Montana"],
140
- ["NE", "Nebraska"],
141
- ["NV", "Nevada"],
142
- ["NH", "New Hampshire"],
143
- ["NJ", "New Jersey"],
144
- ["NM", "New Mexico"],
145
- ["NY", "New York"],
146
- ["NC", "North Carolina"],
147
- ["ND", "North Dakota"],
148
- ["OH", "Ohio"],
149
- ["OK", "Oklahoma"],
150
- ["OR", "Oregon"],
151
- ["PA", "Pennsylvania"],
152
- ["RI", "Rhode Island"],
153
- ["SC", "South Carolina"],
154
- ["SD", "South Dakota"],
155
- ["TN", "Tennessee"],
156
- ["TX", "Texas"],
157
- ["UT", "Utah"],
158
- ["VT", "Vermont"],
159
- ["VA", "Virginia"],
160
- ["WA", "Washington"],
161
- ["WV", "West Virginia"],
162
- ["WI", "Wisconsin"],
163
- ["WY", "Wyoming"],
164
- ["DC", "District of Columbia"],
165
- ["PR", "Puerto Rico"],
166
- ["GU", "Guam"],
167
- ["VI", "U.S. Virgin Islands"],
168
- ["AS", "American Samoa"],
169
- ["MP", "Northern Mariana Islands"]
170
- ];
171
- var USPS_SET = new Set(US_STATE_PAIRS.map((p) => p[0]));
172
- var US_STATE_ALIAS_OVERLAY = {
173
- "Ala.": "AL",
174
- "Alab.": "AL",
175
- "Ariz.": "AZ",
176
- "Ark.": "AR",
177
- "Calif.": "CA",
178
- "Cal.": "CA",
179
- "Colo.": "CO",
180
- "Col.": "CO",
181
- "Conn.": "CT",
182
- "Del.": "DE",
183
- "Fla.": "FL",
184
- "Flor.": "FL",
185
- "Ga.": "GA",
186
- "Ill.": "IL",
187
- "Ind.": "IN",
188
- "Kan.": "KS",
189
- "Kans.": "KS",
190
- "Ky.": "KY",
191
- "La.": "LA",
192
- "Md.": "MD",
193
- "Mass.": "MA",
194
- "Mich.": "MI",
195
- "Minn.": "MN",
196
- "Miss.": "MS",
197
- "Mo.": "MO",
198
- "Mont.": "MT",
199
- "Neb.": "NE",
200
- "Nebr.": "NE",
201
- "Nev.": "NV",
202
- "N.H.": "NH",
203
- "N.J.": "NJ",
204
- "N.M.": "NM",
205
- "N.Mex.": "NM",
206
- "N. Mex.": "NM",
207
- "N.Y.": "NY",
208
- "N.C.": "NC",
209
- "N.D.": "ND",
210
- "N.Dak.": "ND",
211
- "N. Dak.": "ND",
212
- "Okla.": "OK",
213
- "Ore.": "OR",
214
- "Oreg.": "OR",
215
- "Pa.": "PA",
216
- "Penn.": "PA",
217
- "Penna.": "PA",
218
- "R.I.": "RI",
219
- "S.C.": "SC",
220
- "S.D.": "SD",
221
- "S.Dak.": "SD",
222
- "S. Dak.": "SD",
223
- "Tenn.": "TN",
224
- "Tex.": "TX",
225
- "Vt.": "VT",
226
- "Va.": "VA",
227
- "Wash.": "WA",
228
- "W.Va.": "WV",
229
- "W. Va.": "WV",
230
- "Wis.": "WI",
231
- "Wisc.": "WI",
232
- "Wyo.": "WY",
233
- "D.C.": "DC",
234
- "Wash. D.C.": "DC",
235
- "Wash., D.C.": "DC",
236
- "P.R.": "PR",
237
- "V.I.": "VI"
238
- };
239
- var STATE_NAME_TO_USPS = (() => {
240
- const m = /* @__PURE__ */ new Map();
241
- for (const [code, name] of US_STATE_PAIRS) m.set(normalizeName(name), code);
242
- m.set(normalizeName("Washington DC"), "DC");
243
- m.set(normalizeName("Washington D.C."), "DC");
244
- m.set(normalizeName("US Virgin Islands"), "VI");
245
- for (const [alias, code] of Object.entries(US_STATE_ALIAS_OVERLAY)) {
246
- const key = normalizeName(alias);
247
- if (key && !m.has(key)) m.set(key, code);
248
- }
249
- return m;
250
- })();
251
- var STATE_FIPS_SET = /* @__PURE__ */ new Set([
252
- "01",
253
- "02",
254
- "04",
255
- "05",
256
- "06",
257
- "08",
258
- "09",
259
- "10",
260
- "11",
261
- "12",
262
- "13",
263
- "15",
264
- "16",
265
- "17",
266
- "18",
267
- "19",
268
- "20",
269
- "21",
270
- "22",
271
- "23",
272
- "24",
273
- "25",
274
- "26",
275
- "27",
276
- "28",
277
- "29",
278
- "30",
279
- "31",
280
- "32",
281
- "33",
282
- "34",
283
- "35",
284
- "36",
285
- "37",
286
- "38",
287
- "39",
288
- "40",
289
- "41",
290
- "42",
291
- "44",
292
- "45",
293
- "46",
294
- "47",
295
- "48",
296
- "49",
297
- "50",
298
- "51",
299
- "53",
300
- "54",
301
- "55",
302
- "56",
303
- "60",
304
- "66",
305
- "69",
306
- "72",
307
- "78"
308
- ]);
309
- function normalizeCode(s) {
310
- return s.trim().toUpperCase();
311
- }
312
- function normalizeName(s) {
313
- return normalizePlaceName(s);
314
- }
315
- var _countryNameMap = null;
316
- function countryNameMap() {
317
- if (_countryNameMap) return _countryNameMap;
318
- const m = /* @__PURE__ */ new Map();
319
- const langs = ["en", ...SUPPORTED_LANGS.filter((l) => l !== "en")];
320
- for (const lang of langs) {
321
- let dn = null;
322
- try {
323
- dn = new Intl.DisplayNames([lang], { type: "region" });
324
- } catch {
325
- continue;
326
- }
327
- for (const [a2, a3] of ISO2_TO_ISO3) {
328
- let name;
329
- try {
330
- name = dn.of(a2);
331
- } catch {
332
- name = void 0;
333
- }
334
- if (!name || name === a2) continue;
335
- const key = normalizeName(name);
336
- if (key && !m.has(key)) m.set(key, a3);
337
- }
338
- }
339
- for (const [alias, a3] of Object.entries(COUNTRY_ALIAS_OVERLAY)) {
340
- const key = normalizeName(alias);
341
- if (key) m.set(key, a3);
342
- }
343
- _countryNameMap = m;
344
- return m;
345
- }
346
- var COUNTRY_NAME_TOKENS = /* @__PURE__ */ new Set(["country", "countries", "nation", "nationality", "iso", "geo"]);
347
- var STATE_NAME_TOKENS = /* @__PURE__ */ new Set(["state", "province", "st"]);
348
- var ZIP_NAME_TOKENS = /* @__PURE__ */ new Set(["zip", "zipcode", "postal", "postcode", "plz"]);
349
- var COUNTY_NAME_TOKENS = /* @__PURE__ */ new Set(["county", "fips", "borough", "parish"]);
350
- var CITY_NAME_TOKENS = /* @__PURE__ */ new Set(["city", "cities", "town", "municipality", "metro", "location", "place"]);
351
- function tokenizeName(name) {
352
- return name.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_\-./]+/g, " ").toLowerCase().split(/\s+/).filter((t) => t.length > 0);
353
- }
354
- function hasAnyToken(columnName, tokens) {
355
- if (!columnName) return false;
356
- for (const t of tokenizeName(columnName)) if (tokens.has(t)) return true;
357
- return false;
358
- }
359
- var THRESHOLD_PCT = 85;
360
- var NAME_KIND_MIN_DISTINCT = 5;
361
- var MAX_DISTINCT_CONSIDERED = 6e4;
362
- function detectGeo(rawValues, columnName, _locale) {
363
- if (!rawValues || rawValues.length === 0) return null;
364
- const distinct = [];
365
- const seen = /* @__PURE__ */ new Set();
366
- for (const v of rawValues) {
367
- if (v === null || v === void 0) continue;
368
- const s = String(v).trim();
369
- if (s.length === 0) continue;
370
- const key = s.toLowerCase();
371
- if (seen.has(key)) continue;
372
- seen.add(key);
373
- distinct.push(s);
374
- if (distinct.length > MAX_DISTINCT_CONSIDERED) return null;
375
- }
376
- const total = distinct.length;
377
- if (total < 2) return null;
378
- const upper = distinct.map(normalizeCode);
379
- const names = distinct.map(normalizeName);
380
- const cnMap = countryNameMap();
381
- let iso3 = 0, iso2 = 0, usps = 0, cName = 0, sName = 0, zip = 0, county = 0, cityHits = 0;
382
- let iso2AndUsps = 0;
383
- let cNameAndSName = 0;
384
- let stateBoth = 0;
385
- const zipHint = hasAnyToken(columnName, ZIP_NAME_TOKENS);
386
- for (let i = 0; i < total; ++i) {
387
- const u = upper[i];
388
- const nm = names[i];
389
- const raw = distinct[i];
390
- const isIso2 = ISO2_SET.has(u);
391
- const isUsps = USPS_SET.has(u);
392
- if (ISO3_SET.has(u)) iso3++;
393
- if (isIso2) iso2++;
394
- if (isUsps) usps++;
395
- if (isIso2 && isUsps) iso2AndUsps++;
396
- const isCName = cnMap.has(nm);
397
- const isSName = STATE_NAME_TO_USPS.has(nm);
398
- if (isCName) cName++;
399
- if (isSName) sName++;
400
- if (isCName && isSName) cNameAndSName++;
401
- if (isUsps && isSName) stateBoth++;
402
- if (/^\d{5}(-\d{4})?$/.test(raw) || zipHint && /^\d{3,4}$/.test(raw)) zip++;
403
- if (/^\d{5}$/.test(raw) && STATE_FIPS_SET.has(raw.slice(0, 2))) county++;
404
- if (isKnownCity(nm)) cityHits++;
405
- }
406
- const pct = (n) => n / total * 100;
407
- const cands = [];
408
- const add = (kind, matched, spec, guardNameKind = false) => {
409
- const p = pct(matched);
410
- if (p < THRESHOLD_PCT || matched < 2) return;
411
- if (guardNameKind && matched < NAME_KIND_MIN_DISTINCT) {
412
- const tokens = kind === "country-name" ? COUNTRY_NAME_TOKENS : kind === "city-name" ? CITY_NAME_TOKENS : STATE_NAME_TOKENS;
413
- if (!hasAnyToken(columnName, tokens)) return;
414
- }
415
- cands.push({ kind, matched, spec, pct: p });
416
- };
417
- add("country-iso3", iso3, 6);
418
- add("country-name", cName, 5, true);
419
- add("us-state-name", sName, 5, true);
420
- add("us-zip5", zip, 4);
421
- add("us-county-fips", county, 4);
422
- add("country-iso2", iso2, 3);
423
- add("us-state-code", usps, 3);
424
- add("city-name", cityHits, 2, true);
425
- const uspsOnly = usps - stateBoth, sNameOnly = sName - stateBoth;
426
- if (uspsOnly > 0 && sNameOnly > 0) add("us-state-name", usps + sName - stateBoth, 5, true);
427
- if (cands.length === 0) return null;
428
- cands.sort((a, b) => b.pct - a.pct || b.spec - a.spec);
429
- const winner = cands[0];
430
- let ambiguous = false;
431
- const partnerOf = {
432
- "country-iso2": "us-state-code",
433
- "us-state-code": "country-iso2",
434
- "us-zip5": "us-county-fips",
435
- "us-county-fips": "us-zip5",
436
- "country-name": "us-state-name",
437
- "us-state-name": "country-name"
438
- };
439
- const partnerKind = partnerOf[winner.kind];
440
- const runnerUp = cands[1];
441
- const collides = partnerKind && runnerUp && runnerUp.kind === partnerKind && Math.abs(winner.pct - runnerUp.pct) <= 15;
442
- if (winner.kind === "country-iso2" || winner.kind === "us-state-code") {
443
- const overlapShare = winner.matched > 0 ? iso2AndUsps / winner.matched : 0;
444
- const countryHint = hasAnyToken(columnName, COUNTRY_NAME_TOKENS);
445
- const stateHint = hasAnyToken(columnName, STATE_NAME_TOKENS);
446
- if (collides || overlapShare >= 0.5) {
447
- if (countryHint && !stateHint) return finalize("country-iso2", iso2, false);
448
- if (stateHint && !countryHint) return finalize("us-state-code", usps, false);
449
- ambiguous = true;
450
- }
451
- } else if (winner.kind === "us-zip5" || winner.kind === "us-county-fips") {
452
- const allCountyPlausible = county === zip && zip === total;
453
- const zipHint2 = hasAnyToken(columnName, ZIP_NAME_TOKENS);
454
- const countyHint = hasAnyToken(columnName, COUNTY_NAME_TOKENS);
455
- if (countyHint && !zipHint2) return finalize("us-county-fips", county, false);
456
- if (zipHint2 && !countyHint) return finalize("us-zip5", zip, false);
457
- if (allCountyPlausible) return finalize("us-zip5", zip, true);
458
- return finalize("us-zip5", zip, false);
459
- } else if (collides && (winner.kind === "country-name" || winner.kind === "us-state-name")) {
460
- const overlapShare = winner.matched > 0 ? cNameAndSName / winner.matched : 0;
461
- const countryHint = hasAnyToken(columnName, COUNTRY_NAME_TOKENS);
462
- const stateHint = hasAnyToken(columnName, STATE_NAME_TOKENS);
463
- if (countryHint && !stateHint) return finalize("country-name", cName, false);
464
- if (stateHint && !countryHint) return finalize("us-state-name", sName, false);
465
- if (overlapShare >= 0.5) ambiguous = true;
466
- }
467
- return finalize(winner.kind, winner.matched, ambiguous);
468
- function finalize(kind, matched, amb) {
469
- const r = { geoKind: kind, geoMatchPct: Math.round(pct(matched) * 10) / 10 };
470
- if (amb) r.geoAmbiguous = true;
471
- return r;
472
- }
473
- }
474
- function toGeoIso(value, geoKind) {
475
- if (value === null || value === void 0) return null;
476
- const raw = String(value).trim();
477
- if (raw.length === 0) return null;
478
- switch (geoKind) {
479
- case "country-iso3": {
480
- const u = normalizeCode(raw);
481
- return ISO3_SET.has(u) ? u : null;
482
- }
483
- case "country-iso2": {
484
- return ISO2_TO_ISO3.get(normalizeCode(raw)) ?? null;
485
- }
486
- case "country-name": {
487
- return countryNameMap().get(normalizeName(raw)) ?? null;
488
- }
489
- case "us-state-code":
490
- case "us-state-name": {
491
- const u = normalizeCode(raw);
492
- if (USPS_SET.has(u)) return u;
493
- return STATE_NAME_TO_USPS.get(normalizeName(raw)) ?? null;
494
- }
495
- case "us-zip5": {
496
- const m = /^(\d{5})(-\d{4})?$/.exec(raw);
497
- if (m) return m[1];
498
- if (/^\d{3,4}$/.test(raw)) return raw.padStart(5, "0");
499
- return null;
500
- }
501
- case "us-county-fips": {
502
- return /^\d{5}$/.test(raw) && STATE_FIPS_SET.has(raw.slice(0, 2)) ? raw : null;
503
- }
504
- // "city-name" deliberately falls through: no bundled geometry is keyed by city,
505
- // so it is NOT a join kind — it feeds the geoPoint COORDINATE cascade instead.
506
- // Callers building a join column must gate on isJoinGeoKind first; asking this
507
- // function to join on city-name would null every row (a silent blank map).
508
- default:
509
- return null;
510
- }
511
- }
512
- function isJoinGeoKind(kind) {
513
- switch (kind) {
514
- case "country-iso3":
515
- case "country-iso2":
516
- case "country-name":
517
- case "us-state-code":
518
- case "us-state-name":
519
- case "us-zip5":
520
- case "us-county-fips":
521
- return true;
522
- default:
523
- return false;
524
- }
525
- }
526
- function buildGeoIsoColumn(values, geoKind) {
527
- const iso = new Array(values.length);
528
- const unmatchedSeen = /* @__PURE__ */ new Set();
529
- const unmatched = [];
530
- let matchedRows = 0;
531
- for (let i = 0; i < values.length; ++i) {
532
- const norm = toGeoIso(values[i], geoKind);
533
- iso[i] = norm;
534
- if (norm !== null) {
535
- matchedRows++;
536
- } else {
537
- const v = values[i];
538
- if (v !== null && v !== void 0) {
539
- const s = String(v).trim();
540
- if (s.length > 0) {
541
- const key = s.toLowerCase();
542
- if (!unmatchedSeen.has(key)) {
543
- unmatchedSeen.add(key);
544
- unmatched.push(s);
545
- }
546
- }
547
- }
548
- }
549
- }
550
- return { iso, unmatched, matchedRows, totalRows: values.length };
551
- }
552
-
553
- export {
554
- detectGeo,
555
- toGeoIso,
556
- isJoinGeoKind,
557
- buildGeoIsoColumn
558
- };
559
- //# sourceMappingURL=chunk-YJVU7G63.mjs.map