Механизм плагинов в Inputmask строится вокруг расширяемой системы определений символов, алиасов и поведенческих хук-функций. Базовое ядро библиотеки реализует обработку ввода как последовательность преобразований строки в соответствии с маской, где каждый символ маски связан с определённой логикой валидации и форматирования. Плагины встраиваются в этот процесс через расширение глобальных регистров и прототипов, не нарушая внутренний pipeline обработки.
Ключевые точки расширения:
Inputmask.extendDefinitionsInputmask.extendAliasesКаждый символ маски в Inputmask связан с объектом определения. Это определение описывает:
Пример структуры определения:
{
validator: "[0-9]",
cardinality: 1,
definitionSymbol: "*"
}
Плагин, расширяющий поведение, чаще всего начинает с добавления нового символа в registry definitions. Этот механизм реализуется через глобальный объект Inputmask.
Внутренний реестр definitions является глобальным словарём, где ключом выступает символ маски.
Расширение выполняется через:
Inputmask.extendDefinitions({
"#": {
validator: "[1-9]",
cardinality: 1,
definitionSymbol: "#"
}
});
После добавления нового определения символ # становится
полноценной частью грамматики маски и участвует во всех стадиях
обработки ввода.
После регистрации нового символа:
Таким образом, плагин не просто добавляет символ, а расширяет язык описания масок.
Validator может быть функцией, что превращает definition в полноценный модуль логики.
Inputmask.extendDefinitions({
"H": {
validator: function (ch) {
return /[A-Fa-f0-9]/.test(ch);
},
cardinality: 1
}
});
Функциональный валидатор позволяет реализовать:
Плагины часто используют hook-механизмы, встроенные в Inputmask pipeline.
Основные точки вмешательства:
onBeforeMaskonBeforePasteonUnMaskonBeforeWriteКаждый хук позволяет модифицировать данные на определённой стадии жизненного цикла.
На стадии предварительного форматирования входное значение может быть нормализовано:
Inputmask.extendAliases({
customAlias: {
onBeforeMask: function (value) {
return value.trim().toLowerCase();
}
}
});
Хук выполняется до применения маски, что позволяет плагину изменять исходные данные.
Aliases представляют собой преднастроенные конфигурации масок. Каждый alias включает:
Расширение aliases формирует уровень абстракции над definitions.
Inputmask.extendAliases({
"phone-ext": {
mask: "+7 (999) 999-99-99",
greedy: false,
clearIncomplete: true
}
});
Aliases используются как инкапсуляция сложных масок, где plugin-поведение определяется не только символами, но и конфигурацией.
Сложные плагины строятся как комбинация:
Такой подход формирует композиционную модель, где несколько независимых расширений могут работать одновременно без конфликта, если не перекрывают одни и те же символы или алиасы.
Post-processing применяется после завершения ввода или при извлечении значения из input.
Inputmask.extendAliases({
numericCustom: {
onUnMask: function (maskedValue) {
return maskedValue.replace(/\s/g, "");
}
}
});
Этот слой используется для:
Плагины могут внедрять динамическую генерацию маски в зависимости от вводимых данных.
Механизм реализуется через функцию mask:
Inputmask.extendAliases({
dynamicZip: {
mask: function (opts) {
return opts.numericInput ? "99999" : "99999-9999";
}
}
});
Здесь plugin-логика управляет структурой маски на лету, превращая Inputmask в реактивную систему форматирования.
Расширения часто используют HTML-метаданные для конфигурации поведения без изменения JavaScript-кода.
Пример модели:
Плагин может интерпретировать дополнительные атрибуты через preprocessing слой, расширяя стандартный парсер конфигурации.
Некоторые плагины изменяют алгоритм перемещения курсора. Это достигается через переопределение внутренних стратегий обработки позиции:
Хотя прямой API ограничен, поведение может быть модифицировано через комбинацию definitions и hooks.
При создании плагинов важна изоляция расширений. Основные принципы:
Конфликтная ситуация возникает при перекрытии validator-логики одного символа несколькими плагинами, что приводит к неоднозначной валидации.
Механизм extend не заменяет существующие определения полностью, а расширяет или переопределяет их. Это создаёт цепочную модель:
При этом последняя запись в registry имеет приоритет.
Плагины обычно оформляются как независимые модули:
Такая структура позволяет интегрировать расширения в сборщики (Webpack, Rollup, Vite) без изменения ядра библиотеки.
На практике плагины Inputmask реализуют:
Каждый сценарий опирается на комбинацию definitions и runtime hooks, формируя специализированный слой над базовым движком маскирования.