Validator.js — популярная библиотека для валидации и санитизации строковых данных в JavaScript и Node.js. За время развития библиотеки API неоднократно изменялся: часть методов переименовывалась, некоторые функции объявлялись устаревшими, менялись сигнатуры вызовов и структура импорта.
Изменения API особенно важны в следующих сценариях:
Ранние версии библиотеки ориентировались преимущественно на Node.js и CommonJS.
const validator = require('validator');
validator.isEmail('admin@example.com');
Подобный подход долгое время считался стандартным.
С развитием экосистемы JavaScript библиотека начала активно поддерживать ESM.
import validator from 'validator';
validator.isEmail('admin@example.com');
Также появилась возможность импортировать отдельные методы.
import isEmail from 'validator/lib/isEmail';
isEmail('admin@example.com');
Ранние версии библиотеки экспортировали единый объект со всеми методами:
validator.isEmail(...)
validator.isURL(...)
validator.isUUID(...)
Недостатки такого подхода:
Современные версии позволяют импортировать только конкретные валидаторы.
import isURL from 'validator/lib/isURL';
import isJSON from 'validator/lib/isJSON';
Преимущества:
В старых версиях встречались конструкции:
import isEmail from 'validator/es/lib/isEmail';
или:
import isEmail from 'validator/lib/isEmail.js';
Позднее часть путей была унифицирована.
import isEmail from 'validator/lib/isEmail';
Изменение структуры путей стало важным при миграции между major-версиями.
isEmailМетод isEmail() постепенно получал новые параметры и
более строгие правила проверки.
Ранее некоторые невалидные email-адреса проходили проверку.
validator.isEmail('test@test');
В отдельных версиях результат мог отличаться.
Теперь проверка стала значительно строже.
validator.isEmail('admin@example.com');
Дополнительно поддерживаются настройки:
validator.isEmail('admin@example.com', {
allow_display_name: true,
require_tld: true
});
isEmail| Параметр | Назначение |
|---|---|
allow_display_name |
Разрешает формат "John <john@mail.com>" |
require_tld |
Требует наличие доменной зоны |
allow_utf8_local_part |
Поддержка UTF-8 |
allow_ip_domain |
Разрешает IP вместо домена |
domain_specific_validation |
Дополнительные проверки популярных доменов |
isURLМетод имел ограниченный набор опций.
validator.isURL(url);
Появилось множество параметров конфигурации.
validator.isURL(url, {
protocols: ['http', 'https'],
require_protocol: true,
require_host: true,
require_port: false
});
Современный API поддерживает:
validator.isUUID(value);
Проверка выполнялась без указания версии UUID.
validator.isUUID(value, 4);
или:
validator.isUUID(value, '4');
Поддерживаются версии:
isDatevalidator.isDate('2023-10-01');
validator.isDate('2023-10-01', {
format: 'YYYY-MM-DD',
strictMode: true
});
Проблемы старого API:
Новый API сделал поведение более предсказуемым.
Многие валидаторы получили параметр строгой проверки.
Пример:
validator.isNumeric('123');
validator.isNumeric('123', {
no_symbols: true
});
Некоторые методы санитизации были признаны небезопасными.
Например:
validator.toString(value);
Поведение могло быть неоднозначным для null и
undefined.
Использование явного преобразования:
String(value);
или:
value?.toString();
Некоторые функции были полностью удалены из API.
В разные периоды устаревшими объявлялись:
toDate()toFloat()toInt()Причины:
Типы часто подключались отдельно.
npm install @types/validator
Библиотека включает встроенные типы.
import isEmail from 'validator/lib/isEmail';
const result: boolean = isEmail('admin@example.com');
Многие методы принимали ограниченный набор аргументов.
validator.isLength(str, 5);
Используется объект конфигурации.
validator.isLength(str, {
min: 5,
max: 20
});
isLengthvalidator.isLength(str, 5, 10);
validator.isLength(str, {
min: 5,
max: 10
});
Ранние версии плохо работали с Unicode.
Проблемы:
Современные версии корректнее работают с:
validator.isAlpha('Привет', 'ru-RU');
validator.isAlphanumeric('東京', 'ja-JP');
API постепенно получил поддержку большого количества локалей.
Примеры:
validator.isMobilePhone(phone, 'ru-RU');
validator.isPostalCode(code, 'DE');
isMobilePhoneПоддержка стран была ограниченной.
Поддерживаются десятки регионов.
validator.isMobilePhone('+77001234567', 'kk-KZ');
Также появилась возможность:
validator.isMobilePhone(phone, 'any');
Многие изменения API были связаны с безопасностью:
Некоторые методы были переработаны для предотвращения:
escapevalidator.escape('<script>');
Функция стала лучше учитывать HTML entities.
validator.escape('<div>Hello</div>');
Результат:
<div>Hello</div>
Поддерживались очень старые версии Node.js.
Поддержка legacy-сред постепенно удалялась.
Причины:
| Изменение | Последствие |
|---|---|
| Изменение сигнатуры | Старый код перестаёт работать |
| Удаление методов | Ошибки импорта |
| Изменение default behavior | Некорректная логика |
| Более строгая валидация | Ранее валидные данные становятся невалидными |
| Изменение путей импорта | Ошибки bundler |
Перед обновлением рекомендуется фиксировать текущую версию.
{
"dependencies": {
"validator": "13.11.0"
}
}
При переходе между major-версиями необходимо анализировать:
Крупные проекты часто используют промежуточные этапы:
Некоторые методы автоматически приводили значения к строке.
validator.isEmpty(null);
Это могло приводить к неожиданным результатам.
Явная проверка типов:
if (typeof value === 'string') {
validator.isEmpty(value);
}
Современный Validator.js постепенно сместился в сторону:
Наиболее частые ошибки после обновления:
Cannot find module 'validator/lib/isEmail'
validator.isURL('example.com');
После обновления строка может считаться невалидной без протокола.
TypeScript может начать выдавать ошибки:
Argument of type 'null' is not assignable
validator.isLength(name, 3, 20);
validator.isLength(name, {
min: 3,
max: 20
});
const validator = require('validator');
import validator from 'validator';
import isEmail from 'validator/lib/isEmail';
Следует регулярно проверять changelog библиотеки.
Лучше избегать reliance на default behavior.
validator.isURL(url, {
require_protocol: true
});
Особенно важна при обновлении: