UNPKG

imask

Version:

vanilla javascript input mask

122 lines (114 loc) 7.65 kB
import { isString, isObject, pick } from '../core/utils.js'; import IMask from '../core/holder.js'; // TODO can't use overloads here because of https://github.com/microsoft/TypeScript/issues/50754 // export function maskedClass(mask: string): typeof MaskedPattern; // export function maskedClass(mask: DateConstructor): typeof MaskedDate; // export function maskedClass(mask: NumberConstructor): typeof MaskedNumber; // export function maskedClass(mask: Array<any> | ArrayConstructor): typeof MaskedDynamic; // export function maskedClass(mask: MaskedDate): typeof MaskedDate; // export function maskedClass(mask: MaskedNumber): typeof MaskedNumber; // export function maskedClass(mask: MaskedEnum): typeof MaskedEnum; // export function maskedClass(mask: MaskedRange): typeof MaskedRange; // export function maskedClass(mask: MaskedRegExp): typeof MaskedRegExp; // export function maskedClass(mask: MaskedFunction): typeof MaskedFunction; // export function maskedClass(mask: MaskedPattern): typeof MaskedPattern; // export function maskedClass(mask: MaskedDynamic): typeof MaskedDynamic; // export function maskedClass(mask: Masked): typeof Masked; // export function maskedClass(mask: typeof Masked): typeof Masked; // export function maskedClass(mask: typeof MaskedDate): typeof MaskedDate; // export function maskedClass(mask: typeof MaskedNumber): typeof MaskedNumber; // export function maskedClass(mask: typeof MaskedEnum): typeof MaskedEnum; // export function maskedClass(mask: typeof MaskedRange): typeof MaskedRange; // export function maskedClass(mask: typeof MaskedRegExp): typeof MaskedRegExp; // export function maskedClass(mask: typeof MaskedFunction): typeof MaskedFunction; // export function maskedClass(mask: typeof MaskedPattern): typeof MaskedPattern; // export function maskedClass(mask: typeof MaskedDynamic): typeof MaskedDynamic; // export function maskedClass<Mask extends typeof Masked> (mask: Mask): Mask; // export function maskedClass(mask: RegExp): typeof MaskedRegExp; // export function maskedClass(mask: (value: string, ...args: any[]) => boolean): typeof MaskedFunction; /** Get Masked class by mask type */ function maskedClass(mask) /* TODO */{ if (mask == null) throw new Error('mask property should be defined'); if (mask instanceof RegExp) return IMask.MaskedRegExp; if (isString(mask)) return IMask.MaskedPattern; if (mask === Date) return IMask.MaskedDate; if (mask === Number) return IMask.MaskedNumber; if (Array.isArray(mask) || mask === Array) return IMask.MaskedDynamic; if (IMask.Masked && mask.prototype instanceof IMask.Masked) return mask; if (IMask.Masked && mask instanceof IMask.Masked) return mask.constructor; if (mask instanceof Function) return IMask.MaskedFunction; console.warn('Mask not found for mask', mask); // eslint-disable-line no-console return IMask.Masked; } function normalizeOpts(opts) { if (!opts) throw new Error('Options in not defined'); if (IMask.Masked) { if (opts.prototype instanceof IMask.Masked) return { mask: opts }; /* handle cases like: 1) opts = Masked 2) opts = { mask: Masked, ...instanceOpts } */ const { mask = undefined, ...instanceOpts } = opts instanceof IMask.Masked ? { mask: opts } : isObject(opts) && opts.mask instanceof IMask.Masked ? opts : {}; if (mask) { const _mask = mask.mask; return { ...pick(mask, (_, k) => !k.startsWith('_')), mask: mask.constructor, _mask, ...instanceOpts }; } } if (!isObject(opts)) return { mask: opts }; return { ...opts }; } // TODO can't use overloads here because of https://github.com/microsoft/TypeScript/issues/50754 // From masked // export default function createMask<Opts extends Masked, ReturnMasked=Opts> (opts: Opts): ReturnMasked; // // From masked class // export default function createMask<Opts extends MaskedOptions<typeof Masked>, ReturnMasked extends Masked=InstanceType<Opts['mask']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedOptions<typeof MaskedDate>, ReturnMasked extends MaskedDate=MaskedDate<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedOptions<typeof MaskedNumber>, ReturnMasked extends MaskedNumber=MaskedNumber<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedOptions<typeof MaskedEnum>, ReturnMasked extends MaskedEnum=MaskedEnum<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedOptions<typeof MaskedRange>, ReturnMasked extends MaskedRange=MaskedRange<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedOptions<typeof MaskedRegExp>, ReturnMasked extends MaskedRegExp=MaskedRegExp<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedOptions<typeof MaskedFunction>, ReturnMasked extends MaskedFunction=MaskedFunction<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedOptions<typeof MaskedPattern>, ReturnMasked extends MaskedPattern=MaskedPattern<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedOptions<typeof MaskedDynamic>, ReturnMasked extends MaskedDynamic=MaskedDynamic<Opts['parent']>> (opts: Opts): ReturnMasked; // // From mask opts // export default function createMask<Opts extends MaskedOptions<Masked>, ReturnMasked=Opts extends MaskedOptions<infer M> ? M : never> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedNumberOptions, ReturnMasked extends MaskedNumber=MaskedNumber<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedDateFactoryOptions, ReturnMasked extends MaskedDate=MaskedDate<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedEnumOptions, ReturnMasked extends MaskedEnum=MaskedEnum<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedRangeOptions, ReturnMasked extends MaskedRange=MaskedRange<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedPatternOptions, ReturnMasked extends MaskedPattern=MaskedPattern<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedDynamicOptions, ReturnMasked extends MaskedDynamic=MaskedDynamic<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedOptions<RegExp>, ReturnMasked extends MaskedRegExp=MaskedRegExp<Opts['parent']>> (opts: Opts): ReturnMasked; // export default function createMask<Opts extends MaskedOptions<Function>, ReturnMasked extends MaskedFunction=MaskedFunction<Opts['parent']>> (opts: Opts): ReturnMasked; /** Creates new {@link Masked} depending on mask type */ function createMask(opts) { if (IMask.Masked && opts instanceof IMask.Masked) return opts; const nOpts = normalizeOpts(opts); const MaskedClass = maskedClass(nOpts.mask); if (!MaskedClass) throw new Error("Masked class is not found for provided mask " + nOpts.mask + ", appropriate module needs to be imported manually before creating mask."); if (nOpts.mask === MaskedClass) delete nOpts.mask; if (nOpts._mask) { nOpts.mask = nOpts._mask; delete nOpts._mask; } return new MaskedClass(nOpts); } IMask.createMask = createMask; export { createMask as default, maskedClass, normalizeOpts };