@whiteslove/parsing-lexicon 0.2.0 → 0.2.2

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 (94) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +137 -137
  3. package/index.d.ts +374 -374
  4. package/package.json +77 -75
  5. package/src/central-asia-locations.js +211 -211
  6. package/src/central-asia.js +233 -233
  7. package/src/contact.d.ts +44 -44
  8. package/src/contact.js +159 -159
  9. package/src/countries.js +175 -175
  10. package/src/country-context.d.ts +10 -10
  11. package/src/country-context.js +22 -22
  12. package/src/currency.d.ts +14 -14
  13. package/src/currency.js +66 -66
  14. package/src/geo.js +169 -169
  15. package/src/geography-central-asia.js +42 -42
  16. package/src/geography-detection.d.ts +14 -14
  17. package/src/geography-detection.js +64 -64
  18. package/src/geography-display.d.ts +13 -13
  19. package/src/geography-display.js +113 -113
  20. package/src/geography.js +210 -210
  21. package/src/hiring-advanced.js +147 -147
  22. package/src/hiring-candidate-fields.d.ts +9 -9
  23. package/src/hiring-candidate-fields.js +92 -92
  24. package/src/hiring-context.d.ts +64 -64
  25. package/src/hiring-context.js +412 -412
  26. package/src/hiring-language-extensions.d.ts +19 -19
  27. package/src/hiring-language-extensions.js +139 -139
  28. package/src/hiring-languages.js +135 -135
  29. package/src/hiring-location-fields.d.ts +3 -3
  30. package/src/hiring-location-fields.js +53 -53
  31. package/src/hiring-professions-ro.js +191 -191
  32. package/src/hiring-professions.js +437 -437
  33. package/src/hiring-requirements.d.ts +16 -16
  34. package/src/hiring-requirements.js +170 -170
  35. package/src/hiring-salary-context.d.ts +27 -27
  36. package/src/hiring-salary-context.js +76 -76
  37. package/src/hiring-semantics.d.ts +29 -29
  38. package/src/hiring-semantics.js +218 -218
  39. package/src/hiring-skills.d.ts +21 -21
  40. package/src/hiring-skills.js +315 -315
  41. package/src/hiring-source-aliases.d.ts +32 -32
  42. package/src/hiring-source-aliases.js +185 -185
  43. package/src/hiring-source-semantics.d.ts +31 -31
  44. package/src/hiring-source-semantics.js +293 -293
  45. package/src/hiring-temporal.d.ts +15 -15
  46. package/src/hiring-temporal.js +67 -67
  47. package/src/hiring-vacancy-fields.d.ts +5 -5
  48. package/src/hiring-vacancy-fields.js +23 -23
  49. package/src/hiring-work-semantics.d.ts +34 -34
  50. package/src/hiring-work-semantics.js +72 -72
  51. package/src/hiring.js +180 -180
  52. package/src/housing-address.d.ts +18 -18
  53. package/src/housing-address.js +217 -210
  54. package/src/housing-commercial.d.ts +1 -0
  55. package/src/housing-commercial.js +9 -0
  56. package/src/housing-context.d.ts +36 -36
  57. package/src/housing-context.js +183 -183
  58. package/src/housing-features.js +30 -30
  59. package/src/housing-intent.d.ts +9 -9
  60. package/src/housing-intent.js +132 -132
  61. package/src/housing-listing-fields.js +131 -131
  62. package/src/housing-money.d.ts +7 -7
  63. package/src/housing-money.js +102 -102
  64. package/src/housing-source-aliases.d.ts +8 -8
  65. package/src/housing-source-aliases.js +51 -51
  66. package/src/housing-structured.d.ts +55 -55
  67. package/src/housing-structured.js +219 -219
  68. package/src/housing.js +200 -200
  69. package/src/index.js +45 -44
  70. package/src/kz-location-extensions.js +307 -307
  71. package/src/landmarks.js +21 -21
  72. package/src/lexicon-core.js +58 -58
  73. package/src/location-merge.js +106 -106
  74. package/src/locations.js +456 -456
  75. package/src/money-core.d.ts +10 -10
  76. package/src/money-core.js +81 -81
  77. package/src/money-lexicon.d.ts +5 -5
  78. package/src/money-lexicon.js +79 -79
  79. package/src/money.js +154 -154
  80. package/src/normalization.js +384 -384
  81. package/src/odesa-metropolitan.js +144 -144
  82. package/src/romania-geography.js +47 -47
  83. package/src/tashkent-colloquial.js +80 -72
  84. package/src/tashkent-housing-geography.d.ts +38 -38
  85. package/src/tashkent-housing-geography.js +211 -211
  86. package/src/tashkent-pois.js +215 -215
  87. package/src/tashkent-residential-complexes.js +272 -272
  88. package/src/ua-location-extensions-major.js +118 -118
  89. package/src/ua-location-extensions-metro.js +9 -9
  90. package/src/ua-location-extensions-regional.js +246 -246
  91. package/src/ua-secondary-cities.d.ts +2 -2
  92. package/src/ua-secondary-cities.js +57 -57
  93. package/src/ukraine.js +75 -75
  94. package/src/uz-location-extensions.js +259 -259
package/src/geography.js CHANGED
@@ -1,210 +1,210 @@
1
- import { UZ_CITIES, KZ_CITIES } from './geography-central-asia.js';
2
- import { findCanonical } from './normalization.js';
3
- import { canonicalCountryCode } from './countries.js';
4
- import { lexiconEntity } from './lexicon-core.js';
5
- import { RO_CITY_EXTENSIONS } from './romania-geography.js';
6
-
7
- const entity = (canonical, aliases, extra = {}) => lexiconEntity(canonical, aliases, extra);
8
-
9
- export const UA_CITIES = Object.freeze([
10
- entity('Kyiv', { uk: ['Київ'], ru: ['Киев'], en: ['Kyiv', 'Kiev'], ro: ['Kiev'] }, { country: 'UA', type: 'city' }),
11
- entity('Kharkiv', { uk: ['Харків'], ru: ['Харьков'], en: ['Kharkiv', 'Kharkov'], ro: ['Harkiv'] }, { country: 'UA', type: 'city' }),
12
- entity('Odesa', { uk: ['Одеса'], ru: ['Одесса'], en: ['Odesa', 'Odessa'], ro: ['Odesa'] }, { country: 'UA', type: 'city' }),
13
- entity('Dnipro', { uk: ['Дніпро'], ru: ['Днепр'], en: ['Dnipro', 'Dnepr'], ro: ['Dnipro'] }, { country: 'UA', type: 'city' }),
14
- entity('Lviv', { uk: ['Львів'], ru: ['Львов'], en: ['Lviv', 'Lvov'], ro: ['Liov', 'Lviv'] }, { country: 'UA', type: 'city' }),
15
- entity('Zaporizhzhia', { uk: ['Запоріжжя'], ru: ['Запорожье'], en: ['Zaporizhzhia', 'Zaporozhye'], ro: ['Zaporijjea'] }, { country: 'UA', type: 'city' }),
16
- entity('Vinnytsia', { uk: ['Вінниця'], ru: ['Винница'], en: ['Vinnytsia', 'Vinnitsa'], ro: ['Vinița', 'Vinnytsia'] }, { country: 'UA', type: 'city' }),
17
- entity('Ivano-Frankivsk', { uk: ['Івано-Франківськ', 'Франківськ'], ru: ['Ивано-Франковск'], en: ['Ivano-Frankivsk', 'Frankivsk'], ro: ['Ivano-Frankivsk'] }, { country: 'UA', type: 'city' }),
18
- entity('Chernivtsi', { uk: ['Чернівці'], ru: ['Черновцы'], en: ['Chernivtsi', 'Chernovtsy'], ro: ['Cernăuți', 'Cernivți'] }, { country: 'UA', type: 'city' }),
19
- entity('Uzhhorod', { uk: ['Ужгород'], ru: ['Ужгород'], en: ['Uzhhorod', 'Uzhgorod'], ro: ['Ujhorod'] }, { country: 'UA', type: 'city' }),
20
- entity('Mukachevo', { uk: ['Мукачево', 'Мукачеве'], ru: ['Мукачево'], en: ['Mukachevo', 'Mukacheve'], ro: ['Muncaci', 'Mukachevo'] }, { country: 'UA', type: 'city' }),
21
- entity('Lutsk', { uk: ['Луцьк'], ru: ['Луцк'], en: ['Lutsk'], ro: ['Luțk'] }, { country: 'UA', type: 'city' }),
22
- entity('Rivne', { uk: ['Рівне'], ru: ['Ровно'], en: ['Rivne', 'Rovno'], ro: ['Rivne'] }, { country: 'UA', type: 'city' }),
23
- entity('Ternopil', { uk: ['Тернопіль'], ru: ['Тернополь'], en: ['Ternopil', 'Ternopol'], ro: ['Ternopil'] }, { country: 'UA', type: 'city' }),
24
- entity('Khmelnytskyi', { uk: ['Хмельницький'], ru: ['Хмельницкий'], en: ['Khmelnytskyi', 'Khmelnitsky'], ro: ['Hmelnițki'] }, { country: 'UA', type: 'city' }),
25
- entity('Zhytomyr', { uk: ['Житомир'], ru: ['Житомир'], en: ['Zhytomyr', 'Zhitomir'], ro: ['Jîtomîr'] }, { country: 'UA', type: 'city' }),
26
- entity('Cherkasy', { uk: ['Черкаси'], ru: ['Черкассы'], en: ['Cherkasy', 'Cherkassy'], ro: ['Cerkasî'] }, { country: 'UA', type: 'city' }),
27
- entity('Poltava', { uk: ['Полтава'], ru: ['Полтава'], en: ['Poltava'], ro: ['Poltava'] }, { country: 'UA', type: 'city' }),
28
- entity('Chernihiv', { uk: ['Чернігів'], ru: ['Чернигов'], en: ['Chernihiv', 'Chernigov'], ro: ['Cernihiv'] }, { country: 'UA', type: 'city' }),
29
- entity('Sumy', { uk: ['Суми'], ru: ['Сумы'], en: ['Sumy'], ro: ['Sumî'] }, { country: 'UA', type: 'city' }),
30
- entity('Mykolaiv', { uk: ['Миколаїв'], ru: ['Николаев'], en: ['Mykolaiv', 'Nikolaev'], ro: ['Mîkolaiiv'] }, { country: 'UA', type: 'city' }),
31
- entity('Kherson', { uk: ['Херсон'], ru: ['Херсон'], en: ['Kherson'], ro: ['Herson'] }, { country: 'UA', type: 'city' }),
32
- entity('Kropyvnytskyi', { uk: ['Кропивницький'], ru: ['Кропивницкий', 'Кировоград'], en: ['Kropyvnytskyi', 'Kirovohrad'], ro: ['Kropîvnîțkîi'] }, { country: 'UA', type: 'city' }),
33
- entity('Irpin', { uk: ['Ірпінь'], ru: ['Ирпень'], en: ['Irpin'], ro: ['Irpin'] }, { country: 'UA', type: 'city' }),
34
- entity('Bucha', { uk: ['Буча'], ru: ['Буча'], en: ['Bucha'], ro: ['Bucea'] }, { country: 'UA', type: 'city' }),
35
- entity('Brovary', { uk: ['Бровари'], ru: ['Бровары'], en: ['Brovary'], ro: ['Brovary'] }, { country: 'UA', type: 'city' }),
36
- entity('Bila Tserkva', { uk: ['Біла Церква'], ru: ['Белая Церковь'], en: ['Bila Tserkva'], ro: ['Bila Țerkva'] }, { country: 'UA', type: 'city' }),
37
- entity('Kryvyi Rih', { uk: ['Кривий Ріг'], ru: ['Кривой Рог'], en: ['Kryvyi Rih', 'Krivoy Rog'], ro: ['Krîvîi Rih'] }, { country: 'UA', type: 'city' }),
38
- entity('Kremenchuk', { uk: ['Кременчук'], ru: ['Кременчуг'], en: ['Kremenchuk'], ro: ['Kremenciuk'] }, { country: 'UA', type: 'city' }),
39
- entity('Uman', { uk: ['Умань'], ru: ['Умань'], en: ['Uman'], ro: ['Uman'] }, { country: 'UA', type: 'city' }),
40
- ]);
41
-
42
- const RO_CITIES_BASE = Object.freeze([
43
- entity('Bucharest', { ro: ['București', 'Bucuresti'], en: ['Bucharest'], ru: ['Бухарест'], uk: ['Бухарест'] }, { country: 'RO', type: 'city' }),
44
- entity('Cluj-Napoca', { ro: ['Cluj-Napoca', 'Cluj'], en: ['Cluj-Napoca', 'Cluj'], ru: ['Клуж-Напока', 'Клуж'], uk: ['Клуж-Напока'] }, { country: 'RO', type: 'city' }),
45
- entity('Timisoara', { ro: ['Timișoara', 'Timisoara'], en: ['Timisoara', 'Timișoara'], ru: ['Тимишоара'], uk: ['Тімішоара'] }, { country: 'RO', type: 'city' }),
46
- entity('Iasi', { ro: ['Iași', 'Iasi'], en: ['Iasi', 'Iași'], ru: ['Яссы'], uk: ['Ясси'] }, { country: 'RO', type: 'city' }),
47
- entity('Brasov', { ro: ['Brașov', 'Brasov'], en: ['Brasov', 'Brașov'], ru: ['Брашов'], uk: ['Брашов'] }, { country: 'RO', type: 'city' }),
48
- entity('Constanta', { ro: ['Constanța', 'Constanta'], en: ['Constanta', 'Constanța'], ru: ['Констанца'], uk: ['Констанца'] }, { country: 'RO', type: 'city' }),
49
- entity('Oradea', { ro: ['Oradea'], en: ['Oradea'], ru: ['Орадя'], uk: ['Орадя'] }, { country: 'RO', type: 'city' }),
50
- entity('Sibiu', { ro: ['Sibiu'], en: ['Sibiu'], ru: ['Сибиу'], uk: ['Сібіу'] }, { country: 'RO', type: 'city' }),
51
- entity('Craiova', { ro: ['Craiova'], en: ['Craiova'], ru: ['Крайова'], uk: ['Крайова'] }, { country: 'RO', type: 'city' }),
52
- entity('Ploiesti', { ro: ['Ploiești', 'Ploiesti'], en: ['Ploiesti', 'Ploiești'], ru: ['Плоешти'], uk: ['Плоєшті'] }, { country: 'RO', type: 'city' }),
53
- entity('Galati', { ro: ['Galați', 'Galati'], en: ['Galati', 'Galați'], ru: ['Галац'], uk: ['Галац'] }, { country: 'RO', type: 'city' }),
54
- entity('Arad', { ro: ['Arad'], en: ['Arad'], ru: ['Арад'], uk: ['Арад'] }, { country: 'RO', type: 'city' }),
55
- ]);
56
-
57
- export const RO_CITIES = Object.freeze([...RO_CITIES_BASE, ...RO_CITY_EXTENSIONS]);
58
-
59
- export const KG_CITIES = Object.freeze([
60
- entity('Bishkek', { ru: ['Бишкек'], en: ['Bishkek'], kk: ['Бішкек'], uzLatn: ['Bishkek'] }, { country: 'KG', type: 'city' }),
61
- entity('Osh', { ru: ['Ош'], en: ['Osh'], kk: ['Ош'], uzLatn: ['Osh'] }, { country: 'KG', type: 'city' }),
62
- entity('Karakol', { ru: ['Каракол'], en: ['Karakol'], kk: ['Қаракөл'], uzLatn: ['Karakol'] }, { country: 'KG', type: 'city' }),
63
-
64
- ]);
65
-
66
- /** Canonical cities used across global hiring and housing ingestion. */
67
- export const GLOBAL_CITIES = Object.freeze([
68
- entity('Tbilisi', { en: ['Tbilisi'], ru: ['Тбилиси'] }, { country: 'GE', type: 'city' }),
69
- entity('Batumi', { en: ['Batumi'], ru: ['Батуми'] }, { country: 'GE', type: 'city' }),
70
- entity('Baku', { en: ['Baku'], ru: ['Баку'] }, { country: 'AZ', type: 'city' }),
71
- entity('Yerevan', { en: ['Yerevan'], ru: ['Ереван'], uk: ['Єреван'] }, { country: 'AM', type: 'city' }),
72
- entity('Chisinau', { en: ['Chisinau'], ro: ['Chișinău', 'Chişinău'], ru: ['Кишинёв', 'Кишинев'] }, { country: 'MD', type: 'city' }),
73
- entity('Dushanbe', { en: ['Dushanbe'], ru: ['Душанбе'] }, { country: 'TJ', type: 'city' }),
74
- entity('Ashgabat', { en: ['Ashgabat'], ru: ['Ашхабад'] }, { country: 'TM', type: 'city' }),
75
- entity('Warsaw', { en: ['Warsaw'], all: ['Warszawa'], ru: ['Варшава'] }, { country: 'PL', type: 'city' }),
76
- entity('Krakow', { en: ['Krakow'], all: ['Kraków'], ru: ['Краков'] }, { country: 'PL', type: 'city' }),
77
- entity('Berlin', { en: ['Berlin'], ru: ['Берлин'] }, { country: 'DE', type: 'city' }),
78
- entity('Munich', { en: ['Munich'], all: ['München'], ru: ['Мюнхен'] }, { country: 'DE', type: 'city' }),
79
- entity('London', { en: ['London'], ru: ['Лондон'] }, { country: 'GB', type: 'city' }),
80
- entity('New York', { en: ['New York', 'New York City', 'NYC'], ru: ['Нью-Йорк', 'Нью Йорк'] }, { country: 'US', type: 'city' }),
81
- entity('Beijing', { en: ['Beijing'], ru: ['Пекин'], all: ['北京'] }, { country: 'CN', type: 'city' }),
82
- entity('Shanghai', { en: ['Shanghai'], ru: ['Шанхай'], all: ['上海'] }, { country: 'CN', type: 'city' }),
83
- entity('Shenzhen', { en: ['Shenzhen'], ru: ['Шэньчжэнь'], all: ['深圳'] }, { country: 'CN', type: 'city' }),
84
- entity('Guangzhou', { en: ['Guangzhou'], ru: ['Гуанчжоу'], all: ['广州'] }, { country: 'CN', type: 'city' }),
85
- entity('Hangzhou', { en: ['Hangzhou'], ru: ['Ханчжоу'], all: ['杭州'] }, { country: 'CN', type: 'city' }),
86
- entity('Tokyo', { en: ['Tokyo'], ru: ['Токио'], all: ['東京'] }, { country: 'JP', type: 'city' }),
87
- entity('Osaka', { en: ['Osaka'], ru: ['Осака'], all: ['大阪'] }, { country: 'JP', type: 'city' }),
88
- entity('Kyoto', { en: ['Kyoto'], ru: ['Киото'], all: ['京都'] }, { country: 'JP', type: 'city' }),
89
- entity('Seoul', { en: ['Seoul'], ru: ['Сеул'], all: ['서울'] }, { country: 'KR', type: 'city' }),
90
- entity('Busan', { en: ['Busan'], ru: ['Пусан'], all: ['부산'] }, { country: 'KR', type: 'city' }),
91
- entity('Taipei', { en: ['Taipei'], ru: ['Тайбэй'], all: ['台北'] }, { country: 'TW', type: 'city' }),
92
- entity('Kaohsiung', { en: ['Kaohsiung'], ru: ['Гаосюн'], all: ['高雄'] }, { country: 'TW', type: 'city' }),
93
- entity('Taichung', { en: ['Taichung'], ru: ['Тайчжун'], all: ['台中'] }, { country: 'TW', type: 'city' }),
94
- ]);
95
-
96
- export const CITIES = Object.freeze([...UZ_CITIES, ...KZ_CITIES, ...UA_CITIES, ...RO_CITIES, ...KG_CITIES, ...GLOBAL_CITIES]);
97
- export const CITIES_BY_COUNTRY = Object.freeze(Object.fromEntries(
98
- [...new Set(CITIES.map((item) => item.country).filter(Boolean))].map((code) => [
99
- code,
100
- Object.freeze(CITIES.filter((item) => item.country === code)),
101
- ]),
102
- ));
103
-
104
- export function canonicalCity(value, country = null) {
105
- const code = country ? canonicalCountryCode(country) : null;
106
- const catalog = country ? (code ? (CITIES_BY_COUNTRY[code] || []) : []) : CITIES;
107
- return findCanonical(value, catalog)?.canonical || null;
108
- }
109
-
110
- // Backward-compatible aliases. New code should use CITIES/CITIES_BY_COUNTRY/canonicalCity.
111
- export const GEOGRAPHY_CITIES = CITIES;
112
- export const GEOGRAPHY_CITIES_BY_COUNTRY = CITIES_BY_COUNTRY;
113
- export function canonicalAnyCity(value, country = null) {
114
- return canonicalCity(value, country);
115
- }
116
-
117
- export const UA_REGIONS = Object.freeze([
118
- entity('Vinnytsia Oblast', { uk: ['Вінницька область'], ru: ['Винницкая область'], en: ['Vinnytsia Oblast'] }, { country: 'UA', type: 'region' }),
119
- entity('Volyn Oblast', { uk: ['Волинська область'], ru: ['Волынская область'], en: ['Volyn Oblast'] }, { country: 'UA', type: 'region' }),
120
- entity('Dnipropetrovsk Oblast', { uk: ['Дніпропетровська область'], ru: ['Днепропетровская область'], en: ['Dnipropetrovsk Oblast'] }, { country: 'UA', type: 'region' }),
121
- entity('Donetsk Oblast', { uk: ['Донецька область'], ru: ['Донецкая область'], en: ['Donetsk Oblast'] }, { country: 'UA', type: 'region' }),
122
- entity('Zhytomyr Oblast', { uk: ['Житомирська область'], ru: ['Житомирская область'], en: ['Zhytomyr Oblast'] }, { country: 'UA', type: 'region' }),
123
- entity('Zakarpattia Oblast', { uk: ['Закарпатська область'], ru: ['Закарпатская область'], en: ['Zakarpattia Oblast', 'Transcarpathia'] }, { country: 'UA', type: 'region' }),
124
- entity('Zaporizhzhia Oblast', { uk: ['Запорізька область'], ru: ['Запорожская область'], en: ['Zaporizhzhia Oblast'] }, { country: 'UA', type: 'region' }),
125
- entity('Ivano-Frankivsk Oblast', { uk: ['Івано-Франківська область'], ru: ['Ивано-Франковская область'], en: ['Ivano-Frankivsk Oblast'] }, { country: 'UA', type: 'region' }),
126
- entity('Kyiv Oblast', { uk: ['Київська область', 'Київщина'], ru: ['Киевская область', 'Киевщина'], en: ['Kyiv Oblast', 'Kyiv Region'] }, { country: 'UA', type: 'region' }),
127
- entity('Kirovohrad Oblast', { uk: ['Кіровоградська область'], ru: ['Кировоградская область'], en: ['Kirovohrad Oblast'] }, { country: 'UA', type: 'region' }),
128
- entity('Luhansk Oblast', { uk: ['Луганська область'], ru: ['Луганская область'], en: ['Luhansk Oblast'] }, { country: 'UA', type: 'region' }),
129
- entity('Lviv Oblast', { uk: ['Львівська область', 'Львівщина'], ru: ['Львовская область'], en: ['Lviv Oblast'] }, { country: 'UA', type: 'region' }),
130
- entity('Mykolaiv Oblast', { uk: ['Миколаївська область'], ru: ['Николаевская область'], en: ['Mykolaiv Oblast'] }, { country: 'UA', type: 'region' }),
131
- entity('Odesa Oblast', { uk: ['Одеська область', 'Одещина'], ru: ['Одесская область'], en: ['Odesa Oblast', 'Odessa Oblast'] }, { country: 'UA', type: 'region' }),
132
- entity('Poltava Oblast', { uk: ['Полтавська область'], ru: ['Полтавская область'], en: ['Poltava Oblast'] }, { country: 'UA', type: 'region' }),
133
- entity('Rivne Oblast', { uk: ['Рівненська область'], ru: ['Ровенская область'], en: ['Rivne Oblast'] }, { country: 'UA', type: 'region' }),
134
- entity('Sumy Oblast', { uk: ['Сумська область'], ru: ['Сумская область'], en: ['Sumy Oblast'] }, { country: 'UA', type: 'region' }),
135
- entity('Ternopil Oblast', { uk: ['Тернопільська область'], ru: ['Тернопольская область'], en: ['Ternopil Oblast'] }, { country: 'UA', type: 'region' }),
136
- entity('Kharkiv Oblast', { uk: ['Харківська область', 'Харківщина'], ru: ['Харьковская область'], en: ['Kharkiv Oblast'] }, { country: 'UA', type: 'region' }),
137
- entity('Kherson Oblast', { uk: ['Херсонська область'], ru: ['Херсонская область'], en: ['Kherson Oblast'] }, { country: 'UA', type: 'region' }),
138
- entity('Khmelnytskyi Oblast', { uk: ['Хмельницька область'], ru: ['Хмельницкая область'], en: ['Khmelnytskyi Oblast'] }, { country: 'UA', type: 'region' }),
139
- entity('Cherkasy Oblast', { uk: ['Черкаська область'], ru: ['Черкасская область'], en: ['Cherkasy Oblast'] }, { country: 'UA', type: 'region' }),
140
- entity('Chernivtsi Oblast', { uk: ['Чернівецька область'], ru: ['Черновицкая область'], ro: ['Regiunea Cernăuți'], en: ['Chernivtsi Oblast'] }, { country: 'UA', type: 'region' }),
141
- entity('Chernihiv Oblast', { uk: ['Чернігівська область'], ru: ['Черниговская область'], en: ['Chernihiv Oblast'] }, { country: 'UA', type: 'region' }),
142
- entity('Autonomous Republic of Crimea', { uk: ['Автономна Республіка Крим', 'АР Крим'], ru: ['Автономная Республика Крым', 'АР Крым'], en: ['Autonomous Republic of Crimea', 'Crimea'] }, { country: 'UA', type: 'region' }),
143
- entity('Kyiv City', { uk: ['місто Київ', 'м. Київ'], ru: ['город Киев', 'г. Киев'], en: ['Kyiv City'] }, { country: 'UA', type: 'region' }),
144
- entity('Sevastopol City', { uk: ['місто Севастополь', 'м. Севастополь'], ru: ['город Севастополь', 'г. Севастополь'], en: ['Sevastopol City'] }, { country: 'UA', type: 'region' }),
145
- ]);
146
-
147
- const RO_COUNTY_NAMES = [
148
- ['Alba','Alba'],['Arad','Arad'],['Arges','Argeș'],['Bacau','Bacău'],['Bihor','Bihor'],['Bistrita-Nasaud','Bistrița-Năsăud'],['Botosani','Botoșani'],['Braila','Brăila'],['Brasov','Brașov'],['Buzau','Buzău'],
149
- ['Calarasi','Călărași'],['Caras-Severin','Caraș-Severin'],['Cluj','Cluj'],['Constanta','Constanța'],['Covasna','Covasna'],['Dambovita','Dâmbovița'],['Dolj','Dolj'],['Galati','Galați'],['Giurgiu','Giurgiu'],['Gorj','Gorj'],
150
- ['Harghita','Harghita'],['Hunedoara','Hunedoara'],['Ialomita','Ialomița'],['Iasi','Iași'],['Ilfov','Ilfov'],['Maramures','Maramureș'],['Mehedinti','Mehedinți'],['Mures','Mureș'],['Neamt','Neamț'],['Olt','Olt'],
151
- ['Prahova','Prahova'],['Salaj','Sălaj'],['Satu Mare','Satu Mare'],['Sibiu','Sibiu'],['Suceava','Suceava'],['Teleorman','Teleorman'],['Timis','Timiș'],['Tulcea','Tulcea'],['Valcea','Vâlcea'],['Vaslui','Vaslui'],['Vrancea','Vrancea'],
152
- ];
153
- export const RO_REGIONS = Object.freeze([
154
- ...RO_COUNTY_NAMES.map(([canonical, native]) => entity(`${canonical} County`, { ro: [`județul ${native}`, `județ ${native}`, native], en: [`${canonical} County`], ru: [`жудец ${native}`], uk: [`жудець ${native}`] }, { country: 'RO', type: 'region' })),
155
- entity('Bucharest Municipality', { ro: ['Municipiul București', 'București'], en: ['Bucharest Municipality'], ru: ['муниципий Бухарест'], uk: ['муніципій Бухарест'] }, { country: 'RO', type: 'region' }),
156
- ]);
157
-
158
- export const UZ_REGIONS = Object.freeze([
159
- entity('Tashkent Region', { uzLatn: ['Toshkent viloyati'], uzCyrl: ['Тошкент вилояти'], ru: ['Ташкентская область'], en: ['Tashkent Region'] }, { country: 'UZ', type: 'region' }),
160
- entity('Andijan Region', { uzLatn: ['Andijon viloyati'], uzCyrl: ['Андижон вилояти'], ru: ['Андижанская область'], en: ['Andijan Region'] }, { country: 'UZ', type: 'region' }),
161
- entity('Bukhara Region', { uzLatn: ['Buxoro viloyati'], uzCyrl: ['Бухоро вилояти'], ru: ['Бухарская область'], en: ['Bukhara Region'] }, { country: 'UZ', type: 'region' }),
162
- entity('Fergana Region', { uzLatn: ["Farg'ona viloyati", 'Farg‘ona viloyati'], uzCyrl: ['Фарғона вилояти'], ru: ['Ферганская область'], en: ['Fergana Region'] }, { country: 'UZ', type: 'region' }),
163
- entity('Jizzakh Region', { uzLatn: ['Jizzax viloyati'], uzCyrl: ['Жиззах вилояти'], ru: ['Джизакская область'], en: ['Jizzakh Region'] }, { country: 'UZ', type: 'region' }),
164
- entity('Namangan Region', { uzLatn: ['Namangan viloyati'], uzCyrl: ['Наманган вилояти'], ru: ['Наманганская область'], en: ['Namangan Region'] }, { country: 'UZ', type: 'region' }),
165
- entity('Navoiy Region', { uzLatn: ['Navoiy viloyati'], uzCyrl: ['Навоий вилояти'], ru: ['Навоийская область'], en: ['Navoiy Region'] }, { country: 'UZ', type: 'region' }),
166
- entity('Qashqadaryo Region', { uzLatn: ['Qashqadaryo viloyati'], uzCyrl: ['Қашқадарё вилояти'], ru: ['Кашкадарьинская область'], en: ['Qashqadaryo Region', 'Kashkadarya Region'] }, { country: 'UZ', type: 'region' }),
167
- entity('Samarqand Region', { uzLatn: ['Samarqand viloyati'], uzCyrl: ['Самарқанд вилояти'], ru: ['Самаркандская область'], en: ['Samarqand Region', 'Samarkand Region'] }, { country: 'UZ', type: 'region' }),
168
- entity('Surxondaryo Region', { uzLatn: ['Surxondaryo viloyati'], uzCyrl: ['Сурхондарё вилояти'], ru: ['Сурхандарьинская область'], en: ['Surxondaryo Region', 'Surkhandarya Region'] }, { country: 'UZ', type: 'region' }),
169
- entity('Sirdaryo Region', { uzLatn: ['Sirdaryo viloyati'], uzCyrl: ['Сирдарё вилояти'], ru: ['Сырдарьинская область'], en: ['Sirdaryo Region', 'Syrdarya Region'] }, { country: 'UZ', type: 'region' }),
170
- entity('Xorazm Region', { uzLatn: ['Xorazm viloyati'], uzCyrl: ['Хоразм вилояти'], ru: ['Хорезмская область'], en: ['Xorazm Region', 'Khorezm Region'] }, { country: 'UZ', type: 'region' }),
171
- entity('Karakalpakstan', { uzLatn: ["Qoraqalpog'iston Respublikasi", 'Qoraqalpog‘iston Respublikasi'], uzCyrl: ['Қорақалпоғистон Республикаси'], ru: ['Республика Каракалпакстан', 'Каракалпакстан'], en: ['Republic of Karakalpakstan', 'Karakalpakstan'] }, { country: 'UZ', type: 'region' }),
172
- entity('Tashkent City', { uzLatn: ['Toshkent shahri'], uzCyrl: ['Тошкент шаҳри'], ru: ['город Ташкент', 'г. Ташкент'], en: ['Tashkent City'] }, { country: 'UZ', type: 'region' }),
173
- ]);
174
-
175
- export const KZ_REGIONS = Object.freeze([
176
- entity('Abai Region', { kk: ['Абай облысы'], ru: ['Абайская область'], en: ['Abai Region'] }, { country: 'KZ', type: 'region' }),
177
- entity('Akmola Region', { kk: ['Ақмола облысы'], ru: ['Акмолинская область'], en: ['Akmola Region'] }, { country: 'KZ', type: 'region' }),
178
- entity('Aktobe Region', { kk: ['Ақтөбе облысы'], ru: ['Актюбинская область'], en: ['Aktobe Region'] }, { country: 'KZ', type: 'region' }),
179
- entity('Almaty Region', { kk: ['Алматы облысы'], ru: ['Алматинская область'], en: ['Almaty Region'] }, { country: 'KZ', type: 'region' }),
180
- entity('Atyrau Region', { kk: ['Атырау облысы'], ru: ['Атырауская область'], en: ['Atyrau Region'] }, { country: 'KZ', type: 'region' }),
181
- entity('East Kazakhstan Region', { kk: ['Шығыс Қазақстан облысы'], ru: ['Восточно-Казахстанская область'], en: ['East Kazakhstan Region'] }, { country: 'KZ', type: 'region' }),
182
- entity('Jambyl Region', { kk: ['Жамбыл облысы'], ru: ['Жамбылская область'], en: ['Jambyl Region', 'Zhambyl Region'] }, { country: 'KZ', type: 'region' }),
183
- entity('Jetisu Region', { kk: ['Жетісу облысы'], ru: ['Жетысуская область'], en: ['Jetisu Region', 'Zhetysu Region'] }, { country: 'KZ', type: 'region' }),
184
- entity('Karaganda Region', { kk: ['Қарағанды облысы'], ru: ['Карагандинская область'], en: ['Karaganda Region'] }, { country: 'KZ', type: 'region' }),
185
- entity('Kostanay Region', { kk: ['Қостанай облысы'], ru: ['Костанайская область'], en: ['Kostanay Region'] }, { country: 'KZ', type: 'region' }),
186
- entity('Kyzylorda Region', { kk: ['Қызылорда облысы'], ru: ['Кызылординская область'], en: ['Kyzylorda Region'] }, { country: 'KZ', type: 'region' }),
187
- entity('Mangystau Region', { kk: ['Маңғыстау облысы'], ru: ['Мангистауская область'], en: ['Mangystau Region'] }, { country: 'KZ', type: 'region' }),
188
- entity('North Kazakhstan Region', { kk: ['Солтүстік Қазақстан облысы'], ru: ['Северо-Казахстанская область'], en: ['North Kazakhstan Region'] }, { country: 'KZ', type: 'region' }),
189
- entity('Pavlodar Region', { kk: ['Павлодар облысы'], ru: ['Павлодарская область'], en: ['Pavlodar Region'] }, { country: 'KZ', type: 'region' }),
190
- entity('Turkistan Region', { kk: ['Түркістан облысы'], ru: ['Туркестанская область'], en: ['Turkistan Region'] }, { country: 'KZ', type: 'region' }),
191
- entity('Ulytau Region', { kk: ['Ұлытау облысы'], ru: ['Улытауская область'], en: ['Ulytau Region'] }, { country: 'KZ', type: 'region' }),
192
- entity('West Kazakhstan Region', { kk: ['Батыс Қазақстан облысы'], ru: ['Западно-Казахстанская область'], en: ['West Kazakhstan Region'] }, { country: 'KZ', type: 'region' }),
193
- entity('Astana City', { kk: ['Астана қаласы'], ru: ['город Астана'], en: ['Astana City'] }, { country: 'KZ', type: 'region' }),
194
- entity('Almaty City', { kk: ['Алматы қаласы'], ru: ['город Алматы'], en: ['Almaty City'] }, { country: 'KZ', type: 'region' }),
195
- entity('Shymkent City', { kk: ['Шымкент қаласы'], ru: ['город Шымкент'], en: ['Shymkent City'] }, { country: 'KZ', type: 'region' }),
196
- ]);
197
-
198
- export const REGIONS = Object.freeze([...UZ_REGIONS, ...KZ_REGIONS, ...UA_REGIONS, ...RO_REGIONS]);
199
- export const REGIONS_BY_COUNTRY = Object.freeze(Object.fromEntries(
200
- [...new Set(REGIONS.map((item) => item.country).filter(Boolean))].map((code) => [
201
- code,
202
- Object.freeze(REGIONS.filter((item) => item.country === code)),
203
- ]),
204
- ));
205
-
206
- export function canonicalRegion(value, country = null) {
207
- const code = country ? canonicalCountryCode(country) : null;
208
- const catalog = country ? (code ? (REGIONS_BY_COUNTRY[code] || []) : []) : REGIONS;
209
- return findCanonical(value, catalog, { partial: true })?.canonical || null;
210
- }
1
+ import { UZ_CITIES, KZ_CITIES } from './geography-central-asia.js';
2
+ import { findCanonical } from './normalization.js';
3
+ import { canonicalCountryCode } from './countries.js';
4
+ import { lexiconEntity } from './lexicon-core.js';
5
+ import { RO_CITY_EXTENSIONS } from './romania-geography.js';
6
+
7
+ const entity = (canonical, aliases, extra = {}) => lexiconEntity(canonical, aliases, extra);
8
+
9
+ export const UA_CITIES = Object.freeze([
10
+ entity('Kyiv', { uk: ['Київ'], ru: ['Киев'], en: ['Kyiv', 'Kiev'], ro: ['Kiev'] }, { country: 'UA', type: 'city' }),
11
+ entity('Kharkiv', { uk: ['Харків'], ru: ['Харьков'], en: ['Kharkiv', 'Kharkov'], ro: ['Harkiv'] }, { country: 'UA', type: 'city' }),
12
+ entity('Odesa', { uk: ['Одеса'], ru: ['Одесса'], en: ['Odesa', 'Odessa'], ro: ['Odesa'] }, { country: 'UA', type: 'city' }),
13
+ entity('Dnipro', { uk: ['Дніпро'], ru: ['Днепр'], en: ['Dnipro', 'Dnepr'], ro: ['Dnipro'] }, { country: 'UA', type: 'city' }),
14
+ entity('Lviv', { uk: ['Львів'], ru: ['Львов'], en: ['Lviv', 'Lvov'], ro: ['Liov', 'Lviv'] }, { country: 'UA', type: 'city' }),
15
+ entity('Zaporizhzhia', { uk: ['Запоріжжя'], ru: ['Запорожье'], en: ['Zaporizhzhia', 'Zaporozhye'], ro: ['Zaporijjea'] }, { country: 'UA', type: 'city' }),
16
+ entity('Vinnytsia', { uk: ['Вінниця'], ru: ['Винница'], en: ['Vinnytsia', 'Vinnitsa'], ro: ['Vinița', 'Vinnytsia'] }, { country: 'UA', type: 'city' }),
17
+ entity('Ivano-Frankivsk', { uk: ['Івано-Франківськ', 'Франківськ'], ru: ['Ивано-Франковск'], en: ['Ivano-Frankivsk', 'Frankivsk'], ro: ['Ivano-Frankivsk'] }, { country: 'UA', type: 'city' }),
18
+ entity('Chernivtsi', { uk: ['Чернівці'], ru: ['Черновцы'], en: ['Chernivtsi', 'Chernovtsy'], ro: ['Cernăuți', 'Cernivți'] }, { country: 'UA', type: 'city' }),
19
+ entity('Uzhhorod', { uk: ['Ужгород'], ru: ['Ужгород'], en: ['Uzhhorod', 'Uzhgorod'], ro: ['Ujhorod'] }, { country: 'UA', type: 'city' }),
20
+ entity('Mukachevo', { uk: ['Мукачево', 'Мукачеве'], ru: ['Мукачево'], en: ['Mukachevo', 'Mukacheve'], ro: ['Muncaci', 'Mukachevo'] }, { country: 'UA', type: 'city' }),
21
+ entity('Lutsk', { uk: ['Луцьк'], ru: ['Луцк'], en: ['Lutsk'], ro: ['Luțk'] }, { country: 'UA', type: 'city' }),
22
+ entity('Rivne', { uk: ['Рівне'], ru: ['Ровно'], en: ['Rivne', 'Rovno'], ro: ['Rivne'] }, { country: 'UA', type: 'city' }),
23
+ entity('Ternopil', { uk: ['Тернопіль'], ru: ['Тернополь'], en: ['Ternopil', 'Ternopol'], ro: ['Ternopil'] }, { country: 'UA', type: 'city' }),
24
+ entity('Khmelnytskyi', { uk: ['Хмельницький'], ru: ['Хмельницкий'], en: ['Khmelnytskyi', 'Khmelnitsky'], ro: ['Hmelnițki'] }, { country: 'UA', type: 'city' }),
25
+ entity('Zhytomyr', { uk: ['Житомир'], ru: ['Житомир'], en: ['Zhytomyr', 'Zhitomir'], ro: ['Jîtomîr'] }, { country: 'UA', type: 'city' }),
26
+ entity('Cherkasy', { uk: ['Черкаси'], ru: ['Черкассы'], en: ['Cherkasy', 'Cherkassy'], ro: ['Cerkasî'] }, { country: 'UA', type: 'city' }),
27
+ entity('Poltava', { uk: ['Полтава'], ru: ['Полтава'], en: ['Poltava'], ro: ['Poltava'] }, { country: 'UA', type: 'city' }),
28
+ entity('Chernihiv', { uk: ['Чернігів'], ru: ['Чернигов'], en: ['Chernihiv', 'Chernigov'], ro: ['Cernihiv'] }, { country: 'UA', type: 'city' }),
29
+ entity('Sumy', { uk: ['Суми'], ru: ['Сумы'], en: ['Sumy'], ro: ['Sumî'] }, { country: 'UA', type: 'city' }),
30
+ entity('Mykolaiv', { uk: ['Миколаїв'], ru: ['Николаев'], en: ['Mykolaiv', 'Nikolaev'], ro: ['Mîkolaiiv'] }, { country: 'UA', type: 'city' }),
31
+ entity('Kherson', { uk: ['Херсон'], ru: ['Херсон'], en: ['Kherson'], ro: ['Herson'] }, { country: 'UA', type: 'city' }),
32
+ entity('Kropyvnytskyi', { uk: ['Кропивницький'], ru: ['Кропивницкий', 'Кировоград'], en: ['Kropyvnytskyi', 'Kirovohrad'], ro: ['Kropîvnîțkîi'] }, { country: 'UA', type: 'city' }),
33
+ entity('Irpin', { uk: ['Ірпінь'], ru: ['Ирпень'], en: ['Irpin'], ro: ['Irpin'] }, { country: 'UA', type: 'city' }),
34
+ entity('Bucha', { uk: ['Буча'], ru: ['Буча'], en: ['Bucha'], ro: ['Bucea'] }, { country: 'UA', type: 'city' }),
35
+ entity('Brovary', { uk: ['Бровари'], ru: ['Бровары'], en: ['Brovary'], ro: ['Brovary'] }, { country: 'UA', type: 'city' }),
36
+ entity('Bila Tserkva', { uk: ['Біла Церква'], ru: ['Белая Церковь'], en: ['Bila Tserkva'], ro: ['Bila Țerkva'] }, { country: 'UA', type: 'city' }),
37
+ entity('Kryvyi Rih', { uk: ['Кривий Ріг'], ru: ['Кривой Рог'], en: ['Kryvyi Rih', 'Krivoy Rog'], ro: ['Krîvîi Rih'] }, { country: 'UA', type: 'city' }),
38
+ entity('Kremenchuk', { uk: ['Кременчук'], ru: ['Кременчуг'], en: ['Kremenchuk'], ro: ['Kremenciuk'] }, { country: 'UA', type: 'city' }),
39
+ entity('Uman', { uk: ['Умань'], ru: ['Умань'], en: ['Uman'], ro: ['Uman'] }, { country: 'UA', type: 'city' }),
40
+ ]);
41
+
42
+ const RO_CITIES_BASE = Object.freeze([
43
+ entity('Bucharest', { ro: ['București', 'Bucuresti'], en: ['Bucharest'], ru: ['Бухарест'], uk: ['Бухарест'] }, { country: 'RO', type: 'city' }),
44
+ entity('Cluj-Napoca', { ro: ['Cluj-Napoca', 'Cluj'], en: ['Cluj-Napoca', 'Cluj'], ru: ['Клуж-Напока', 'Клуж'], uk: ['Клуж-Напока'] }, { country: 'RO', type: 'city' }),
45
+ entity('Timisoara', { ro: ['Timișoara', 'Timisoara'], en: ['Timisoara', 'Timișoara'], ru: ['Тимишоара'], uk: ['Тімішоара'] }, { country: 'RO', type: 'city' }),
46
+ entity('Iasi', { ro: ['Iași', 'Iasi'], en: ['Iasi', 'Iași'], ru: ['Яссы'], uk: ['Ясси'] }, { country: 'RO', type: 'city' }),
47
+ entity('Brasov', { ro: ['Brașov', 'Brasov'], en: ['Brasov', 'Brașov'], ru: ['Брашов'], uk: ['Брашов'] }, { country: 'RO', type: 'city' }),
48
+ entity('Constanta', { ro: ['Constanța', 'Constanta'], en: ['Constanta', 'Constanța'], ru: ['Констанца'], uk: ['Констанца'] }, { country: 'RO', type: 'city' }),
49
+ entity('Oradea', { ro: ['Oradea'], en: ['Oradea'], ru: ['Орадя'], uk: ['Орадя'] }, { country: 'RO', type: 'city' }),
50
+ entity('Sibiu', { ro: ['Sibiu'], en: ['Sibiu'], ru: ['Сибиу'], uk: ['Сібіу'] }, { country: 'RO', type: 'city' }),
51
+ entity('Craiova', { ro: ['Craiova'], en: ['Craiova'], ru: ['Крайова'], uk: ['Крайова'] }, { country: 'RO', type: 'city' }),
52
+ entity('Ploiesti', { ro: ['Ploiești', 'Ploiesti'], en: ['Ploiesti', 'Ploiești'], ru: ['Плоешти'], uk: ['Плоєшті'] }, { country: 'RO', type: 'city' }),
53
+ entity('Galati', { ro: ['Galați', 'Galati'], en: ['Galati', 'Galați'], ru: ['Галац'], uk: ['Галац'] }, { country: 'RO', type: 'city' }),
54
+ entity('Arad', { ro: ['Arad'], en: ['Arad'], ru: ['Арад'], uk: ['Арад'] }, { country: 'RO', type: 'city' }),
55
+ ]);
56
+
57
+ export const RO_CITIES = Object.freeze([...RO_CITIES_BASE, ...RO_CITY_EXTENSIONS]);
58
+
59
+ export const KG_CITIES = Object.freeze([
60
+ entity('Bishkek', { ru: ['Бишкек'], en: ['Bishkek'], kk: ['Бішкек'], uzLatn: ['Bishkek'] }, { country: 'KG', type: 'city' }),
61
+ entity('Osh', { ru: ['Ош'], en: ['Osh'], kk: ['Ош'], uzLatn: ['Osh'] }, { country: 'KG', type: 'city' }),
62
+ entity('Karakol', { ru: ['Каракол'], en: ['Karakol'], kk: ['Қаракөл'], uzLatn: ['Karakol'] }, { country: 'KG', type: 'city' }),
63
+
64
+ ]);
65
+
66
+ /** Canonical cities used across global hiring and housing ingestion. */
67
+ export const GLOBAL_CITIES = Object.freeze([
68
+ entity('Tbilisi', { en: ['Tbilisi'], ru: ['Тбилиси'] }, { country: 'GE', type: 'city' }),
69
+ entity('Batumi', { en: ['Batumi'], ru: ['Батуми'] }, { country: 'GE', type: 'city' }),
70
+ entity('Baku', { en: ['Baku'], ru: ['Баку'] }, { country: 'AZ', type: 'city' }),
71
+ entity('Yerevan', { en: ['Yerevan'], ru: ['Ереван'], uk: ['Єреван'] }, { country: 'AM', type: 'city' }),
72
+ entity('Chisinau', { en: ['Chisinau'], ro: ['Chișinău', 'Chişinău'], ru: ['Кишинёв', 'Кишинев'] }, { country: 'MD', type: 'city' }),
73
+ entity('Dushanbe', { en: ['Dushanbe'], ru: ['Душанбе'] }, { country: 'TJ', type: 'city' }),
74
+ entity('Ashgabat', { en: ['Ashgabat'], ru: ['Ашхабад'] }, { country: 'TM', type: 'city' }),
75
+ entity('Warsaw', { en: ['Warsaw'], all: ['Warszawa'], ru: ['Варшава'] }, { country: 'PL', type: 'city' }),
76
+ entity('Krakow', { en: ['Krakow'], all: ['Kraków'], ru: ['Краков'] }, { country: 'PL', type: 'city' }),
77
+ entity('Berlin', { en: ['Berlin'], ru: ['Берлин'] }, { country: 'DE', type: 'city' }),
78
+ entity('Munich', { en: ['Munich'], all: ['München'], ru: ['Мюнхен'] }, { country: 'DE', type: 'city' }),
79
+ entity('London', { en: ['London'], ru: ['Лондон'] }, { country: 'GB', type: 'city' }),
80
+ entity('New York', { en: ['New York', 'New York City', 'NYC'], ru: ['Нью-Йорк', 'Нью Йорк'] }, { country: 'US', type: 'city' }),
81
+ entity('Beijing', { en: ['Beijing'], ru: ['Пекин'], all: ['北京'] }, { country: 'CN', type: 'city' }),
82
+ entity('Shanghai', { en: ['Shanghai'], ru: ['Шанхай'], all: ['上海'] }, { country: 'CN', type: 'city' }),
83
+ entity('Shenzhen', { en: ['Shenzhen'], ru: ['Шэньчжэнь'], all: ['深圳'] }, { country: 'CN', type: 'city' }),
84
+ entity('Guangzhou', { en: ['Guangzhou'], ru: ['Гуанчжоу'], all: ['广州'] }, { country: 'CN', type: 'city' }),
85
+ entity('Hangzhou', { en: ['Hangzhou'], ru: ['Ханчжоу'], all: ['杭州'] }, { country: 'CN', type: 'city' }),
86
+ entity('Tokyo', { en: ['Tokyo'], ru: ['Токио'], all: ['東京'] }, { country: 'JP', type: 'city' }),
87
+ entity('Osaka', { en: ['Osaka'], ru: ['Осака'], all: ['大阪'] }, { country: 'JP', type: 'city' }),
88
+ entity('Kyoto', { en: ['Kyoto'], ru: ['Киото'], all: ['京都'] }, { country: 'JP', type: 'city' }),
89
+ entity('Seoul', { en: ['Seoul'], ru: ['Сеул'], all: ['서울'] }, { country: 'KR', type: 'city' }),
90
+ entity('Busan', { en: ['Busan'], ru: ['Пусан'], all: ['부산'] }, { country: 'KR', type: 'city' }),
91
+ entity('Taipei', { en: ['Taipei'], ru: ['Тайбэй'], all: ['台北'] }, { country: 'TW', type: 'city' }),
92
+ entity('Kaohsiung', { en: ['Kaohsiung'], ru: ['Гаосюн'], all: ['高雄'] }, { country: 'TW', type: 'city' }),
93
+ entity('Taichung', { en: ['Taichung'], ru: ['Тайчжун'], all: ['台中'] }, { country: 'TW', type: 'city' }),
94
+ ]);
95
+
96
+ export const CITIES = Object.freeze([...UZ_CITIES, ...KZ_CITIES, ...UA_CITIES, ...RO_CITIES, ...KG_CITIES, ...GLOBAL_CITIES]);
97
+ export const CITIES_BY_COUNTRY = Object.freeze(Object.fromEntries(
98
+ [...new Set(CITIES.map((item) => item.country).filter(Boolean))].map((code) => [
99
+ code,
100
+ Object.freeze(CITIES.filter((item) => item.country === code)),
101
+ ]),
102
+ ));
103
+
104
+ export function canonicalCity(value, country = null) {
105
+ const code = country ? canonicalCountryCode(country) : null;
106
+ const catalog = country ? (code ? (CITIES_BY_COUNTRY[code] || []) : []) : CITIES;
107
+ return findCanonical(value, catalog)?.canonical || null;
108
+ }
109
+
110
+ // Backward-compatible aliases. New code should use CITIES/CITIES_BY_COUNTRY/canonicalCity.
111
+ export const GEOGRAPHY_CITIES = CITIES;
112
+ export const GEOGRAPHY_CITIES_BY_COUNTRY = CITIES_BY_COUNTRY;
113
+ export function canonicalAnyCity(value, country = null) {
114
+ return canonicalCity(value, country);
115
+ }
116
+
117
+ export const UA_REGIONS = Object.freeze([
118
+ entity('Vinnytsia Oblast', { uk: ['Вінницька область'], ru: ['Винницкая область'], en: ['Vinnytsia Oblast'] }, { country: 'UA', type: 'region' }),
119
+ entity('Volyn Oblast', { uk: ['Волинська область'], ru: ['Волынская область'], en: ['Volyn Oblast'] }, { country: 'UA', type: 'region' }),
120
+ entity('Dnipropetrovsk Oblast', { uk: ['Дніпропетровська область'], ru: ['Днепропетровская область'], en: ['Dnipropetrovsk Oblast'] }, { country: 'UA', type: 'region' }),
121
+ entity('Donetsk Oblast', { uk: ['Донецька область'], ru: ['Донецкая область'], en: ['Donetsk Oblast'] }, { country: 'UA', type: 'region' }),
122
+ entity('Zhytomyr Oblast', { uk: ['Житомирська область'], ru: ['Житомирская область'], en: ['Zhytomyr Oblast'] }, { country: 'UA', type: 'region' }),
123
+ entity('Zakarpattia Oblast', { uk: ['Закарпатська область'], ru: ['Закарпатская область'], en: ['Zakarpattia Oblast', 'Transcarpathia'] }, { country: 'UA', type: 'region' }),
124
+ entity('Zaporizhzhia Oblast', { uk: ['Запорізька область'], ru: ['Запорожская область'], en: ['Zaporizhzhia Oblast'] }, { country: 'UA', type: 'region' }),
125
+ entity('Ivano-Frankivsk Oblast', { uk: ['Івано-Франківська область'], ru: ['Ивано-Франковская область'], en: ['Ivano-Frankivsk Oblast'] }, { country: 'UA', type: 'region' }),
126
+ entity('Kyiv Oblast', { uk: ['Київська область', 'Київщина'], ru: ['Киевская область', 'Киевщина'], en: ['Kyiv Oblast', 'Kyiv Region'] }, { country: 'UA', type: 'region' }),
127
+ entity('Kirovohrad Oblast', { uk: ['Кіровоградська область'], ru: ['Кировоградская область'], en: ['Kirovohrad Oblast'] }, { country: 'UA', type: 'region' }),
128
+ entity('Luhansk Oblast', { uk: ['Луганська область'], ru: ['Луганская область'], en: ['Luhansk Oblast'] }, { country: 'UA', type: 'region' }),
129
+ entity('Lviv Oblast', { uk: ['Львівська область', 'Львівщина'], ru: ['Львовская область'], en: ['Lviv Oblast'] }, { country: 'UA', type: 'region' }),
130
+ entity('Mykolaiv Oblast', { uk: ['Миколаївська область'], ru: ['Николаевская область'], en: ['Mykolaiv Oblast'] }, { country: 'UA', type: 'region' }),
131
+ entity('Odesa Oblast', { uk: ['Одеська область', 'Одещина'], ru: ['Одесская область'], en: ['Odesa Oblast', 'Odessa Oblast'] }, { country: 'UA', type: 'region' }),
132
+ entity('Poltava Oblast', { uk: ['Полтавська область'], ru: ['Полтавская область'], en: ['Poltava Oblast'] }, { country: 'UA', type: 'region' }),
133
+ entity('Rivne Oblast', { uk: ['Рівненська область'], ru: ['Ровенская область'], en: ['Rivne Oblast'] }, { country: 'UA', type: 'region' }),
134
+ entity('Sumy Oblast', { uk: ['Сумська область'], ru: ['Сумская область'], en: ['Sumy Oblast'] }, { country: 'UA', type: 'region' }),
135
+ entity('Ternopil Oblast', { uk: ['Тернопільська область'], ru: ['Тернопольская область'], en: ['Ternopil Oblast'] }, { country: 'UA', type: 'region' }),
136
+ entity('Kharkiv Oblast', { uk: ['Харківська область', 'Харківщина'], ru: ['Харьковская область'], en: ['Kharkiv Oblast'] }, { country: 'UA', type: 'region' }),
137
+ entity('Kherson Oblast', { uk: ['Херсонська область'], ru: ['Херсонская область'], en: ['Kherson Oblast'] }, { country: 'UA', type: 'region' }),
138
+ entity('Khmelnytskyi Oblast', { uk: ['Хмельницька область'], ru: ['Хмельницкая область'], en: ['Khmelnytskyi Oblast'] }, { country: 'UA', type: 'region' }),
139
+ entity('Cherkasy Oblast', { uk: ['Черкаська область'], ru: ['Черкасская область'], en: ['Cherkasy Oblast'] }, { country: 'UA', type: 'region' }),
140
+ entity('Chernivtsi Oblast', { uk: ['Чернівецька область'], ru: ['Черновицкая область'], ro: ['Regiunea Cernăuți'], en: ['Chernivtsi Oblast'] }, { country: 'UA', type: 'region' }),
141
+ entity('Chernihiv Oblast', { uk: ['Чернігівська область'], ru: ['Черниговская область'], en: ['Chernihiv Oblast'] }, { country: 'UA', type: 'region' }),
142
+ entity('Autonomous Republic of Crimea', { uk: ['Автономна Республіка Крим', 'АР Крим'], ru: ['Автономная Республика Крым', 'АР Крым'], en: ['Autonomous Republic of Crimea', 'Crimea'] }, { country: 'UA', type: 'region' }),
143
+ entity('Kyiv City', { uk: ['місто Київ', 'м. Київ'], ru: ['город Киев', 'г. Киев'], en: ['Kyiv City'] }, { country: 'UA', type: 'region' }),
144
+ entity('Sevastopol City', { uk: ['місто Севастополь', 'м. Севастополь'], ru: ['город Севастополь', 'г. Севастополь'], en: ['Sevastopol City'] }, { country: 'UA', type: 'region' }),
145
+ ]);
146
+
147
+ const RO_COUNTY_NAMES = [
148
+ ['Alba','Alba'],['Arad','Arad'],['Arges','Argeș'],['Bacau','Bacău'],['Bihor','Bihor'],['Bistrita-Nasaud','Bistrița-Năsăud'],['Botosani','Botoșani'],['Braila','Brăila'],['Brasov','Brașov'],['Buzau','Buzău'],
149
+ ['Calarasi','Călărași'],['Caras-Severin','Caraș-Severin'],['Cluj','Cluj'],['Constanta','Constanța'],['Covasna','Covasna'],['Dambovita','Dâmbovița'],['Dolj','Dolj'],['Galati','Galați'],['Giurgiu','Giurgiu'],['Gorj','Gorj'],
150
+ ['Harghita','Harghita'],['Hunedoara','Hunedoara'],['Ialomita','Ialomița'],['Iasi','Iași'],['Ilfov','Ilfov'],['Maramures','Maramureș'],['Mehedinti','Mehedinți'],['Mures','Mureș'],['Neamt','Neamț'],['Olt','Olt'],
151
+ ['Prahova','Prahova'],['Salaj','Sălaj'],['Satu Mare','Satu Mare'],['Sibiu','Sibiu'],['Suceava','Suceava'],['Teleorman','Teleorman'],['Timis','Timiș'],['Tulcea','Tulcea'],['Valcea','Vâlcea'],['Vaslui','Vaslui'],['Vrancea','Vrancea'],
152
+ ];
153
+ export const RO_REGIONS = Object.freeze([
154
+ ...RO_COUNTY_NAMES.map(([canonical, native]) => entity(`${canonical} County`, { ro: [`județul ${native}`, `județ ${native}`, native], en: [`${canonical} County`], ru: [`жудец ${native}`], uk: [`жудець ${native}`] }, { country: 'RO', type: 'region' })),
155
+ entity('Bucharest Municipality', { ro: ['Municipiul București', 'București'], en: ['Bucharest Municipality'], ru: ['муниципий Бухарест'], uk: ['муніципій Бухарест'] }, { country: 'RO', type: 'region' }),
156
+ ]);
157
+
158
+ export const UZ_REGIONS = Object.freeze([
159
+ entity('Tashkent Region', { uzLatn: ['Toshkent viloyati'], uzCyrl: ['Тошкент вилояти'], ru: ['Ташкентская область'], en: ['Tashkent Region'] }, { country: 'UZ', type: 'region' }),
160
+ entity('Andijan Region', { uzLatn: ['Andijon viloyati'], uzCyrl: ['Андижон вилояти'], ru: ['Андижанская область'], en: ['Andijan Region'] }, { country: 'UZ', type: 'region' }),
161
+ entity('Bukhara Region', { uzLatn: ['Buxoro viloyati'], uzCyrl: ['Бухоро вилояти'], ru: ['Бухарская область'], en: ['Bukhara Region'] }, { country: 'UZ', type: 'region' }),
162
+ entity('Fergana Region', { uzLatn: ["Farg'ona viloyati", 'Farg‘ona viloyati'], uzCyrl: ['Фарғона вилояти'], ru: ['Ферганская область'], en: ['Fergana Region'] }, { country: 'UZ', type: 'region' }),
163
+ entity('Jizzakh Region', { uzLatn: ['Jizzax viloyati'], uzCyrl: ['Жиззах вилояти'], ru: ['Джизакская область'], en: ['Jizzakh Region'] }, { country: 'UZ', type: 'region' }),
164
+ entity('Namangan Region', { uzLatn: ['Namangan viloyati'], uzCyrl: ['Наманган вилояти'], ru: ['Наманганская область'], en: ['Namangan Region'] }, { country: 'UZ', type: 'region' }),
165
+ entity('Navoiy Region', { uzLatn: ['Navoiy viloyati'], uzCyrl: ['Навоий вилояти'], ru: ['Навоийская область'], en: ['Navoiy Region'] }, { country: 'UZ', type: 'region' }),
166
+ entity('Qashqadaryo Region', { uzLatn: ['Qashqadaryo viloyati'], uzCyrl: ['Қашқадарё вилояти'], ru: ['Кашкадарьинская область'], en: ['Qashqadaryo Region', 'Kashkadarya Region'] }, { country: 'UZ', type: 'region' }),
167
+ entity('Samarqand Region', { uzLatn: ['Samarqand viloyati'], uzCyrl: ['Самарқанд вилояти'], ru: ['Самаркандская область'], en: ['Samarqand Region', 'Samarkand Region'] }, { country: 'UZ', type: 'region' }),
168
+ entity('Surxondaryo Region', { uzLatn: ['Surxondaryo viloyati'], uzCyrl: ['Сурхондарё вилояти'], ru: ['Сурхандарьинская область'], en: ['Surxondaryo Region', 'Surkhandarya Region'] }, { country: 'UZ', type: 'region' }),
169
+ entity('Sirdaryo Region', { uzLatn: ['Sirdaryo viloyati'], uzCyrl: ['Сирдарё вилояти'], ru: ['Сырдарьинская область'], en: ['Sirdaryo Region', 'Syrdarya Region'] }, { country: 'UZ', type: 'region' }),
170
+ entity('Xorazm Region', { uzLatn: ['Xorazm viloyati'], uzCyrl: ['Хоразм вилояти'], ru: ['Хорезмская область'], en: ['Xorazm Region', 'Khorezm Region'] }, { country: 'UZ', type: 'region' }),
171
+ entity('Karakalpakstan', { uzLatn: ["Qoraqalpog'iston Respublikasi", 'Qoraqalpog‘iston Respublikasi'], uzCyrl: ['Қорақалпоғистон Республикаси'], ru: ['Республика Каракалпакстан', 'Каракалпакстан'], en: ['Republic of Karakalpakstan', 'Karakalpakstan'] }, { country: 'UZ', type: 'region' }),
172
+ entity('Tashkent City', { uzLatn: ['Toshkent shahri'], uzCyrl: ['Тошкент шаҳри'], ru: ['город Ташкент', 'г. Ташкент'], en: ['Tashkent City'] }, { country: 'UZ', type: 'region' }),
173
+ ]);
174
+
175
+ export const KZ_REGIONS = Object.freeze([
176
+ entity('Abai Region', { kk: ['Абай облысы'], ru: ['Абайская область'], en: ['Abai Region'] }, { country: 'KZ', type: 'region' }),
177
+ entity('Akmola Region', { kk: ['Ақмола облысы'], ru: ['Акмолинская область'], en: ['Akmola Region'] }, { country: 'KZ', type: 'region' }),
178
+ entity('Aktobe Region', { kk: ['Ақтөбе облысы'], ru: ['Актюбинская область'], en: ['Aktobe Region'] }, { country: 'KZ', type: 'region' }),
179
+ entity('Almaty Region', { kk: ['Алматы облысы'], ru: ['Алматинская область'], en: ['Almaty Region'] }, { country: 'KZ', type: 'region' }),
180
+ entity('Atyrau Region', { kk: ['Атырау облысы'], ru: ['Атырауская область'], en: ['Atyrau Region'] }, { country: 'KZ', type: 'region' }),
181
+ entity('East Kazakhstan Region', { kk: ['Шығыс Қазақстан облысы'], ru: ['Восточно-Казахстанская область'], en: ['East Kazakhstan Region'] }, { country: 'KZ', type: 'region' }),
182
+ entity('Jambyl Region', { kk: ['Жамбыл облысы'], ru: ['Жамбылская область'], en: ['Jambyl Region', 'Zhambyl Region'] }, { country: 'KZ', type: 'region' }),
183
+ entity('Jetisu Region', { kk: ['Жетісу облысы'], ru: ['Жетысуская область'], en: ['Jetisu Region', 'Zhetysu Region'] }, { country: 'KZ', type: 'region' }),
184
+ entity('Karaganda Region', { kk: ['Қарағанды облысы'], ru: ['Карагандинская область'], en: ['Karaganda Region'] }, { country: 'KZ', type: 'region' }),
185
+ entity('Kostanay Region', { kk: ['Қостанай облысы'], ru: ['Костанайская область'], en: ['Kostanay Region'] }, { country: 'KZ', type: 'region' }),
186
+ entity('Kyzylorda Region', { kk: ['Қызылорда облысы'], ru: ['Кызылординская область'], en: ['Kyzylorda Region'] }, { country: 'KZ', type: 'region' }),
187
+ entity('Mangystau Region', { kk: ['Маңғыстау облысы'], ru: ['Мангистауская область'], en: ['Mangystau Region'] }, { country: 'KZ', type: 'region' }),
188
+ entity('North Kazakhstan Region', { kk: ['Солтүстік Қазақстан облысы'], ru: ['Северо-Казахстанская область'], en: ['North Kazakhstan Region'] }, { country: 'KZ', type: 'region' }),
189
+ entity('Pavlodar Region', { kk: ['Павлодар облысы'], ru: ['Павлодарская область'], en: ['Pavlodar Region'] }, { country: 'KZ', type: 'region' }),
190
+ entity('Turkistan Region', { kk: ['Түркістан облысы'], ru: ['Туркестанская область'], en: ['Turkistan Region'] }, { country: 'KZ', type: 'region' }),
191
+ entity('Ulytau Region', { kk: ['Ұлытау облысы'], ru: ['Улытауская область'], en: ['Ulytau Region'] }, { country: 'KZ', type: 'region' }),
192
+ entity('West Kazakhstan Region', { kk: ['Батыс Қазақстан облысы'], ru: ['Западно-Казахстанская область'], en: ['West Kazakhstan Region'] }, { country: 'KZ', type: 'region' }),
193
+ entity('Astana City', { kk: ['Астана қаласы'], ru: ['город Астана'], en: ['Astana City'] }, { country: 'KZ', type: 'region' }),
194
+ entity('Almaty City', { kk: ['Алматы қаласы'], ru: ['город Алматы'], en: ['Almaty City'] }, { country: 'KZ', type: 'region' }),
195
+ entity('Shymkent City', { kk: ['Шымкент қаласы'], ru: ['город Шымкент'], en: ['Shymkent City'] }, { country: 'KZ', type: 'region' }),
196
+ ]);
197
+
198
+ export const REGIONS = Object.freeze([...UZ_REGIONS, ...KZ_REGIONS, ...UA_REGIONS, ...RO_REGIONS]);
199
+ export const REGIONS_BY_COUNTRY = Object.freeze(Object.fromEntries(
200
+ [...new Set(REGIONS.map((item) => item.country).filter(Boolean))].map((code) => [
201
+ code,
202
+ Object.freeze(REGIONS.filter((item) => item.country === code)),
203
+ ]),
204
+ ));
205
+
206
+ export function canonicalRegion(value, country = null) {
207
+ const code = country ? canonicalCountryCode(country) : null;
208
+ const catalog = country ? (code ? (REGIONS_BY_COUNTRY[code] || []) : []) : REGIONS;
209
+ return findCanonical(value, catalog, { partial: true })?.canonical || null;
210
+ }