quality / commitlint (push) Skipped
CD / update-wiki (push) Successful in 5s
quality / changes (push) Successful in 4s
quality / docker-check (push) Skipped
quality / web (push) Successful in 45s
quality / api (push) Successful in 36s
CD / quality (push) Successful in 1m30s
CD / publish (push) Successful in 1m51s
Co-authored-by: Cursor <cursoragent@cursor.com>
77 lines
4.2 KiB
TypeScript
77 lines
4.2 KiB
TypeScript
/**
|
|
* Стандартизированный справочник стран (ISO 3166-1 alpha-2) с русскими названиями.
|
|
* Источник: общедоступный справочник. Не зависит от данных в БД vps-tracker.
|
|
*/
|
|
interface CountryRef {
|
|
/** ISO 3166-1 alpha-2 код */
|
|
code: string;
|
|
/** Русское название */
|
|
name: string;
|
|
/** Английское название */
|
|
nameEn: string;
|
|
}
|
|
declare const COUNTRIES: readonly CountryRef[];
|
|
declare const COUNTRY_BY_CODE: Record<string, CountryRef>;
|
|
declare const COUNTRY_BY_NAME_RU: Record<string, CountryRef>;
|
|
|
|
/**
|
|
* Стандартизированный справочник городов по странам.
|
|
* Используется в фильтрах VPS и форме редактирования.
|
|
* Не зависит от данных в БД vps-tracker — общедоступный статичный справочник.
|
|
*/
|
|
|
|
interface CityRef {
|
|
/** ISO 3166-1 alpha-2 код страны */
|
|
countryCode: string;
|
|
/** Русское название города */
|
|
name: string;
|
|
/** Английское название города */
|
|
nameEn: string;
|
|
}
|
|
/**
|
|
* Топ-города по странам (включая города с крупными дата-центрами).
|
|
* Список намеренно ограничен — расширяется по мере необходимости.
|
|
*/
|
|
declare const CITIES: readonly CityRef[];
|
|
declare const CITY_BY_NAME_RU: Record<string, CityRef>;
|
|
/** Найти город в справочнике по русскому названию. */
|
|
declare function resolveCityRef(cityName: string): CityRef | undefined;
|
|
/** Страна из справочника для города (если есть привязка). */
|
|
declare function resolveCountryForCity(cityName: string): CountryRef | undefined;
|
|
interface CityLocationRow {
|
|
city?: string | null;
|
|
country?: string | null;
|
|
}
|
|
/** Проверить, относится ли город к выбранной стране (справочник или данные VPS). */
|
|
declare function cityMatchesCountry(cityName: string, countryName: string, rows?: readonly CityLocationRow[]): boolean;
|
|
/** Опции городов: из VPS и опционально справочника, опционально по стране. */
|
|
declare function buildCityOptions(rows: readonly CityLocationRow[] | undefined, countryName?: string, options?: {
|
|
includeCatalog?: boolean;
|
|
}): {
|
|
value: string;
|
|
label: string;
|
|
}[];
|
|
/** Страна для города: справочник, иначе первая запись VPS с таким городом. */
|
|
declare function resolveCountryForCityFromRows(cityName: string, rows: readonly CityLocationRow[] | undefined): string | undefined;
|
|
interface CityOption extends CityRef {
|
|
country: CountryRef;
|
|
}
|
|
/** Список городов с привязкой к стране. */
|
|
declare function listCities(countryCode?: string): CityOption[];
|
|
/** Список стран, у которых есть города в справочнике. */
|
|
declare function countriesWithCities(): CountryRef[];
|
|
|
|
/**
|
|
* Канонические коды {loc} для hostname (из naming seed / docs).
|
|
* Ключ — русское имя города (lower case).
|
|
*/
|
|
declare const CANONICAL_LOC_CODES: Record<string, string>;
|
|
/** Детерминированный уникальный loc-код для города (hostname {loc}). */
|
|
declare function locCodeForCity(city: Pick<CityRef, 'name' | 'nameEn' | 'countryCode'>, usedCodes: ReadonlySet<string>): string;
|
|
/** Все города каталога с выделенными loc-кодами (без коллизий). */
|
|
declare function catalogCitiesWithLocCodes(): Array<CityRef & {
|
|
locCode: string;
|
|
}>;
|
|
|
|
export { CANONICAL_LOC_CODES, CITIES, CITY_BY_NAME_RU, COUNTRIES, COUNTRY_BY_CODE, COUNTRY_BY_NAME_RU, type CityLocationRow, type CityOption, type CityRef, type CountryRef, buildCityOptions, catalogCitiesWithLocCodes, cityMatchesCountry, countriesWithCities, listCities, locCodeForCity, resolveCityRef, resolveCountryForCity, resolveCountryForCityFromRows };
|