doxa-maps/library/data
doxa-maps-88655c70 9b9f2765b4 Regions: one rollup, ported from theirs, instead of two copies
summarizeRegions() was duplicated in regions-list.vue and
region-dashboards.vue — two copies of the same rollup, so two chances
for the region page and the dashboard to disagree about one number.
Both now import a port of DX-life's config/countries-meta.ts, placed in
library/ because it has two named consumers.

Ported verbatim: slugify's replace chain, FULL_PRAYER_COVERAGE_COUNT,
addToStats's conditions, fitView's constants, lngExtent's largest-gap
walk, WORLD_VIEW, both sort orders. Changed only: TypeScript to JS
(interfaces to JSDoc), and their `import { COUNTRIES } from
'../app/utils/countries'` becomes library/data/countries.json — their
same 242-entry {value,label} array, in their order. toNumber and
emptyStats are exported beyond their surface, and only those two: their
pages need no cross-region total because DX-life has no "all regions"
view, and ours does for the no-selection chooser.

Two things the copies had wrong, both fixed by porting rather than
patching:

- They slugged a country from the API's LOCALIZED label. Theirs slugs
  from the canonical English name, deliberately. The live site settled
  it: /regions/the-united-states is 200 and /regions/united-states is
  404; /regions/the-democratic-republic-of-the-congo is 200 and
  /regions/dr-congo is 404. Since the dashboard writes the slug into
  the URL hash, our deep links pointed at pages that do not exist
  there.

- They dropped centre/zoom/bounds entirely, so our maps derived their
  own frame. Theirs computes a fit view per country and per region,
  including the antimeridian: Oceania's bounds come out east 187.9,
  where a naive max() says 178 and spans the globe backwards.

Also fixed regions-list.vue's formatNumber, still hardcoded en-US after
the same fix landed in region-dashboards.vue, and its region sort, which
used (a.label || 'Other') where theirs compares a.label directly.

Proof: region-vs-live 73/73 and country-vs-live 28/28 UNCHANGED — the
rollup is equivalent. New _probe-countries-meta.mjs is 20/20 and
includes a negative test showing the antimeridian assertion really
discriminates. oceania-and-list, regions-swap, standalone-app,
dashboard, total and search all green. 159 lines of duplication gone.
2026-09-24 04:01:34 +00:00
..
countries.json Regions: one rollup, ported from theirs, instead of two copies 2026-09-24 04:01:34 +00:00
iso-numeric-to-alpha2.json doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
langFamilyByIso.json doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
langFamilyByLanguage.json doxa-maps — portable bundler for embeddable JAMstack maps 2026-09-10 01:53:07 +00:00
README.md docs: simplify all folder READMEs (what's here + graphic + link); migrate complex reference to docs/architecture/{data-sources,i18n,components,app-wrappers,poster-generation}.md 2026-09-11 18:50:31 +00:00

library/data/ — static lookup tables

Small JSON tables inlined into any bundle that imports them (eager JSON imports, no runtime fetch). Import as @map/data/<file>.json.

  • langFamilyByLanguage.json — language label → family ("Telugu": "Dravidian"). Derives languageFamily when the API returns null for imb_language_family. English labels only.
  • langFamilyByIso.json — ISO 639-3 code → family ("afr": "Indo-European"). Used first, because the API localizes language labels but primary_language.value (the ISO code) is stable across locales. Generated by joining langFamilyByLanguage.json onto EN API rows by ISO code; there is no regeneration script — re-run that join against a fresh EN pull if the language set changes.
  • iso-numeric-to-alpha2.json — ISO 3166-1 numeric → alpha-2 ("840": "US"). For joining numeric-keyed geodata (world-atlas TopoJSON) to alpha-2 records. No code consumers yet — kept as a ready lookup.

Consumers of the language tables: composables/useMapData.js, useDoxaSearch.js, useMapLayers.js, legends/useLanguageFamilyLegendData.js.