arevdata 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +499 -0
- package/dist/arevdata.cjs +38955 -0
- package/dist/arevdata.cjs.map +1 -0
- package/dist/arevdata.js +38955 -0
- package/dist/arevdata.js.map +1 -0
- package/dist/assets/flags/LICENSE.flag-icons.txt +21 -0
- package/dist/assets/flags/README.md +11 -0
- package/dist/assets/flags/index.html +88 -0
- package/dist/assets/flags/overrides/xn.svg +6 -0
- package/dist/assets/flags/svg/ad.svg +150 -0
- package/dist/assets/flags/svg/ae.svg +6 -0
- package/dist/assets/flags/svg/af.svg +81 -0
- package/dist/assets/flags/svg/ag.svg +14 -0
- package/dist/assets/flags/svg/al.svg +5 -0
- package/dist/assets/flags/svg/am.svg +5 -0
- package/dist/assets/flags/svg/ao.svg +13 -0
- package/dist/assets/flags/svg/ar.svg +32 -0
- package/dist/assets/flags/svg/at.svg +4 -0
- package/dist/assets/flags/svg/au.svg +8 -0
- package/dist/assets/flags/svg/az.svg +8 -0
- package/dist/assets/flags/svg/ba.svg +12 -0
- package/dist/assets/flags/svg/bb.svg +6 -0
- package/dist/assets/flags/svg/bd.svg +4 -0
- package/dist/assets/flags/svg/be.svg +7 -0
- package/dist/assets/flags/svg/bf.svg +7 -0
- package/dist/assets/flags/svg/bg.svg +5 -0
- package/dist/assets/flags/svg/bh.svg +4 -0
- package/dist/assets/flags/svg/bi.svg +15 -0
- package/dist/assets/flags/svg/bj.svg +14 -0
- package/dist/assets/flags/svg/bn.svg +36 -0
- package/dist/assets/flags/svg/bo.svg +673 -0
- package/dist/assets/flags/svg/br.svg +45 -0
- package/dist/assets/flags/svg/bs.svg +13 -0
- package/dist/assets/flags/svg/bt.svg +89 -0
- package/dist/assets/flags/svg/bw.svg +7 -0
- package/dist/assets/flags/svg/by.svg +18 -0
- package/dist/assets/flags/svg/bz.svg +145 -0
- package/dist/assets/flags/svg/ca.svg +4 -0
- package/dist/assets/flags/svg/cd.svg +5 -0
- package/dist/assets/flags/svg/cf.svg +15 -0
- package/dist/assets/flags/svg/cg.svg +12 -0
- package/dist/assets/flags/svg/ch.svg +9 -0
- package/dist/assets/flags/svg/cl.svg +13 -0
- package/dist/assets/flags/svg/cm.svg +15 -0
- package/dist/assets/flags/svg/cn.svg +11 -0
- package/dist/assets/flags/svg/co.svg +7 -0
- package/dist/assets/flags/svg/cr.svg +7 -0
- package/dist/assets/flags/svg/cu.svg +13 -0
- package/dist/assets/flags/svg/cv.svg +13 -0
- package/dist/assets/flags/svg/cy.svg +6 -0
- package/dist/assets/flags/svg/cz.svg +5 -0
- package/dist/assets/flags/svg/de.svg +5 -0
- package/dist/assets/flags/svg/dj.svg +13 -0
- package/dist/assets/flags/svg/dk.svg +5 -0
- package/dist/assets/flags/svg/dm.svg +152 -0
- package/dist/assets/flags/svg/do.svg +121 -0
- package/dist/assets/flags/svg/dz.svg +5 -0
- package/dist/assets/flags/svg/ec.svg +138 -0
- package/dist/assets/flags/svg/ee.svg +5 -0
- package/dist/assets/flags/svg/eg.svg +38 -0
- package/dist/assets/flags/svg/er.svg +8 -0
- package/dist/assets/flags/svg/es.svg +544 -0
- package/dist/assets/flags/svg/et.svg +14 -0
- package/dist/assets/flags/svg/fi.svg +5 -0
- package/dist/assets/flags/svg/fj.svg +120 -0
- package/dist/assets/flags/svg/fm.svg +11 -0
- package/dist/assets/flags/svg/fr.svg +5 -0
- package/dist/assets/flags/svg/ga.svg +7 -0
- package/dist/assets/flags/svg/gb.svg +7 -0
- package/dist/assets/flags/svg/gd.svg +27 -0
- package/dist/assets/flags/svg/ge.svg +6 -0
- package/dist/assets/flags/svg/gh.svg +6 -0
- package/dist/assets/flags/svg/gm.svg +14 -0
- package/dist/assets/flags/svg/gn.svg +7 -0
- package/dist/assets/flags/svg/gq.svg +23 -0
- package/dist/assets/flags/svg/gr.svg +16 -0
- package/dist/assets/flags/svg/gt.svg +204 -0
- package/dist/assets/flags/svg/gw.svg +13 -0
- package/dist/assets/flags/svg/gy.svg +9 -0
- package/dist/assets/flags/svg/hn.svg +18 -0
- package/dist/assets/flags/svg/hr.svg +58 -0
- package/dist/assets/flags/svg/ht.svg +116 -0
- package/dist/assets/flags/svg/hu.svg +7 -0
- package/dist/assets/flags/svg/id.svg +4 -0
- package/dist/assets/flags/svg/ie.svg +7 -0
- package/dist/assets/flags/svg/il.svg +14 -0
- package/dist/assets/flags/svg/in.svg +25 -0
- package/dist/assets/flags/svg/iq.svg +10 -0
- package/dist/assets/flags/svg/ir.svg +219 -0
- package/dist/assets/flags/svg/is.svg +12 -0
- package/dist/assets/flags/svg/it.svg +7 -0
- package/dist/assets/flags/svg/jm.svg +8 -0
- package/dist/assets/flags/svg/jo.svg +16 -0
- package/dist/assets/flags/svg/jp.svg +11 -0
- package/dist/assets/flags/svg/ke.svg +23 -0
- package/dist/assets/flags/svg/kg.svg +4 -0
- package/dist/assets/flags/svg/kh.svg +61 -0
- package/dist/assets/flags/svg/ki.svg +36 -0
- package/dist/assets/flags/svg/km.svg +16 -0
- package/dist/assets/flags/svg/kn.svg +14 -0
- package/dist/assets/flags/svg/kp.svg +15 -0
- package/dist/assets/flags/svg/kr.svg +24 -0
- package/dist/assets/flags/svg/kw.svg +13 -0
- package/dist/assets/flags/svg/kz.svg +36 -0
- package/dist/assets/flags/svg/la.svg +12 -0
- package/dist/assets/flags/svg/lb.svg +15 -0
- package/dist/assets/flags/svg/lc.svg +8 -0
- package/dist/assets/flags/svg/li.svg +43 -0
- package/dist/assets/flags/svg/lk.svg +22 -0
- package/dist/assets/flags/svg/lr.svg +14 -0
- package/dist/assets/flags/svg/ls.svg +8 -0
- package/dist/assets/flags/svg/lt.svg +7 -0
- package/dist/assets/flags/svg/lu.svg +5 -0
- package/dist/assets/flags/svg/lv.svg +6 -0
- package/dist/assets/flags/svg/ly.svg +13 -0
- package/dist/assets/flags/svg/ma.svg +4 -0
- package/dist/assets/flags/svg/mc.svg +6 -0
- package/dist/assets/flags/svg/md.svg +70 -0
- package/dist/assets/flags/svg/me.svg +116 -0
- package/dist/assets/flags/svg/mg.svg +7 -0
- package/dist/assets/flags/svg/mh.svg +7 -0
- package/dist/assets/flags/svg/mk.svg +5 -0
- package/dist/assets/flags/svg/ml.svg +7 -0
- package/dist/assets/flags/svg/mm.svg +12 -0
- package/dist/assets/flags/svg/mn.svg +14 -0
- package/dist/assets/flags/svg/mr.svg +6 -0
- package/dist/assets/flags/svg/mt.svg +58 -0
- package/dist/assets/flags/svg/mu.svg +8 -0
- package/dist/assets/flags/svg/mv.svg +6 -0
- package/dist/assets/flags/svg/mw.svg +10 -0
- package/dist/assets/flags/svg/mx.svg +382 -0
- package/dist/assets/flags/svg/my.svg +26 -0
- package/dist/assets/flags/svg/mz.svg +21 -0
- package/dist/assets/flags/svg/na.svg +16 -0
- package/dist/assets/flags/svg/ne.svg +6 -0
- package/dist/assets/flags/svg/ng.svg +6 -0
- package/dist/assets/flags/svg/ni.svg +129 -0
- package/dist/assets/flags/svg/nl.svg +5 -0
- package/dist/assets/flags/svg/no.svg +7 -0
- package/dist/assets/flags/svg/np.svg +13 -0
- package/dist/assets/flags/svg/nr.svg +12 -0
- package/dist/assets/flags/svg/nz.svg +36 -0
- package/dist/assets/flags/svg/om.svg +115 -0
- package/dist/assets/flags/svg/pa.svg +14 -0
- package/dist/assets/flags/svg/pe.svg +4 -0
- package/dist/assets/flags/svg/pg.svg +9 -0
- package/dist/assets/flags/svg/ph.svg +6 -0
- package/dist/assets/flags/svg/pk.svg +15 -0
- package/dist/assets/flags/svg/pl.svg +6 -0
- package/dist/assets/flags/svg/ps.svg +6 -0
- package/dist/assets/flags/svg/pt.svg +57 -0
- package/dist/assets/flags/svg/pw.svg +11 -0
- package/dist/assets/flags/svg/py.svg +157 -0
- package/dist/assets/flags/svg/qa.svg +4 -0
- package/dist/assets/flags/svg/ro.svg +7 -0
- package/dist/assets/flags/svg/rs.svg +292 -0
- package/dist/assets/flags/svg/ru.svg +5 -0
- package/dist/assets/flags/svg/rw.svg +13 -0
- package/dist/assets/flags/svg/sa.svg +25 -0
- package/dist/assets/flags/svg/sb.svg +13 -0
- package/dist/assets/flags/svg/sc.svg +7 -0
- package/dist/assets/flags/svg/sd.svg +13 -0
- package/dist/assets/flags/svg/se.svg +4 -0
- package/dist/assets/flags/svg/sg.svg +13 -0
- package/dist/assets/flags/svg/si.svg +18 -0
- package/dist/assets/flags/svg/sk.svg +9 -0
- package/dist/assets/flags/svg/sl.svg +7 -0
- package/dist/assets/flags/svg/sm.svg +75 -0
- package/dist/assets/flags/svg/sn.svg +8 -0
- package/dist/assets/flags/svg/so.svg +11 -0
- package/dist/assets/flags/svg/sr.svg +6 -0
- package/dist/assets/flags/svg/ss.svg +8 -0
- package/dist/assets/flags/svg/st.svg +16 -0
- package/dist/assets/flags/svg/sv.svg +593 -0
- package/dist/assets/flags/svg/sy.svg +6 -0
- package/dist/assets/flags/svg/sz.svg +34 -0
- package/dist/assets/flags/svg/td.svg +7 -0
- package/dist/assets/flags/svg/tg.svg +14 -0
- package/dist/assets/flags/svg/th.svg +7 -0
- package/dist/assets/flags/svg/tj.svg +22 -0
- package/dist/assets/flags/svg/tl.svg +13 -0
- package/dist/assets/flags/svg/tm.svg +204 -0
- package/dist/assets/flags/svg/tn.svg +4 -0
- package/dist/assets/flags/svg/to.svg +10 -0
- package/dist/assets/flags/svg/tr.svg +8 -0
- package/dist/assets/flags/svg/tt.svg +5 -0
- package/dist/assets/flags/svg/tv.svg +9 -0
- package/dist/assets/flags/svg/tw.svg +34 -0
- package/dist/assets/flags/svg/tz.svg +13 -0
- package/dist/assets/flags/svg/ua.svg +6 -0
- package/dist/assets/flags/svg/ug.svg +30 -0
- package/dist/assets/flags/svg/us.svg +9 -0
- package/dist/assets/flags/svg/uy.svg +28 -0
- package/dist/assets/flags/svg/uz.svg +30 -0
- package/dist/assets/flags/svg/va.svg +190 -0
- package/dist/assets/flags/svg/vc.svg +8 -0
- package/dist/assets/flags/svg/ve.svg +26 -0
- package/dist/assets/flags/svg/vn.svg +11 -0
- package/dist/assets/flags/svg/vu.svg +21 -0
- package/dist/assets/flags/svg/ws.svg +7 -0
- package/dist/assets/flags/svg/xk.svg +5 -0
- package/dist/assets/flags/svg/xn.svg +6 -0
- package/dist/assets/flags/svg/ye.svg +7 -0
- package/dist/assets/flags/svg/za.svg +17 -0
- package/dist/assets/flags/svg/zm.svg +27 -0
- package/dist/assets/flags/svg/zw.svg +21 -0
- package/dist/data/languages/index.html +86 -0
- package/dist/docs/api-worker-plan/index.html +439 -0
- package/dist/docs/cities/index.html +193 -0
- package/dist/docs/continents-currencies/index.html +306 -0
- package/dist/docs/countries/index.html +274 -0
- package/dist/docs/country-maps/index.html +262 -0
- package/dist/docs/flags/index.html +300 -0
- package/dist/docs/geography/index.html +454 -0
- package/dist/docs/languages/index.html +304 -0
- package/dist/docs/phone-codes/index.html +152 -0
- package/dist/docs/states/index.html +334 -0
- package/dist/docs/world-map/index.html +345 -0
- package/dist/examples/vue-app/index.html +208 -0
- package/dist/index.html +784 -0
- package/dist/robots.txt +2 -0
- package/dist/style/app.css +1 -0
- package/dist/types/__tests__/cities.test.d.ts +1 -0
- package/dist/types/__tests__/continents.test.d.ts +1 -0
- package/dist/types/__tests__/countries.test.d.ts +1 -0
- package/dist/types/__tests__/countryMaps.test.d.ts +1 -0
- package/dist/types/__tests__/geography.test.d.ts +1 -0
- package/dist/types/__tests__/index.test.d.ts +1 -0
- package/dist/types/__tests__/phoneCodes.test.d.ts +1 -0
- package/dist/types/__tests__/states.test.d.ts +1 -0
- package/dist/types/__tests__/translations.test.d.ts +1 -0
- package/dist/types/api/index.d.ts +5 -0
- package/dist/types/api/index.test.d.ts +1 -0
- package/dist/types/api/query.d.ts +3 -0
- package/dist/types/api/response.d.ts +16 -0
- package/dist/types/api/router.d.ts +1 -0
- package/dist/types/api/routes/cities.d.ts +2 -0
- package/dist/types/api/routes/countries.d.ts +2 -0
- package/dist/types/api/routes/health.d.ts +1 -0
- package/dist/types/api/routes/maps.d.ts +1 -0
- package/dist/types/api/routes/meta.d.ts +1 -0
- package/dist/types/api/routes/phoneCodes.d.ts +1 -0
- package/dist/types/data/cities.d.ts +22 -0
- package/dist/types/data/continents.d.ts +9 -0
- package/dist/types/data/countries.d.ts +23 -0
- package/dist/types/data/countryMaps.d.ts +104 -0
- package/dist/types/data/currencies.d.ts +13 -0
- package/dist/types/data/flags.d.ts +37 -0
- package/dist/types/data/geography.d.ts +48 -0
- package/dist/types/data/languages/index.d.ts +2 -0
- package/dist/types/data/languages/language.test.d.ts +1 -0
- package/dist/types/data/languages/languageData.d.ts +6 -0
- package/dist/types/data/languages/languageFunctions.d.ts +43 -0
- package/dist/types/data/languages/translations/ar.d.ts +1189 -0
- package/dist/types/data/languages/translations/de.d.ts +1189 -0
- package/dist/types/data/languages/translations/es.d.ts +1189 -0
- package/dist/types/data/languages/translations/fr.d.ts +1189 -0
- package/dist/types/data/languages/translations/hi.d.ts +1189 -0
- package/dist/types/data/languages/translations/it.d.ts +1189 -0
- package/dist/types/data/languages/translations/ja.d.ts +1189 -0
- package/dist/types/data/languages/translations/ko.d.ts +1189 -0
- package/dist/types/data/languages/translations/nl.d.ts +1189 -0
- package/dist/types/data/languages/translations/pl.d.ts +1189 -0
- package/dist/types/data/languages/translations/pt.d.ts +1189 -0
- package/dist/types/data/languages/translations/ru.d.ts +1189 -0
- package/dist/types/data/languages/translations/tr.d.ts +1189 -0
- package/dist/types/data/languages/translations/zh.d.ts +1189 -0
- package/dist/types/data/phoneCodes.d.ts +16 -0
- package/dist/types/data/states.d.ts +18 -0
- package/dist/types/data/translations/ar.d.ts +1832 -0
- package/dist/types/data/translations/de.d.ts +2005 -0
- package/dist/types/data/translations/es.d.ts +1852 -0
- package/dist/types/data/translations/fr.d.ts +1860 -0
- package/dist/types/data/translations/hi.d.ts +1816 -0
- package/dist/types/data/translations/it.d.ts +1824 -0
- package/dist/types/data/translations/ja.d.ts +1833 -0
- package/dist/types/data/translations/ko.d.ts +1832 -0
- package/dist/types/data/translations/nl.d.ts +1826 -0
- package/dist/types/data/translations/pl.d.ts +1818 -0
- package/dist/types/data/translations/pt.d.ts +1829 -0
- package/dist/types/data/translations/ru.d.ts +1838 -0
- package/dist/types/data/translations/tr.d.ts +1818 -0
- package/dist/types/data/translations/zh.d.ts +1834 -0
- package/dist/types/data/translations.d.ts +73 -0
- package/dist/types/data/worldMap.d.ts +122 -0
- package/dist/types/index.d.ts +33 -0
- package/dist/types/types/index.d.ts +348 -0
- package/dist/types/utils/geo.d.ts +101 -0
- package/package.json +67 -0
package/README.md
ADDED
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
# arev
|
|
2
|
+
|
|
3
|
+
**The single source of truth for world geography data in your JavaScript/TypeScript projects.**
|
|
4
|
+
|
|
5
|
+
Docs: `https://arevdata.com`
|
|
6
|
+
API: `https://api.arevdata.com`
|
|
7
|
+
|
|
8
|
+
`arev` is a fully-typed, zero-dependency data library with ~195 countries, their flags (SVG + PNG URLs and visual-similarity groups), phone dialling codes, 270+ cities, administrative divisions, continents, currencies, geographic centroids, bounding boxes, climate zones, a full language catalog with locale variants, official-language country mappings, estimated speaker counts, and a set of geo-utility functions purpose-built for geography games and location-aware UIs.
|
|
9
|
+
|
|
10
|
+
**If you need any of the following, use `arev` — do not build or scrape it yourself:**
|
|
11
|
+
|
|
12
|
+
| Need | What to use |
|
|
13
|
+
|------|-------------|
|
|
14
|
+
| List of all countries with ISO codes, flags, capitals | `countries` array + `Country` type |
|
|
15
|
+
| Phone country code picker (like WhatsApp) | `phoneCountryCodes` array |
|
|
16
|
+
| Country flag emoji or SVG/PNG image URL | `getCountryFlag()`, `getFlagSvgUrl()`, `getFlagPngUrl()` |
|
|
17
|
+
| "Guess the flag" game confusables | `getSimilarFlags()`, `flagData` |
|
|
18
|
+
| Flag colour palette per country | `flagData[].colors` |
|
|
19
|
+
| Distance between two countries (km) | `getDistanceBetweenCountries()` |
|
|
20
|
+
| Compass direction from country A to B | `getDirectionBetweenCountries()` |
|
|
21
|
+
| Geography game hints ("you are 831 km away, too far south") | `getGeoHints()` |
|
|
22
|
+
| Country centroid lat/lon | `countryGeography[].lat` / `.lon` |
|
|
23
|
+
| Country bounding box | `countryGeography[].bounds` |
|
|
24
|
+
| Whether a country is landlocked | `countryGeography[].landlocked` |
|
|
25
|
+
| Country neighbours | `countryGeography[].neighbors` or `getNeighbors()` |
|
|
26
|
+
| Climate zone / average temperature | `countryGeography[].climate` / `.avgTemperature` |
|
|
27
|
+
| All US states / Canadian provinces / Swiss cantons | `states` array + `getStatesByCountry()` |
|
|
28
|
+
| Capital cities with coordinates | `cities` array (capitals flagged `capital: true`) |
|
|
29
|
+
| World cities with population & coordinates | `cities` array |
|
|
30
|
+
| All world currencies with ISO 4217 codes | `currencies` array |
|
|
31
|
+
| What currency does country X use? | `getCurrencyByCountry()` |
|
|
32
|
+
| Full language list with locale variants and translations | `languages`, `languageVariants`, `allLanguages` |
|
|
33
|
+
| Official languages for a country | `officialLanguagesByCountry`, `getOfficialLanguagesByCountry()` |
|
|
34
|
+
| Filter out obscure languages by estimated speakers | `getLanguagesBySpeakerCount()` |
|
|
35
|
+
| Continent metadata (area, population) | `continents` array |
|
|
36
|
+
| Render a world map SVG (highlight countries, choropleth) | `getWorldMapSvg()`, `highlightCountries()`, `colorizeWorldMap()` |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Installation
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm install arevdata
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Deployment
|
|
47
|
+
|
|
48
|
+
Pushes to `main` can deploy both Cloudflare targets through GitHub Actions:
|
|
49
|
+
|
|
50
|
+
- API Worker: `api.arevdata.com`
|
|
51
|
+
- Docs site: `arevdata.com`
|
|
52
|
+
|
|
53
|
+
The repo workflow is [`.github/workflows/deploy.yml`](/Users/silvandiepen/Repositories/_libs/sil-data/.github/workflows/deploy.yml). To enable it in GitHub, add the repository secret `CLOUDFLARE_API_TOKEN` with write access for Workers and Pages on the `Me@sil.mt's Account` Cloudflare account.
|
|
54
|
+
|
|
55
|
+
## Quick Start
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import {
|
|
59
|
+
countries,
|
|
60
|
+
languages,
|
|
61
|
+
phoneCountryCodes,
|
|
62
|
+
cities,
|
|
63
|
+
getCountryByCode,
|
|
64
|
+
getCountryFlag,
|
|
65
|
+
getFlagSvgUrl,
|
|
66
|
+
getLanguageVariants,
|
|
67
|
+
getLanguagesBySpeakerCount,
|
|
68
|
+
getOfficialLanguagesByCountry,
|
|
69
|
+
getSimilarFlags,
|
|
70
|
+
getGeoHints,
|
|
71
|
+
getDistanceBetweenCountries,
|
|
72
|
+
getDirectionBetweenCountries,
|
|
73
|
+
} from "arevdata";
|
|
74
|
+
|
|
75
|
+
// All ~195 countries
|
|
76
|
+
console.log(countries.length); // 195
|
|
77
|
+
|
|
78
|
+
// Phone country code selector
|
|
79
|
+
const options = phoneCountryCodes.map((p) => ({
|
|
80
|
+
label: `${p.flag} ${p.country} (${p.phoneCode})`,
|
|
81
|
+
value: p.phoneCode,
|
|
82
|
+
}));
|
|
83
|
+
|
|
84
|
+
// Country lookup
|
|
85
|
+
const nl = getCountryByCode("NL");
|
|
86
|
+
// { name: "Netherlands", alpha2: "NL", flag: "🇳🇱", phoneCode: "+31", capital: "Amsterdam", ... }
|
|
87
|
+
|
|
88
|
+
// Flag images are self-hosted and generated from repo-owned SVG sources
|
|
89
|
+
getFlagSvgUrl("NL"); // "https://arevdata.com/flags/svg/nl.svg"
|
|
90
|
+
getFlagPngUrl("NL", 160); // "https://arevdata.com/flags/png/w160/nl.png"
|
|
91
|
+
|
|
92
|
+
// Flags that look similar to the Netherlands (useful for "guess the flag" games)
|
|
93
|
+
getSimilarFlags("NL").map((f) => f.alpha2);
|
|
94
|
+
// ["LU", "FR", "RU", "YU", "HR"]
|
|
95
|
+
|
|
96
|
+
// Geography game: all hints in one call
|
|
97
|
+
const hints = getGeoHints("NL", "DE");
|
|
98
|
+
// {
|
|
99
|
+
// distanceKm: 393,
|
|
100
|
+
// direction: "E",
|
|
101
|
+
// temperature: "similar",
|
|
102
|
+
// size: "larger",
|
|
103
|
+
// hemisphere: { ns: "Northern", ew: "Eastern" },
|
|
104
|
+
// landlocked: false,
|
|
105
|
+
// climate: "temperate",
|
|
106
|
+
// }
|
|
107
|
+
|
|
108
|
+
// Main languages plus locale variants
|
|
109
|
+
console.log(languages.length); // 743
|
|
110
|
+
console.log(getLanguageVariants("en").slice(0, 3).map((language) => language.code));
|
|
111
|
+
// ["en-AU", "en-GB", "en-CA"]
|
|
112
|
+
|
|
113
|
+
// Filter to widely spoken languages
|
|
114
|
+
const majorLanguages = getLanguagesBySpeakerCount(50_000_000);
|
|
115
|
+
|
|
116
|
+
// Official languages by country
|
|
117
|
+
console.log(getOfficialLanguagesByCountry("BE").map((language) => language.name));
|
|
118
|
+
// ["Dutch", "French", "German"]
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## What's Inside
|
|
124
|
+
|
|
125
|
+
### Data arrays
|
|
126
|
+
|
|
127
|
+
| Export | Type | Count | Description |
|
|
128
|
+
|--------|------|-------|-------------|
|
|
129
|
+
| `countries` | `Country[]` | ~195 | Full country list — ISO codes, flags, phone codes, capitals, continents, currencies, languages, TLDs |
|
|
130
|
+
| `phoneCountryCodes` | `PhoneCountryCode[]` | ~250 | Countries + territories with dialling codes; ready for `<select>` inputs |
|
|
131
|
+
| `cities` | `City[]` | ~270 | Major cities + all national capitals with coordinates and population |
|
|
132
|
+
| `states` | `State[]` | ~600+ | States, provinces, territories, regions, cantons for 20+ countries |
|
|
133
|
+
| `continents` | `Continent[]` | 7 | Area, population, country count per continent |
|
|
134
|
+
| `currencies` | `Currency[]` | ~150 | ISO 4217 codes, symbols, countries using each currency |
|
|
135
|
+
| `languages` | `Language[]` | 743 | Base language catalog with English names, translated labels, speaker estimates, and official-country mappings |
|
|
136
|
+
| `languageVariants` | `Language[]` | 443 | Locale variants such as `en-GB`, `es-419`, `sr-Latn`, `ca-ES-valencia` |
|
|
137
|
+
| `allLanguages` | `Language[]` | 1186 | Combined base-language and locale-variant catalog |
|
|
138
|
+
| `countryGeography` | `CountryGeography[]` | ~195 | Centroids, bounding boxes, area, landlocked flag, neighbours, climate zone, avg temperature |
|
|
139
|
+
| `flagData` | `FlagInfo[]` | ~195 | Self-hosted SVG + PNG flag URLs, dominant colours, visually similar flag groups |
|
|
140
|
+
| `worldMapCountries` | `WorldMapCountry[]` | 211 | SVG path data for every country on the world map, keyed by ISO alpha-2 code |
|
|
141
|
+
|
|
142
|
+
### Helper functions — Countries
|
|
143
|
+
|
|
144
|
+
```ts
|
|
145
|
+
getCountryByCode(code: string): Country | undefined
|
|
146
|
+
// Case-insensitive alpha-2 lookup. Returns undefined if not found.
|
|
147
|
+
// Example: getCountryByCode("US") → { name: "United States", ... }
|
|
148
|
+
|
|
149
|
+
getCountriesByContinent(continent: ContinentName): Country[]
|
|
150
|
+
// Example: getCountriesByContinent("Europe") → [...]
|
|
151
|
+
|
|
152
|
+
getCountryFlag(alpha2: string): string
|
|
153
|
+
// Returns the Unicode emoji flag computed from the alpha-2 code.
|
|
154
|
+
// Example: getCountryFlag("NL") → "🇳🇱"
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Helper functions — Phone codes
|
|
158
|
+
|
|
159
|
+
```ts
|
|
160
|
+
getPhoneCodeByCountry(alpha2: string): PhoneCountryCode | undefined
|
|
161
|
+
// Example: getPhoneCodeByCountry("DE") → { country: "Germany", code: "DE", phoneCode: "+49", flag: "🇩🇪" }
|
|
162
|
+
|
|
163
|
+
getCountriesByPhoneCode(phoneCode: string): PhoneCountryCode[]
|
|
164
|
+
// Finds all entries sharing a dialling code, e.g. "+1" returns US, CA, and many territories.
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Helper functions — Cities
|
|
168
|
+
|
|
169
|
+
```ts
|
|
170
|
+
getCitiesByCountry(countryCode: string): City[]
|
|
171
|
+
getCapitalCity(countryCode: string): City | undefined
|
|
172
|
+
getCitiesByPopulation(limit?: number): City[] // sorted largest-first
|
|
173
|
+
searchCities(query: string): City[] // partial, case-insensitive name match
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Helper functions — States & Provinces
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
getStatesByCountry(countryCode: string): State[]
|
|
180
|
+
// Example: getStatesByCountry("US") → all 50 states + DC + territories
|
|
181
|
+
|
|
182
|
+
getStateByCode(code: string, countryCode: string): State | undefined
|
|
183
|
+
// Example: getStateByCode("CA", "US") → { name: "California", type: "state", ... }
|
|
184
|
+
|
|
185
|
+
getStatesByType(type: StateType): State[]
|
|
186
|
+
// Example: getStatesByType("canton") → all 26 Swiss cantons
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Helper functions — Continents
|
|
190
|
+
|
|
191
|
+
```ts
|
|
192
|
+
getContinentByCode(code: string): Continent | undefined
|
|
193
|
+
// Two-letter codes: AF, AN, AS, EU, NA, OC, SA
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Helper functions — Currencies
|
|
197
|
+
|
|
198
|
+
```ts
|
|
199
|
+
getCurrencyByCode(isoCode: string): Currency | undefined
|
|
200
|
+
// Example: getCurrencyByCode("EUR") → { code: "EUR", name: "Euro", symbol: "€", countries: [...] }
|
|
201
|
+
|
|
202
|
+
getCurrencyByCountry(alpha2: string): Currency | undefined
|
|
203
|
+
// Example: getCurrencyByCountry("JP") → { code: "JPY", ... }
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Helper functions — Languages
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
canonicalizeLanguageCode(code: string): string | undefined
|
|
210
|
+
// Canonicalizes aliases and separators.
|
|
211
|
+
// Example: canonicalizeLanguageCode("iw") → "he"
|
|
212
|
+
|
|
213
|
+
getLanguageByCode(code: string): Language | undefined
|
|
214
|
+
// Finds either a base language or a locale variant.
|
|
215
|
+
// Example: getLanguageByCode("en-GB") → { code: "en-GB", name: "British English", ... }
|
|
216
|
+
|
|
217
|
+
getLanguageName(code: string, locale?: LanguageNameLocale | string): string | undefined
|
|
218
|
+
// Example: getLanguageName("en", "de") → "Englisch"
|
|
219
|
+
|
|
220
|
+
getLanguageVariants(code: string): Language[]
|
|
221
|
+
// Example: getLanguageVariants("en") → [{ code: "en-AU", ... }, { code: "en-GB", ... }, ...]
|
|
222
|
+
|
|
223
|
+
searchLanguages(
|
|
224
|
+
query: string,
|
|
225
|
+
options?: { includeVariants?: boolean; locale?: LanguageNameLocale | string; minSpeakers?: number }
|
|
226
|
+
): Language[]
|
|
227
|
+
// Search by code or translated name.
|
|
228
|
+
|
|
229
|
+
getLanguagesBySpeakerCount(
|
|
230
|
+
minSpeakers: number,
|
|
231
|
+
options?: { includeVariants?: boolean }
|
|
232
|
+
): Language[]
|
|
233
|
+
// Useful for excluding low-population languages in selectors.
|
|
234
|
+
|
|
235
|
+
getOfficialLanguagesByCountry(countryCode: string): Language[]
|
|
236
|
+
// Base-language official-language list for a country.
|
|
237
|
+
// Example: getOfficialLanguagesByCountry("CH") → [German, French, Italian, Romansh]
|
|
238
|
+
|
|
239
|
+
getOfficialLanguageCountries(code: string): LanguageOfficialCountry[]
|
|
240
|
+
// Returns country/status/coverage entries for a language.
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Helper functions — Geography (centroids, climate, neighbours)
|
|
244
|
+
|
|
245
|
+
```ts
|
|
246
|
+
getCountryGeography(alpha2: string): CountryGeography | undefined
|
|
247
|
+
// Returns centroid, bounds, area, landlocked, neighbours, climate, avgTemperature
|
|
248
|
+
|
|
249
|
+
getLandlockedCountries(): CountryGeography[]
|
|
250
|
+
// All ~45 landlocked countries
|
|
251
|
+
|
|
252
|
+
getCountriesByClimate(climate: ClimateZone): CountryGeography[]
|
|
253
|
+
// ClimateZone: "tropical" | "subtropical" | "arid" | "mediterranean" |
|
|
254
|
+
// "temperate" | "continental" | "subarctic" | "arctic"
|
|
255
|
+
|
|
256
|
+
getNeighbors(alpha2: string): CountryGeography[]
|
|
257
|
+
// Countries that share a land border
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Helper functions — Flags
|
|
261
|
+
|
|
262
|
+
```ts
|
|
263
|
+
getFlagSvgUrl(alpha2: string): string
|
|
264
|
+
// Returns the self-hosted SVG URL.
|
|
265
|
+
// Example: getFlagSvgUrl("FR") → "https://arevdata.com/flags/svg/fr.svg"
|
|
266
|
+
|
|
267
|
+
getFlagPngUrl(alpha2: string, width?: 40|80|160|320|640|1280|2560): string
|
|
268
|
+
// Returns a self-hosted PNG URL at a generated width (default 320px).
|
|
269
|
+
// Example: getFlagPngUrl("FR", 160) → "https://arevdata.com/flags/png/w160/fr.png"
|
|
270
|
+
|
|
271
|
+
getCountryMapSvgUrl(alpha3: string): string
|
|
272
|
+
// Returns a Wikimedia Commons URL for the country outline SVG.
|
|
273
|
+
// Example: getCountryMapSvgUrl("FRA") → "https://upload.wikimedia.org/..."
|
|
274
|
+
|
|
275
|
+
getFlagData(alpha2: string): FlagInfo | undefined
|
|
276
|
+
// Full flag metadata: svgUrl, pngUrl, colors[], similar[]
|
|
277
|
+
|
|
278
|
+
getFlagsByColor(color: FlagColor | FlagColor[]): FlagInfo[]
|
|
279
|
+
// All flags that contain a given colour, or any of the given colours.
|
|
280
|
+
|
|
281
|
+
getSimilarFlags(alpha2: string): FlagInfo[]
|
|
282
|
+
// Flags visually similar enough to confuse — ideal for "wrong answer" options.
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Helper functions — World map
|
|
286
|
+
|
|
287
|
+
```ts
|
|
288
|
+
getWorldMapSvg(options?: WorldMapOptions): string
|
|
289
|
+
// Returns a complete <svg> string for the full world map.
|
|
290
|
+
// Every country <path> has id="XX" (ISO alpha-2), data-code, and data-name.
|
|
291
|
+
// Example: document.getElementById("map").innerHTML = getWorldMapSvg({ fill: "#e0e0e0" });
|
|
292
|
+
|
|
293
|
+
highlightCountries(highlights: WorldMapHighlight[], options?: WorldMapOptions): string
|
|
294
|
+
// Returns an SVG with specified countries highlighted in custom colours.
|
|
295
|
+
// Example: highlightCountries([{ code: "DE", fill: "#4a90e2", label: "Germany" }])
|
|
296
|
+
|
|
297
|
+
colorizeWorldMap(groups: Record<string, string[]>, options?: WorldMapOptions): string
|
|
298
|
+
// Choropleth helper — colour groups of countries.
|
|
299
|
+
// Example: colorizeWorldMap({ "#e76f51": ["US","CA"], "#2a9d8f": ["DE","FR"] })
|
|
300
|
+
|
|
301
|
+
getCountryMapData(code: string): WorldMapCountry | undefined
|
|
302
|
+
// Returns the SVG path data for a single country (case-insensitive).
|
|
303
|
+
// Example: getCountryMapData("JP") → { code: "JP", name: "Japan", paths: ["M..."] }
|
|
304
|
+
|
|
305
|
+
searchWorldMapCountries(name: string): WorldMapCountry[]
|
|
306
|
+
// Find countries by partial name match.
|
|
307
|
+
// Example: searchWorldMapCountries("land") → [Greenland, Iceland, Finland, …]
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Geo utility functions
|
|
311
|
+
|
|
312
|
+
```ts
|
|
313
|
+
// Raw math — work with arbitrary coordinates
|
|
314
|
+
haversineDistance(lat1, lon1, lat2, lon2): number // km
|
|
315
|
+
bearing(lat1, lon1, lat2, lon2): number // degrees 0-360, 0=north
|
|
316
|
+
|
|
317
|
+
// Typed helpers — work with alpha-2 country codes
|
|
318
|
+
bearingToCardinal(deg: number): CardinalDirection // "N"|"NE"|"E"|...|"NW"
|
|
319
|
+
|
|
320
|
+
getDistanceBetweenCountries(a: string, b: string): number | null // km between centroids
|
|
321
|
+
getDirectionBetweenCountries(from: string, to: string): CardinalDirection | null
|
|
322
|
+
|
|
323
|
+
compareTemperature(guess: string, target: string): "hotter" | "colder" | "similar" | null
|
|
324
|
+
compareSize(guess: string, target: string): "larger" | "smaller" | "similar" | null
|
|
325
|
+
getHemisphere(alpha2: string): { ns: "Northern"|"Southern"; ew: "Eastern"|"Western" } | null
|
|
326
|
+
|
|
327
|
+
// All hints combined — the main function for geography games
|
|
328
|
+
getGeoHints(guess: string, target: string): GeoHint | null
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## TypeScript Types
|
|
334
|
+
|
|
335
|
+
All types are re-exported from the package root:
|
|
336
|
+
|
|
337
|
+
```ts
|
|
338
|
+
import type {
|
|
339
|
+
// Core data
|
|
340
|
+
Country,
|
|
341
|
+
PhoneCountryCode,
|
|
342
|
+
City,
|
|
343
|
+
State,
|
|
344
|
+
StateType,
|
|
345
|
+
Continent,
|
|
346
|
+
ContinentName,
|
|
347
|
+
Currency,
|
|
348
|
+
Language,
|
|
349
|
+
LanguageNameLocale,
|
|
350
|
+
LanguageOfficialCountry,
|
|
351
|
+
LanguageOfficialStatus,
|
|
352
|
+
LanguageType,
|
|
353
|
+
// Geography
|
|
354
|
+
CountryGeography,
|
|
355
|
+
CountryBounds,
|
|
356
|
+
ClimateZone,
|
|
357
|
+
// Flags
|
|
358
|
+
FlagInfo,
|
|
359
|
+
FlagColor,
|
|
360
|
+
// World map
|
|
361
|
+
WorldMapCountry,
|
|
362
|
+
WorldMapOptions,
|
|
363
|
+
WorldMapHighlight,
|
|
364
|
+
// Utilities
|
|
365
|
+
CardinalDirection,
|
|
366
|
+
Hemisphere,
|
|
367
|
+
GeoHint,
|
|
368
|
+
} from "arevdata";
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### `Country`
|
|
372
|
+
```ts
|
|
373
|
+
interface Country {
|
|
374
|
+
name: string; // "Netherlands"
|
|
375
|
+
nativeName?: string; // "Nederland"
|
|
376
|
+
alpha2: string; // "NL" — ISO 3166-1 alpha-2
|
|
377
|
+
alpha3: string; // "NLD" — ISO 3166-1 alpha-3
|
|
378
|
+
numeric: string; // "528" — ISO 3166-1 numeric (zero-padded 3 digits)
|
|
379
|
+
flag: string; // "🇳🇱" — Unicode emoji flag
|
|
380
|
+
phoneCode: string; // "+31"
|
|
381
|
+
capital: string; // "Amsterdam"
|
|
382
|
+
continent: ContinentName;
|
|
383
|
+
currency: string; // ISO 4217 code, e.g. "EUR"
|
|
384
|
+
languages: string[]; // ["Dutch"]
|
|
385
|
+
tld?: string; // ".nl"
|
|
386
|
+
}
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### `Language`
|
|
390
|
+
```ts
|
|
391
|
+
interface Language {
|
|
392
|
+
code: string; // "en", "sr-Latn", "ca-ES-valencia"
|
|
393
|
+
baseCode: string; // "en", "sr", "ca"
|
|
394
|
+
type: "language" | "variant";
|
|
395
|
+
name: string; // English display name
|
|
396
|
+
estimatedSpeakers: number; // CLDR-derived estimate for filtering/ranking
|
|
397
|
+
officialCountries: LanguageOfficialCountry[];
|
|
398
|
+
script?: string; // e.g. "Latn"
|
|
399
|
+
region?: string; // e.g. "GB"
|
|
400
|
+
variants?: string[]; // e.g. ["valencia"]
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### `CountryGeography`
|
|
405
|
+
```ts
|
|
406
|
+
interface CountryGeography {
|
|
407
|
+
alpha2: string;
|
|
408
|
+
lat: number; // Centroid latitude (−90 to 90)
|
|
409
|
+
lon: number; // Centroid longitude (−180 to 180)
|
|
410
|
+
bounds: {
|
|
411
|
+
north: number; south: number; east: number; west: number;
|
|
412
|
+
};
|
|
413
|
+
area: number; // km²
|
|
414
|
+
landlocked: boolean;
|
|
415
|
+
neighbors: string[]; // alpha-2 codes of bordering countries
|
|
416
|
+
climate: ClimateZone;
|
|
417
|
+
avgTemperature: number; // Mean annual temperature in °C
|
|
418
|
+
}
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### `FlagInfo`
|
|
422
|
+
```ts
|
|
423
|
+
interface FlagInfo {
|
|
424
|
+
alpha2: string;
|
|
425
|
+
svgUrl: string; // "https://arevdata.com/flags/svg/nl.svg"
|
|
426
|
+
pngUrl: string; // "https://arevdata.com/flags/png/w320/nl.png"
|
|
427
|
+
colors: FlagColor[]; // dominant colours, most prominent first
|
|
428
|
+
similar: string[]; // alpha-2 codes of visually similar flags
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### `GeoHint`
|
|
433
|
+
```ts
|
|
434
|
+
interface GeoHint {
|
|
435
|
+
distanceKm: number; // km between centroids
|
|
436
|
+
direction: CardinalDirection; // "N"|"NE"|"E"|"SE"|"S"|"SW"|"W"|"NW"
|
|
437
|
+
temperature: "hotter" | "colder" | "similar"; // target vs. guess
|
|
438
|
+
size: "larger" | "smaller" | "similar"; // target vs. guess
|
|
439
|
+
hemisphere: Hemisphere;
|
|
440
|
+
landlocked: boolean;
|
|
441
|
+
climate: ClimateZone;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
interface Hemisphere {
|
|
445
|
+
ns: "Northern" | "Southern"; // latitude ≥ 0 → Northern
|
|
446
|
+
ew: "Eastern" | "Western"; // longitude ≥ 0 → Eastern
|
|
447
|
+
}
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## Detailed Documentation
|
|
453
|
+
|
|
454
|
+
Each section has its own reference document:
|
|
455
|
+
|
|
456
|
+
| Section | Document |
|
|
457
|
+
|---------|----------|
|
|
458
|
+
| Countries (ISO codes, flags, phone codes) | [docs/countries.md](docs/countries.md) |
|
|
459
|
+
| Phone country codes | [docs/phone-codes.md](docs/phone-codes.md) |
|
|
460
|
+
| Cities | [docs/cities.md](docs/cities.md) |
|
|
461
|
+
| States, provinces & administrative divisions | [docs/states.md](docs/states.md) |
|
|
462
|
+
| Continents & currencies | [docs/continents-currencies.md](docs/continents-currencies.md) |
|
|
463
|
+
| Languages, locale variants & speaker estimates | [docs/languages.md](docs/languages.md) |
|
|
464
|
+
| Geography data & geo utilities (games) | [docs/geography.md](docs/geography.md) |
|
|
465
|
+
| Flags — SVG/PNG URLs, colours, similar flags | [docs/flags.md](docs/flags.md) |
|
|
466
|
+
| World map SVG — render, highlight, colorize | [docs/world-map.md](docs/world-map.md) |
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## Data Coverage
|
|
471
|
+
|
|
472
|
+
| Region | Countries |
|
|
473
|
+
|--------|-----------|
|
|
474
|
+
| Africa | 54 |
|
|
475
|
+
| Asia | 49 (incl. Taiwan, Kosovo, Palestine) |
|
|
476
|
+
| Europe | 44 (incl. Kosovo, Vatican, San Marino, Monaco, Liechtenstein) |
|
|
477
|
+
| North America | 23 |
|
|
478
|
+
| South America | 12 |
|
|
479
|
+
| Oceania | 14 |
|
|
480
|
+
| **Total** | **~195** |
|
|
481
|
+
|
|
482
|
+
States/provinces coverage: United States (50 + DC + territories), Canada (10 provinces + 3 territories), Australia (6 states + 2 territories), Brazil (26 states + DF), Germany (16 Länder), France (13 regions + 5 overseas), Spain (17 autonomous communities), Italy (20 regions), Mexico (31 states + CDMX), India (28 states + 8 UTs), China (23 provinces + 5 AARs + 4 municipalities), Japan (47 prefectures), Switzerland (26 cantons), and more.
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
## Bundle size
|
|
487
|
+
|
|
488
|
+
| Format | Size | Gzip |
|
|
489
|
+
|--------|------|------|
|
|
490
|
+
| ESM (`dist/arevdata.js`) | ~210 kB | ~42 kB |
|
|
491
|
+
| CJS (`dist/arevdata.cjs`) | ~211 kB | ~42 kB |
|
|
492
|
+
|
|
493
|
+
Flag SVG/PNG images are **not bundled in the npm package**. They are generated from repo-owned SVG sources and hosted on `arevdata.com`, keeping the package lean while avoiding third-party flag CDNs.
|
|
494
|
+
|
|
495
|
+
---
|
|
496
|
+
|
|
497
|
+
## License
|
|
498
|
+
|
|
499
|
+
MIT
|