@coffer-org/sdk 1.8.0 → 2.0.0

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.
@@ -1,6 +1,9 @@
1
1
  export interface Country {
2
2
  code: string;
3
3
  name: string;
4
+ nameRu: string;
5
+ nameEn: string;
4
6
  }
5
7
  export declare const COUNTRIES: Country[];
6
8
  export declare const COUNTRIES_BY_CODE: Map<string, Country>;
9
+ export declare function resolveCountryCode(raw: unknown): string | null;
package/dist/countries.js CHANGED
@@ -1,196 +1,261 @@
1
1
  export const COUNTRIES = [
2
- { code: 'AF', name: 'Афганістан' },
3
- { code: 'AL', name: 'Албанія' },
4
- { code: 'DZ', name: 'Алжир' },
5
- { code: 'AD', name: 'Андорра' },
6
- { code: 'AO', name: 'Ангола' },
7
- { code: 'AG', name: 'Антигуа і Барбуда' },
8
- { code: 'AR', name: 'Аргентина' },
9
- { code: 'AM', name: 'Вірменія' },
10
- { code: 'AU', name: 'Австралія' },
11
- { code: 'AT', name: 'Австрія' },
12
- { code: 'AZ', name: 'Азербайджан' },
13
- { code: 'BS', name: 'Багамські Острови' },
14
- { code: 'BH', name: 'Бахрейн' },
15
- { code: 'BD', name: 'Бангладеш' },
16
- { code: 'BY', name: 'Білорусь' },
17
- { code: 'BE', name: 'Бельгія' },
18
- { code: 'BZ', name: 'Беліз' },
19
- { code: 'BJ', name: 'Бенін' },
20
- { code: 'BT', name: 'Бутан' },
21
- { code: 'BO', name: 'Болівія' },
22
- { code: 'BA', name: 'Боснія і Герцеговина' },
23
- { code: 'BW', name: 'Ботсвана' },
24
- { code: 'BR', name: 'Бразилія' },
25
- { code: 'BN', name: 'Бруней' },
26
- { code: 'BG', name: 'Болгарія' },
27
- { code: 'BF', name: 'Буркіна-Фасо' },
28
- { code: 'BI', name: 'Бурунді' },
29
- { code: 'CV', name: 'Кабо-Верде' },
30
- { code: 'KH', name: 'Камбоджа' },
31
- { code: 'CM', name: 'Камерун' },
32
- { code: 'CA', name: 'Канада' },
33
- { code: 'CF', name: 'ЦАР' },
34
- { code: 'TD', name: 'Чад' },
35
- { code: 'CL', name: 'Чилі' },
36
- { code: 'CN', name: 'Китай' },
37
- { code: 'CO', name: 'Колумбія' },
38
- { code: 'KM', name: 'Комори' },
39
- { code: 'CG', name: 'Конго' },
40
- { code: 'CD', name: 'ДР Конго' },
41
- { code: 'CR', name: 'Коста-Рика' },
42
- { code: 'CI', name: "Кот-д'Івуар" },
43
- { code: 'HR', name: 'Хорватія' },
44
- { code: 'CU', name: 'Куба' },
45
- { code: 'CY', name: 'Кіпр' },
46
- { code: 'CZ', name: 'Чехія' },
47
- { code: 'DK', name: 'Данія' },
48
- { code: 'DJ', name: 'Джибуті' },
49
- { code: 'DM', name: 'Домініка' },
50
- { code: 'DO', name: 'Домініканська Республіка' },
51
- { code: 'EC', name: 'Еквадор' },
52
- { code: 'EG', name: 'Єгипет' },
53
- { code: 'SV', name: 'Сальвадор' },
54
- { code: 'GQ', name: 'Екваторіальна Гвінея' },
55
- { code: 'ER', name: 'Еритрея' },
56
- { code: 'EE', name: 'Естонія' },
57
- { code: 'SZ', name: 'Есватіні' },
58
- { code: 'ET', name: 'Ефіопія' },
59
- { code: 'FJ', name: 'Фіджі' },
60
- { code: 'FI', name: 'Фінляндія' },
61
- { code: 'FR', name: 'Франція' },
62
- { code: 'GA', name: 'Габон' },
63
- { code: 'GM', name: 'Гамбія' },
64
- { code: 'GE', name: 'Грузія' },
65
- { code: 'DE', name: 'Німеччина' },
66
- { code: 'GH', name: 'Гана' },
67
- { code: 'GR', name: 'Греція' },
68
- { code: 'GD', name: 'Гренада' },
69
- { code: 'GT', name: 'Гватемала' },
70
- { code: 'GN', name: 'Гвінея' },
71
- { code: 'GW', name: 'Гвінея-Бісау' },
72
- { code: 'GY', name: 'Гаяна' },
73
- { code: 'HT', name: 'Гаїті' },
74
- { code: 'HN', name: 'Гондурас' },
75
- { code: 'HU', name: 'Угорщина' },
76
- { code: 'IS', name: 'Ісландія' },
77
- { code: 'IN', name: 'Індія' },
78
- { code: 'ID', name: 'Індонезія' },
79
- { code: 'IR', name: 'Іран' },
80
- { code: 'IQ', name: 'Ірак' },
81
- { code: 'IE', name: 'Ірландія' },
82
- { code: 'IL', name: 'Ізраїль' },
83
- { code: 'IT', name: 'Італія' },
84
- { code: 'JM', name: 'Ямайка' },
85
- { code: 'JP', name: 'Японія' },
86
- { code: 'JO', name: 'Йорданія' },
87
- { code: 'KZ', name: 'Казахстан' },
88
- { code: 'KE', name: 'Кенія' },
89
- { code: 'KI', name: 'Кірибаті' },
90
- { code: 'KP', name: 'КНДР' },
91
- { code: 'KR', name: 'Південна Корея' },
92
- { code: 'KW', name: 'Кувейт' },
93
- { code: 'KG', name: 'Киргизстан' },
94
- { code: 'LA', name: 'Лаос' },
95
- { code: 'LV', name: 'Латвія' },
96
- { code: 'LB', name: 'Ліван' },
97
- { code: 'LS', name: 'Лесото' },
98
- { code: 'LR', name: 'Ліберія' },
99
- { code: 'LY', name: 'Лівія' },
100
- { code: 'LI', name: 'Ліхтенштейн' },
101
- { code: 'LT', name: 'Литва' },
102
- { code: 'LU', name: 'Люксембург' },
103
- { code: 'MG', name: 'Мадагаскар' },
104
- { code: 'MW', name: 'Малаві' },
105
- { code: 'MY', name: 'Малайзія' },
106
- { code: 'MV', name: 'Мальдіви' },
107
- { code: 'ML', name: 'Малі' },
108
- { code: 'MT', name: 'Мальта' },
109
- { code: 'MH', name: 'Маршаллові Острови' },
110
- { code: 'MR', name: 'Мавританія' },
111
- { code: 'MU', name: 'Маврикій' },
112
- { code: 'MX', name: 'Мексика' },
113
- { code: 'FM', name: 'Мікронезія' },
114
- { code: 'MD', name: 'Молдова' },
115
- { code: 'MC', name: 'Монако' },
116
- { code: 'MN', name: 'Монголія' },
117
- { code: 'ME', name: 'Чорногорія' },
118
- { code: 'MA', name: 'Марокко' },
119
- { code: 'MZ', name: 'Мозамбік' },
120
- { code: 'MM', name: "М'янма" },
121
- { code: 'NA', name: 'Намібія' },
122
- { code: 'NR', name: 'Науру' },
123
- { code: 'NP', name: 'Непал' },
124
- { code: 'NL', name: 'Нідерланди' },
125
- { code: 'NZ', name: 'Нова Зеландія' },
126
- { code: 'NI', name: 'Нікарагуа' },
127
- { code: 'NE', name: 'Нігер' },
128
- { code: 'NG', name: 'Нігерія' },
129
- { code: 'MK', name: 'Північна Македонія' },
130
- { code: 'NO', name: 'Норвегія' },
131
- { code: 'OM', name: 'Оман' },
132
- { code: 'PK', name: 'Пакистан' },
133
- { code: 'PW', name: 'Палау' },
134
- { code: 'PA', name: 'Панама' },
135
- { code: 'PG', name: 'Папуа Нова Гвінея' },
136
- { code: 'PY', name: 'Парагвай' },
137
- { code: 'PE', name: 'Перу' },
138
- { code: 'PH', name: 'Філіппіни' },
139
- { code: 'PL', name: 'Польща' },
140
- { code: 'PT', name: 'Португалія' },
141
- { code: 'QA', name: 'Катар' },
142
- { code: 'RO', name: 'Румунія' },
143
- { code: 'RU', name: 'Росія' },
144
- { code: 'RW', name: 'Руанда' },
145
- { code: 'KN', name: 'Сент-Кітс і Невіс' },
146
- { code: 'LC', name: 'Сент-Люсія' },
147
- { code: 'VC', name: 'Сент-Вінсент і Гренадіни' },
148
- { code: 'WS', name: 'Самоа' },
149
- { code: 'SM', name: 'Сан-Марино' },
150
- { code: 'ST', name: 'Сан-Томе і Принсіпі' },
151
- { code: 'SA', name: 'Саудівська Аравія' },
152
- { code: 'SN', name: 'Сенегал' },
153
- { code: 'RS', name: 'Сербія' },
154
- { code: 'SC', name: 'Сейшели' },
155
- { code: 'SL', name: 'Сьєрра-Леоне' },
156
- { code: 'SG', name: 'Сінгапур' },
157
- { code: 'SK', name: 'Словаччина' },
158
- { code: 'SI', name: 'Словенія' },
159
- { code: 'SB', name: 'Соломонові Острови' },
160
- { code: 'SO', name: 'Сомалі' },
161
- { code: 'ZA', name: 'ПАР' },
162
- { code: 'SS', name: 'Південний Судан' },
163
- { code: 'ES', name: 'Іспанія' },
164
- { code: 'LK', name: 'Шрі-Ланка' },
165
- { code: 'SD', name: 'Судан' },
166
- { code: 'SR', name: 'Суринам' },
167
- { code: 'SE', name: 'Швеція' },
168
- { code: 'CH', name: 'Швейцарія' },
169
- { code: 'SY', name: 'Сирія' },
170
- { code: 'TW', name: 'Тайвань' },
171
- { code: 'TJ', name: 'Таджикистан' },
172
- { code: 'TZ', name: 'Танзанія' },
173
- { code: 'TH', name: 'Таїланд' },
174
- { code: 'TL', name: 'Тімор-Лесте' },
175
- { code: 'TG', name: 'Того' },
176
- { code: 'TO', name: 'Тонга' },
177
- { code: 'TT', name: 'Тринідад і Тобаго' },
178
- { code: 'TN', name: 'Туніс' },
179
- { code: 'TR', name: 'Туреччина' },
180
- { code: 'TM', name: 'Туркменістан' },
181
- { code: 'TV', name: 'Тувалу' },
182
- { code: 'UG', name: 'Уганда' },
183
- { code: 'UA', name: 'Україна' },
184
- { code: 'AE', name: 'ОАЕ' },
185
- { code: 'GB', name: 'Велика Британія' },
186
- { code: 'US', name: 'США' },
187
- { code: 'UY', name: 'Уругвай' },
188
- { code: 'UZ', name: 'Узбекистан' },
189
- { code: 'VU', name: 'Вануату' },
190
- { code: 'VE', name: 'Венесуела' },
191
- { code: 'VN', name: "В'єтнам" },
192
- { code: 'YE', name: 'Ємен' },
193
- { code: 'ZM', name: 'Замбія' },
194
- { code: 'ZW', name: 'Зімбабве' },
2
+ { code: 'AF', name: 'Афганістан', nameRu: 'Афганистан', nameEn: 'Afghanistan' },
3
+ { code: 'AL', name: 'Албанія', nameRu: 'Албания', nameEn: 'Albania' },
4
+ { code: 'DZ', name: 'Алжир', nameRu: 'Алжир', nameEn: 'Algeria' },
5
+ { code: 'AD', name: 'Андорра', nameRu: 'Андорра', nameEn: 'Andorra' },
6
+ { code: 'AO', name: 'Ангола', nameRu: 'Ангола', nameEn: 'Angola' },
7
+ { code: 'AG', name: 'Антигуа і Барбуда', nameRu: 'Антигуа и Барбуда', nameEn: 'Antigua & Barbuda' },
8
+ { code: 'AR', name: 'Аргентина', nameRu: 'Аргентина', nameEn: 'Argentina' },
9
+ { code: 'AM', name: 'Вірменія', nameRu: 'Армения', nameEn: 'Armenia' },
10
+ { code: 'AU', name: 'Австралія', nameRu: 'Австралия', nameEn: 'Australia' },
11
+ { code: 'AT', name: 'Австрія', nameRu: 'Австрия', nameEn: 'Austria' },
12
+ { code: 'AZ', name: 'Азербайджан', nameRu: 'Азербайджан', nameEn: 'Azerbaijan' },
13
+ { code: 'BS', name: 'Багамські Острови', nameRu: 'Багамы', nameEn: 'Bahamas' },
14
+ { code: 'BH', name: 'Бахрейн', nameRu: 'Бахрейн', nameEn: 'Bahrain' },
15
+ { code: 'BD', name: 'Бангладеш', nameRu: 'Бангладеш', nameEn: 'Bangladesh' },
16
+ { code: 'BY', name: 'Білорусь', nameRu: 'Беларусь', nameEn: 'Belarus' },
17
+ { code: 'BE', name: 'Бельгія', nameRu: 'Бельгия', nameEn: 'Belgium' },
18
+ { code: 'BZ', name: 'Беліз', nameRu: 'Белиз', nameEn: 'Belize' },
19
+ { code: 'BJ', name: 'Бенін', nameRu: 'Бенин', nameEn: 'Benin' },
20
+ { code: 'BT', name: 'Бутан', nameRu: 'Бутан', nameEn: 'Bhutan' },
21
+ { code: 'BO', name: 'Болівія', nameRu: 'Боливия', nameEn: 'Bolivia' },
22
+ { code: 'BA', name: 'Боснія і Герцеговина', nameRu: 'Босния и Герцеговина', nameEn: 'Bosnia & Herzegovina' },
23
+ { code: 'BW', name: 'Ботсвана', nameRu: 'Ботсвана', nameEn: 'Botswana' },
24
+ { code: 'BR', name: 'Бразилія', nameRu: 'Бразилия', nameEn: 'Brazil' },
25
+ { code: 'BN', name: 'Бруней', nameRu: 'Бруней', nameEn: 'Brunei' },
26
+ { code: 'BG', name: 'Болгарія', nameRu: 'Болгария', nameEn: 'Bulgaria' },
27
+ { code: 'BF', name: 'Буркіна-Фасо', nameRu: 'Буркина-Фасо', nameEn: 'Burkina Faso' },
28
+ { code: 'BI', name: 'Бурунді', nameRu: 'Бурунди', nameEn: 'Burundi' },
29
+ { code: 'CV', name: 'Кабо-Верде', nameRu: 'Кабо-Верде', nameEn: 'Cape Verde' },
30
+ { code: 'KH', name: 'Камбоджа', nameRu: 'Камбоджа', nameEn: 'Cambodia' },
31
+ { code: 'CM', name: 'Камерун', nameRu: 'Камерун', nameEn: 'Cameroon' },
32
+ { code: 'CA', name: 'Канада', nameRu: 'Канада', nameEn: 'Canada' },
33
+ { code: 'CF', name: 'ЦАР', nameRu: 'Центрально-Африканская Республика', nameEn: 'Central African Republic' },
34
+ { code: 'TD', name: 'Чад', nameRu: 'Чад', nameEn: 'Chad' },
35
+ { code: 'CL', name: 'Чилі', nameRu: 'Чили', nameEn: 'Chile' },
36
+ { code: 'CN', name: 'Китай', nameRu: 'Китай', nameEn: 'China' },
37
+ { code: 'CO', name: 'Колумбія', nameRu: 'Колумбия', nameEn: 'Colombia' },
38
+ { code: 'KM', name: 'Комори', nameRu: 'Коморы', nameEn: 'Comoros' },
39
+ { code: 'CG', name: 'Конго', nameRu: 'Конго - Браззавиль', nameEn: 'Congo - Brazzaville' },
40
+ { code: 'CD', name: 'ДР Конго', nameRu: 'Конго - Киншаса', nameEn: 'Congo - Kinshasa' },
41
+ { code: 'CR', name: 'Коста-Рика', nameRu: 'Коста-Рика', nameEn: 'Costa Rica' },
42
+ { code: 'CI', name: "Кот-д'Івуар", nameRu: 'Кот-д’Ивуар', nameEn: 'Côte d’Ivoire' },
43
+ { code: 'HR', name: 'Хорватія', nameRu: 'Хорватия', nameEn: 'Croatia' },
44
+ { code: 'CU', name: 'Куба', nameRu: 'Куба', nameEn: 'Cuba' },
45
+ { code: 'CY', name: 'Кіпр', nameRu: 'Кипр', nameEn: 'Cyprus' },
46
+ { code: 'CZ', name: 'Чехія', nameRu: 'Чехия', nameEn: 'Czechia' },
47
+ { code: 'DK', name: 'Данія', nameRu: 'Дания', nameEn: 'Denmark' },
48
+ { code: 'DJ', name: 'Джибуті', nameRu: 'Джибути', nameEn: 'Djibouti' },
49
+ { code: 'DM', name: 'Домініка', nameRu: 'Доминика', nameEn: 'Dominica' },
50
+ { code: 'DO', name: 'Домініканська Республіка', nameRu: 'Доминиканская Республика', nameEn: 'Dominican Republic' },
51
+ { code: 'EC', name: 'Еквадор', nameRu: 'Эквадор', nameEn: 'Ecuador' },
52
+ { code: 'EG', name: 'Єгипет', nameRu: 'Египет', nameEn: 'Egypt' },
53
+ { code: 'SV', name: 'Сальвадор', nameRu: 'Сальвадор', nameEn: 'El Salvador' },
54
+ { code: 'GQ', name: 'Екваторіальна Гвінея', nameRu: 'Экваториальная Гвинея', nameEn: 'Equatorial Guinea' },
55
+ { code: 'ER', name: 'Еритрея', nameRu: 'Эритрея', nameEn: 'Eritrea' },
56
+ { code: 'EE', name: 'Естонія', nameRu: 'Эстония', nameEn: 'Estonia' },
57
+ { code: 'SZ', name: 'Есватіні', nameRu: 'Эсватини', nameEn: 'Eswatini' },
58
+ { code: 'ET', name: 'Ефіопія', nameRu: 'Эфиопия', nameEn: 'Ethiopia' },
59
+ { code: 'FJ', name: 'Фіджі', nameRu: 'Фиджи', nameEn: 'Fiji' },
60
+ { code: 'FI', name: 'Фінляндія', nameRu: 'Финляндия', nameEn: 'Finland' },
61
+ { code: 'FR', name: 'Франція', nameRu: 'Франция', nameEn: 'France' },
62
+ { code: 'GA', name: 'Габон', nameRu: 'Габон', nameEn: 'Gabon' },
63
+ { code: 'GM', name: 'Гамбія', nameRu: 'Гамбия', nameEn: 'Gambia' },
64
+ { code: 'GE', name: 'Грузія', nameRu: 'Грузия', nameEn: 'Georgia' },
65
+ { code: 'DE', name: 'Німеччина', nameRu: 'Германия', nameEn: 'Germany' },
66
+ { code: 'GH', name: 'Гана', nameRu: 'Гана', nameEn: 'Ghana' },
67
+ { code: 'GR', name: 'Греція', nameRu: 'Греция', nameEn: 'Greece' },
68
+ { code: 'GD', name: 'Гренада', nameRu: 'Гренада', nameEn: 'Grenada' },
69
+ { code: 'GT', name: 'Гватемала', nameRu: 'Гватемала', nameEn: 'Guatemala' },
70
+ { code: 'GN', name: 'Гвінея', nameRu: 'Гвинея', nameEn: 'Guinea' },
71
+ { code: 'GW', name: 'Гвінея-Бісау', nameRu: 'Гвинея-Бисау', nameEn: 'Guinea-Bissau' },
72
+ { code: 'GY', name: 'Гаяна', nameRu: 'Гайана', nameEn: 'Guyana' },
73
+ { code: 'HT', name: 'Гаїті', nameRu: 'Гаити', nameEn: 'Haiti' },
74
+ { code: 'HN', name: 'Гондурас', nameRu: 'Гондурас', nameEn: 'Honduras' },
75
+ { code: 'HU', name: 'Угорщина', nameRu: 'Венгрия', nameEn: 'Hungary' },
76
+ { code: 'IS', name: 'Ісландія', nameRu: 'Исландия', nameEn: 'Iceland' },
77
+ { code: 'IN', name: 'Індія', nameRu: 'Индия', nameEn: 'India' },
78
+ { code: 'ID', name: 'Індонезія', nameRu: 'Индонезия', nameEn: 'Indonesia' },
79
+ { code: 'IR', name: 'Іран', nameRu: 'Иран', nameEn: 'Iran' },
80
+ { code: 'IQ', name: 'Ірак', nameRu: 'Ирак', nameEn: 'Iraq' },
81
+ { code: 'IE', name: 'Ірландія', nameRu: 'Ирландия', nameEn: 'Ireland' },
82
+ { code: 'IL', name: 'Ізраїль', nameRu: 'Израиль', nameEn: 'Israel' },
83
+ { code: 'IT', name: 'Італія', nameRu: 'Италия', nameEn: 'Italy' },
84
+ { code: 'JM', name: 'Ямайка', nameRu: 'Ямайка', nameEn: 'Jamaica' },
85
+ { code: 'JP', name: 'Японія', nameRu: 'Япония', nameEn: 'Japan' },
86
+ { code: 'JO', name: 'Йорданія', nameRu: 'Иордания', nameEn: 'Jordan' },
87
+ { code: 'KZ', name: 'Казахстан', nameRu: 'Казахстан', nameEn: 'Kazakhstan' },
88
+ { code: 'KE', name: 'Кенія', nameRu: 'Кения', nameEn: 'Kenya' },
89
+ { code: 'KI', name: 'Кірибаті', nameRu: 'Кирибати', nameEn: 'Kiribati' },
90
+ { code: 'KP', name: 'КНДР', nameRu: 'КНДР', nameEn: 'North Korea' },
91
+ { code: 'KR', name: 'Південна Корея', nameRu: 'Республика Корея', nameEn: 'South Korea' },
92
+ { code: 'KW', name: 'Кувейт', nameRu: 'Кувейт', nameEn: 'Kuwait' },
93
+ { code: 'KG', name: 'Киргизстан', nameRu: 'Киргизия', nameEn: 'Kyrgyzstan' },
94
+ { code: 'LA', name: 'Лаос', nameRu: 'Лаос', nameEn: 'Laos' },
95
+ { code: 'LV', name: 'Латвія', nameRu: 'Латвия', nameEn: 'Latvia' },
96
+ { code: 'LB', name: 'Ліван', nameRu: 'Ливан', nameEn: 'Lebanon' },
97
+ { code: 'LS', name: 'Лесото', nameRu: 'Лесото', nameEn: 'Lesotho' },
98
+ { code: 'LR', name: 'Ліберія', nameRu: 'Либерия', nameEn: 'Liberia' },
99
+ { code: 'LY', name: 'Лівія', nameRu: 'Ливия', nameEn: 'Libya' },
100
+ { code: 'LI', name: 'Ліхтенштейн', nameRu: 'Лихтенштейн', nameEn: 'Liechtenstein' },
101
+ { code: 'LT', name: 'Литва', nameRu: 'Литва', nameEn: 'Lithuania' },
102
+ { code: 'LU', name: 'Люксембург', nameRu: 'Люксембург', nameEn: 'Luxembourg' },
103
+ { code: 'MG', name: 'Мадагаскар', nameRu: 'Мадагаскар', nameEn: 'Madagascar' },
104
+ { code: 'MW', name: 'Малаві', nameRu: 'Малави', nameEn: 'Malawi' },
105
+ { code: 'MY', name: 'Малайзія', nameRu: 'Малайзия', nameEn: 'Malaysia' },
106
+ { code: 'MV', name: 'Мальдіви', nameRu: 'Мальдивы', nameEn: 'Maldives' },
107
+ { code: 'ML', name: 'Малі', nameRu: 'Мали', nameEn: 'Mali' },
108
+ { code: 'MT', name: 'Мальта', nameRu: 'Мальта', nameEn: 'Malta' },
109
+ { code: 'MH', name: 'Маршаллові Острови', nameRu: 'Маршалловы о-ва', nameEn: 'Marshall Islands' },
110
+ { code: 'MR', name: 'Мавританія', nameRu: 'Мавритания', nameEn: 'Mauritania' },
111
+ { code: 'MU', name: 'Маврикій', nameRu: 'Маврикий', nameEn: 'Mauritius' },
112
+ { code: 'MX', name: 'Мексика', nameRu: 'Мексика', nameEn: 'Mexico' },
113
+ { code: 'FM', name: 'Мікронезія', nameRu: 'Федеративные Штаты Микронезии', nameEn: 'Micronesia' },
114
+ { code: 'MD', name: 'Молдова', nameRu: 'Молдова', nameEn: 'Moldova' },
115
+ { code: 'MC', name: 'Монако', nameRu: 'Монако', nameEn: 'Monaco' },
116
+ { code: 'MN', name: 'Монголія', nameRu: 'Монголия', nameEn: 'Mongolia' },
117
+ { code: 'ME', name: 'Чорногорія', nameRu: 'Черногория', nameEn: 'Montenegro' },
118
+ { code: 'MA', name: 'Марокко', nameRu: 'Марокко', nameEn: 'Morocco' },
119
+ { code: 'MZ', name: 'Мозамбік', nameRu: 'Мозамбик', nameEn: 'Mozambique' },
120
+ { code: 'MM', name: "М'янма", nameRu: 'Мьянма (Бирма)', nameEn: 'Myanmar (Burma)' },
121
+ { code: 'NA', name: 'Намібія', nameRu: 'Намибия', nameEn: 'Namibia' },
122
+ { code: 'NR', name: 'Науру', nameRu: 'Науру', nameEn: 'Nauru' },
123
+ { code: 'NP', name: 'Непал', nameRu: 'Непал', nameEn: 'Nepal' },
124
+ { code: 'NL', name: 'Нідерланди', nameRu: 'Нидерланды', nameEn: 'Netherlands' },
125
+ { code: 'NZ', name: 'Нова Зеландія', nameRu: 'Новая Зеландия', nameEn: 'New Zealand' },
126
+ { code: 'NI', name: 'Нікарагуа', nameRu: 'Никарагуа', nameEn: 'Nicaragua' },
127
+ { code: 'NE', name: 'Нігер', nameRu: 'Нигер', nameEn: 'Niger' },
128
+ { code: 'NG', name: 'Нігерія', nameRu: 'Нигерия', nameEn: 'Nigeria' },
129
+ { code: 'MK', name: 'Північна Македонія', nameRu: 'Северная Македония', nameEn: 'North Macedonia' },
130
+ { code: 'NO', name: 'Норвегія', nameRu: 'Норвегия', nameEn: 'Norway' },
131
+ { code: 'OM', name: 'Оман', nameRu: 'Оман', nameEn: 'Oman' },
132
+ { code: 'PK', name: 'Пакистан', nameRu: 'Пакистан', nameEn: 'Pakistan' },
133
+ { code: 'PW', name: 'Палау', nameRu: 'Палау', nameEn: 'Palau' },
134
+ { code: 'PA', name: 'Панама', nameRu: 'Панама', nameEn: 'Panama' },
135
+ { code: 'PG', name: 'Папуа Нова Гвінея', nameRu: 'Папуа — Новая Гвинея', nameEn: 'Papua New Guinea' },
136
+ { code: 'PY', name: 'Парагвай', nameRu: 'Парагвай', nameEn: 'Paraguay' },
137
+ { code: 'PE', name: 'Перу', nameRu: 'Перу', nameEn: 'Peru' },
138
+ { code: 'PH', name: 'Філіппіни', nameRu: 'Филиппины', nameEn: 'Philippines' },
139
+ { code: 'PL', name: 'Польща', nameRu: 'Польша', nameEn: 'Poland' },
140
+ { code: 'PT', name: 'Португалія', nameRu: 'Португалия', nameEn: 'Portugal' },
141
+ { code: 'QA', name: 'Катар', nameRu: 'Катар', nameEn: 'Qatar' },
142
+ { code: 'RO', name: 'Румунія', nameRu: 'Румыния', nameEn: 'Romania' },
143
+ { code: 'RU', name: 'Росія', nameRu: 'Россия', nameEn: 'Russia' },
144
+ { code: 'RW', name: 'Руанда', nameRu: 'Руанда', nameEn: 'Rwanda' },
145
+ { code: 'KN', name: 'Сент-Кітс і Невіс', nameRu: 'Сент-Китс и Невис', nameEn: 'St. Kitts & Nevis' },
146
+ { code: 'LC', name: 'Сент-Люсія', nameRu: 'Сент-Люсия', nameEn: 'St. Lucia' },
147
+ { code: 'VC', name: 'Сент-Вінсент і Гренадіни', nameRu: 'Сент-Винсент и Гренадины', nameEn: 'St. Vincent & Grenadines' },
148
+ { code: 'WS', name: 'Самоа', nameRu: 'Самоа', nameEn: 'Samoa' },
149
+ { code: 'SM', name: 'Сан-Марино', nameRu: 'Сан-Марино', nameEn: 'San Marino' },
150
+ { code: 'ST', name: 'Сан-Томе і Принсіпі', nameRu: 'Сан-Томе и Принсипи', nameEn: 'São Tomé & Príncipe' },
151
+ { code: 'SA', name: 'Саудівська Аравія', nameRu: 'Саудовская Аравия', nameEn: 'Saudi Arabia' },
152
+ { code: 'SN', name: 'Сенегал', nameRu: 'Сенегал', nameEn: 'Senegal' },
153
+ { code: 'RS', name: 'Сербія', nameRu: 'Сербия', nameEn: 'Serbia' },
154
+ { code: 'SC', name: 'Сейшели', nameRu: 'Сейшельские о-ва', nameEn: 'Seychelles' },
155
+ { code: 'SL', name: 'Сьєрра-Леоне', nameRu: 'Сьерра-Леоне', nameEn: 'Sierra Leone' },
156
+ { code: 'SG', name: 'Сінгапур', nameRu: 'Сингапур', nameEn: 'Singapore' },
157
+ { code: 'SK', name: 'Словаччина', nameRu: 'Словакия', nameEn: 'Slovakia' },
158
+ { code: 'SI', name: 'Словенія', nameRu: 'Словения', nameEn: 'Slovenia' },
159
+ { code: 'SB', name: 'Соломонові Острови', nameRu: 'Соломоновы о-ва', nameEn: 'Solomon Islands' },
160
+ { code: 'SO', name: 'Сомалі', nameRu: 'Сомали', nameEn: 'Somalia' },
161
+ { code: 'ZA', name: 'ПАР', nameRu: 'Южно-Африканская Республика', nameEn: 'South Africa' },
162
+ { code: 'SS', name: 'Південний Судан', nameRu: 'Южный Судан', nameEn: 'South Sudan' },
163
+ { code: 'ES', name: 'Іспанія', nameRu: 'Испания', nameEn: 'Spain' },
164
+ { code: 'LK', name: 'Шрі-Ланка', nameRu: 'Шри-Ланка', nameEn: 'Sri Lanka' },
165
+ { code: 'SD', name: 'Судан', nameRu: 'Судан', nameEn: 'Sudan' },
166
+ { code: 'SR', name: 'Суринам', nameRu: 'Суринам', nameEn: 'Suriname' },
167
+ { code: 'SE', name: 'Швеція', nameRu: 'Швеция', nameEn: 'Sweden' },
168
+ { code: 'CH', name: 'Швейцарія', nameRu: 'Швейцария', nameEn: 'Switzerland' },
169
+ { code: 'SY', name: 'Сирія', nameRu: 'Сирия', nameEn: 'Syria' },
170
+ { code: 'TW', name: 'Тайвань', nameRu: 'Тайвань', nameEn: 'Taiwan' },
171
+ { code: 'TJ', name: 'Таджикистан', nameRu: 'Таджикистан', nameEn: 'Tajikistan' },
172
+ { code: 'TZ', name: 'Танзанія', nameRu: 'Танзания', nameEn: 'Tanzania' },
173
+ { code: 'TH', name: 'Таїланд', nameRu: 'Таиланд', nameEn: 'Thailand' },
174
+ { code: 'TL', name: 'Тімор-Лесте', nameRu: 'Восточный Тимор', nameEn: 'Timor-Leste' },
175
+ { code: 'TG', name: 'Того', nameRu: 'Того', nameEn: 'Togo' },
176
+ { code: 'TO', name: 'Тонга', nameRu: 'Тонга', nameEn: 'Tonga' },
177
+ { code: 'TT', name: 'Тринідад і Тобаго', nameRu: 'Тринидад и Тобаго', nameEn: 'Trinidad & Tobago' },
178
+ { code: 'TN', name: 'Туніс', nameRu: 'Тунис', nameEn: 'Tunisia' },
179
+ { code: 'TR', name: 'Туреччина', nameRu: 'Турция', nameEn: 'Türkiye' },
180
+ { code: 'TM', name: 'Туркменістан', nameRu: 'Туркменистан', nameEn: 'Turkmenistan' },
181
+ { code: 'TV', name: 'Тувалу', nameRu: 'Тувалу', nameEn: 'Tuvalu' },
182
+ { code: 'UG', name: 'Уганда', nameRu: 'Уганда', nameEn: 'Uganda' },
183
+ { code: 'UA', name: 'Україна', nameRu: 'Украина', nameEn: 'Ukraine' },
184
+ { code: 'AE', name: 'ОАЕ', nameRu: 'ОАЭ', nameEn: 'United Arab Emirates' },
185
+ { code: 'GB', name: 'Велика Британія', nameRu: 'Великобритания', nameEn: 'United Kingdom' },
186
+ { code: 'US', name: 'США', nameRu: 'Соединенные Штаты', nameEn: 'United States' },
187
+ { code: 'UY', name: 'Уругвай', nameRu: 'Уругвай', nameEn: 'Uruguay' },
188
+ { code: 'UZ', name: 'Узбекистан', nameRu: 'Узбекистан', nameEn: 'Uzbekistan' },
189
+ { code: 'VU', name: 'Вануату', nameRu: 'Вануату', nameEn: 'Vanuatu' },
190
+ { code: 'VE', name: 'Венесуела', nameRu: 'Венесуэла', nameEn: 'Venezuela' },
191
+ { code: 'VN', name: "В'єтнам", nameRu: 'Вьетнам', nameEn: 'Vietnam' },
192
+ { code: 'YE', name: 'Ємен', nameRu: 'Йемен', nameEn: 'Yemen' },
193
+ { code: 'ZM', name: 'Замбія', nameRu: 'Замбия', nameEn: 'Zambia' },
194
+ { code: 'ZW', name: 'Зімбабве', nameRu: 'Зимбабве', nameEn: 'Zimbabwe' },
195
195
  ];
