Организация библиотеки алиасов

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

Внутри библиотеки поддерживается глобальный реестр алиасов, представляющий собой словарь, где ключом выступает строковое имя алиаса, а значением — конфигурационный объект. Этот объект может содержать:

  • базовый масочный шаблон (mask или pattern)
  • определения символов (definitions)
  • правила автодополнения и заполнения
  • функции обратного вызова (onBeforeMask, onUnMask, onBeforeWrite)
  • настройки поведения каретки
  • параметры очистки и нормализации ввода

Такой подход позволяет отделить декларацию формата данных от логики его применения.

Регистрация алиаса

Регистрация нового алиаса осуществляется через расширение реестра. Каждый алиас добавляется как именованный конфигурационный объект:

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

Ключевой принцип — декларативность. Алиас описывает не действия, а конечное поведение маски.

В типичном сценарии регистрации определяется базовая структура:

  • идентификатор формата (например, “phone”, “currency”, “email”)
  • базовые ограничения ввода
  • правила форматирования отображения

Механизм наследования алиасов

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

При наследовании происходит:

  • копирование базовой конфигурации
  • переопределение отдельных параметров
  • объединение объектов definitions
  • переопределение callback-функций

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

Глубокое слияние конфигураций

При расширении алиаса используется механизм глубокого слияния:

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

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

Переопределение и модификация существующих алиасов

Существующий алиас может быть изменён в любой момент. Это используется для:

  • локализации форматов (например, телефонные номера по странам)
  • адаптации под бизнес-логику
  • добавления новых правил валидации

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

Порядок разрешения алиасов

При использовании алиаса в инициализации маски происходит следующий процесс:

  1. Поиск алиаса в реестре
  2. Загрузка базовой конфигурации
  3. Применение наследуемых алиасов (если указаны)
  4. Слияние пользовательской конфигурации
  5. Компиляция итоговой маски
  6. Инициализация обработчиков ввода

Таким образом, итоговая маска является результатом цепочки трансформаций, а не статической сущностью.

Глобальные и локальные алиасы

Система различает два уровня определения:

  • глобальные алиасы — доступны во всех контекстах использования библиотеки
  • локальные алиасы — передаются через конфигурацию конкретного экземпляра

Локальные алиасы имеют приоритет над глобальными при совпадении имён. Это позволяет изолировать поведение в рамках отдельных модулей приложения.

Композиция алиасов

Алиасы могут строиться через композицию:

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

Композиция позволяет создавать дерево форматов без дублирования логики.

Работа с definitions внутри алиасов

definitions являются ключевым механизмом расширения языка масок. В контексте алиасов они позволяют:

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

При объединении алиасов definitions сливаются по ключу, что позволяет безопасно расширять набор допустимых символов без разрушения базовой логики.

Callback-функции в алиасах

Алиасы могут включать набор жизненных циклов обработки ввода:

  • предварительная обработка входной строки
  • трансформация отображаемого значения
  • обратное преобразование (unmasking)
  • постобработка после изменения значения

Эти функции позволяют реализовать сложные сценарии:

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

Важно, что порядок вызова callback-функций определяется внутренним пайплайном обработки ввода.

Паттерны построения алиасов

Существует несколько устойчивых архитектурных подходов:

1. Базовый алиас + расширения

Используется для форматов с вариативными правилами (телефоны, документы).

2. Семейство алиасов

Набор алиасов с общим префиксом и различными параметрами (например, currency-eur, currency-usd).

3. Контекстные алиасы

Изменяют поведение в зависимости от состояния формы или внешних данных.

4. Декларативные цепочки

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

Конфликты алиасов и стратегия разрешения

При наличии конфликтующих определений применяется правило приоритета:

  • локальная конфигурация
  • явное переопределение при инициализации
  • наследуемый алиас
  • глобальный алиас

Конфликт definitions разрешается по ключу, тогда как конфликт mask приводит к полной замене шаблона.

Производительность при использовании алиасов

Глубокие цепочки наследования могут влиять на скорость инициализации масок. Основные факторы:

  • количество уровней наследования
  • объём definitions
  • количество callback-функций
  • динамическая компиляция маски

Для оптимизации часто используется предварительная сборка алиасов в финальные конфигурации до инициализации UI.

Типичные ошибки проектирования алиасов

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

Такие ошибки приводят к трудно поддерживаемым конфигурациям и непредсказуемому поведению масок ввода.