@bicharts/shape-core 0.1.13 → 0.1.15

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 (41) hide show
  1. package/dist/chunk-2LR73DNS.mjs +2 -0
  2. package/dist/chunk-3UOCZ2D6.mjs +2 -0
  3. package/dist/chunk-FVSPBUW2.mjs +2 -0
  4. package/dist/chunk-GY54KQLP.mjs +2 -0
  5. package/dist/chunk-NWDPA7DG.mjs +2 -0
  6. package/dist/chunk-QEH7WTLB.mjs +2 -0
  7. package/dist/chunk-WBEROMBG.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/types/models.d.ts +1 -0
  17. package/dist/util.mjs +1 -11
  18. package/package.json +2 -2
  19. package/dist/chunk-ICDJLWEM.mjs +0 -83
  20. package/dist/chunk-ICDJLWEM.mjs.map +0 -7
  21. package/dist/chunk-NGV56PGT.mjs +0 -787
  22. package/dist/chunk-NGV56PGT.mjs.map +0 -7
  23. package/dist/chunk-QTEE53OQ.mjs +0 -205
  24. package/dist/chunk-QTEE53OQ.mjs.map +0 -7
  25. package/dist/chunk-RZAZ7PZK.mjs +0 -31
  26. package/dist/chunk-RZAZ7PZK.mjs.map +0 -7
  27. package/dist/chunk-VHWC3THS.mjs +0 -572
  28. package/dist/chunk-VHWC3THS.mjs.map +0 -7
  29. package/dist/chunk-VLMGGCN4.mjs +0 -36
  30. package/dist/chunk-VLMGGCN4.mjs.map +0 -7
  31. package/dist/chunk-YJVU7G63.mjs +0 -559
  32. package/dist/chunk-YJVU7G63.mjs.map +0 -7
  33. package/dist/formatDetector.mjs.map +0 -7
  34. package/dist/geoDetector.mjs.map +0 -7
  35. package/dist/geoPoint.mjs.map +0 -7
  36. package/dist/index.mjs.map +0 -7
  37. package/dist/indexedText.mjs.map +0 -7
  38. package/dist/models.mjs.map +0 -7
  39. package/dist/monthNames.mjs.map +0 -7
  40. package/dist/ordinalDetector.mjs.map +0 -7
  41. package/dist/util.mjs.map +0 -7
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/geoDetector.ts"],
4
- "sourcesContent": ["// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Client-side GEO detector (geo/choropleth Phase 0 \u2014 the enabling SIGNAL)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Measures whether a categorical column is a GEOGRAPHIC dimension and, if so,\n// of which KIND (country / US-state / US-ZIP / US-county). Runs client-side in\n// shape-core so BOTH the Power BI visual and the MCP classifier share ONE\n// implementation \u2014 the profiler has the ACTUAL cell values (the server sees\n// only obfuscated tokens), so geo recognition MUST happen here.\n//\n// What ships to the server is an ENUM + a PERCENT + a bool, never raw values:\n// geoKind \u2014 the most specific kind that clears threshold (see GeoKind)\n// geoMatchPct \u2014 % of DISTINCT values that resolved to that kind\n// geoAmbiguous \u2014 the value set is a known code collision (ISO-2 vs USPS,\n// ZIP vs county-FIPS, or country-name vs US-state-name) that a\n// single column cannot disambiguate; the server gate should be\n// conservative. Set only when genuinely undecidable here.\n// This is strictly less revealing than isTemporal (shipped unconditionally) \u2014\n// \"column X looks like countries, 98% matched\" is not a user secret \u2014 so the\n// caller runs detection regardless of privacy level and ships only the summary.\n//\n// Design decisions (2026-07-21):\n// \u2022 ISO codes are the interchange. Normal form: country \u2192 ISO 3166-1 alpha-3;\n// US state \u2192 USPS. (Normalization to normal form is Phase 1's __geoIso__\n// builder; Phase 0 only DETECTS.)\n// \u2022 Country NAMES are recognized in all 27 languages the visual supports, built\n// at runtime from Intl.DisplayNames(type:'region') (the monthNames.ts pattern \u2014\n// zero shipped name table), UNION a small flat alias overlay (alias \u2192 ISO3) for\n// forms Intl doesn't emit (\"USA\", \"UK\", \"Holland\", historical names). The\n// overlay is a plain map on purpose: trivial for an LLM to extend.\n// \u2022 us-county-NAME is intentionally NOT detected here \u2014 it needs a sibling STATE\n// column to disambiguate (Illinois \"Lake\" vs Indiana \"Lake\"), which a single-\n// column detector can't see. Deferred to Phase 3, where the caller supplies\n// cross-column context.\n//\n// Returns null when nothing clears threshold \u2192 the caller ships no geo fields\n// (older servers ignore them anyway; the signal is inert until Phase 1's gate).\n\n// The city table lives in geoPoint (the point-geocode cascade owns it); this module\n// only asks \"is this a known city?\" to emit the city-name KIND. One-directional \u2014\n// geoPoint never imports geoDetector \u2014 so there is no import cycle.\nimport { isKnownCity, normalizePlaceName } from \"./geoPoint\";\n\n// ISO 3166-1: alpha-2 \u2192 alpha-3, the full assigned set. This is the ONLY geo\n// name/code table that ships (a few KB); everything else (country names in 27\n// languages) is derived at runtime from Intl. Packed as \"A2 A3\" pairs to keep\n// the source compact and the structure typo-resistant.\nconst ISO_3166_PAIRS =\n \"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,\" +\n \"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,\" +\n \"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,\" +\n \"DE DEU,DJ DJI,DK DNK,DM DMA,DO DOM,DZ DZA,\" +\n \"EC ECU,EE EST,EG EGY,EH ESH,ER ERI,ES ESP,ET ETH,\" +\n \"FI FIN,FJ FJI,FK FLK,FM FSM,FO FRO,FR FRA,\" +\n \"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,\" +\n \"HK HKG,HM HMD,HN HND,HR HRV,HT HTI,HU HUN,\" +\n \"ID IDN,IE IRL,IL ISR,IM IMN,IN IND,IO IOT,IQ IRQ,IR IRN,IS ISL,IT ITA,\" +\n \"JE JEY,JM JAM,JO JOR,JP JPN,\" +\n \"KE KEN,KG KGZ,KH KHM,KI KIR,KM COM,KN KNA,KP PRK,KR KOR,KW KWT,KY CYM,KZ KAZ,\" +\n \"LA LAO,LB LBN,LC LCA,LI LIE,LK LKA,LR LBR,LS LSO,LT LTU,LU LUX,LV LVA,LY LBY,\" +\n \"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,\" +\n \"NA NAM,NC NCL,NE NER,NF NFK,NG NGA,NI NIC,NL NLD,NO NOR,NP NPL,NR NRU,NU NIU,NZ NZL,\" +\n \"OM OMN,\" +\n \"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,\" +\n \"QA QAT,\" +\n \"RE REU,RO ROU,RS SRB,RU RUS,RW RWA,\" +\n \"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,\" +\n \"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,\" +\n \"UA UKR,UG UGA,UM UMI,US USA,UY URY,UZ UZB,\" +\n \"VA VAT,VC VCT,VE VEN,VG VGB,VI VIR,VN VNM,VU VUT,\" +\n \"WF WLF,WS WSM,\" +\n \"YE YEM,YT MYT,\" +\n \"ZA ZAF,ZM ZMB,ZW ZWE\";\n\nconst ISO2_TO_ISO3: Map<string, string> = (() => {\n const m = new Map<string, string>();\n for (const pair of ISO_3166_PAIRS.split(\",\")) {\n const [a2, a3] = pair.split(\" \");\n if (a2 && a3) m.set(a2, a3);\n }\n return m;\n})();\nconst ISO2_SET: Set<string> = new Set(ISO2_TO_ISO3.keys());\nconst ISO3_SET: Set<string> = new Set(ISO2_TO_ISO3.values());\n\n// The 27 languages the visual localizes to (mirrors lib/shared/Localizer.ts\n// PHRASES \u2014 the definition of \"languages the visual supports today\"). Country\n// names are recognized in every one of these via Intl. If Localizer's set\n// changes, mirror it here.\nconst SUPPORTED_LANGS = [\n \"en\", \"fr\", \"es\", \"de\", \"it\", \"pt\", \"ru\", \"ja\", \"zh\", \"ko\", \"ar\", \"hi\", \"tr\",\n \"pl\", \"he\", \"nl\", \"sv\", \"fi\", \"no\", \"da\", \"cs\", \"el\", \"uk\", \"ro\", \"id\", \"vi\", \"th\",\n];\n\n// Flat alias overlay for country-name forms Intl.DisplayNames does NOT emit \u2014\n// colloquial abbreviations, common short forms, and historical names. Keys are\n// pre-normalize() spellings (they get normalized at build); values are ISO3.\n// Extend freely (this is the \"trivial for an LLM to generate\" map).\nconst COUNTRY_ALIAS_OVERLAY: Record<string, string> = {\n \"usa\": \"USA\", \"u.s.\": \"USA\", \"u.s.a.\": \"USA\", \"us\": \"USA\", \"america\": \"USA\",\n \"united states of america\": \"USA\", \"the united states\": \"USA\",\n \"uk\": \"GBR\", \"u.k.\": \"GBR\", \"great britain\": \"GBR\", \"britain\": \"GBR\", \"england\": \"GBR\",\n \"south korea\": \"KOR\", \"north korea\": \"PRK\", \"korea\": \"KOR\",\n \"ivory coast\": \"CIV\", \"cote d ivoire\": \"CIV\",\n \"vietnam\": \"VNM\", \"laos\": \"LAO\", \"syria\": \"SYR\", \"iran\": \"IRN\", \"russia\": \"RUS\",\n \"moldova\": \"MDA\", \"tanzania\": \"TZA\", \"bolivia\": \"BOL\", \"venezuela\": \"VEN\",\n \"brunei\": \"BRN\", \"czech republic\": \"CZE\", \"czechia\": \"CZE\", \"slovakia\": \"SVK\",\n \"uae\": \"ARE\", \"united arab emirates\": \"ARE\",\n \"drc\": \"COD\", \"dr congo\": \"COD\", \"democratic republic of the congo\": \"COD\",\n \"republic of the congo\": \"COG\", \"congo\": \"COG\",\n \"swaziland\": \"SWZ\", \"eswatini\": \"SWZ\", \"cape verde\": \"CPV\", \"cabo verde\": \"CPV\",\n \"burma\": \"MMR\", \"myanmar\": \"MMR\", \"holland\": \"NLD\", \"the netherlands\": \"NLD\",\n \"netherlands\": \"NLD\", \"vatican\": \"VAT\", \"vatican city\": \"VAT\", \"palestine\": \"PSE\",\n \"macau\": \"MAC\", \"macao\": \"MAC\", \"hong kong\": \"HKG\", \"taiwan\": \"TWN\",\n \"turkey\": \"TUR\", \"turkiye\": \"TUR\", \"macedonia\": \"MKD\", \"north macedonia\": \"MKD\",\n \"gambia\": \"GMB\", \"the gambia\": \"GMB\", \"bahamas\": \"BHS\", \"the bahamas\": \"BHS\",\n \"east timor\": \"TLS\", \"timor leste\": \"TLS\",\n};\n\n// US states + DC + the five inhabited territories: USPS code \u2194 name. Small\n// enough to ship verbatim (no Intl source for subnational names).\nconst US_STATE_PAIRS: [string, string][] = [\n [\"AL\", \"Alabama\"], [\"AK\", \"Alaska\"], [\"AZ\", \"Arizona\"], [\"AR\", \"Arkansas\"],\n [\"CA\", \"California\"], [\"CO\", \"Colorado\"], [\"CT\", \"Connecticut\"], [\"DE\", \"Delaware\"],\n [\"FL\", \"Florida\"], [\"GA\", \"Georgia\"], [\"HI\", \"Hawaii\"], [\"ID\", \"Idaho\"],\n [\"IL\", \"Illinois\"], [\"IN\", \"Indiana\"], [\"IA\", \"Iowa\"], [\"KS\", \"Kansas\"],\n [\"KY\", \"Kentucky\"], [\"LA\", \"Louisiana\"], [\"ME\", \"Maine\"], [\"MD\", \"Maryland\"],\n [\"MA\", \"Massachusetts\"], [\"MI\", \"Michigan\"], [\"MN\", \"Minnesota\"], [\"MS\", \"Mississippi\"],\n [\"MO\", \"Missouri\"], [\"MT\", \"Montana\"], [\"NE\", \"Nebraska\"], [\"NV\", \"Nevada\"],\n [\"NH\", \"New Hampshire\"], [\"NJ\", \"New Jersey\"], [\"NM\", \"New Mexico\"], [\"NY\", \"New York\"],\n [\"NC\", \"North Carolina\"], [\"ND\", \"North Dakota\"], [\"OH\", \"Ohio\"], [\"OK\", \"Oklahoma\"],\n [\"OR\", \"Oregon\"], [\"PA\", \"Pennsylvania\"], [\"RI\", \"Rhode Island\"], [\"SC\", \"South Carolina\"],\n [\"SD\", \"South Dakota\"], [\"TN\", \"Tennessee\"], [\"TX\", \"Texas\"], [\"UT\", \"Utah\"],\n [\"VT\", \"Vermont\"], [\"VA\", \"Virginia\"], [\"WA\", \"Washington\"], [\"WV\", \"West Virginia\"],\n [\"WI\", \"Wisconsin\"], [\"WY\", \"Wyoming\"], [\"DC\", \"District of Columbia\"],\n [\"PR\", \"Puerto Rico\"], [\"GU\", \"Guam\"], [\"VI\", \"U.S. Virgin Islands\"],\n [\"AS\", \"American Samoa\"], [\"MP\", \"Northern Mariana Islands\"],\n];\nconst USPS_SET: Set<string> = new Set(US_STATE_PAIRS.map(p => p[0]));\n\n// Common / traditional (AP-style) state abbreviations users actually type \u2014 the forms\n// USPS 2-letter codes and full names both miss (\"Calif.\", \"Fla.\", \"N.Y.\", \"Wash.\"). Keys\n// are pre-normalize spellings (normalizeName strips the periods \u2192 \"calif\", \"n y\", \"wash\");\n// values are USPS. A plain map so an LLM can extend it (the COUNTRY_ALIAS_OVERLAY pattern).\n// Bare 2-letter forms (with/without a period) already resolve via USPS us-state-code, so\n// this focuses on the distinctive multi-char + punctuated abbreviations.\nconst US_STATE_ALIAS_OVERLAY: Record<string, string> = {\n \"Ala.\": \"AL\", \"Alab.\": \"AL\", \"Ariz.\": \"AZ\", \"Ark.\": \"AR\",\n \"Calif.\": \"CA\", \"Cal.\": \"CA\", \"Colo.\": \"CO\", \"Col.\": \"CO\", \"Conn.\": \"CT\",\n \"Del.\": \"DE\", \"Fla.\": \"FL\", \"Flor.\": \"FL\", \"Ga.\": \"GA\",\n \"Ill.\": \"IL\", \"Ind.\": \"IN\", \"Kan.\": \"KS\", \"Kans.\": \"KS\", \"Ky.\": \"KY\",\n \"La.\": \"LA\", \"Md.\": \"MD\", \"Mass.\": \"MA\", \"Mich.\": \"MI\", \"Minn.\": \"MN\",\n \"Miss.\": \"MS\", \"Mo.\": \"MO\", \"Mont.\": \"MT\", \"Neb.\": \"NE\", \"Nebr.\": \"NE\",\n \"Nev.\": \"NV\", \"N.H.\": \"NH\", \"N.J.\": \"NJ\", \"N.M.\": \"NM\", \"N.Mex.\": \"NM\", \"N. Mex.\": \"NM\",\n \"N.Y.\": \"NY\", \"N.C.\": \"NC\", \"N.D.\": \"ND\", \"N.Dak.\": \"ND\", \"N. Dak.\": \"ND\",\n \"Okla.\": \"OK\", \"Ore.\": \"OR\", \"Oreg.\": \"OR\",\n \"Pa.\": \"PA\", \"Penn.\": \"PA\", \"Penna.\": \"PA\", \"R.I.\": \"RI\", \"S.C.\": \"SC\",\n \"S.D.\": \"SD\", \"S.Dak.\": \"SD\", \"S. Dak.\": \"SD\", \"Tenn.\": \"TN\", \"Tex.\": \"TX\",\n \"Vt.\": \"VT\", \"Va.\": \"VA\", \"Wash.\": \"WA\", \"W.Va.\": \"WV\", \"W. Va.\": \"WV\",\n \"Wis.\": \"WI\", \"Wisc.\": \"WI\", \"Wyo.\": \"WY\",\n \"D.C.\": \"DC\", \"Wash. D.C.\": \"DC\", \"Wash., D.C.\": \"DC\",\n \"P.R.\": \"PR\", \"V.I.\": \"VI\",\n};\nconst STATE_NAME_TO_USPS: Map<string, string> = (() => {\n const m = new Map<string, string>();\n for (const [code, name] of US_STATE_PAIRS) m.set(normalizeName(name), code);\n // A couple of common alternates Intl/CLDR or users write differently.\n m.set(normalizeName(\"Washington DC\"), \"DC\");\n m.set(normalizeName(\"Washington D.C.\"), \"DC\");\n m.set(normalizeName(\"US Virgin Islands\"), \"VI\");\n // Common/traditional abbreviations (Calif., Fla., N.Y., \u2026).\n for (const [alias, code] of Object.entries(US_STATE_ALIAS_OVERLAY)) {\n const key = normalizeName(alias);\n if (key && !m.has(key)) m.set(key, code);\n }\n return m;\n})();\n\n// Valid 2-digit state FIPS prefixes (50 states + DC + 5 territories). A 5-digit\n// numeric is a plausible county FIPS only when its first two digits are in here;\n// otherwise it's a ZIP (e.g. \"90210\" \u2192 prefix \"90\" \u2209 set \u2192 not a county).\nconst STATE_FIPS_SET: Set<string> = new Set([\n \"01\", \"02\", \"04\", \"05\", \"06\", \"08\", \"09\", \"10\", \"11\", \"12\", \"13\", \"15\", \"16\",\n \"17\", \"18\", \"19\", \"20\", \"21\", \"22\", \"23\", \"24\", \"25\", \"26\", \"27\", \"28\", \"29\",\n \"30\", \"31\", \"32\", \"33\", \"34\", \"35\", \"36\", \"37\", \"38\", \"39\", \"40\", \"41\", \"42\",\n \"44\", \"45\", \"46\", \"47\", \"48\", \"49\", \"50\", \"51\", \"53\", \"54\", \"55\", \"56\",\n \"60\", \"66\", \"69\", \"72\", \"78\",\n]);\n\n// \u2500\u2500 Normalizers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Codes: uppercase + trim, so \"us\" / \" US \" / \"Us\" all compare as \"US\".\nfunction normalizeCode(s: string): string {\n return s.trim().toUpperCase();\n}\n// Names: lowercase, strip diacritics, drop punctuation (keep letters/digits of\n// ANY script + spaces so CJK / Arabic / Cyrillic names survive), collapse\n// whitespace. \"C\u00F4te d'Ivoire\" \u2192 \"cote d ivoire\"; \"\u65E5\u672C\" stays \"\u65E5\u672C\".\n// ONE implementation with geoPoint's normalizePlaceName, not a copy: isKnownCity's\n// contract is \"already normalized, do not re-normalize\" \u2014 detectGeo passes THIS\n// function's output into the city table, so the two normalizers diverging would make\n// city detection silently miss with no test catching it. (2026-07-25 sweep.)\n// Declared `function` (hoisted) \u2014 module-init tables above/below call it during load.\nfunction normalizeName(s: string): string {\n return normalizePlaceName(s);\n}\n\n// Country-name \u2192 ISO3 lookup, built once (lazily) from Intl across all supported\n// languages UNION the alias overlay. English is added first so it wins any\n// cross-language normalized-key collision; the overlay is applied last so an\n// explicit alias always resolves. Cached module-wide (monthNames.ts pattern).\nlet _countryNameMap: Map<string, string> | null = null;\nfunction countryNameMap(): Map<string, string> {\n if (_countryNameMap) return _countryNameMap;\n const m = new Map<string, string>();\n // English first (authoritative on collisions), then the rest.\n const langs = [\"en\", ...SUPPORTED_LANGS.filter(l => l !== \"en\")];\n for (const lang of langs) {\n let dn: Intl.DisplayNames | null = null;\n try {\n dn = new Intl.DisplayNames([lang], { type: \"region\" });\n } catch {\n continue; // runtime without this locale's data \u2014 skip it\n }\n for (const [a2, a3] of ISO2_TO_ISO3) {\n let name: string | undefined;\n try {\n name = dn.of(a2);\n } catch {\n name = undefined;\n }\n // Intl returns the input code when it has no localized name.\n if (!name || name === a2) continue;\n const key = normalizeName(name);\n if (key && !m.has(key)) m.set(key, a3);\n }\n }\n for (const [alias, a3] of Object.entries(COUNTRY_ALIAS_OVERLAY)) {\n const key = normalizeName(alias);\n if (key) m.set(key, a3); // overlay wins \u2014 explicit intent\n }\n _countryNameMap = m;\n return m;\n}\n\n// \u2500\u2500 Column-name tokens (tiebreaker / guard, never a substitute) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst COUNTRY_NAME_TOKENS = new Set([\"country\", \"countries\", \"nation\", \"nationality\", \"iso\", \"geo\"]);\nconst STATE_NAME_TOKENS = new Set([\"state\", \"province\", \"st\"]);\nconst ZIP_NAME_TOKENS = new Set([\"zip\", \"zipcode\", \"postal\", \"postcode\", \"plz\"]);\nconst COUNTY_NAME_TOKENS = new Set([\"county\", \"fips\", \"borough\", \"parish\"]);\nconst CITY_NAME_TOKENS = new Set([\"city\", \"cities\", \"town\", \"municipality\", \"metro\", \"location\", \"place\"]);\n\nfunction tokenizeName(name: string): string[] {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_\\-./]+/g, \" \")\n .toLowerCase()\n .split(/\\s+/)\n .filter(t => t.length > 0);\n}\nfunction hasAnyToken(columnName: string | undefined, tokens: Set<string>): boolean {\n if (!columnName) return false;\n for (const t of tokenizeName(columnName)) if (tokens.has(t)) return true;\n return false;\n}\n\n// \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport type GeoKind =\n | \"country-iso3\"\n | \"country-iso2\"\n | \"country-name\"\n | \"us-state-code\"\n | \"us-state-name\"\n | \"us-zip5\"\n | \"us-county-fips\"\n // NOT a choropleth join key \u2014 no bundled geometry is keyed by city. It marks a column\n // whose values geoPoint can turn into a COORDINATE, which is what makes a point map\n // (North America Bubbles) offerable on data that has no lat/lon columns.\n | \"city-name\";\n\nexport type GeoDetectionResult = {\n geoKind: GeoKind;\n geoMatchPct: number; // 0..100, one decimal\n geoAmbiguous?: boolean; // known single-column code collision\n};\n\n// Emit the signal only above this match rate. The client REPORTS the measured\n// pct; the server gate re-checks against sysparm LLMGeoMinMatchPct (Phase 1).\nconst THRESHOLD_PCT = 85;\n// Dictionary-word kinds (country/state NAMES) collide with person/place names\n// (Chad, Georgia, Jordan). Require either a decent number of matched distinct\n// values OR a geo-ish column name, so a 3-name roster doesn't read as countries.\nconst NAME_KIND_MIN_DISTINCT = 5;\n// Cap the work on pathological high-cardinality free-text columns. Real geo\n// columns are far below this (\u2264 ~250 countries, 56 states, ~42k ZIPs). ZIP/FIPS\n// are cheap regex either way; this only bounds the dictionary path.\nconst MAX_DISTINCT_CONSIDERED = 60000;\n\ntype Candidate = { kind: GeoKind; pct: number; matched: number; spec: number };\n\n/**\n * Detect whether a column's values are a geographic dimension.\n * @param rawValues DISTINCT raw cell values (order irrelevant; duplicates are\n * harmless but the caller usually passes the distinct set).\n * @param columnName the source column name (tiebreaker/guard for ambiguous codes).\n * @param _locale reserved (country names already union all 27 languages; the\n * report locale is not needed to match). Kept for signature symmetry.\n */\nexport function detectGeo(\n rawValues: string[],\n columnName?: string,\n _locale?: string,\n): GeoDetectionResult | null {\n if (!rawValues || rawValues.length === 0) return null;\n\n // Distinct (CASE-INSENSITIVE \u2014 regions are the same place regardless of case,\n // so \"USA\"/\"usa\" is one region, not two), non-empty, string-ified. The first\n // spelling seen represents the region for matching.\n const distinct: string[] = [];\n const seen = new Set<string>();\n for (const v of rawValues) {\n if (v === null || v === undefined) continue;\n const s = String(v).trim();\n if (s.length === 0) continue;\n const key = s.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n distinct.push(s);\n if (distinct.length > MAX_DISTINCT_CONSIDERED) return null;\n }\n const total = distinct.length;\n if (total < 2) return null; // a 1-region \"map\" is degenerate\n\n const upper = distinct.map(normalizeCode);\n const names = distinct.map(normalizeName);\n const cnMap = countryNameMap();\n\n let iso3 = 0, iso2 = 0, usps = 0, cName = 0, sName = 0, zip = 0, county = 0, cityHits = 0;\n let iso2AndUsps = 0; // values valid as BOTH an ISO-2 and a USPS code\n let cNameAndSName = 0; // values matching BOTH a country and a US-state name\n let stateBoth = 0; // values valid as BOTH a USPS code and a state name/abbrev\n // A column named zip/postal whose values Power BI coerced to a NUMBER lost its\n // leading zero(s): a whole New-England/NJ/PR (0xxxx) column becomes bare 3-4 digit\n // integers. Count those as ZIPs ONLY under a zip name token, so the column still\n // resolves as us-zip5 instead of failing detection outright (toGeoIso then pads\n // them back). Gated by the token so a generic small-integer column never misfires.\n const zipHint = hasAnyToken(columnName, ZIP_NAME_TOKENS);\n for (let i = 0; i < total; ++i) {\n const u = upper[i];\n const nm = names[i];\n const raw = distinct[i];\n const isIso2 = ISO2_SET.has(u);\n const isUsps = USPS_SET.has(u);\n if (ISO3_SET.has(u)) iso3++;\n if (isIso2) iso2++;\n if (isUsps) usps++;\n if (isIso2 && isUsps) iso2AndUsps++;\n const isCName = cnMap.has(nm);\n const isSName = STATE_NAME_TO_USPS.has(nm);\n if (isCName) cName++;\n if (isSName) sName++;\n if (isCName && isSName) cNameAndSName++;\n if (isUsps && isSName) stateBoth++;\n if (/^\\d{5}(-\\d{4})?$/.test(raw) || (zipHint && /^\\d{3,4}$/.test(raw))) zip++;\n if (/^\\d{5}$/.test(raw) && STATE_FIPS_SET.has(raw.slice(0, 2))) county++;\n if (isKnownCity(nm)) cityHits++;\n }\n\n const pct = (n: number) => (n / total) * 100;\n const cands: Candidate[] = [];\n const add = (kind: GeoKind, matched: number, spec: number, guardNameKind = false) => {\n const p = pct(matched);\n if (p < THRESHOLD_PCT || matched < 2) return;\n if (guardNameKind && matched < NAME_KIND_MIN_DISTINCT) {\n const tokens = kind === \"country-name\" ? COUNTRY_NAME_TOKENS\n : kind === \"city-name\" ? CITY_NAME_TOKENS\n : STATE_NAME_TOKENS;\n if (!hasAnyToken(columnName, tokens)) return; // likely a person/place roster\n }\n cands.push({ kind, matched, spec, pct: p });\n };\n // spec = specificity rank for tie-breaking (higher = more certain / less\n // collision-prone). ISO-3 and full names beat 2-letter codes and numerics.\n add(\"country-iso3\", iso3, 6);\n add(\"country-name\", cName, 5, true);\n add(\"us-state-name\", sName, 5, true);\n add(\"us-zip5\", zip, 4);\n add(\"us-county-fips\", county, 4);\n add(\"country-iso2\", iso2, 3);\n add(\"us-state-code\", usps, 3);\n // CITY sits at the BOTTOM of the specificity order on purpose. Several city names are\n // also state or country names (\"New York\", \"Washington\", \"Mexico\", \"Quebec\"), and a\n // column of those is far likelier to be the region than the city \u2014 so any region kind\n // that clears threshold outranks city. Guarded like the other dictionary kinds: a short\n // roster of proper nouns needs a city-ish column name before it reads as cities.\n add(\"city-name\", cityHits, 2, true);\n // A column that MIXES USPS codes with state names/abbreviations (\"TX\", \"California\",\n // \"Fla.\") splits between us-state-code and us-state-name, so neither kind alone clears\n // threshold. They are the SAME concept (a state) and toGeoIso resolves either form for\n // either kind, so score the UNION as one us-state candidate \u2014 but only when the column\n // genuinely mixes both forms (a pure-code column keeps its us-state-code candidate so\n // the ISO-2/USPS collision handling below is untouched).\n const uspsOnly = usps - stateBoth, sNameOnly = sName - stateBoth;\n if (uspsOnly > 0 && sNameOnly > 0) add(\"us-state-name\", usps + sName - stateBoth, 5, true);\n\n if (cands.length === 0) return null;\n cands.sort((a, b) => (b.pct - a.pct) || (b.spec - a.spec));\n\n const winner = cands[0];\n let ambiguous = false;\n\n // Resolve the three known collisions when the runner-up is the colliding\n // partner and the two are close (within 15 pts): let a decisive column name\n // pick; otherwise keep the default winner and FLAG ambiguity.\n const partnerOf: Partial<Record<GeoKind, GeoKind>> = {\n \"country-iso2\": \"us-state-code\", \"us-state-code\": \"country-iso2\",\n \"us-zip5\": \"us-county-fips\", \"us-county-fips\": \"us-zip5\",\n \"country-name\": \"us-state-name\", \"us-state-name\": \"country-name\",\n };\n const partnerKind = partnerOf[winner.kind];\n const runnerUp = cands[1];\n const collides = partnerKind && runnerUp && runnerUp.kind === partnerKind\n && Math.abs(winner.pct - runnerUp.pct) <= 15;\n\n if (winner.kind === \"country-iso2\" || winner.kind === \"us-state-code\") {\n // How much of the matched set is valid under BOTH interpretations.\n const overlapShare = winner.matched > 0 ? iso2AndUsps / winner.matched : 0;\n const countryHint = hasAnyToken(columnName, COUNTRY_NAME_TOKENS);\n const stateHint = hasAnyToken(columnName, STATE_NAME_TOKENS);\n if (collides || overlapShare >= 0.5) {\n if (countryHint && !stateHint) return finalize(\"country-iso2\", iso2, false);\n if (stateHint && !countryHint) return finalize(\"us-state-code\", usps, false);\n ambiguous = true; // undecidable from this column alone\n }\n } else if (winner.kind === \"us-zip5\" || winner.kind === \"us-county-fips\") {\n // Numeric 5-digit: ZIP and county-FIPS share the pattern. If any value's\n // prefix is not a valid state FIPS, it CAN'T be county \u2192 ZIP wins clean.\n const allCountyPlausible = county === zip && zip === total;\n const zipHint = hasAnyToken(columnName, ZIP_NAME_TOKENS);\n const countyHint = hasAnyToken(columnName, COUNTY_NAME_TOKENS);\n if (countyHint && !zipHint) return finalize(\"us-county-fips\", county, false);\n if (zipHint && !countyHint) return finalize(\"us-zip5\", zip, false);\n // No decisive name: default to ZIP (far more common in BI data); flag\n // ambiguous only when every value is ALSO a plausible county code.\n if (allCountyPlausible) return finalize(\"us-zip5\", zip, true);\n return finalize(\"us-zip5\", zip, false);\n } else if (collides && (winner.kind === \"country-name\" || winner.kind === \"us-state-name\")) {\n const overlapShare = winner.matched > 0 ? cNameAndSName / winner.matched : 0;\n const countryHint = hasAnyToken(columnName, COUNTRY_NAME_TOKENS);\n const stateHint = hasAnyToken(columnName, STATE_NAME_TOKENS);\n if (countryHint && !stateHint) return finalize(\"country-name\", cName, false);\n if (stateHint && !countryHint) return finalize(\"us-state-name\", sName, false);\n if (overlapShare >= 0.5) ambiguous = true;\n }\n\n return finalize(winner.kind, winner.matched, ambiguous);\n\n function finalize(kind: GeoKind, matched: number, amb: boolean): GeoDetectionResult {\n const r: GeoDetectionResult = { geoKind: kind, geoMatchPct: Math.round(pct(matched) * 10) / 10 };\n if (amb) r.geoAmbiguous = true;\n return r;\n }\n}\n\n// \u2500\u2500 __geoIso__ normalization (Phase 1 \u00A73a foundation) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Deterministic value \u2192 NORMAL FORM for a known geoKind. This is the join key the\n// generated chart uses (Plotly locations / D3 path bind); the LLM never builds a\n// name\u2192code mapping in code \u2014 the client precomputes it here (single source, shared\n// by the visual's __geoIso__ builder and the MCP). Normal forms:\n// country-* \u2192 ISO 3166-1 alpha-3\n// us-state-* \u2192 USPS 2-letter\n// us-zip5 \u2192 5-digit ZIP (\u25004 extension stripped)\n// us-county-fips \u2192 5-digit FIPS\n// Returns null when the value doesn't resolve \u2192 the caller null-fills __geoIso__ and\n// counts it as unmatched (the classic silent-drop failure, handled deterministically).\nexport function toGeoIso(value: string | null | undefined, geoKind: GeoKind): string | null {\n if (value === null || value === undefined) return null;\n const raw = String(value).trim();\n if (raw.length === 0) return null;\n switch (geoKind) {\n case \"country-iso3\": {\n const u = normalizeCode(raw);\n return ISO3_SET.has(u) ? u : null;\n }\n case \"country-iso2\": {\n return ISO2_TO_ISO3.get(normalizeCode(raw)) ?? null;\n }\n case \"country-name\": {\n return countryNameMap().get(normalizeName(raw)) ?? null;\n }\n case \"us-state-code\":\n case \"us-state-name\": {\n // Tolerant regardless of the detected kind: try USPS code first, then the\n // name/common-abbreviation map (\"California\", \"Calif.\", \"N.Y.\"). So a code\n // column with a stray \"Calif.\" \u2014 or a name column with a stray \"CA\" \u2014 both\n // resolve rather than dropping to unmatched.\n const u = normalizeCode(raw);\n if (USPS_SET.has(u)) return u;\n return STATE_NAME_TO_USPS.get(normalizeName(raw)) ?? null;\n }\n case \"us-zip5\": {\n const m = /^(\\d{5})(-\\d{4})?$/.exec(raw);\n if (m) return m[1];\n // Power BI / Excel silently coerce a ZIP column to a NUMBER, dropping the\n // leading zero(s): \"01001\" -> 1001, \"00501\" -> 501. Within a column already\n // resolved as ZIP-5, a bare 3-4 digit integer is a zero-stripped ZIP \u2014 left-\n // pad to recover it (the whole New England / NJ / PR 0xxxx block otherwise\n // reads as unmatched, prod 2026-07-23). USPS ZIPs are 00501..99950, so any\n // <5-digit value is unambiguously a stripped leading zero.\n if (/^\\d{3,4}$/.test(raw)) return raw.padStart(5, \"0\");\n return null;\n }\n case \"us-county-fips\": {\n return /^\\d{5}$/.test(raw) && STATE_FIPS_SET.has(raw.slice(0, 2)) ? raw : null;\n }\n // \"city-name\" deliberately falls through: no bundled geometry is keyed by city,\n // so it is NOT a join kind \u2014 it feeds the geoPoint COORDINATE cascade instead.\n // Callers building a join column must gate on isJoinGeoKind first; asking this\n // function to join on city-name would null every row (a silent blank map).\n default:\n return null;\n }\n}\n\n/** True for kinds that resolve to a polygon join key (__geoIso__ against feature.id).\n * \"city-name\" is a GeoKind but NOT a join kind \u2014 it marks a column the geoPoint\n * cascade can turn into a coordinate. Building a join column from a non-join kind\n * produces an all-null __geoIso__ = a blank choropleth with no error. */\nexport function isJoinGeoKind(kind: string | null | undefined): boolean {\n switch (kind) {\n case \"country-iso3\":\n case \"country-iso2\":\n case \"country-name\":\n case \"us-state-code\":\n case \"us-state-name\":\n case \"us-zip5\":\n case \"us-county-fips\":\n return true;\n default:\n return false;\n }\n}\n\nexport type GeoIsoColumn = {\n // Per-row normal form, aligned 1:1 with the input values; null where a value\n // didn't resolve (\u2192 the synthetic __geoIso__ cell is null / not drawn).\n iso: (string | null)[];\n // Distinct raw values that failed to resolve \u2014 feeds options.geoUnmatched so\n // the chart can annotate \"N regions unmatched\" instead of silently dropping.\n unmatched: string[];\n // Convenience counts for the annotation + gate.\n matchedRows: number;\n totalRows: number;\n};\n\n/**\n * Build the aligned __geoIso__ column for a full column of values under a known\n * geoKind. Pure \u2014 the visual appends `iso` beside __rowIdx__ and surfaces\n * `unmatched` via options.geoUnmatched (Phase 1 \u00A73a).\n */\nexport function buildGeoIsoColumn(values: (string | null | undefined)[], geoKind: GeoKind): GeoIsoColumn {\n const iso: (string | null)[] = new Array(values.length);\n const unmatchedSeen = new Set<string>();\n const unmatched: string[] = [];\n let matchedRows = 0;\n for (let i = 0; i < values.length; ++i) {\n const norm = toGeoIso(values[i], geoKind);\n iso[i] = norm;\n if (norm !== null) {\n matchedRows++;\n } else {\n const v = values[i];\n if (v !== null && v !== undefined) {\n const s = String(v).trim();\n if (s.length > 0) {\n const key = s.toLowerCase();\n if (!unmatchedSeen.has(key)) { unmatchedSeen.add(key); unmatched.push(s); }\n }\n }\n }\n }\n return { iso, unmatched, matchedRows, totalRows: values.length };\n}\n"],
5
- "mappings": "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",
6
- "names": ["zipHint"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/geoPointRoles.ts"],
4
- "sourcesContent": ["// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// POINT-COLUMN ROLE RESOLUTION \u2014 which column is the city, the state, the ZIP\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// geoPoint.ts answers \"given a city/state/zip, WHERE is this row?\". This module answers\n// the question that comes first: \"which COLUMN is the city, and which is the state?\".\n//\n// That used to be answered by the model: the codegen response names pointCityColumn /\n// pointStateColumn / pointZipColumn and the host geocoded from whatever it was handed.\n// A production North America point map showed why that is not sufficient. The model was\n// City{distinct=23}, StateCode{distinct=16}, Country{distinct=4}, <2 measures>\n// and answered `{\"city\":\"City\"}` \u2014 no state. Geocoding then ran city-only, so the\n// City+State tier never engaged, the \"state contradicts city\" guard never had a state\n// to check, and 8 of 32 marks were placed by the largest-match tie-break on a bare\n// name (\"Burlington\" -> Burlington ONTARIO, not Vermont) with the map presenting them\n// as ordinary points. Nothing was broken; a field was simply left blank.\n//\n// These roles are DETERMINISTICALLY RESOLVABLE from the values, and every classifier\n// needed already exists in geoPoint.ts. So the model's answer is treated as a HINT that\n// gets VERIFIED, and any role it omitted is BACKFILLED from the data. A hint is still\n// useful \u2014 it disambiguates which of two plausible columns was intended \u2014 but it is\n// never the only thing standing between the user and a wrong coordinate.\n//\n// THE COUNTRY TRAP this also closes. `resolveAdmin1(\"CA\")` is CALIFORNIA. Measured\n// across 15 country identifiers (\"US\" \"USA\" \"United States\" \"CAN\" \"Canada\" \"MX\" \"MEX\"\n// \"Mexico\" \u2026) that is the ONLY collision \u2014 but it is a catastrophic one: a Country\n// column bound into the state slot makes every Canadian city fail to match inside\n// California and fall back to the California centroid, piling Mississauga, Montr\u00E9al,\n// Burnaby and Laval onto one dot outside Bakersfield. \"Canada, inside the USA.\"\n//\n// It cannot be fixed the way the sibling \"Mexico\" collision was (geoPoint.ts drops the\n// bare admin1 NAME \"mexico\" because the country reading dominates and the State of\n// M\u00E9xico is obscure). For \"CA\" the California reading is overwhelmingly the common one\n// in real US data, so deleting the key would break far more than it fixes. The fix has\n// to be CONTEXTUAL, which is exactly what a column-level pass can do and a row-level\n// lookup cannot: judge the column by ALL its values at once.\n\nimport { normalizePlaceName, resolveAdmin1, isKnownCity, zipPrefixCandidates } from \"./geoPoint\";\n\n/** The place parts a coordinate can be resolved from. Any subset. */\nexport type PointBind = {\n city?: string;\n state?: string;\n zip?: string;\n lat?: string;\n lon?: string;\n /** Narrows a city name to the row's own country. Never inferred from a value in\n * another slot \u2014 see the \"CA\" note above. */\n country?: string;\n};\n\nexport type PointRoleResolution = {\n /** The binding to geocode with: hint, minus anything refused, plus anything backfilled. */\n bind: PointBind | null;\n /** Roles the hint omitted that were resolved from the data (\"state=StateCode\"). */\n backfilled: string[];\n /** Roles the hint named that were REFUSED, with why (\"state=Country (country column)\"). */\n refused: string[];\n};\n\n// Share of DISTINCT values a column must match before a role is claimed for it. Mirrors\n// geoDetector's THRESHOLD_PCT: high enough that a column of something else cannot claim\n// a role by accident, loose enough to tolerate the blanks and typos real data carries.\nconst THRESHOLD_PCT = 85;\n// A role BACKFILLED from the data (no hint) additionally needs this many distinct\n// matches \u2014 geoDetector's roster guard. One matching value is a coincidence, not a\n// column: a lone \"CA\" is far likelier to be Canada than a single-state California table.\nconst MIN_DISTINCT_BACKFILL = 2;\n// ZIP is held to a HIGHER bar than the name roles, because its classifier is pure digit\n// shape and measures are digits too: a Revenue column carrying 54300 / 48900 / 33700\n// reads as a perfectly good run of 5-digit ZIPs. Callers are expected to keep measures\n// out of the candidate list, but that is one `isMeasure` flag away from failing open, and\n// a measure silently adopted as the ZIP column would relocate every point on the map. A\n// real ZIP column is ALL ZIPs, so demand exactly that.\nconst ZIP_THRESHOLD_PCT = 100;\n// Classification reads DISTINCT values, so a wide column costs no more than a narrow\n// one; this only bounds a pathological all-unique text column.\nconst MAX_DISTINCT_SCAN = 400;\n\n// Country identifiers, normalized. Deliberately NOT a general ISO table: this exists\n// only to break the one measured admin1 collision, and a column of countries is\n// recognized by ALL its values being country identifiers, not by any single one.\nconst COUNTRY_IDS = new Set([\n \"us\", \"usa\", \"u s\", \"u s a\", \"united states\", \"united states of america\", \"america\",\n \"ca\", \"can\", \"canada\",\n \"mx\", \"mex\", \"mexico\", \"estados unidos mexicanos\",\n]);\n\n/** Distinct, normalized, non-blank values of a column (capped). */\nfunction distinctNormalized(values: Array<unknown>): string[] {\n const seen = new Set<string>();\n for (const v of values) {\n if (v === null || v === undefined) continue;\n const k = normalizePlaceName(String(v));\n if (!k) continue;\n if (!seen.has(k)) {\n seen.add(k);\n if (seen.size >= MAX_DISTINCT_SCAN) break;\n }\n }\n return Array.from(seen);\n}\n\n/**\n * Is this column a list of COUNTRIES?\n *\n * Every distinct value must be a country identifier, AND at least one of them must be\n * UNAMBIGUOUS \u2014 a country identifier that is not also a state/province code.\n *\n * That second condition is not fussiness, it is the whole correctness of this function\n * under CROSS-FILTERING. Roles are re-resolved against whatever rows survive a filter, and\n * \"CA\" is the one token that is both a country (Canada) and an admin1 (California). Filter\n * a US table down to a single Californian row and its StateCode column becomes exactly\n * {\"CA\"} \u2014 trivially \"all country identifiers\". Without this condition that column is\n * adopted as the COUNTRY role, every city is then narrowed to Canada, nothing matches, and\n * the map goes BLANK on a single click. Observed on the real point map, 2026-07-26.\n *\n * So: {US, CA, MX} is a country column (US and MX are unambiguous), {Canada, Mexico} is a\n * country column, {CA, TX} is a US state column containing California, and {CA} ALONE is\n * not enough evidence for anything \u2014 which is the honest answer, because it genuinely is\n * not enough evidence.\n */\nexport function looksLikeCountryColumn(values: Array<unknown>): boolean {\n const d = distinctNormalized(values);\n if (d.length === 0) return false;\n if (!d.every(v => COUNTRY_IDS.has(v))) return false;\n return d.some(v => !resolveAdmin1(v));\n}\n\n/** A token that is BOTH a country identifier and a state/province code \u2014 today only \"CA\"\n * (Canada vs California). Such a value can never, on its own, decide a column's role. */\nfunction isAmbiguousCountryState(normalized: string): boolean {\n return COUNTRY_IDS.has(normalized) && !!resolveAdmin1(normalized);\n}\n\n/** Share of DISTINCT values that resolve to a state/province, 0..100 (one decimal). */\nexport function admin1MatchPct(values: Array<unknown>): number {\n const d = distinctNormalized(values);\n if (d.length === 0) return 0;\n let n = 0;\n for (const v of d) if (resolveAdmin1(v)) n++;\n return Math.round((n / d.length) * 1000) / 10;\n}\n\n/** Distinct RAW (trimmed) values \u2014 for ZIPs, which normalizePlaceName would mangle:\n * it rewrites punctuation to spaces, turning \"90210-1234\" into \"90210 1234\", which\n * zipPrefixCandidates' ZIP+4 pattern then rejects. */\nfunction distinctRaw(values: Array<unknown>): string[] {\n const seen = new Set<string>();\n for (const v of values) {\n if (v === null || v === undefined) continue;\n const s = String(v).trim();\n if (!s) continue;\n if (!seen.has(s)) {\n seen.add(s);\n if (seen.size >= MAX_DISTINCT_SCAN) break;\n }\n }\n return Array.from(seen);\n}\n\n/** Share of DISTINCT values that read as a ZIP / ZIP-prefix, 0..100 (one decimal). */\nexport function zipMatchPct(values: Array<unknown>): number {\n const d = distinctRaw(values);\n if (d.length === 0) return 0;\n let n = 0;\n for (const v of d) if (zipPrefixCandidates(v).length > 0) n++;\n return Math.round((n / d.length) * 1000) / 10;\n}\n\n/** Share of DISTINCT values that are known city names, 0..100 (one decimal). */\nfunction cityPct(values: Array<unknown>): number {\n const d = distinctNormalized(values);\n if (d.length === 0) return 0;\n let n = 0;\n for (const v of d) if (isKnownCity(v)) n++;\n return Math.round((n / d.length) * 1000) / 10;\n}\n\nfunction distinctMatches(values: Array<unknown>, pred: (v: string) => boolean): number {\n let n = 0;\n for (const v of distinctNormalized(values)) if (pred(v)) n++;\n return n;\n}\n\n/** distinctMatches over RAW values (ZIP only \u2014 see distinctRaw). */\nfunction distinctRawMatches(values: Array<unknown>, pred: (v: string) => boolean): number {\n let n = 0;\n for (const v of distinctRaw(values)) if (pred(v)) n++;\n return n;\n}\n\n/**\n * Verify the hinted point-column roles against the data and fill in what the hint left\n * out. Pure: `columns` are the available column names, `rows` the row objects keyed by\n * those names, `hint` whatever the codegen response named (may be null).\n *\n * `columns` MUST exclude measures. A place is a dimension; a measure that wandered into\n * this list can be adopted as the ZIP column on digit shape alone (see ZIP_THRESHOLD_PCT)\n * and would move every point on the map.\n *\n * A role is only ever REFUSED for a positive reason (the column is countries; the column\n * does not look like states at all) \u2014 never merely because the classifier is unsure. And\n * a refusal drops that ONE role, leaving the rest of the binding intact, because\n * geocoding from city alone still beats geocoding from nothing.\n */\nexport function resolvePointRoles(\n columns: string[],\n rows: Array<Record<string, any>>,\n hint: PointBind | null,\n): PointRoleResolution {\n const backfilled: string[] = [];\n const refused: string[] = [];\n const out: PointBind = {};\n const colSet = new Set(columns);\n const valuesOf = (name: string) => rows.map(r => r[name]);\n\n // ---- 1. Carry over the hint, VERIFYING the two roles that can be catastrophically\n // wrong. city/lat/lon are carried as given: a mis-hinted city degrades to \"no match\"\n // (a visible off-map count), whereas a mis-hinted STATE actively relocates points.\n for (const role of [\"city\", \"zip\", \"lat\", \"lon\", \"country\"] as const) {\n const name = hint?.[role];\n if (name && colSet.has(name)) out[role] = name;\n }\n const hintedState = hint?.state;\n if (hintedState && colSet.has(hintedState)) {\n const vals = valuesOf(hintedState);\n const dvals = distinctNormalized(vals);\n if (dvals.length > 0 && dvals.every(isAmbiguousCountryState)) {\n // Everything in this column is the Canada/California token and nothing else.\n // It is genuinely undecidable, so decide nothing: refuse it as a state (using it\n // would place Canadian cities in California) and do NOT promote it to country\n // (that would place Californian cities in Canada). Falling back to city-only\n // still resolves, which is the one outcome that cannot be badly wrong.\n refused.push(`state=${hintedState} (every value is \"CA\", which is both Canada and California)`);\n } else if (looksLikeCountryColumn(vals)) {\n // The \"CA\" trap. Every value is a country, so this is a country column that\n // landed in the state slot. Using it would resolve \"CA\" to California and\n // drag a whole country's cities into one US state.\n //\n // Having identified what the column actually IS, put it to work rather than\n // discarding it: as the COUNTRY role it narrows city matching to the right\n // country, which is most of the value the state would have provided.\n refused.push(`state=${hintedState} (every value is a country, not a state)`);\n if (!out.country) out.country = hintedState;\n } else if (admin1MatchPct(vals) < THRESHOLD_PCT) {\n refused.push(`state=${hintedState} (only ${admin1MatchPct(vals)}% of values are states/provinces)`);\n } else {\n out.state = hintedState;\n }\n }\n\n // ---- 2. Backfill the roles nothing supplied. This is the real-world fix: the model\n // named only the city, so the state column sat unused beside it.\n const taken = new Set(Object.values(out).filter(Boolean) as string[]);\n const candidates = columns.filter(c => !taken.has(c) && !c.startsWith(\"__\"));\n\n if (!out.state) {\n let best: { name: string; pct: number } | null = null;\n for (const c of candidates) {\n const vals = valuesOf(c);\n if (looksLikeCountryColumn(vals)) continue; // never a state\n const pct = admin1MatchPct(vals);\n if (pct < THRESHOLD_PCT) continue;\n // The roster guard, relaxed for UNAMBIGUOUS evidence. A cross-filter can shrink\n // any column to one distinct value, and demanding two flatly would drop the\n // state role on every single-row subset \u2014 degrading precision for no reason. One\n // \"TX\" is proof enough; one \"CA\" is not, because it is equally Canada.\n const hits = distinctMatches(vals, v => !!resolveAdmin1(v));\n const unambiguous = distinctMatches(vals, v => !!resolveAdmin1(v) && !isAmbiguousCountryState(v));\n if (hits < MIN_DISTINCT_BACKFILL && unambiguous < 1) continue;\n if (!best || pct > best.pct) best = { name: c, pct };\n }\n if (best) {\n out.state = best.name;\n taken.add(best.name);\n backfilled.push(`state=${best.name} (${best.pct}% states/provinces)`);\n }\n }\n\n if (!out.zip) {\n for (const c of candidates) {\n if (taken.has(c)) continue;\n const vals = valuesOf(c);\n const pct = zipMatchPct(vals);\n if (pct < ZIP_THRESHOLD_PCT) continue;\n if (distinctRawMatches(vals, v => zipPrefixCandidates(v).length > 0) < MIN_DISTINCT_BACKFILL) continue;\n out.zip = c;\n taken.add(c);\n backfilled.push(`zip=${c} (${pct}% ZIP codes)`);\n break;\n }\n }\n\n // COUNTRY narrows city matching to the row's own country, which is what keeps a bare\n // \"Burlington\" on a US row out of Ontario. Backfilled last among the narrowing roles\n // and only from an unambiguous all-country column, because a wrong country is worse\n // than none: it would filter every candidate away and drop the row to a coarser tier.\n if (!out.country) {\n for (const c of candidates) {\n if (taken.has(c)) continue;\n if (!looksLikeCountryColumn(valuesOf(c))) continue;\n out.country = c;\n taken.add(c);\n backfilled.push(`country=${c}`);\n break;\n }\n }\n\n if (!out.city) {\n let best: { name: string; pct: number } | null = null;\n for (const c of candidates) {\n if (taken.has(c)) continue;\n const vals = valuesOf(c);\n const pct = cityPct(vals);\n if (pct < THRESHOLD_PCT) continue;\n if (distinctMatches(vals, v => isKnownCity(v)) < MIN_DISTINCT_BACKFILL) continue;\n if (!best || pct > best.pct) best = { name: c, pct };\n }\n if (best) {\n out.city = best.name;\n backfilled.push(`city=${best.name} (${best.pct}% known cities)`);\n }\n }\n\n // country ALONE is not a placeable binding \u2014 it only narrows the other tiers \u2014 so it\n // deliberately does not count toward \"we can geocode something\".\n const any = !!(out.city || out.state || out.zip || (out.lat && out.lon));\n return { bind: any ? out : null, backfilled, refused };\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
package/dist/util.mjs.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }