v-mask
Version:
Tiny input mask library for Vue.js based on text-mask-core (~5kb) exposed as directive. No dependencies
58 lines (53 loc) • 1.73 kB
JavaScript
import { defaultMaskReplacers, NEXT_CHAR_OPTIONAL } from '../constants';
import { castToRegexp, makeRegexpOptional } from './regexp';
/**
* @param {string[]} mask
* @param {MaskReplaces} maskReplacers
* @returns {RegExp[]}
*/
function maskToRegExpMask(mask, maskReplacers = defaultMaskReplacers) {
return mask
.map((char, index, array) => {
const maskChar = maskReplacers[char] || char;
const previousChar = array[index - 1];
const previousMaskChar = maskReplacers[previousChar] || previousChar;
if (maskChar === NEXT_CHAR_OPTIONAL) {
return null;
}
if (previousMaskChar === NEXT_CHAR_OPTIONAL) {
return makeRegexpOptional(castToRegexp(maskChar));
}
return maskChar;
})
.filter(Boolean);
}
/**
* Converts mask from `v-mask` string format to `text-mask-core` format
* @param {string} stringMask
* @param {MaskReplaces} maskReplacers
* @return {RegExp[]}
*/
export function stringMaskToRegExpMask(stringMask, maskReplacers = defaultMaskReplacers) {
return maskToRegExpMask(stringMask.split(''), maskReplacers);
}
/**
* Converts mask from `v-mask` array format to `text-mask-core` format
* @param {Array.<string|RegExp>} arrayMask
* @param {MaskReplaces} maskReplacers
* @return {RegExp[]}
*/
export function arrayMaskToRegExpMask(arrayMask, maskReplacers = defaultMaskReplacers) {
const flattenedMask = arrayMask
.map((part) => {
if (part instanceof RegExp) {
return part;
}
if (typeof part === 'string') {
return part.split('');
}
return null;
})
.filter(Boolean)
.reduce((mask, part) => mask.concat(part), []);
return maskToRegExpMask(flattenedMask, maskReplacers);
}