@ssibrahimbas/v-mask
Version:
mask directive for vue3
57 lines (56 loc) • 1.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useMask = void 0;
const masker_1 = require("./masker");
const tokens_1 = require("./tokens");
const event = (name) => {
return new CustomEvent(name, {
bubbles: true,
cancelable: true,
composed: true,
});
};
const useMask = (el, binding) => {
if (!binding.value)
return;
let config = binding.value;
if (Array.isArray(config) || typeof config === "string") {
config = {
mask: config,
tokens: tokens_1.tokens,
};
}
if (el.tagName.toLocaleUpperCase() !== "INPUT") {
const els = el.getElementsByTagName("input");
if (els.length !== 1) {
throw new Error("v-mask directive requires 1 input, found " + els.length);
}
else {
el = els[0];
}
}
el.oninput = function (evt) {
if (!evt.isTrusted)
return;
let position = el.selectionEnd || 0;
const digit = el.value[position - 1];
el.value = (0, masker_1.masker)(el.value, config.mask, config.tokens, true);
while (position < el.value.length &&
el.value.charAt(position - 1) !== digit) {
position++;
}
if (el === document.activeElement) {
el.setSelectionRange(position, position);
setTimeout(function () {
el.setSelectionRange(position, position);
}, 0);
}
el.dispatchEvent(event("input"));
};
const newDisplay = (0, masker_1.masker)(el.value, config.mask, config.tokens, true);
if (newDisplay !== el.value) {
el.value = newDisplay;
el.dispatchEvent(event("input"));
}
};
exports.useMask = useMask;