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.
Files changed (289) hide show
  1. package/README.md +499 -0
  2. package/dist/arevdata.cjs +38955 -0
  3. package/dist/arevdata.cjs.map +1 -0
  4. package/dist/arevdata.js +38955 -0
  5. package/dist/arevdata.js.map +1 -0
  6. package/dist/assets/flags/LICENSE.flag-icons.txt +21 -0
  7. package/dist/assets/flags/README.md +11 -0
  8. package/dist/assets/flags/index.html +88 -0
  9. package/dist/assets/flags/overrides/xn.svg +6 -0
  10. package/dist/assets/flags/svg/ad.svg +150 -0
  11. package/dist/assets/flags/svg/ae.svg +6 -0
  12. package/dist/assets/flags/svg/af.svg +81 -0
  13. package/dist/assets/flags/svg/ag.svg +14 -0
  14. package/dist/assets/flags/svg/al.svg +5 -0
  15. package/dist/assets/flags/svg/am.svg +5 -0
  16. package/dist/assets/flags/svg/ao.svg +13 -0
  17. package/dist/assets/flags/svg/ar.svg +32 -0
  18. package/dist/assets/flags/svg/at.svg +4 -0
  19. package/dist/assets/flags/svg/au.svg +8 -0
  20. package/dist/assets/flags/svg/az.svg +8 -0
  21. package/dist/assets/flags/svg/ba.svg +12 -0
  22. package/dist/assets/flags/svg/bb.svg +6 -0
  23. package/dist/assets/flags/svg/bd.svg +4 -0
  24. package/dist/assets/flags/svg/be.svg +7 -0
  25. package/dist/assets/flags/svg/bf.svg +7 -0
  26. package/dist/assets/flags/svg/bg.svg +5 -0
  27. package/dist/assets/flags/svg/bh.svg +4 -0
  28. package/dist/assets/flags/svg/bi.svg +15 -0
  29. package/dist/assets/flags/svg/bj.svg +14 -0
  30. package/dist/assets/flags/svg/bn.svg +36 -0
  31. package/dist/assets/flags/svg/bo.svg +673 -0
  32. package/dist/assets/flags/svg/br.svg +45 -0
  33. package/dist/assets/flags/svg/bs.svg +13 -0
  34. package/dist/assets/flags/svg/bt.svg +89 -0
  35. package/dist/assets/flags/svg/bw.svg +7 -0
  36. package/dist/assets/flags/svg/by.svg +18 -0
  37. package/dist/assets/flags/svg/bz.svg +145 -0
  38. package/dist/assets/flags/svg/ca.svg +4 -0
  39. package/dist/assets/flags/svg/cd.svg +5 -0
  40. package/dist/assets/flags/svg/cf.svg +15 -0
  41. package/dist/assets/flags/svg/cg.svg +12 -0
  42. package/dist/assets/flags/svg/ch.svg +9 -0
  43. package/dist/assets/flags/svg/cl.svg +13 -0
  44. package/dist/assets/flags/svg/cm.svg +15 -0
  45. package/dist/assets/flags/svg/cn.svg +11 -0
  46. package/dist/assets/flags/svg/co.svg +7 -0
  47. package/dist/assets/flags/svg/cr.svg +7 -0
  48. package/dist/assets/flags/svg/cu.svg +13 -0
  49. package/dist/assets/flags/svg/cv.svg +13 -0
  50. package/dist/assets/flags/svg/cy.svg +6 -0
  51. package/dist/assets/flags/svg/cz.svg +5 -0
  52. package/dist/assets/flags/svg/de.svg +5 -0
  53. package/dist/assets/flags/svg/dj.svg +13 -0
  54. package/dist/assets/flags/svg/dk.svg +5 -0
  55. package/dist/assets/flags/svg/dm.svg +152 -0
  56. package/dist/assets/flags/svg/do.svg +121 -0
  57. package/dist/assets/flags/svg/dz.svg +5 -0
  58. package/dist/assets/flags/svg/ec.svg +138 -0
  59. package/dist/assets/flags/svg/ee.svg +5 -0
  60. package/dist/assets/flags/svg/eg.svg +38 -0
  61. package/dist/assets/flags/svg/er.svg +8 -0
  62. package/dist/assets/flags/svg/es.svg +544 -0
  63. package/dist/assets/flags/svg/et.svg +14 -0
  64. package/dist/assets/flags/svg/fi.svg +5 -0
  65. package/dist/assets/flags/svg/fj.svg +120 -0
  66. package/dist/assets/flags/svg/fm.svg +11 -0
  67. package/dist/assets/flags/svg/fr.svg +5 -0
  68. package/dist/assets/flags/svg/ga.svg +7 -0
  69. package/dist/assets/flags/svg/gb.svg +7 -0
  70. package/dist/assets/flags/svg/gd.svg +27 -0
  71. package/dist/assets/flags/svg/ge.svg +6 -0
  72. package/dist/assets/flags/svg/gh.svg +6 -0
  73. package/dist/assets/flags/svg/gm.svg +14 -0
  74. package/dist/assets/flags/svg/gn.svg +7 -0
  75. package/dist/assets/flags/svg/gq.svg +23 -0
  76. package/dist/assets/flags/svg/gr.svg +16 -0
  77. package/dist/assets/flags/svg/gt.svg +204 -0
  78. package/dist/assets/flags/svg/gw.svg +13 -0
  79. package/dist/assets/flags/svg/gy.svg +9 -0
  80. package/dist/assets/flags/svg/hn.svg +18 -0
  81. package/dist/assets/flags/svg/hr.svg +58 -0
  82. package/dist/assets/flags/svg/ht.svg +116 -0
  83. package/dist/assets/flags/svg/hu.svg +7 -0
  84. package/dist/assets/flags/svg/id.svg +4 -0
  85. package/dist/assets/flags/svg/ie.svg +7 -0
  86. package/dist/assets/flags/svg/il.svg +14 -0
  87. package/dist/assets/flags/svg/in.svg +25 -0
  88. package/dist/assets/flags/svg/iq.svg +10 -0
  89. package/dist/assets/flags/svg/ir.svg +219 -0
  90. package/dist/assets/flags/svg/is.svg +12 -0
  91. package/dist/assets/flags/svg/it.svg +7 -0
  92. package/dist/assets/flags/svg/jm.svg +8 -0
  93. package/dist/assets/flags/svg/jo.svg +16 -0
  94. package/dist/assets/flags/svg/jp.svg +11 -0
  95. package/dist/assets/flags/svg/ke.svg +23 -0
  96. package/dist/assets/flags/svg/kg.svg +4 -0
  97. package/dist/assets/flags/svg/kh.svg +61 -0
  98. package/dist/assets/flags/svg/ki.svg +36 -0
  99. package/dist/assets/flags/svg/km.svg +16 -0
  100. package/dist/assets/flags/svg/kn.svg +14 -0
  101. package/dist/assets/flags/svg/kp.svg +15 -0
  102. package/dist/assets/flags/svg/kr.svg +24 -0
  103. package/dist/assets/flags/svg/kw.svg +13 -0
  104. package/dist/assets/flags/svg/kz.svg +36 -0
  105. package/dist/assets/flags/svg/la.svg +12 -0
  106. package/dist/assets/flags/svg/lb.svg +15 -0
  107. package/dist/assets/flags/svg/lc.svg +8 -0
  108. package/dist/assets/flags/svg/li.svg +43 -0
  109. package/dist/assets/flags/svg/lk.svg +22 -0
  110. package/dist/assets/flags/svg/lr.svg +14 -0
  111. package/dist/assets/flags/svg/ls.svg +8 -0
  112. package/dist/assets/flags/svg/lt.svg +7 -0
  113. package/dist/assets/flags/svg/lu.svg +5 -0
  114. package/dist/assets/flags/svg/lv.svg +6 -0
  115. package/dist/assets/flags/svg/ly.svg +13 -0
  116. package/dist/assets/flags/svg/ma.svg +4 -0
  117. package/dist/assets/flags/svg/mc.svg +6 -0
  118. package/dist/assets/flags/svg/md.svg +70 -0
  119. package/dist/assets/flags/svg/me.svg +116 -0
  120. package/dist/assets/flags/svg/mg.svg +7 -0
  121. package/dist/assets/flags/svg/mh.svg +7 -0
  122. package/dist/assets/flags/svg/mk.svg +5 -0
  123. package/dist/assets/flags/svg/ml.svg +7 -0
  124. package/dist/assets/flags/svg/mm.svg +12 -0
  125. package/dist/assets/flags/svg/mn.svg +14 -0
  126. package/dist/assets/flags/svg/mr.svg +6 -0
  127. package/dist/assets/flags/svg/mt.svg +58 -0
  128. package/dist/assets/flags/svg/mu.svg +8 -0
  129. package/dist/assets/flags/svg/mv.svg +6 -0
  130. package/dist/assets/flags/svg/mw.svg +10 -0
  131. package/dist/assets/flags/svg/mx.svg +382 -0
  132. package/dist/assets/flags/svg/my.svg +26 -0
  133. package/dist/assets/flags/svg/mz.svg +21 -0
  134. package/dist/assets/flags/svg/na.svg +16 -0
  135. package/dist/assets/flags/svg/ne.svg +6 -0
  136. package/dist/assets/flags/svg/ng.svg +6 -0
  137. package/dist/assets/flags/svg/ni.svg +129 -0
  138. package/dist/assets/flags/svg/nl.svg +5 -0
  139. package/dist/assets/flags/svg/no.svg +7 -0
  140. package/dist/assets/flags/svg/np.svg +13 -0
  141. package/dist/assets/flags/svg/nr.svg +12 -0
  142. package/dist/assets/flags/svg/nz.svg +36 -0
  143. package/dist/assets/flags/svg/om.svg +115 -0
  144. package/dist/assets/flags/svg/pa.svg +14 -0
  145. package/dist/assets/flags/svg/pe.svg +4 -0
  146. package/dist/assets/flags/svg/pg.svg +9 -0
  147. package/dist/assets/flags/svg/ph.svg +6 -0
  148. package/dist/assets/flags/svg/pk.svg +15 -0
  149. package/dist/assets/flags/svg/pl.svg +6 -0
  150. package/dist/assets/flags/svg/ps.svg +6 -0
  151. package/dist/assets/flags/svg/pt.svg +57 -0
  152. package/dist/assets/flags/svg/pw.svg +11 -0
  153. package/dist/assets/flags/svg/py.svg +157 -0
  154. package/dist/assets/flags/svg/qa.svg +4 -0
  155. package/dist/assets/flags/svg/ro.svg +7 -0
  156. package/dist/assets/flags/svg/rs.svg +292 -0
  157. package/dist/assets/flags/svg/ru.svg +5 -0
  158. package/dist/assets/flags/svg/rw.svg +13 -0
  159. package/dist/assets/flags/svg/sa.svg +25 -0
  160. package/dist/assets/flags/svg/sb.svg +13 -0
  161. package/dist/assets/flags/svg/sc.svg +7 -0
  162. package/dist/assets/flags/svg/sd.svg +13 -0
  163. package/dist/assets/flags/svg/se.svg +4 -0
  164. package/dist/assets/flags/svg/sg.svg +13 -0
  165. package/dist/assets/flags/svg/si.svg +18 -0
  166. package/dist/assets/flags/svg/sk.svg +9 -0
  167. package/dist/assets/flags/svg/sl.svg +7 -0
  168. package/dist/assets/flags/svg/sm.svg +75 -0
  169. package/dist/assets/flags/svg/sn.svg +8 -0
  170. package/dist/assets/flags/svg/so.svg +11 -0
  171. package/dist/assets/flags/svg/sr.svg +6 -0
  172. package/dist/assets/flags/svg/ss.svg +8 -0
  173. package/dist/assets/flags/svg/st.svg +16 -0
  174. package/dist/assets/flags/svg/sv.svg +593 -0
  175. package/dist/assets/flags/svg/sy.svg +6 -0
  176. package/dist/assets/flags/svg/sz.svg +34 -0
  177. package/dist/assets/flags/svg/td.svg +7 -0
  178. package/dist/assets/flags/svg/tg.svg +14 -0
  179. package/dist/assets/flags/svg/th.svg +7 -0
  180. package/dist/assets/flags/svg/tj.svg +22 -0
  181. package/dist/assets/flags/svg/tl.svg +13 -0
  182. package/dist/assets/flags/svg/tm.svg +204 -0
  183. package/dist/assets/flags/svg/tn.svg +4 -0
  184. package/dist/assets/flags/svg/to.svg +10 -0
  185. package/dist/assets/flags/svg/tr.svg +8 -0
  186. package/dist/assets/flags/svg/tt.svg +5 -0
  187. package/dist/assets/flags/svg/tv.svg +9 -0
  188. package/dist/assets/flags/svg/tw.svg +34 -0
  189. package/dist/assets/flags/svg/tz.svg +13 -0
  190. package/dist/assets/flags/svg/ua.svg +6 -0
  191. package/dist/assets/flags/svg/ug.svg +30 -0
  192. package/dist/assets/flags/svg/us.svg +9 -0
  193. package/dist/assets/flags/svg/uy.svg +28 -0
  194. package/dist/assets/flags/svg/uz.svg +30 -0
  195. package/dist/assets/flags/svg/va.svg +190 -0
  196. package/dist/assets/flags/svg/vc.svg +8 -0
  197. package/dist/assets/flags/svg/ve.svg +26 -0
  198. package/dist/assets/flags/svg/vn.svg +11 -0
  199. package/dist/assets/flags/svg/vu.svg +21 -0
  200. package/dist/assets/flags/svg/ws.svg +7 -0
  201. package/dist/assets/flags/svg/xk.svg +5 -0
  202. package/dist/assets/flags/svg/xn.svg +6 -0
  203. package/dist/assets/flags/svg/ye.svg +7 -0
  204. package/dist/assets/flags/svg/za.svg +17 -0
  205. package/dist/assets/flags/svg/zm.svg +27 -0
  206. package/dist/assets/flags/svg/zw.svg +21 -0
  207. package/dist/data/languages/index.html +86 -0
  208. package/dist/docs/api-worker-plan/index.html +439 -0
  209. package/dist/docs/cities/index.html +193 -0
  210. package/dist/docs/continents-currencies/index.html +306 -0
  211. package/dist/docs/countries/index.html +274 -0
  212. package/dist/docs/country-maps/index.html +262 -0
  213. package/dist/docs/flags/index.html +300 -0
  214. package/dist/docs/geography/index.html +454 -0
  215. package/dist/docs/languages/index.html +304 -0
  216. package/dist/docs/phone-codes/index.html +152 -0
  217. package/dist/docs/states/index.html +334 -0
  218. package/dist/docs/world-map/index.html +345 -0
  219. package/dist/examples/vue-app/index.html +208 -0
  220. package/dist/index.html +784 -0
  221. package/dist/robots.txt +2 -0
  222. package/dist/style/app.css +1 -0
  223. package/dist/types/__tests__/cities.test.d.ts +1 -0
  224. package/dist/types/__tests__/continents.test.d.ts +1 -0
  225. package/dist/types/__tests__/countries.test.d.ts +1 -0
  226. package/dist/types/__tests__/countryMaps.test.d.ts +1 -0
  227. package/dist/types/__tests__/geography.test.d.ts +1 -0
  228. package/dist/types/__tests__/index.test.d.ts +1 -0
  229. package/dist/types/__tests__/phoneCodes.test.d.ts +1 -0
  230. package/dist/types/__tests__/states.test.d.ts +1 -0
  231. package/dist/types/__tests__/translations.test.d.ts +1 -0
  232. package/dist/types/api/index.d.ts +5 -0
  233. package/dist/types/api/index.test.d.ts +1 -0
  234. package/dist/types/api/query.d.ts +3 -0
  235. package/dist/types/api/response.d.ts +16 -0
  236. package/dist/types/api/router.d.ts +1 -0
  237. package/dist/types/api/routes/cities.d.ts +2 -0
  238. package/dist/types/api/routes/countries.d.ts +2 -0
  239. package/dist/types/api/routes/health.d.ts +1 -0
  240. package/dist/types/api/routes/maps.d.ts +1 -0
  241. package/dist/types/api/routes/meta.d.ts +1 -0
  242. package/dist/types/api/routes/phoneCodes.d.ts +1 -0
  243. package/dist/types/data/cities.d.ts +22 -0
  244. package/dist/types/data/continents.d.ts +9 -0
  245. package/dist/types/data/countries.d.ts +23 -0
  246. package/dist/types/data/countryMaps.d.ts +104 -0
  247. package/dist/types/data/currencies.d.ts +13 -0
  248. package/dist/types/data/flags.d.ts +37 -0
  249. package/dist/types/data/geography.d.ts +48 -0
  250. package/dist/types/data/languages/index.d.ts +2 -0
  251. package/dist/types/data/languages/language.test.d.ts +1 -0
  252. package/dist/types/data/languages/languageData.d.ts +6 -0
  253. package/dist/types/data/languages/languageFunctions.d.ts +43 -0
  254. package/dist/types/data/languages/translations/ar.d.ts +1189 -0
  255. package/dist/types/data/languages/translations/de.d.ts +1189 -0
  256. package/dist/types/data/languages/translations/es.d.ts +1189 -0
  257. package/dist/types/data/languages/translations/fr.d.ts +1189 -0
  258. package/dist/types/data/languages/translations/hi.d.ts +1189 -0
  259. package/dist/types/data/languages/translations/it.d.ts +1189 -0
  260. package/dist/types/data/languages/translations/ja.d.ts +1189 -0
  261. package/dist/types/data/languages/translations/ko.d.ts +1189 -0
  262. package/dist/types/data/languages/translations/nl.d.ts +1189 -0
  263. package/dist/types/data/languages/translations/pl.d.ts +1189 -0
  264. package/dist/types/data/languages/translations/pt.d.ts +1189 -0
  265. package/dist/types/data/languages/translations/ru.d.ts +1189 -0
  266. package/dist/types/data/languages/translations/tr.d.ts +1189 -0
  267. package/dist/types/data/languages/translations/zh.d.ts +1189 -0
  268. package/dist/types/data/phoneCodes.d.ts +16 -0
  269. package/dist/types/data/states.d.ts +18 -0
  270. package/dist/types/data/translations/ar.d.ts +1832 -0
  271. package/dist/types/data/translations/de.d.ts +2005 -0
  272. package/dist/types/data/translations/es.d.ts +1852 -0
  273. package/dist/types/data/translations/fr.d.ts +1860 -0
  274. package/dist/types/data/translations/hi.d.ts +1816 -0
  275. package/dist/types/data/translations/it.d.ts +1824 -0
  276. package/dist/types/data/translations/ja.d.ts +1833 -0
  277. package/dist/types/data/translations/ko.d.ts +1832 -0
  278. package/dist/types/data/translations/nl.d.ts +1826 -0
  279. package/dist/types/data/translations/pl.d.ts +1818 -0
  280. package/dist/types/data/translations/pt.d.ts +1829 -0
  281. package/dist/types/data/translations/ru.d.ts +1838 -0
  282. package/dist/types/data/translations/tr.d.ts +1818 -0
  283. package/dist/types/data/translations/zh.d.ts +1834 -0
  284. package/dist/types/data/translations.d.ts +73 -0
  285. package/dist/types/data/worldMap.d.ts +122 -0
  286. package/dist/types/index.d.ts +33 -0
  287. package/dist/types/types/index.d.ts +348 -0
  288. package/dist/types/utils/geo.d.ts +101 -0
  289. 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