Breaking changes

Переход между крупными версиями библиотеки сопровождался переработкой внутренних механизмов обработки масок, что привело к изменению поведения в ряде сценариев. Основная цель эволюции — повышение предсказуемости ввода, устранение неоднозначностей в парсинге масок и унификация API для различных окружений (браузер, фреймворки, SSR).

Пересмотр модели обработки ввода

Одним из ключевых изменений стало изменение внутреннего цикла обработки событий ввода. Ранее логика была тесно привязана к последовательности DOM-событий, что приводило к различиям между браузерами. В новых версиях введён единый слой нормализации ввода:

  • унифицирована обработка keydown, input, paste
  • устранены различия поведения между mobile/desktop окружениями
  • изменён порядок применения маски к входному значению

Следствием стало то, что некоторые сценарии «постепенного заполнения» маски начали вести себя иначе, особенно при автозаполнении и вставке текста.

Изменение синтаксиса масок и правил интерпретации

Ранее допустимые конструкции масок интерпретировались более гибко, что иногда приводило к неоднозначным результатам. В обновлённой модели:

  • жёстче интерпретируются символы-метасимволы
  • изменено поведение экранирования
  • сокращены «неявные» преобразования символов

Например, конструкции с необязательными сегментами теперь требуют более явного описания, иначе поведение считается неопределённым.

Особенно заметны изменения в обработке:

  • числовых масок с разделителями
  • масок дат и времени
  • пользовательских алфавитных шаблонов

Удаление и переименование устаревших опций

В рамках эволюции Inputmask были удалены или заменены ряд конфигурационных параметров, которые ранее считались устаревшими.

Типовые изменения:

  • опции, связанные с legacy-поведением автокоррекции ввода, исключены
  • некоторые булевы флаги заменены объектной конфигурацией
  • параметры, дублирующие функциональность новых API, удалены

Особенность миграции заключается в том, что старые параметры не всегда приводили к ошибке — в некоторых случаях они просто игнорировались, что усложняло диагностику.

Изменения событийной модели

Существенные изменения затронули события, которые генерирует библиотека:

  • изменён набор кастомных событий
  • пересмотрена структура payload
  • унифицирован формат данных в oncomplete, onincomplete, oncleared

В старых версиях события могли содержать частично «сырые» значения поля. В новых версиях все значения проходят через финальную нормализацию маски.

Также изменилось поведение при программном изменении значения поля:

  • вызов .setValue() больше не инициирует полный цикл пользовательских событий
  • различаются сценарии «инициировано пользователем» и «инициировано программно»

Изменения в инициализации масок

Ранее инициализация часто выполнялась через прямой вызов функции с DOM-элементом. В новых версиях акцент смещён в сторону конфигурационного объекта:

  • единый формат инициализации через options
  • явное разделение маски и поведения
  • поддержка ленивой инициализации

Изменилось также поведение при повторной инициализации на одном и том же элементе:

  • старый инстанс теперь должен быть явно уничтожен
  • автоматическое «переприсваивание» маски считается потенциально опасным

Изменения обработки paste и autofill

Одним из наиболее критичных breaking changes стало изменение обработки вставки данных:

  • вставка теперь проходит через полноценный парсер маски
  • изменена стратегия «очистки» входных данных
  • автозаполнение браузера обрабатывается как пакетное событие

Ранее вставка могла частично игнорировать маску при определённых условиях, что приводило к неконсистентным состояниям. Новая модель устранила этот класс ошибок, но изменила поведение существующих интеграций.

Изменения в пользовательских масках и валидаторах

Пользовательские определения масок стали более строгими:

  • изменён формат кастомных валидаторов
  • убрана возможность неявного возврата undefined как валидного состояния
  • усилена проверка типов возвращаемых значений

Также изменилось поведение при конфликте правил:

  • ранее применялось «последнее правило выигрывает»
  • теперь используется детерминированный приоритет правил

Изменения в интеграции с фреймворками

Интеграции с React, Vue и другими библиотеками были переработаны в сторону изоляции состояния:

  • отказ от прямого вмешательства в жизненный цикл компонента
  • переход к контролируемым обёрткам
  • устранение побочных эффектов при re-render

В результате поведение маски стало более предсказуемым, но потребовало явного управления обновлениями значения.

Изменения data-атрибутов и декларативной конфигурации

Декларативная инициализация через HTML-атрибуты также претерпела изменения:

  • часть атрибутов была переименована
  • некоторые атрибуты больше не поддерживаются
  • изменён приоритет между data-атрибутами и JS-конфигурацией

Теперь JavaScript-конфигурация имеет приоритет над HTML-разметкой без возможности частичного слияния в отдельных случаях.

Изменение модели удаления маски

Ранее удаление маски часто означало «очистку поведения», но сохранение части форматирования. В новой модели:

  • уничтожается весь внутренний state
  • поле возвращается к чистому DOM-input поведению
  • отменяются все слушатели событий

Это изменение критично для динамических интерфейсов, где маска переключается в рантайме.

Совместимость и поведение в разных браузерах

Отдельное направление breaking changes связано с выравниванием поведения между браузерами:

  • унифицирована работа с contenteditable
  • изменены fallback-механизмы для старых движков
  • устранены различия в обработке input[type=number]

Некоторые старые обходные пути были удалены, так как больше не соответствуют современным спецификациям DOM.

Типовые сценарии миграции

Миграция между версиями Inputmask обычно затрагивает несколько уровней:

  • пересборка конфигураций масок
  • замена устаревших опций
  • переработка событийных обработчиков
  • проверка поведения paste/autofill
  • адаптация интеграции с UI-фреймворками

Наиболее частые источники ошибок при переходе:

  • неявно используемые deprecated-параметры
  • зависимость от старого поведения вставки текста
  • ожидание частичных обновлений маски вместо полной переработки значения
  • смешение декларативной и программной инициализации

Изменения в производительности и побочные эффекты

Изменения архитектуры привели к перераспределению нагрузки:

  • увеличена стоимость первичной инициализации
  • снижена стоимость обработки повторного ввода
  • уменьшено количество DOM-операций при вводе

В старых реализациях часть логики выполнялась синхронно на каждый символ, что приводило к микролагам в сложных масках. Новая модель смещает часть вычислений в предварительную нормализацию.

Поведение при некорректных масках

Ранее некорректные маски могли «молчаливо деградировать», частично работая. Теперь поведение изменено:

  • некорректная маска либо полностью отклоняется
  • либо переводится в строгое ограниченное поведение
  • диагностика ошибок стала более явной

Это изменение особенно важно для сложных форм с динамическими масками, где ранее ошибки маскирования могли быть незаметны на ранних этапах разработки.