196
196
  export const COUNTRIES_BY_CODE = new Map(COUNTRIES.map((c) => [c.code, c]));
197
+ function normalizeCountryName(s) {
198
+ return s
199
+ .normalize('NFD')
200
+ .replace(/[\u0300-\u036f]/g, '')
201
+ .toLowerCase()
202
+ .replace(/['\u2019`\u00b4\u02bc.,\-\u2013\u2014()]/g, ' ')
203
+ .replace(/\s+/g, ' ')
204
+ .trim();
205
+ }
206
+ const COUNTRY_ALIASES = {
207
+ usa: 'US',
208
+ us: 'US',
209
+ 'united states': 'US',
210
+ 'united states of america': 'US',
211
+ сша: 'US',
212
+ uk: 'GB',
213
+ 'united kingdom': 'GB',
214
+ 'great britain': 'GB',
215
+ britain: 'GB',
216
+ england: 'GB',
217
+ англія: 'GB',
218
+ англия: 'GB',
219
+ британія: 'GB',
220
+ британия: 'GB',
221
+ uae: 'AE',
222
+ оае: 'AE',
223
+ оаэ: 'AE',
224
+ 'united arab emirates': 'AE',
225
+ holland: 'NL',
226
+ голландія: 'NL',
227
+ голландия: 'NL',
228
+ 'czech republic': 'CZ',
229
+ чехія: 'CZ',
230
+ 'south korea': 'KR',
231
+ 'republic of korea': 'KR',
232
+ korea: 'KR',
233
+ корея: 'KR',
234
+ 'north korea': 'KP',
235
+ 'ivory coast': 'CI',
236
+ burma: 'MM',
237
+ 'cape verde': 'CV',
238
+ 'east timor': 'TL',
239
+ swaziland: 'SZ',
240
+ macedonia: 'MK',
241
+ 'russian federation': 'RU',
242
+ росія: 'RU',
243
+ россия: 'RU',
244
+ 'p r c': 'CN',
245
+ китай: 'CN',
246
+ };
247
+ const CODE_BY_NAME = new Map();
248
+ for (const c of COUNTRIES) {
249
+ for (const n of [c.name, c.nameRu, c.nameEn])
250
+ CODE_BY_NAME.set(normalizeCountryName(n), c.code);
251
+ }
252
+ for (const [alias, code] of Object.entries(COUNTRY_ALIASES))
253
+ CODE_BY_NAME.set(normalizeCountryName(alias), code);
254
+ export function resolveCountryCode(raw) {
255
+ const s = String(raw ?? '').trim();
256
+ if (!s)
257
+ return null;
258
+ if (s.length === 2 && COUNTRIES_BY_CODE.has(s.toUpperCase()))
259
+ return s.toUpperCase();
260
+ return CODE_BY_NAME.get(normalizeCountryName(s)) ?? null;
261
+ }
package/dist/fields.d.ts CHANGED
@@ -94,7 +94,7 @@ export interface FieldClient {
94
94
  options?: OptionItem[];
95
95
  relation?: {
96
96
  library: string;
97
- type: string;
97
+ shelf: string;
98
98
  };
99
99
  virtual?: boolean;
100
100
  default?: string | number | boolean | null;
package/dist/fields.js CHANGED
@@ -466,7 +466,7 @@ export function relation(raw) {
466
466
  prim: 'relation',
467
467
  column: multi ? 'text' : 'integer',
468
468
  hints: { multi, displayKey: o.displayKey ?? 'name' },
469
- relation: { library: raw.options.library, type: raw.options.shelf },
469
+ relation: { library: raw.options.library, shelf: raw.options.shelf },
470
470
  ...(multi && { json: true }),
471
471
  zod: optionalize(s, required),
472
472
  };
@@ -789,15 +789,34 @@ export function period(raw) {
789
789
  };
790
790
  return wrapKey(o, meta);
791
791
  }
792
+ const FILE_KEYS = new Set(['name', 'mime', 'size']);
793
+ const FILE_URL_KEYS = ['url', 'src', 'href', 'link'];
794
+ function fileEntryIssue(it) {
795
+ if (typeof it !== 'object' || it === null || Array.isArray(it))
796
+ return 'file_structure';
797
+ const rec = it;
798
+ if (FILE_URL_KEYS.some((k) => k in rec))
799
+ return 'file_remote_url';
800
+ const name = rec['name'];
801
+ if (typeof name !== 'string' || name === '')
802
+ return 'file_structure';
803
+ if (name.includes('://') || name.startsWith('//'))
804
+ return 'file_remote_url';
805
+ if (/[\\/]/.test(name) || name.includes('..'))
806
+ return 'file_name';
807
+ for (const k of Object.keys(rec))
808
+ if (!FILE_KEYS.has(k))
809
+ return 'file_unknown_key';
810
+ if (rec['mime'] !== undefined && typeof rec['mime'] !== 'string')
811
+ return 'file_structure';
812
+ if (rec['size'] !== undefined && typeof rec['size'] !== 'number')
813
+ return 'file_structure';
814
+ return null;
815
+ }
792
816
  function makeFile(kind, raw) {
793
817
  const o = normalizeOpts(raw);
794
818
  const required = o.required ?? false;
795
819
  const multiple = o.multiple ?? false;
796
- const rowSchema = z.object({
797
- name: z.string().min(1),
798
- mime: z.string().optional(),
799
- size: z.number().optional(),
800
- });
801
820
  const s = z.unknown().superRefine((raw, ctx) => {
802
821
  if (typeof raw === 'string') {
803
822
  try {
@@ -811,8 +830,9 @@ function makeFile(kind, raw) {
811
830
  const parsed = jsonValue(raw);
812
831
  const items = Array.isArray(parsed) ? parsed : [parsed];
813
832
  for (const it of items) {
814
- if (!rowSchema.safeParse(it).success) {
815
- ctx.addIssue({ code: z.ZodIssueCode.custom, message: vmsg('file_structure') });
833
+ const code = fileEntryIssue(it);
834
+ if (code) {
835
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: vmsg(code) });
816
836
  return;
817
837
  }
818
838
  }
package/dist/shelf.d.ts CHANGED
@@ -1,10 +1,14 @@
1
1
  import { z } from 'zod';
2
2
  import type { FieldMeta, LayoutEl, ColumnType } from './fields.ts';
3
3
  import type { FieldClient, GroupEl, PseudoEl } from './fields.ts';
4
+ export interface ShelfListView {
5
+ kind?: string;
6
+ fields: string[];
7
+ }
4
8
  export interface ShelfViews {
5
9
  title?: string;
6
10
  inline?: string[];
7
- table?: string[];
11
+ list?: ShelfListView;
8
12
  groupBy?: string[];
9
13
  defaultGroupBy?: string;
10
14
  select?: {
@@ -25,6 +29,7 @@ export interface ShelfDef {
25
29
  }
26
30
  export declare function fieldEntries(items: LayoutEl[]): [string, FieldMeta][];
27
31
  export declare function storageColumns(key: string, field: FieldMeta): [string, ColumnType][];
32
+ export declare function cellValue(field: FieldMeta, key: string, row: Record<string, unknown>): unknown;
28
33
  export interface CollectionEntry {
29
34
  key: string;
30
35
  group: GroupEl;
@@ -40,7 +45,8 @@ export declare function textSearchKeys(m: ShelfDef): string[];
40
45
  export declare function inlineKeys(m: ShelfDef): string[];
41
46
  export declare function inlineImageKey(m: ShelfDef): string | undefined;
42
47
  export declare function inlineText(m: ShelfDef, row: Record<string, unknown>): string;
43
- export declare function tableKeys(m: ShelfDef): string[];
48
+ export declare function viewKeys(m: ShelfDef): string[];
49
+ export declare function listKind(m: ShelfDef): string;
44
50
  export declare function groupableFields(m: ShelfDef): string[];
45
51
  export declare function defaultGroupField(m: ShelfDef): string | undefined;
46
52
  export declare function coverKey(m: ShelfDef): string | undefined;
package/dist/shelf.js CHANGED
@@ -24,6 +24,22 @@ export function storageColumns(key, field) {
24
24
  return Object.entries(field.columns).map(([sub, col]) => [`${key}__${sub}`, col]);
25
25
  return [[key, field.column]];
26
26
  }
27
+ export function cellValue(field, key, row) {
28
+ if (!field.columns)
29
+ return row[key];
30
+ if (row[key] !== undefined)
31
+ return row[key];
32
+ const out = {};
33
+ let filled = false;
34
+ for (const sub of Object.keys(field.columns)) {
35
+ const v = row[`${key}__${sub}`];
36
+ if (v == null || v === '')
37
+ continue;
38
+ out[sub] = v;
39
+ filled = true;
40
+ }
41
+ return filled ? out : undefined;
42
+ }
27
43
  export function collectionGroups(items) {
28
44
  const out = [];
29
45
  for (const it of items) {
@@ -52,8 +68,8 @@ export function defineShelf(m) {
52
68
  const dup = keys.find((k, i) => keys.indexOf(k) !== i);
53
69
  if (dup)
54
70
  throw new Error(`[shelf] ${m.library}/${m.shelf}: duplicate key '${dup}'`);
55
- if (m.standalone !== false && !m.views?.table?.length)
56
- console.warn(`[shelf] ${m.library}/${m.shelf}: standalone shelf without an explicit views.table`);
71
+ if (m.standalone !== false && !m.views?.list?.fields?.length)
72
+ console.warn(`[shelf] ${m.library}/${m.shelf}: standalone shelf without an explicit views.list`);
57
73
  return m;
58
74
  }
59
75
  export const SYSTEM_FIELDS = ['id', 'createdAt', 'updatedAt'];
@@ -108,13 +124,16 @@ export function inlineText(m, row) {
108
124
  }, []);
109
125
  return parts.join(' ').trim() || recordTitle(m, row);
110
126
  }
111
- export function tableKeys(m) {
127
+ export function viewKeys(m) {
112
128
  const tk = titleKey(m);
113
- const rest = m.views?.table?.length
114
- ? realKeys(m, m.views.table.filter((k) => k !== tk))
129
+ const rest = m.views?.list?.fields?.length
130
+ ? realKeys(m, m.views.list.fields.filter((k) => k !== tk))
115
131
  : [];
116
132
  return [tk, ...rest];
117
133
  }
134
+ export function listKind(m) {
135
+ return m.views?.list?.kind ?? 'table';
136
+ }
118
137
  const GROUPABLE_PRIMS = new Set(['select', 'checkbox', 'relation']);
119
138
  export function groupableFields(m) {
120
139
  if (m.views?.groupBy?.length)
@@ -146,7 +165,7 @@ export function listKeys(m) {
146
165
  out.push(k);
147
166
  };
148
167
  add(titleKey(m));
149
- tableKeys(m).forEach(add);
168
+ viewKeys(m).forEach(add);
150
169
  groupableFields(m).forEach(add);
151
170
  inlineKeys(m).forEach(add);
152
171
  add(inlineImageKey(m));
@@ -5,7 +5,7 @@ export const USERS_SHELF = defineShelf({
5
5
  library: '',
6
6
  label: 'auth.usersTitle',
7
7
  icon: 'lucide:users',
8
- views: { table: ['login', 'displayName', 'role', 'disabled'] },
8
+ views: { list: { fields: ['login', 'displayName', 'role', 'disabled'] } },
9
9
  fields: [
10
10
  field.string({ key: 'login', label: 'auth.fieldLogin' }),
11
11
  field.string({ key: 'displayName', label: 'auth.fieldDisplayName' }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coffer-org/sdk",
3
- "version": "1.8.0",
3
+ "version": "2.0.0",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=24"