Страны и форматы
Откуда форматы
Таблица стран генерируется из метаданных libphonenumber — библиотеки Google, по которой номера проверяет Android. Для каждой страны берётся пример мобильного номера и его национальный формат без приставки: так номер пишут в самой стране.
28 стран из tinyval-mask сохраняют его форматы — +7 (999) 999-99-99, а не +7 999 999-99-99: при переходе с tinyval-mask на tinyval-phone ничего не меняется.
В бандл библиотека Google не попадает: в пакете только готовая таблица — код страны, шаблон и пара регулярных выражений.
import { phoneTable } from 'tinyval-phone';
phoneTable.jp; // ['81', '99-9999-9999', '0']
phoneTable.bs; // ['1', '(999) 999-9999', '1', '242']
// код, шаблон после кода, национальная приставка, признак страныНомера разной длины
В некоторых странах номера бывают разной длины: в Германии мобильный — 10 или 11 цифр, в Австрии — от 8 до 13. Лишние цифры в шаблоне необязательные: +49 999 9999999[9]. Номер считается заполненным (complete), когда введена минимальная длина, — дальше можно дописать ещё цифры.
Страны с общим кодом
Один телефонный код бывает у нескольких стран: +1 — США, Канада и ещё 23 страны и территории (Багамы, Ямайка, Пуэрто-Рико…), +7 — Россия и Казахстан, +44 — Великобритания, Джерси, Гернси и остров Мэн. Страна определяется так:
- Берётся самый длинный подходящий код:
+1242…— код1,+375…— код375. - Если у страны есть «признак» и номер под него подходит — это она. Признак — начало номера (
+1 242— Багамы) или весь номер (+1 416 555 0123— Канада: по коду города, когда номер введён полностью). - Иначе — главная страна кода:
+1— США,+44— Великобритания.
Пока номер Канады введён не полностью, показываются США — маска у них одинаковая, меняется только флаг. Номера Аландских островов, Ватикана, Шпицбергена, Кокосовых островов и ещё нескольких территорий не отличить от номеров Финляндии, Италии, Норвегии и Австралии — для них определяется главная страна, так же делает и libphonenumber.
detectCountry('+1 201 555 0123'); // 'us'
detectCountry('+1 242 359 1234'); // 'bs'
detectCountry('+1 416 555 0123'); // 'ca'
detectCountry('+7 701 123 4567'); // 'kz'
detectCountry('+44 7797 712345'); // 'je'Национальная приставка
Внутри страны перед номером часто набирают приставку: 8 в России, 0 в Британии и Германии, 06 в Венгрии. С defaultCountry её можно вводить — она отбрасывается, а код страны добавляется сам:
mask('07400123456', phoneAuto({ defaultCountry: 'gb' })); // '+44 7400 123456'
mask('015123456789', phone('de')); // '+49 151 23456789'
mask('0612345678', phone('fr')); // '+33 6 12 34 56 78'Свои страны и форматы
Формат страны можно поменять, страну — добавить или убрать: npx tinyval-phone countries копирует таблицу в проект, а setCountries подключает её. Подробно — Свои страны и флаги.
import { setCountries } from 'tinyval-phone';
setCountries({ de: ['49', '9999 9999999[9]', '0'], xk: null });Обновление данных
Номерные планы стран иногда меняются. В самом пакете таблица и флаги пересобираются из свежих libphonenumber-js и country-flag-icons командой npm run generate -w packages/tinyval-phone; тесты проверяют пример номера каждой страны.