{"version":3,"file":"imask.min.js","sources":["../src/core/utils.ts","../src/core/action-details.ts","../src/core/holder.ts","../src/masked/factory.ts","../src/controls/mask-element.ts","../src/controls/html-mask-element.ts","../src/controls/html-input-mask-element.ts","../src/controls/html-contenteditable-mask-element.ts","../src/controls/input-history.ts","../src/controls/input.ts","../src/core/change-details.ts","../src/core/continuous-tail-details.ts","../src/masked/base.ts","../src/masked/pattern/chunk-tail-details.ts","../src/masked/pattern/cursor.ts","../src/masked/pattern/fixed-definition.ts","../src/masked/pattern/input-definition.ts","../src/masked/regexp.ts","../src/masked/pattern.ts","../src/masked/range.ts","../src/masked/date.ts","../src/masked/dynamic.ts","../src/masked/enum.ts","../src/masked/function.ts","../src/masked/number.ts","../src/masked/pipe.ts","../src/masked/repeat.ts","../src/index.ts"],"sourcesContent":["/** Checks if value is string */\nexport\nfunction isString (str: unknown): str is string {\n return typeof str === 'string' || str instanceof String;\n}\n\n/** Checks if value is object */\nexport\nfunction isObject (obj: unknown): obj is object {\n return typeof obj === 'object' && obj != null && obj?.constructor?.name === 'Object';\n}\n\nexport\nfunction pick, K extends keyof T, V extends T[keyof T]> (\n obj: T,\n keys: K[] | ((v: V, k: K) => boolean),\n): Pick {\n if (Array.isArray(keys)) return pick(obj, (_, k) => keys.includes(k));\n return (Object.entries(obj) as unknown as Array<[K, V]>)\n .reduce((acc, [k, v]) => {\n if (keys(v, k)) acc[k] = v;\n return acc;\n }, {} as any);\n}\n\n/** Direction */\nexport\nconst DIRECTION = {\n NONE: 'NONE',\n LEFT: 'LEFT',\n FORCE_LEFT: 'FORCE_LEFT',\n RIGHT: 'RIGHT',\n FORCE_RIGHT: 'FORCE_RIGHT',\n} as const;\n\n/** Direction */\nexport\ntype Direction = typeof DIRECTION[keyof typeof DIRECTION];\n\nexport\nfunction forceDirection (direction: Direction): Direction {\n switch (direction) {\n case DIRECTION.LEFT:\n return DIRECTION.FORCE_LEFT;\n case DIRECTION.RIGHT:\n return DIRECTION.FORCE_RIGHT;\n default:\n return direction;\n }\n}\n\n/** Escapes regular expression control chars */\nexport\nfunction escapeRegExp (str: string): string {\n return str.replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1');\n}\n\n// cloned from https://github.com/epoberezkin/fast-deep-equal with small changes\nexport\nfunction objectIncludes (b: any, a: any): boolean {\n if (a === b) return true;\n\n const arrA = Array.isArray(a), arrB = Array.isArray(b);\n let i;\n\n if (arrA && arrB) {\n if (a.length != b.length) return false;\n for (i = 0; i < a.length; i++)\n if (!objectIncludes(a[i], b[i])) return false;\n return true;\n }\n\n if (arrA != arrB) return false;\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n const dateA = a instanceof Date, dateB = b instanceof Date;\n if (dateA && dateB) return a.getTime() == b.getTime();\n if (dateA != dateB) return false;\n\n const regexpA = a instanceof RegExp, regexpB = b instanceof RegExp;\n if (regexpA && regexpB) return a.toString() == b.toString();\n if (regexpA != regexpB) return false;\n\n const keys = Object.keys(a);\n // if (keys.length !== Object.keys(b).length) return false;\n\n for (i = 0; i < keys.length; i++)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = 0; i < keys.length; i++)\n if(!objectIncludes(b[keys[i]], a[keys[i]])) return false;\n\n return true;\n } else if (a && b && typeof a === 'function' && typeof b === 'function') {\n return a.toString() === b.toString()\n }\n\n return false;\n}\n\n/** Selection range */\nexport\ntype Selection = {\n start: number;\n end: number;\n};\n","import { type Direction, type Selection, DIRECTION } from './utils';\n\nexport\ntype ActionDetailsOptions = Pick;\n\n\n/** Provides details of changing input */\nexport default\nclass ActionDetails {\n /** Current input value */\n declare value: string;\n /** Current cursor position */\n declare cursorPos: number;\n /** Old input value */\n declare oldValue: string;\n /** Old selection */\n declare oldSelection: Selection;\n\n constructor (opts: ActionDetailsOptions) {\n Object.assign(this, opts);\n\n // double check if left part was changed (autofilling, other non-standard input triggers)\n while (this.value.slice(0, this.startChangePos) !== this.oldValue.slice(0, this.startChangePos)) {\n --this.oldSelection.start;\n }\n\n // double check right part\n while (this.value.slice(this.cursorPos) !== this.oldValue.slice(this.oldSelection.end)) {\n if (this.value.length - this.cursorPos < this.oldValue.length - this.oldSelection.end) ++this.oldSelection.end;\n else ++this.cursorPos;\n }\n }\n\n /** Start changing position */\n get startChangePos (): number {\n return Math.min(this.cursorPos, this.oldSelection.start);\n }\n\n /** Inserted symbols count */\n get insertedCount (): number {\n return this.cursorPos - this.startChangePos;\n }\n\n /** Inserted symbols */\n get inserted (): string {\n return this.value.substr(this.startChangePos, this.insertedCount);\n }\n\n /** Removed symbols count */\n get removedCount (): number {\n // Math.max for opposite operation\n return Math.max((this.oldSelection.end - this.startChangePos) ||\n // for Delete\n this.oldValue.length - this.value.length, 0);\n }\n\n /** Removed symbols */\n get removed (): string {\n return this.oldValue.substr(this.startChangePos, this.removedCount);\n }\n\n /** Unchanged head symbols */\n get head (): string {\n return this.value.substring(0, this.startChangePos);\n }\n\n /** Unchanged tail symbols */\n get tail (): string {\n return this.value.substring(this.startChangePos + this.insertedCount);\n }\n\n /** Remove direction */\n get removeDirection (): Direction {\n if (!this.removedCount || this.insertedCount) return DIRECTION.NONE;\n\n // align right if delete at right\n return (\n (this.oldSelection.end === this.cursorPos || this.oldSelection.start === this.cursorPos) &&\n // if not range removed (event with backspace)\n this.oldSelection.end === this.oldSelection.start\n ) ?\n DIRECTION.RIGHT :\n DIRECTION.LEFT;\n }\n}\n","import type { default as _InputMask, InputMaskElement as _InputMaskElement } from '../controls/input';\nimport type { default as _Masked } from '../masked/base';\nimport type { default as _MaskedPattern } from '../masked/pattern';\nimport type { default as _RepeatBlock } from '../masked/repeat';\nimport type { default as _MaskedDate } from '../masked/date';\nimport type { default as _MaskedDynamic } from '../masked/dynamic';\nimport type { default as _MaskedEnum } from '../masked/enum';\nimport type { default as _MaskedRange } from '../masked/range';\nimport type { default as _MaskedNumber } from '../masked/number';\nimport type { default as _MaskedFunction } from '../masked/function';\nimport type { default as _MaskedRegExp } from '../masked/regexp';\nimport type {\n default as _createMask,\n FactoryArg,\n} from '../masked/factory';\nimport type { default as _ChangeDetails } from './change-details';\n\nimport type { default as _MaskElement } from '../controls/mask-element';\nimport type { default as _HTMLMaskElement } from '../controls/html-mask-element';\nimport type { default as _HTMLContenteditableMaskElement } from '../controls/html-contenteditable-mask-element';\nimport type {\n createPipe as _createPipe,\n pipe as _pipe,\n PIPE_TYPE as _PIPE_TYPE\n} from '../masked/pipe';\n\n\n/** Applies mask on element */\nfunction IMask (el: _InputMaskElement, opts: Opts): _InputMask {\n // currently available only for input-like elements\n return new IMask.InputMask(el, opts);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\ndeclare namespace IMask {\n export let InputMask: typeof _InputMask;\n export let createMask: typeof _createMask;\n export let Masked: typeof _Masked;\n export let MaskedPattern: typeof _MaskedPattern;\n export let RepeatBlock: typeof _RepeatBlock;\n export let MaskedDate: typeof _MaskedDate;\n export let MaskedDynamic: typeof _MaskedDynamic;\n export let MaskedEnum: typeof _MaskedEnum;\n export let MaskedRange: typeof _MaskedRange;\n export let MaskedNumber: typeof _MaskedNumber;\n export let MaskedFunction: typeof _MaskedFunction;\n export let MaskedRegExp: typeof _MaskedRegExp;\n export let ChangeDetails: typeof _ChangeDetails;\n export let MaskElement: typeof _MaskElement;\n export let HTMLMaskElement: typeof _HTMLMaskElement;\n export let HTMLContenteditableMaskElement: typeof _HTMLContenteditableMaskElement;\n export let createPipe: typeof _createPipe;\n export let pipe: typeof _pipe;\n export let PIPE_TYPE: typeof _PIPE_TYPE;\n}\n\nexport default IMask;\n","import { isString, pick, isObject } from '../core/utils';\nimport type Masked from './base';\nimport { type MaskedOptions } from './base';\nimport IMask from '../core/holder';\n\nimport type MaskedRegExp from './regexp';\nimport type MaskedPattern from './pattern';\nimport type MaskedFunction from './function';\nimport type MaskedDate from './date';\nimport type MaskedNumber from './number';\nimport type MaskedDynamic from './dynamic';\nimport type MaskedRange from './range';\nimport type MaskedEnum from './enum';\n\nimport { type MaskedEnumOptions } from './enum';\nimport { type MaskedRangeOptions } from './range';\nimport { type MaskedDynamicOptions } from './dynamic';\nimport { type MaskedPatternOptions } from './pattern';\nimport { type MaskedNumberOptions } from './number';\nimport { type MaskedRegExpOptions } from './regexp';\nimport { type MaskedFunctionOptions } from './function';\nimport { type MaskedDateOptions } from './date';\n\ntype MaskedDateFactoryOptions = Omit & { mask: DateConstructor };\n\nexport\ntype FactoryStaticOpts =\n | MaskedDateFactoryOptions\n | MaskedNumberOptions\n | MaskedPatternOptions\n | MaskedDynamicOptions\n | MaskedRegExpOptions\n | MaskedFunctionOptions\n;\n\nexport\ntype AllFactoryStaticOpts =\n & MaskedDateFactoryOptions\n & MaskedNumberOptions\n & MaskedPatternOptions\n & MaskedDynamicOptions\n & MaskedRegExpOptions\n & MaskedFunctionOptions\n & MaskedEnumOptions\n & MaskedRangeOptions\n;\n\nexport\ntype FactoryStaticReturnMasked =\n Opts extends MaskedDateFactoryOptions ? MaskedDate :\n Opts extends MaskedNumberOptions ? MaskedNumber :\n Opts extends MaskedPatternOptions ? MaskedPattern :\n Opts extends MaskedDynamicOptions ? MaskedDynamic :\n Opts extends MaskedRegExpOptions ? MaskedRegExp :\n Opts extends MaskedFunctionOptions ? MaskedFunction :\n never\n;\n\nexport\ntype FactoryStaticMaskReturnMasked =\n Mask extends MaskedDateFactoryOptions['mask'] ? MaskedDate :\n Mask extends MaskedNumberOptions['mask'] ? MaskedNumber :\n Mask extends MaskedPatternOptions['mask'] ? MaskedPattern :\n Mask extends MaskedDynamicOptions['mask'] ? MaskedDynamic :\n Mask extends MaskedRegExpOptions['mask'] ? MaskedRegExp :\n Mask extends MaskedFunctionOptions['mask'] ? MaskedFunction :\n never\n;\n\n\nexport\ntype FactoryInstanceOpts =\n | { mask: MaskedDate } & Omit\n | { mask: MaskedNumber } & Omit\n | { mask: MaskedEnum } & Omit\n | { mask: MaskedRange } & Omit\n | { mask: MaskedRegExp } & Omit\n | { mask: MaskedFunction } & Omit\n | { mask: MaskedPattern } & Omit\n | { mask: MaskedDynamic } & Omit\n | { mask: Masked } & Omit\n;\n\nexport\ntype FactoryInstanceReturnMasked = Opts extends { mask: infer M } ? M : never;\n\nexport\ntype FactoryConstructorOpts =\n | { mask: typeof MaskedDate } & Omit\n | { mask: typeof MaskedNumber } & Omit\n | { mask: typeof MaskedEnum } & Omit\n | { mask: typeof MaskedRange } & Omit\n | { mask: typeof MaskedRegExp } & Omit\n | { mask: typeof MaskedFunction } & Omit\n | { mask: typeof MaskedPattern } & Omit\n | { mask: typeof MaskedDynamic } & Omit\n | { mask: typeof Masked } & Omit\n;\n \nexport\ntype FactoryConstructorReturnMasked =\n Opts extends { mask: typeof MaskedDate } ? MaskedDate :\n Opts extends { mask: typeof MaskedNumber } ? MaskedNumber :\n Opts extends { mask: typeof MaskedEnum } ? MaskedEnum :\n Opts extends { mask: typeof MaskedRange } ? MaskedRange :\n Opts extends { mask: typeof MaskedRegExp } ? MaskedRegExp :\n Opts extends { mask: typeof MaskedFunction } ? MaskedFunction :\n Opts extends { mask: typeof MaskedPattern } ? MaskedPattern :\n Opts extends { mask: typeof MaskedDynamic } ? MaskedDynamic :\n Masked\n;\n\nexport\ntype FactoryOpts = FactoryConstructorOpts | FactoryInstanceOpts | FactoryStaticOpts;\n\nexport\ntype FactoryArg = Masked | FactoryOpts | FactoryStaticOpts['mask'];\n\nexport\ntype ExtendFactoryArgOptions =\n Masked | FactoryOpts & Opts | FactoryStaticOpts['mask']\n;\n\nexport\ntype UpdateStaticOpts =\n Opts extends MaskedEnumOptions ? MaskedEnumOptions :\n Opts extends MaskedRangeOptions ? MaskedRangeOptions :\n Opts extends MaskedDynamicOptions ? MaskedDynamicOptions :\n Opts extends MaskedPatternOptions ? MaskedPatternOptions :\n Opts extends MaskedDateOptions ? MaskedDateOptions :\n Opts extends MaskedNumberOptions ? MaskedNumberOptions :\n Opts extends MaskedRegExpOptions ? MaskedRegExpOptions :\n Opts extends MaskedFunctionOptions ? MaskedFunctionOptions :\n never\n;\n\ntype AnyOpts = Record;\n\nexport\ntype UpdateInstanceOpts =\n M extends MaskedRegExp ? MaskedRegExpOptions :\n M extends MaskedFunction ? MaskedFunctionOptions :\n M extends MaskedDate ? MaskedDateOptions :\n M extends MaskedNumber ? MaskedNumberOptions :\n M extends MaskedDynamic ? MaskedDynamicOptions :\n M extends MaskedRange ? MaskedRangeOptions :\n M extends MaskedEnum ? MaskedEnumOptions :\n M extends MaskedPattern ? MaskedPatternOptions :\n AnyOpts\n;\n\nexport\ntype UpdateConstructorOpts =\n M extends { mask: typeof MaskedDate } ? MaskedDateOptions :\n M extends { mask: typeof MaskedNumber } ? MaskedNumberOptions :\n M extends { mask: typeof MaskedEnum } ? MaskedEnumOptions :\n M extends { mask: typeof MaskedRange } ? MaskedRangeOptions :\n M extends { mask: typeof MaskedRegExp } ? MaskedRegExpOptions :\n M extends { mask: typeof MaskedFunction } ? MaskedFunctionOptions :\n M extends { mask: typeof MaskedPattern } ? MaskedPatternOptions :\n M extends { mask: typeof MaskedDynamic } ? MaskedDynamicOptions :\n AnyOpts\n;\n\nexport\ntype UpdateStaticMaskOpts =\n M extends MaskedDateFactoryOptions['mask'] ? MaskedDateOptions :\n M extends MaskedNumberOptions['mask'] ? MaskedNumberOptions :\n M extends MaskedPatternOptions['mask'] ? MaskedPatternOptions :\n M extends MaskedDynamicOptions['mask'] ? MaskedDynamicOptions :\n M extends MaskedRegExpOptions['mask'] ? MaskedRegExpOptions :\n M extends MaskedFunctionOptions['mask'] ? MaskedFunctionOptions :\n never\n;\n\nexport\ntype UpdateOpts = Partial<\n Opts extends Masked ? UpdateInstanceOpts :\n Opts extends FactoryStaticOpts['mask'] ? UpdateStaticMaskOpts :\n Opts extends FactoryStaticOpts ? UpdateStaticOpts :\n Opts extends FactoryInstanceOpts ? UpdateInstanceOpts :\n Opts extends FactoryConstructorOpts ? UpdateConstructorOpts :\n AnyOpts\n>;\n\nexport\ntype FactoryReturnMasked =\n Opts extends Masked ? Opts :\n Opts extends FactoryStaticOpts['mask'] ? FactoryStaticMaskReturnMasked :\n Opts extends FactoryConstructorOpts ? FactoryConstructorReturnMasked :\n Opts extends FactoryInstanceOpts ? FactoryInstanceReturnMasked :\n Opts extends FactoryStaticOpts ? FactoryStaticReturnMasked :\n never\n;\n\n\n// TODO can't use overloads here because of https://github.com/microsoft/TypeScript/issues/50754\n// export function maskedClass(mask: string): typeof MaskedPattern;\n// export function maskedClass(mask: DateConstructor): typeof MaskedDate;\n// export function maskedClass(mask: NumberConstructor): typeof MaskedNumber;\n// export function maskedClass(mask: Array | ArrayConstructor): typeof MaskedDynamic;\n// export function maskedClass(mask: MaskedDate): typeof MaskedDate;\n// export function maskedClass(mask: MaskedNumber): typeof MaskedNumber;\n// export function maskedClass(mask: MaskedEnum): typeof MaskedEnum;\n// export function maskedClass(mask: MaskedRange): typeof MaskedRange;\n// export function maskedClass(mask: MaskedRegExp): typeof MaskedRegExp;\n// export function maskedClass(mask: MaskedFunction): typeof MaskedFunction;\n// export function maskedClass(mask: MaskedPattern): typeof MaskedPattern;\n// export function maskedClass(mask: MaskedDynamic): typeof MaskedDynamic;\n// export function maskedClass(mask: Masked): typeof Masked;\n// export function maskedClass(mask: typeof Masked): typeof Masked;\n// export function maskedClass(mask: typeof MaskedDate): typeof MaskedDate;\n// export function maskedClass(mask: typeof MaskedNumber): typeof MaskedNumber;\n// export function maskedClass(mask: typeof MaskedEnum): typeof MaskedEnum;\n// export function maskedClass(mask: typeof MaskedRange): typeof MaskedRange;\n// export function maskedClass(mask: typeof MaskedRegExp): typeof MaskedRegExp;\n// export function maskedClass(mask: typeof MaskedFunction): typeof MaskedFunction;\n// export function maskedClass(mask: typeof MaskedPattern): typeof MaskedPattern;\n// export function maskedClass(mask: typeof MaskedDynamic): typeof MaskedDynamic;\n// export function maskedClass (mask: Mask): Mask;\n// export function maskedClass(mask: RegExp): typeof MaskedRegExp;\n// export function maskedClass(mask: (value: string, ...args: any[]) => boolean): typeof MaskedFunction;\n\n/** Get Masked class by mask type */\nexport function maskedClass (mask: Masked | FactoryOpts['mask']): any /* TODO */ {\n if (mask == null) throw new Error('mask property should be defined');\n\n if (mask instanceof RegExp) return IMask.MaskedRegExp;\n if (isString(mask)) return IMask.MaskedPattern;\n if (mask === Date) return IMask.MaskedDate;\n if (mask === Number) return IMask.MaskedNumber;\n if (Array.isArray(mask) || mask === Array) return IMask.MaskedDynamic;\n if (IMask.Masked && (mask as any).prototype instanceof IMask.Masked) return mask;\n if (IMask.Masked && mask instanceof IMask.Masked) return mask.constructor;\n if (mask instanceof Function) return IMask.MaskedFunction;\n\n console.warn('Mask not found for mask', mask); // eslint-disable-line no-console\n return IMask.Masked;\n}\n\ntype MaskedClassOf =\n M extends MaskedDate ? typeof MaskedDate :\n M extends MaskedNumber ? typeof MaskedNumber :\n M extends MaskedEnum ? typeof MaskedEnum :\n M extends MaskedRange ? typeof MaskedRange :\n M extends MaskedRegExp ? typeof MaskedRegExp :\n M extends MaskedFunction ? typeof MaskedFunction :\n M extends MaskedPattern ? typeof MaskedPattern :\n M extends MaskedDynamic ? typeof MaskedDynamic :\n any\n;\n\n\ntype NormalizedMaskedOpts = Omit & {\n _mask: Opts,\n mask: MaskedClassOf,\n};\n\ntype NormalizedInstanceOpts =\n Omit &\n NormalizedMaskedOpts\n;\n\nexport\ntype NormalizedOpts =\n Opts extends FactoryStaticOpts['mask'] ? { mask: Opts } :\n Opts extends Masked ? NormalizedMaskedOpts :\n Opts extends FactoryInstanceOpts ? NormalizedInstanceOpts :\n Opts extends FactoryStaticOpts | FactoryConstructorOpts ? Opts :\n { mask: Opts }\n;\n\nexport\nfunction normalizeOpts (opts: Opts): NormalizedOpts {\n if (!opts) throw new Error('Options in not defined');\n\n if (IMask.Masked) {\n if ((opts as any).prototype instanceof IMask.Masked) return { mask: opts } as NormalizedOpts;\n\n /*\n handle cases like:\n 1) opts = Masked\n 2) opts = { mask: Masked, ...instanceOpts }\n */\n const { mask=undefined, ...instanceOpts } =\n opts instanceof IMask.Masked ? { mask: opts } :\n isObject(opts) && (opts as FactoryInstanceOpts).mask instanceof IMask.Masked ? (opts as FactoryInstanceOpts) : {};\n\n if (mask) {\n const _mask = (mask as Masked).mask;\n\n return {\n ...pick(mask, (_, k: string) => !k.startsWith('_')),\n mask: mask.constructor,\n _mask,\n ...instanceOpts,\n } as NormalizedOpts;\n }\n }\n\n if (!isObject(opts)) return { mask: opts } as unknown as NormalizedOpts;\n\n return { ...opts } as unknown as NormalizedOpts;\n}\n\n// TODO can't use overloads here because of https://github.com/microsoft/TypeScript/issues/50754\n\n// From masked\n// export default function createMask (opts: Opts): ReturnMasked;\n// // From masked class\n// export default function createMask, ReturnMasked extends Masked=InstanceType> (opts: Opts): ReturnMasked;\n// export default function createMask, ReturnMasked extends MaskedDate=MaskedDate> (opts: Opts): ReturnMasked;\n// export default function createMask, ReturnMasked extends MaskedNumber=MaskedNumber> (opts: Opts): ReturnMasked;\n// export default function createMask, ReturnMasked extends MaskedEnum=MaskedEnum> (opts: Opts): ReturnMasked;\n// export default function createMask, ReturnMasked extends MaskedRange=MaskedRange> (opts: Opts): ReturnMasked;\n// export default function createMask, ReturnMasked extends MaskedRegExp=MaskedRegExp> (opts: Opts): ReturnMasked;\n// export default function createMask, ReturnMasked extends MaskedFunction=MaskedFunction> (opts: Opts): ReturnMasked;\n// export default function createMask, ReturnMasked extends MaskedPattern=MaskedPattern> (opts: Opts): ReturnMasked;\n// export default function createMask, ReturnMasked extends MaskedDynamic=MaskedDynamic> (opts: Opts): ReturnMasked;\n// // From mask opts\n// export default function createMask, ReturnMasked=Opts extends MaskedOptions ? M : never> (opts: Opts): ReturnMasked;\n// export default function createMask> (opts: Opts): ReturnMasked;\n// export default function createMask> (opts: Opts): ReturnMasked;\n// export default function createMask> (opts: Opts): ReturnMasked;\n// export default function createMask> (opts: Opts): ReturnMasked;\n// export default function createMask> (opts: Opts): ReturnMasked;\n// export default function createMask> (opts: Opts): ReturnMasked;\n// export default function createMask, ReturnMasked extends MaskedRegExp=MaskedRegExp> (opts: Opts): ReturnMasked;\n// export default function createMask, ReturnMasked extends MaskedFunction=MaskedFunction> (opts: Opts): ReturnMasked;\n\n/** Creates new {@link Masked} depending on mask type */\nexport default\nfunction createMask (opts: Opts): FactoryReturnMasked {\n if (IMask.Masked && (opts instanceof IMask.Masked)) return opts as FactoryReturnMasked;\n const nOpts = normalizeOpts(opts);\n\n const MaskedClass = maskedClass(nOpts.mask);\n 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.`);\n\n if (nOpts.mask === MaskedClass) delete nOpts.mask;\n if ((nOpts as any)._mask) { nOpts.mask = (nOpts as any)._mask; delete (nOpts as any)._mask; }\n return new MaskedClass(nOpts);\n}\n\n\nIMask.createMask = createMask;\n","import IMask from '../core/holder';\n\n\nexport\ntype ElementEvent =\n | 'selectionChange'\n | 'input'\n | 'drop'\n | 'click'\n | 'focus'\n | 'commit'\n;\n\nexport\ntype EventHandlers = { [key in ElementEvent]: (...args: any[]) => void } & {\n undo?: (...args: any[]) => void;\n redo?: (...args: any[]) => void;\n}\n\n/** Generic element API to use with mask */\nexport default\nabstract class MaskElement {\n /** */\n abstract _unsafeSelectionStart: number | null;\n /** */\n abstract _unsafeSelectionEnd: number | null;\n /** */\n abstract value: string;\n\n /** Safely returns selection start */\n get selectionStart (): number {\n let start;\n try {\n start = this._unsafeSelectionStart;\n } catch {}\n\n return start != null ?\n start :\n this.value.length;\n }\n\n /** Safely returns selection end */\n get selectionEnd (): number {\n let end;\n try {\n end = this._unsafeSelectionEnd;\n } catch {}\n\n return end != null ?\n end :\n this.value.length;\n }\n\n /** Safely sets element selection */\n select (start: number, end: number) {\n if (start == null || end == null ||\n start === this.selectionStart && end === this.selectionEnd) return;\n\n try {\n this._unsafeSelect(start, end);\n } catch {}\n }\n\n /** */\n get isActive (): boolean { return false; }\n /** */\n abstract _unsafeSelect (start: number, end: number): void;\n /** */\n abstract bindEvents (handlers: EventHandlers): void;\n /** */\n abstract unbindEvents (): void\n}\n\n\nIMask.MaskElement = MaskElement;\n","import MaskElement, { EventHandlers } from './mask-element';\nimport IMask from '../core/holder';\n\n\nconst KEY_Z = 90;\nconst KEY_Y = 89;\n\n/** Bridge between HTMLElement and {@link Masked} */\nexport default\nabstract class HTMLMaskElement extends MaskElement {\n /** HTMLElement to use mask on */\n declare input: HTMLElement;\n declare _handlers: EventHandlers;\n abstract value: string;\n\n constructor (input: HTMLElement) {\n super();\n this.input = input;\n this._onKeydown = this._onKeydown.bind(this);\n this._onInput = this._onInput.bind(this);\n this._onBeforeinput = this._onBeforeinput.bind(this);\n this._onCompositionEnd = this._onCompositionEnd.bind(this);\n }\n\n get rootElement (): HTMLDocument {\n return (this.input.getRootNode?.() ?? document) as HTMLDocument;\n }\n\n /** Is element in focus */\n get isActive (): boolean {\n return this.input === this.rootElement.activeElement;\n }\n\n /** Binds HTMLElement events to mask internal events */\n override bindEvents (handlers: EventHandlers) {\n this.input.addEventListener('keydown', this._onKeydown as EventListener);\n this.input.addEventListener('input', this._onInput as EventListener);\n this.input.addEventListener('beforeinput', this._onBeforeinput as EventListener);\n this.input.addEventListener('compositionend', this._onCompositionEnd as EventListener);\n this.input.addEventListener('drop', handlers.drop);\n this.input.addEventListener('click', handlers.click);\n this.input.addEventListener('focus', handlers.focus);\n this.input.addEventListener('blur', handlers.commit);\n this._handlers = handlers;\n }\n\n _onKeydown (e: KeyboardEvent) {\n if (this._handlers.redo && (\n (e.keyCode === KEY_Z && e.shiftKey && (e.metaKey || e.ctrlKey)) ||\n (e.keyCode === KEY_Y && e.ctrlKey)\n )) {\n e.preventDefault();\n return this._handlers.redo(e);\n }\n\n if (this._handlers.undo && e.keyCode === KEY_Z && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n return this._handlers.undo(e);\n }\n\n if (!e.isComposing) this._handlers.selectionChange(e);\n }\n\n _onBeforeinput (e: InputEvent) {\n if (e.inputType === 'historyUndo' && this._handlers.undo) {\n e.preventDefault();\n return this._handlers.undo(e);\n }\n\n if (e.inputType === 'historyRedo' && this._handlers.redo) {\n e.preventDefault();\n return this._handlers.redo(e);\n }\n }\n\n _onCompositionEnd (e: CompositionEvent) {\n this._handlers.input(e);\n }\n\n _onInput (e: InputEvent) {\n if (!e.isComposing) this._handlers.input(e);\n }\n\n /** Unbinds HTMLElement events to mask internal events */\n override unbindEvents () {\n this.input.removeEventListener('keydown', this._onKeydown as EventListener);\n this.input.removeEventListener('input', this._onInput as EventListener);\n this.input.removeEventListener('beforeinput', this._onBeforeinput as EventListener);\n this.input.removeEventListener('compositionend', this._onCompositionEnd as EventListener);\n this.input.removeEventListener('drop', this._handlers.drop);\n this.input.removeEventListener('click', this._handlers.click);\n this.input.removeEventListener('focus', this._handlers.focus);\n this.input.removeEventListener('blur', this._handlers.commit);\n this._handlers = {} as EventHandlers;\n }\n}\n\n\nIMask.HTMLMaskElement = HTMLMaskElement;\n","import HTMLMaskElement from './html-mask-element';\nimport IMask from '../core/holder';\n\nexport\ntype InputElement = HTMLTextAreaElement | HTMLInputElement;\n\n/** Bridge between InputElement and {@link Masked} */\nexport default\nclass HTMLInputMaskElement extends HTMLMaskElement {\n /** InputElement to use mask on */\n declare input: InputElement;\n\n constructor (input: InputElement) {\n super(input);\n this.input = input;\n }\n\n /** Returns InputElement selection start */\n override get _unsafeSelectionStart (): number | null {\n return this.input.selectionStart != null ? this.input.selectionStart : this.value.length;\n }\n\n /** Returns InputElement selection end */\n override get _unsafeSelectionEnd (): number | null {\n return this.input.selectionEnd;\n }\n\n /** Sets InputElement selection */\n _unsafeSelect (start: number, end: number) {\n this.input.setSelectionRange(start, end);\n }\n\n override get value (): string {\n return this.input.value;\n }\n override set value (value: string) {\n this.input.value = value;\n }\n}\n\n\nIMask.HTMLMaskElement = HTMLMaskElement;\n","import HTMLMaskElement from './html-mask-element';\nimport IMask from '../core/holder';\n\n\nexport default\nclass HTMLContenteditableMaskElement extends HTMLMaskElement {\n declare input: HTMLElement;\n /** Returns HTMLElement selection start */\n override get _unsafeSelectionStart (): number | null {\n const root = this.rootElement;\n const selection = root.getSelection && root.getSelection();\n const anchorOffset = selection && selection.anchorOffset;\n const focusOffset = selection && selection.focusOffset;\n if (focusOffset == null || anchorOffset == null || anchorOffset < focusOffset) {\n return anchorOffset;\n }\n return focusOffset;\n }\n\n /** Returns HTMLElement selection end */\n override get _unsafeSelectionEnd (): number | null {\n const root = this.rootElement;\n const selection = root.getSelection && root.getSelection();\n const anchorOffset = selection && selection.anchorOffset;\n const focusOffset = selection && selection.focusOffset;\n if (focusOffset == null || anchorOffset == null || anchorOffset > focusOffset) {\n return anchorOffset;\n }\n return focusOffset;\n }\n\n /** Sets HTMLElement selection */\n override _unsafeSelect (start: number, end: number) {\n if (!this.rootElement.createRange) return;\n\n const range = this.rootElement.createRange();\n range.setStart(this.input.firstChild || this.input, start);\n range.setEnd(this.input.lastChild || this.input, end);\n const root = this.rootElement;\n const selection = root.getSelection && root.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n\n /** HTMLElement value */\n override get value (): string {\n return this.input.textContent || '';\n }\n override set value (value: string) {\n this.input.textContent = value;\n }\n}\n\n\nIMask.HTMLContenteditableMaskElement = HTMLContenteditableMaskElement;\n","import { type Selection } from '../core/utils';\n\n\nexport\ntype InputHistoryState = {\n unmaskedValue: string,\n selection: Selection,\n};\n\n\nexport default\nclass InputHistory {\n static MAX_LENGTH = 100;\n states: InputHistoryState[] = [];\n currentIndex = 0;\n\n get currentState (): InputHistoryState | undefined {\n return this.states[this.currentIndex];\n }\n\n get isEmpty (): boolean {\n return this.states.length === 0;\n }\n\n push (state: InputHistoryState) {\n // if current index points before the last element then remove the future\n if (this.currentIndex < this.states.length - 1) this.states.length = this.currentIndex + 1;\n this.states.push(state);\n if (this.states.length > InputHistory.MAX_LENGTH) this.states.shift();\n this.currentIndex = this.states.length - 1;\n }\n\n go (steps: number): InputHistoryState | undefined {\n this.currentIndex = Math.min(Math.max(this.currentIndex + steps, 0), this.states.length - 1);\n return this.currentState;\n }\n\n undo () {\n return this.go(-1);\n }\n\n redo () {\n return this.go(+1);\n }\n\n clear () {\n this.states.length = 0;\n this.currentIndex = 0;\n }\n}\n","import { DIRECTION, type Selection } from '../core/utils';\nimport ActionDetails from '../core/action-details';\nimport createMask, { type UpdateOpts, maskedClass, type FactoryArg, type FactoryReturnMasked } from '../masked/factory';\nimport Masked from '../masked/base';\nimport MaskElement from './mask-element';\nimport HTMLInputMaskElement, { type InputElement } from './html-input-mask-element';\nimport HTMLContenteditableMaskElement from './html-contenteditable-mask-element';\nimport IMask from '../core/holder';\nimport InputHistory, { type InputHistoryState } from './input-history';\n\n\nexport\ntype InputMaskElement = MaskElement | InputElement | HTMLElement;\n\nexport\ntype InputMaskEventListener = (e?: InputEvent) => void;\n\n/** Listens to element events and controls changes between element and {@link Masked} */\nexport default\nclass InputMask> {\n /**\n View element\n */\n declare el: MaskElement;\n\n /** Internal {@link Masked} model */\n declare masked: FactoryReturnMasked;\n\n declare _listeners: Record>;\n declare _value: string;\n declare _changingCursorPos: number;\n declare _unmaskedValue: string;\n declare _rawInputValue: string;\n declare _selection: Selection;\n declare _cursorChanging?: ReturnType;\n declare _historyChanging?: boolean;\n declare _inputEvent?: InputEvent;\n declare history: InputHistory;\n\n constructor (el: InputMaskElement, opts: Opts) {\n this.el =\n (el instanceof MaskElement) ? el :\n (el.isContentEditable && el.tagName !== 'INPUT' && el.tagName !== 'TEXTAREA') ? new HTMLContenteditableMaskElement(el) :\n new HTMLInputMaskElement(el as InputElement);\n\n this.masked = createMask(opts);\n\n this._listeners = {};\n this._value = '';\n this._unmaskedValue = '';\n this._rawInputValue = '';\n this.history = new InputHistory();\n\n this._saveSelection = this._saveSelection.bind(this);\n this._onInput = this._onInput.bind(this);\n this._onChange = this._onChange.bind(this);\n this._onDrop = this._onDrop.bind(this);\n this._onFocus = this._onFocus.bind(this);\n this._onClick = this._onClick.bind(this);\n this._onUndo = this._onUndo.bind(this);\n this._onRedo = this._onRedo.bind(this);\n this.alignCursor = this.alignCursor.bind(this);\n this.alignCursorFriendly = this.alignCursorFriendly.bind(this);\n\n this._bindEvents();\n\n // refresh\n this.updateValue();\n this._onChange();\n }\n\n maskEquals (mask: any): boolean {\n return mask == null || this.masked?.maskEquals(mask);\n }\n\n /** Masked */\n get mask (): FactoryReturnMasked['mask'] {\n return this.masked.mask;\n }\n set mask (mask: any) {\n if (this.maskEquals(mask)) return;\n\n if (!((mask as Masked) instanceof IMask.Masked) && this.masked.constructor === maskedClass(mask as Masked)) {\n // TODO \"any\" no idea\n this.masked.updateOptions({ mask } as any);\n return;\n }\n\n const masked = (mask instanceof IMask.Masked ? mask : createMask({ mask } as Opts)) as FactoryReturnMasked;\n masked.unmaskedValue = this.masked.unmaskedValue;\n this.masked = masked;\n }\n\n /** Raw value */\n get value (): string {\n return this._value;\n }\n\n set value (str: string) {\n if (this.value === str) return;\n\n this.masked.value = str;\n this.updateControl('auto');\n }\n\n /** Unmasked value */\n get unmaskedValue (): string {\n return this._unmaskedValue;\n }\n\n set unmaskedValue (str: string) {\n if (this.unmaskedValue === str) return;\n\n this.masked.unmaskedValue = str;\n this.updateControl('auto');\n }\n\n /** Raw input value */\n get rawInputValue (): string {\n return this._rawInputValue;\n }\n\n set rawInputValue (str: string) {\n if (this.rawInputValue === str) return;\n\n this.masked.rawInputValue = str;\n this.updateControl();\n this.alignCursor();\n }\n\n /** Typed unmasked value */\n get typedValue (): FactoryReturnMasked['typedValue'] {\n return this.masked.typedValue;\n }\n\n set typedValue (val: FactoryReturnMasked['typedValue']) {\n if (this.masked.typedValueEquals(val)) return;\n\n this.masked.typedValue = val;\n this.updateControl('auto');\n }\n\n /** Display value */\n get displayValue (): string {\n return this.masked.displayValue;\n }\n\n /** Starts listening to element events */\n _bindEvents () {\n this.el.bindEvents({\n selectionChange: this._saveSelection,\n input: this._onInput,\n drop: this._onDrop,\n click: this._onClick,\n focus: this._onFocus,\n commit: this._onChange,\n undo: this._onUndo,\n redo: this._onRedo,\n });\n }\n\n /** Stops listening to element events */\n _unbindEvents () {\n if (this.el) this.el.unbindEvents();\n }\n\n /** Fires custom event */\n _fireEvent (ev: string, e?: InputEvent) {\n const listeners = this._listeners[ev];\n if (!listeners) return;\n\n listeners.forEach(l => l(e));\n }\n\n /** Current selection start */\n get selectionStart (): number {\n return this._cursorChanging ?\n this._changingCursorPos :\n\n this.el.selectionStart;\n }\n\n /** Current cursor position */\n get cursorPos (): number {\n return this._cursorChanging ?\n this._changingCursorPos :\n\n this.el.selectionEnd;\n }\n set cursorPos (pos: number) {\n if (!this.el || !this.el.isActive) return;\n\n this.el.select(pos, pos);\n this._saveSelection();\n }\n\n /** Stores current selection */\n _saveSelection (/* ev */) {\n if (this.displayValue !== this.el.value) {\n console.warn('Element value was changed outside of mask. Syncronize mask using `mask.updateValue()` to work properly.'); // eslint-disable-line no-console\n }\n this._selection = {\n start: this.selectionStart,\n end: this.cursorPos,\n };\n }\n\n /** Syncronizes model value from view */\n updateValue () {\n this.masked.value = this.el.value;\n this._value = this.masked.value;\n }\n\n /** Syncronizes view from model value, fires change events */\n updateControl (cursorPos?: number | 'auto') {\n const newUnmaskedValue = this.masked.unmaskedValue;\n const newValue = this.masked.value;\n const newRawInputValue = this.masked.rawInputValue;\n const newDisplayValue = this.displayValue;\n\n const isChanged =\n this.unmaskedValue !== newUnmaskedValue ||\n this.value !== newValue ||\n this._rawInputValue !== newRawInputValue\n ;\n\n this._unmaskedValue = newUnmaskedValue;\n this._value = newValue;\n this._rawInputValue = newRawInputValue;\n\n if (this.el.value !== newDisplayValue) this.el.value = newDisplayValue;\n\n if (cursorPos === 'auto') this.alignCursor();\n else if (cursorPos != null) this.cursorPos = cursorPos;\n\n if (isChanged) this._fireChangeEvents();\n if (!this._historyChanging && (isChanged || this.history.isEmpty)) this.history.push({\n unmaskedValue: newUnmaskedValue,\n selection: { start: this.selectionStart, end: this.cursorPos },\n });\n }\n\n /** Updates options with deep equal check, recreates {@link Masked} model if mask type changes */\n updateOptions(opts: UpdateOpts) {\n const { mask, ...restOpts } = opts as any; // TODO types, yes, mask is optional\n\n const updateMask = !this.maskEquals(mask);\n const updateOpts = this.masked.optionsIsChanged(restOpts);\n\n if (updateMask) this.mask = mask;\n if (updateOpts) this.masked.updateOptions(restOpts); // TODO\n\n if (updateMask || updateOpts) this.updateControl();\n }\n\n /** Updates cursor */\n updateCursor (cursorPos: number) {\n if (cursorPos == null) return;\n this.cursorPos = cursorPos;\n\n // also queue change cursor for mobile browsers\n this._delayUpdateCursor(cursorPos);\n }\n\n /** Delays cursor update to support mobile browsers */\n _delayUpdateCursor (cursorPos: number) {\n this._abortUpdateCursor();\n this._changingCursorPos = cursorPos;\n this._cursorChanging = setTimeout(() => {\n if (!this.el) return; // if was destroyed\n this.cursorPos = this._changingCursorPos;\n this._abortUpdateCursor();\n }, 10);\n }\n\n /** Fires custom events */\n _fireChangeEvents () {\n this._fireEvent('accept', this._inputEvent);\n if (this.masked.isComplete) this._fireEvent('complete', this._inputEvent);\n }\n\n /** Aborts delayed cursor update */\n _abortUpdateCursor () {\n if (this._cursorChanging) {\n clearTimeout(this._cursorChanging);\n delete this._cursorChanging;\n }\n }\n\n /** Aligns cursor to nearest available position */\n alignCursor () {\n this.cursorPos = this.masked.nearestInputPos(this.masked.nearestInputPos(this.cursorPos, DIRECTION.LEFT));\n }\n\n /** Aligns cursor only if selection is empty */\n alignCursorFriendly () {\n if (this.selectionStart !== this.cursorPos) return; // skip if range is selected\n this.alignCursor();\n }\n\n /** Adds listener on custom event */\n on (ev: string, handler: InputMaskEventListener): this {\n if (!this._listeners[ev]) this._listeners[ev] = [];\n this._listeners[ev].push(handler);\n return this;\n }\n\n /** Removes custom event listener */\n off (ev: string, handler: InputMaskEventListener): this {\n if (!this._listeners[ev]) return this;\n if (!handler) {\n delete this._listeners[ev];\n return this;\n }\n const hIndex = this._listeners[ev].indexOf(handler);\n if (hIndex >= 0) this._listeners[ev].splice(hIndex, 1);\n return this;\n }\n\n /** Handles view input event */\n _onInput (e: InputEvent): void {\n this._inputEvent = e;\n this._abortUpdateCursor();\n\n const details = new ActionDetails({\n // new state\n value: this.el.value,\n cursorPos: this.cursorPos,\n\n // old state\n oldValue: this.displayValue,\n oldSelection: this._selection,\n });\n\n const oldRawValue = this.masked.rawInputValue;\n\n const offset = this.masked.splice(\n details.startChangePos,\n details.removed.length,\n details.inserted,\n details.removeDirection,\n { input: true, raw: true },\n ).offset;\n\n // force align in remove direction only if no input chars were removed\n // otherwise we still need to align with NONE (to get out from fixed symbols for instance)\n const removeDirection = oldRawValue === this.masked.rawInputValue ?\n details.removeDirection :\n DIRECTION.NONE;\n\n let cursorPos = this.masked.nearestInputPos(\n details.startChangePos + offset,\n removeDirection,\n );\n if (removeDirection !== DIRECTION.NONE) cursorPos = this.masked.nearestInputPos(cursorPos, DIRECTION.NONE);\n\n this.updateControl(cursorPos);\n delete this._inputEvent;\n }\n\n /** Handles view change event and commits model value */\n _onChange () {\n if (this.displayValue !== this.el.value) {\n this.updateValue();\n }\n this.masked.doCommit();\n this.updateControl();\n this._saveSelection();\n }\n\n /** Handles view drop event, prevents by default */\n _onDrop (ev: Event) {\n ev.preventDefault();\n ev.stopPropagation();\n }\n\n /** Restore last selection on focus */\n _onFocus (ev: Event) {\n this.alignCursorFriendly();\n }\n\n /** Restore last selection on focus */\n _onClick (ev: Event) {\n this.alignCursorFriendly();\n }\n\n _onUndo () {\n this._applyHistoryState(this.history.undo());\n }\n\n _onRedo () {\n this._applyHistoryState(this.history.redo());\n }\n\n _applyHistoryState (state: InputHistoryState | undefined) {\n if (!state) return;\n\n this._historyChanging = true;\n this.unmaskedValue = state.unmaskedValue;\n this.el.select(state.selection.start, state.selection.end);\n this._saveSelection();\n this._historyChanging = false;\n }\n\n /** Unbind view events and removes element reference */\n destroy () {\n this._unbindEvents();\n (this._listeners as any).length = 0;\n delete (this as any).el;\n }\n}\n\n\nIMask.InputMask = InputMask;\n","import IMask from \"./holder\";\n\n\nexport\ntype ChangeDetailsOptions = Pick;\n\n/** Provides details of changing model value */\nexport default\nclass ChangeDetails {\n /** Inserted symbols */\n declare inserted: string;\n /** Additional offset if any changes occurred before tail */\n declare tailShift: number;\n /** Raw inserted is used by dynamic mask */\n declare rawInserted: string;\n /** Can skip chars */\n declare skip: boolean;\n\n\n static normalize (prep: string | [string, ChangeDetails]): [string, ChangeDetails] {\n return Array.isArray(prep) ? prep : [\n prep,\n new ChangeDetails(),\n ];\n }\n\n constructor (details?: Partial) {\n Object.assign(this, {\n inserted: '',\n rawInserted: '',\n tailShift: 0,\n skip: false,\n }, details);\n }\n\n /** Aggregate changes */\n aggregate (details: ChangeDetails): this {\n this.inserted += details.inserted;\n this.rawInserted += details.rawInserted;\n this.tailShift += details.tailShift;\n this.skip = this.skip || details.skip;\n\n return this;\n }\n\n /** Total offset considering all changes */\n get offset (): number {\n return this.tailShift + this.inserted.length;\n }\n\n get consumed (): boolean {\n return Boolean(this.rawInserted) || this.skip;\n }\n}\n\n\nIMask.ChangeDetails = ChangeDetails;\n","import type { TailDetails, AppendTail } from './tail-details';\nimport type ChangeDetails from './change-details';\n\n\ntype ContinuousTailState = Pick;\n\n/** Provides details of continuous extracted tail */\nexport default\nclass ContinuousTailDetails implements TailDetails {\n /** Tail value as string */\n declare value: string;\n /** Tail start position */\n declare from: number;\n /** Start position */\n declare stop?: number;\n\n constructor (value: string='', from: number=0, stop?: number) {\n this.value = value;\n this.from = from;\n this.stop = stop;\n }\n\n toString (): string { return this.value; }\n\n extend (tail: string | TailDetails): void {\n this.value += String(tail);\n }\n\n appendTo (masked: AppendTail): ChangeDetails {\n return masked.append(this.toString(), { tail: true })\n .aggregate(masked._appendPlaceholder());\n }\n\n get state (): ContinuousTailState {\n return {\n value: this.value,\n from: this.from,\n stop: this.stop,\n };\n }\n\n set state (state: ContinuousTailState) {\n Object.assign(this, state);\n }\n\n unshift (beforePos?: number): string {\n if (!this.value.length || (beforePos != null && this.from >= beforePos)) return '';\n\n const shiftChar = this.value[0];\n this.value = this.value.slice(1);\n return shiftChar;\n }\n\n shift (): string {\n if (!this.value.length) return '';\n\n const shiftChar = this.value[this.value.length-1];\n this.value = this.value.slice(0, -1);\n return shiftChar;\n }\n}\n","import ChangeDetails from '../core/change-details';\nimport ContinuousTailDetails from '../core/continuous-tail-details';\nimport { type Direction, DIRECTION, isString, forceDirection, objectIncludes } from '../core/utils';\nimport { type TailDetails } from '../core/tail-details';\nimport IMask from '../core/holder';\n\n\nexport\ntype MaskedState = {\n _value: string,\n _rawInputValue: string,\n};\n\n/** Append flags */\nexport\ntype AppendFlags = {\n input?: boolean,\n tail?: boolean,\n raw?: boolean,\n _beforeTailState?: State,\n};\n\n/** Extract flags */\nexport\ntype ExtractFlags = {\n raw?: boolean\n};\n\n// see https://github.com/microsoft/TypeScript/issues/6223\n\nexport\ntype MaskedOptions = Partial>;\n\n\n/** Provides common masking stuff */\nexport default\nabstract class Masked {\n static DEFAULTS: Record = {\n skipInvalid: true,\n } satisfies Partial;\n static EMPTY_VALUES: Array = [undefined, null, ''];\n\n /** */\n declare mask: unknown;\n /** */\n declare parent?: Masked;\n /** Transforms value before mask processing */\n declare prepare?: (chars: string, masked: Masked, flags: AppendFlags) => string | [string, ChangeDetails];\n /** Transforms each char before mask processing */\n declare prepareChar?: (chars: string, masked: Masked, flags: AppendFlags) => string | [string, ChangeDetails];\n /** Validates if value is acceptable */\n declare validate?: (value: string, masked: Masked, flags: AppendFlags) => boolean;\n /** Does additional processing at the end of editing */\n declare commit?: (value: string, masked: Masked) => void;\n /** Format typed value to string */\n declare format?: (value: Value, masked: Masked) => string;\n /** Parse string to get typed value */\n declare parse?: (str: string, masked: Masked) => Value;\n /** Enable characters overwriting */\n abstract overwrite?: boolean | 'shift' | undefined;\n /** */\n abstract eager?: boolean | 'remove' | 'append' | undefined;\n /** */\n abstract skipInvalid?: boolean | undefined;\n\n /** */\n declare _initialized: boolean;\n\n declare _value: string;\n declare _refreshing?: boolean;\n declare _isolated?: boolean;\n\n constructor (opts: MaskedOptions) {\n this._value = '';\n this._update({\n ...Masked.DEFAULTS,\n ...opts,\n });\n this._initialized = true;\n }\n\n /** Sets and applies new options */\n updateOptions (opts: Partial) {\n if (!this.optionsIsChanged(opts)) return;\n\n this.withValueRefresh(this._update.bind(this, opts));\n }\n\n /** Sets new options */\n _update (opts: Partial) {\n Object.assign(this, opts);\n }\n\n /** Mask state */\n get state (): MaskedState {\n return {\n _value: this.value,\n _rawInputValue: this.rawInputValue,\n };\n }\n\n set state (state: MaskedState) {\n this._value = state._value;\n }\n\n /** Resets value */\n reset () {\n this._value = '';\n }\n\n get value (): string {\n return this._value;\n }\n\n set value (value: string) {\n this.resolve(value, { input: true });\n }\n\n /** Resolve new value */\n resolve (value: string, flags: AppendFlags={ input: true }): void {\n this.reset();\n this.append(value, flags, '');\n this.doCommit();\n }\n\n get unmaskedValue (): string {\n return this.value;\n }\n\n set unmaskedValue (value: string) {\n this.resolve(value, {});\n }\n\n get typedValue (): Value {\n return this.parse ? this.parse(this.value, this) : this.unmaskedValue as Value;\n }\n\n set typedValue (value: Value) {\n if (this.format) {\n this.value = this.format(value, this);\n } else {\n this.unmaskedValue = String(value);\n }\n }\n\n /** Value that includes raw user input */\n get rawInputValue (): string {\n return this.extractInput(0, this.displayValue.length, {raw: true});\n }\n\n set rawInputValue (value: string) {\n this.resolve(value, { raw: true });\n }\n\n get displayValue (): string {\n return this.value;\n }\n\n get isComplete (): boolean {\n return true;\n }\n\n get isFilled (): boolean {\n return this.isComplete;\n }\n\n /** Finds nearest input position in direction */\n nearestInputPos (cursorPos: number, direction?: Direction): number {\n return cursorPos;\n }\n\n totalInputPositions (fromPos: number=0, toPos: number=this.displayValue.length): number {\n return Math.min(this.displayValue.length, toPos - fromPos);\n }\n\n /** Extracts value in range considering flags */\n extractInput (fromPos: number=0, toPos: number=this.displayValue.length, flags?: ExtractFlags): string {\n return this.displayValue.slice(fromPos, toPos);\n }\n\n /** Extracts tail in range */\n extractTail (fromPos: number=0, toPos: number=this.displayValue.length): TailDetails {\n return new ContinuousTailDetails(this.extractInput(fromPos, toPos), fromPos);\n }\n\n /** Appends tail */\n appendTail (tail: string | String | TailDetails): ChangeDetails {\n if (isString(tail)) tail = new ContinuousTailDetails(String(tail));\n\n return (tail as TailDetails).appendTo(this);\n }\n\n /** Appends char */\n _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\n if (!ch) return new ChangeDetails();\n\n this._value += ch;\n return new ChangeDetails({\n inserted: ch,\n rawInserted: ch,\n });\n }\n\n /** Appends char */\n _appendChar (ch: string, flags: AppendFlags={}, checkTail?: TailDetails): ChangeDetails {\n const consistentState: MaskedState = this.state;\n let details: ChangeDetails;\n [ch, details] = this.doPrepareChar(ch, flags);\n\n if (ch) details = details.aggregate(this._appendCharRaw(ch, flags));\n\n if (details.inserted) {\n let consistentTail;\n let appended = this.doValidate(flags) !== false;\n\n if (appended && checkTail != null) {\n // validation ok, check tail\n const beforeTailState = this.state;\n if (this.overwrite === true) {\n consistentTail = checkTail.state;\n for (let i=0; i < details.rawInserted.length; ++i) {\n checkTail.unshift(this.displayValue.length - details.tailShift);\n }\n }\n\n let tailDetails = this.appendTail(checkTail);\n appended = tailDetails.rawInserted.length === checkTail.toString().length;\n\n // not ok, try shift\n if (!(appended && tailDetails.inserted) && this.overwrite === 'shift') {\n this.state = beforeTailState;\n consistentTail = checkTail.state;\n for (let i=0; i < details.rawInserted.length; ++i) {\n checkTail.shift();\n }\n\n tailDetails = this.appendTail(checkTail);\n appended = tailDetails.rawInserted.length === checkTail.toString().length;\n }\n\n // if ok, rollback state after tail\n if (appended && tailDetails.inserted) this.state = beforeTailState;\n }\n\n // revert all if something went wrong\n if (!appended) {\n details = new ChangeDetails();\n this.state = consistentState;\n if (checkTail && consistentTail) checkTail.state = consistentTail;\n }\n }\n return details;\n }\n\n /** Appends optional placeholder at the end */\n _appendPlaceholder (): ChangeDetails {\n return new ChangeDetails();\n }\n\n /** Appends optional eager placeholder at the end */\n _appendEager (): ChangeDetails {\n return new ChangeDetails();\n }\n\n /** Appends symbols considering flags */\n append (str: string, flags?: AppendFlags, tail?: string | String | TailDetails): ChangeDetails {\n if (!isString(str)) throw new Error('value should be string');\n const checkTail = isString(tail) ? new ContinuousTailDetails(String(tail)) : tail as TailDetails;\n if (flags?.tail) flags._beforeTailState = this.state;\n\n let details;\n [str, details] = this.doPrepare(str, flags);\n\n for (let ci=0; ci(fn: () => T): T {\n if (this._refreshing || !this._initialized) return fn();\n this._refreshing = true;\n\n const rawInput = this.rawInputValue;\n const value = this.value;\n\n const ret = fn();\n\n this.rawInputValue = rawInput;\n // append lost trailing chars at the end\n if (this.value && this.value !== value && value.indexOf(this.value) === 0) {\n this.append(value.slice(this.displayValue.length), {}, '');\n this.doCommit();\n }\n\n delete this._refreshing;\n return ret;\n }\n\n runIsolated(fn: (masked: this) => T): T {\n if (this._isolated || !this._initialized) return fn(this);\n this._isolated = true;\n const state = this.state;\n\n const ret = fn(this);\n\n this.state = state;\n delete this._isolated;\n\n return ret;\n }\n\n doSkipInvalid (ch: string, flags: AppendFlags={}, checkTail?: TailDetails): boolean {\n return Boolean(this.skipInvalid);\n }\n\n /** Prepares string before mask processing */\n doPrepare (str: string, flags: AppendFlags={}): [string, ChangeDetails] {\n return ChangeDetails.normalize(this.prepare ?\n this.prepare(str, this, flags) :\n str);\n }\n\n /** Prepares each char before mask processing */\n doPrepareChar (str: string, flags: AppendFlags={}): [string, ChangeDetails] {\n return ChangeDetails.normalize(this.prepareChar ?\n this.prepareChar(str, this, flags) :\n str);\n }\n\n /** Validates if value is acceptable */\n doValidate (flags: AppendFlags): boolean {\n return (!this.validate || this.validate(this.value, this, flags)) &&\n (!this.parent || this.parent.doValidate(flags));\n }\n\n /** Does additional processing at the end of editing */\n doCommit () {\n if (this.commit) this.commit(this.value, this);\n }\n\n splice (start: number, deleteCount: number, inserted: string, removeDirection: Direction = DIRECTION.NONE, flags: AppendFlags = { input: true }): ChangeDetails {\n const tailPos: number = start + deleteCount;\n const tail: TailDetails = this.extractTail(tailPos);\n\n const eagerRemove = this.eager === true || this.eager === 'remove';\n\n let oldRawValue;\n if (eagerRemove) {\n removeDirection = forceDirection(removeDirection);\n oldRawValue = this.extractInput(0, tailPos, {raw: true});\n }\n\n let startChangePos: number = start;\n const details: ChangeDetails = new ChangeDetails();\n\n // if it is just deletion without insertion\n if (removeDirection !== DIRECTION.NONE) {\n startChangePos = this.nearestInputPos(start,\n deleteCount > 1 && start !== 0 && !eagerRemove ?\n DIRECTION.NONE :\n removeDirection\n );\n\n // adjust tailShift if start was aligned\n details.tailShift = startChangePos - start;\n }\n\n details.aggregate(this.remove(startChangePos));\n\n if (eagerRemove && removeDirection !== DIRECTION.NONE && oldRawValue === this.rawInputValue) {\n if (removeDirection === DIRECTION.FORCE_LEFT) {\n let valLength;\n while (oldRawValue === this.rawInputValue && (valLength = this.displayValue.length)) {\n details\n .aggregate(new ChangeDetails({ tailShift: -1 }))\n .aggregate(this.remove(valLength-1));\n }\n } else if (removeDirection === DIRECTION.FORCE_RIGHT) {\n tail.unshift();\n }\n }\n\n return details.aggregate(this.append(inserted, flags, tail));\n }\n\n maskEquals (mask: any): boolean {\n return this.mask === mask;\n }\n\n optionsIsChanged (opts: Partial): boolean {\n return !objectIncludes(this, opts);\n }\n\n typedValueEquals (value: any): boolean {\n const tval = this.typedValue;\n\n return value === tval ||\n Masked.EMPTY_VALUES.includes(value) && Masked.EMPTY_VALUES.includes(tval) ||\n (this.format ? this.format(value, this) === this.format(this.typedValue, this) : false);\n }\n}\n\n\nIMask.Masked = Masked;\n","import type { TailDetails, AppendTail } from '../../core/tail-details';\nimport ChangeDetails from '../../core/change-details';\nimport { isString } from '../../core/utils';\nimport ContinuousTailDetails from '../../core/continuous-tail-details';\nimport IMask from '../../core/holder';\nimport type MaskedPattern from '../pattern';\n\n\nexport\ntype ChunksTailState = Pick & { chunks: Array };\n\nexport default\nclass ChunksTailDetails implements TailDetails {\n declare chunks: Array;\n declare from: number;\n declare stop?: number;\n /** */\n declare blockIndex?: number;\n\n constructor (chunks: Array=[], from: number=0) {\n this.chunks = chunks;\n this.from = from;\n }\n\n toString (): string {\n return this.chunks.map(String).join('');\n }\n\n extend (tailChunk: string | String | TailDetails): void {\n if (!String(tailChunk)) return;\n tailChunk = (isString(tailChunk) ? new ContinuousTailDetails(String(tailChunk)) : tailChunk) as TailDetails;\n\n const lastChunk = this.chunks[this.chunks.length-1];\n const extendLast = lastChunk &&\n // if stops are same or tail has no stop\n (lastChunk.stop === tailChunk.stop || tailChunk.stop == null) &&\n // if tail chunk goes just after last chunk\n tailChunk.from === (lastChunk.from + lastChunk.toString().length);\n\n if (tailChunk instanceof ContinuousTailDetails) {\n // check the ability to extend previous chunk\n if (extendLast) {\n // extend previous chunk\n lastChunk.extend(tailChunk.toString());\n } else {\n // append new chunk\n this.chunks.push(tailChunk);\n }\n } else if (tailChunk instanceof ChunksTailDetails) {\n if (tailChunk.stop == null) {\n // unwrap floating chunks to parent, keeping `from` pos\n let firstTailChunk;\n while (tailChunk.chunks.length && tailChunk.chunks[0].stop == null) {\n firstTailChunk = tailChunk.chunks.shift() as TailDetails; // not possible to be `undefined` because length was checked above\n firstTailChunk.from += tailChunk.from;\n this.extend(firstTailChunk);\n }\n }\n\n // if tail chunk still has value\n if (tailChunk.toString()) {\n // if chunks contains stops, then popup stop to container\n tailChunk.stop = tailChunk.blockIndex;\n this.chunks.push(tailChunk);\n }\n }\n }\n\n appendTo (masked: AppendTail | MaskedPattern): ChangeDetails {\n if (!(masked instanceof IMask.MaskedPattern)) {\n const tail = new ContinuousTailDetails(this.toString());\n return tail.appendTo(masked);\n }\n\n const details = new ChangeDetails();\n\n for (let ci=0; ci < this.chunks.length; ++ci) {\n const chunk = this.chunks[ci];\n\n const lastBlockIter = masked._mapPosToBlock(masked.displayValue.length);\n const stop = chunk.stop;\n let chunkBlock;\n if (stop != null &&\n // if block not found or stop is behind lastBlock\n (!lastBlockIter || lastBlockIter.index <= stop)\n ) {\n if (\n chunk instanceof ChunksTailDetails ||\n // for continuous block also check if stop is exist\n masked._stops.indexOf(stop) >= 0\n ) {\n details.aggregate(masked._appendPlaceholder(stop));\n }\n chunkBlock = chunk instanceof ChunksTailDetails && masked._blocks[stop];\n }\n\n if (chunkBlock) {\n const tailDetails = chunkBlock.appendTail(chunk);\n details.aggregate(tailDetails);\n\n // get not inserted chars\n const remainChars = chunk.toString().slice(tailDetails.rawInserted.length);\n if (remainChars) details.aggregate(masked.append(remainChars, { tail: true }));\n } else {\n details.aggregate(masked.append(chunk.toString(), { tail: true }));\n }\n }\n\n return details;\n }\n\n get state (): ChunksTailState {\n return {\n chunks: this.chunks.map(c => c.state),\n from: this.from,\n stop: this.stop,\n blockIndex: this.blockIndex,\n };\n }\n\n set state (state: ChunksTailState) {\n const { chunks, ...props } = state;\n Object.assign(this, props);\n this.chunks = chunks.map(cstate => {\n const chunk = \"chunks\" in cstate ?\n new ChunksTailDetails() :\n new ContinuousTailDetails();\n chunk.state = cstate;\n return chunk;\n });\n }\n\n unshift (beforePos?: number): string {\n if (!this.chunks.length || (beforePos != null && this.from >= beforePos)) return '';\n\n const chunkShiftPos = beforePos != null ? beforePos - this.from : beforePos;\n let ci=0;\n while (ci < this.chunks.length) {\n const chunk = this.chunks[ci];\n const shiftChar = chunk.unshift(chunkShiftPos);\n\n if (chunk.toString()) {\n // chunk still contains value\n // but not shifted - means no more available chars to shift\n if (!shiftChar) break;\n ++ci;\n } else {\n // clean if chunk has no value\n this.chunks.splice(ci, 1);\n }\n\n if (shiftChar) return shiftChar;\n }\n\n return '';\n }\n\n shift (): string {\n if (!this.chunks.length) return '';\n\n let ci=this.chunks.length-1;\n while (0 <= ci) {\n const chunk = this.chunks[ci];\n const shiftChar = chunk.shift();\n\n if (chunk.toString()) {\n // chunk still contains value\n // but not shifted - means no more available chars to shift\n if (!shiftChar) break;\n --ci;\n } else {\n // clean if chunk has no value\n this.chunks.splice(ci, 1);\n }\n\n if (shiftChar) return shiftChar;\n }\n\n return '';\n }\n}\n","import { DIRECTION } from '../../core/utils';\nimport type MaskedPattern from '../pattern';\nimport type PatternBlock from './block';\n\n\ntype PatternCursorState = { offset: number, index: number, ok: boolean };\n\nexport default\nclass PatternCursor {\n declare masked: MaskedPattern;\n declare offset: number;\n declare index: number;\n declare ok: boolean;\n declare _log: PatternCursorState[];\n\n constructor (masked: MaskedPattern, pos: number) {\n this.masked = masked;\n this._log = [];\n\n const { offset, index } = masked._mapPosToBlock(pos) || (\n pos < 0 ?\n // first\n { index: 0, offset: 0 } :\n // last\n { index: this.masked._blocks.length, offset: 0 }\n );\n this.offset = offset;\n this.index = index;\n this.ok = false;\n }\n\n get block (): PatternBlock {\n return this.masked._blocks[this.index];\n }\n\n get pos (): number {\n return this.masked._blockStartPos(this.index) + this.offset;\n }\n\n get state (): PatternCursorState {\n return { index: this.index, offset: this.offset, ok: this.ok };\n }\n\n set state (s: PatternCursorState) {\n Object.assign(this, s);\n }\n\n pushState () {\n this._log.push(this.state);\n }\n\n popState (): PatternCursorState | undefined {\n const s = this._log.pop();\n if (s) this.state = s;\n return s;\n }\n\n bindBlock () {\n if (this.block) return;\n if (this.index < 0) {\n this.index = 0;\n this.offset = 0;\n }\n if (this.index >= this.masked._blocks.length) {\n this.index = this.masked._blocks.length - 1;\n this.offset = (this.block as unknown as PatternBlock).displayValue.length; // TODO this is stupid type error, `block` depends on index that was changed above\n }\n }\n\n _pushLeft(fn: () => boolean | undefined): boolean {\n this.pushState();\n for (this.bindBlock(); 0<=this.index; --this.index, this.offset=this.block?.displayValue.length || 0) {\n if (fn()) return this.ok = true;\n }\n\n return this.ok = false;\n }\n\n _pushRight (fn: () => boolean | undefined): boolean {\n this.pushState();\n for (this.bindBlock(); this.index {\n if (this.block.isFixed || !this.block.value) return;\n\n this.offset = this.block.nearestInputPos(this.offset, DIRECTION.FORCE_LEFT);\n if (this.offset !== 0) return true;\n });\n }\n\n pushLeftBeforeInput (): boolean {\n // cases:\n // filled input: 00|\n // optional empty input: 00[]|\n // nested block: XX<[]>|\n return this._pushLeft(() => {\n if (this.block.isFixed) return;\n\n this.offset = this.block.nearestInputPos(this.offset, DIRECTION.LEFT);\n return true;\n });\n }\n\n pushLeftBeforeRequired (): boolean {\n return this._pushLeft(() => {\n if (this.block.isFixed || this.block.isOptional && !this.block.value) return;\n\n this.offset = this.block.nearestInputPos(this.offset, DIRECTION.LEFT);\n return true;\n });\n }\n\n pushRightBeforeFilled (): boolean {\n return this._pushRight(() => {\n if (this.block.isFixed || !this.block.value) return;\n\n this.offset = this.block.nearestInputPos(this.offset, DIRECTION.FORCE_RIGHT);\n if (this.offset !== this.block.value.length) return true;\n });\n }\n\n pushRightBeforeInput (): boolean {\n return this._pushRight(() => {\n if (this.block.isFixed) return;\n\n // const o = this.offset;\n this.offset = this.block.nearestInputPos(this.offset, DIRECTION.NONE);\n // HACK cases like (STILL DOES NOT WORK FOR NESTED)\n // aa|X\n // aaX_ - this will not work\n // if (o && o === this.offset && this.block instanceof PatternInputDefinition) continue;\n return true;\n });\n }\n\n pushRightBeforeRequired (): boolean {\n return this._pushRight(() => {\n if (this.block.isFixed || this.block.isOptional && !this.block.value) return;\n\n // TODO check |[*]XX_\n this.offset = this.block.nearestInputPos(this.offset, DIRECTION.NONE);\n return true;\n });\n }\n}\n","import ChangeDetails from '../../core/change-details';\nimport { DIRECTION, type Direction, isString } from '../../core/utils';\nimport { type TailDetails } from '../../core/tail-details';\nimport ContinuousTailDetails from '../../core/continuous-tail-details';\nimport { type ExtractFlags, type AppendFlags, type MaskedState } from '../base';\nimport type PatternBlock from './block';\n\n\nexport\ntype PatternFixedDefinitionOptions = Pick;\n\n\nexport default\nclass PatternFixedDefinition implements PatternBlock {\n /** */\n declare _value: string;\n /** */\n declare char: string;\n /** */\n declare isUnmasking?: boolean;\n /** */\n declare eager: boolean | 'remove' | 'append' | undefined;\n /** */\n declare _isRawInput?: boolean;\n /** */\n declare isFixed: boolean;\n\n constructor(opts: PatternFixedDefinitionOptions) {\n Object.assign(this, opts);\n this._value = '';\n this.isFixed = true;\n }\n\n get value (): string {\n return this._value;\n }\n\n get unmaskedValue (): string {\n return this.isUnmasking ? this.value : '';\n }\n\n get rawInputValue (): string {\n return this._isRawInput ? this.value : '';\n }\n\n get displayValue (): string {\n return this.value;\n }\n\n reset () {\n this._isRawInput = false;\n this._value = '';\n }\n\n remove (fromPos: number=0, toPos: number=this._value.length): ChangeDetails {\n this._value = this._value.slice(0, fromPos) + this._value.slice(toPos);\n if (!this._value) this._isRawInput = false;\n\n return new ChangeDetails();\n }\n\n nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\n const minPos = 0;\n const maxPos = this._value.length;\n\n switch (direction) {\n case DIRECTION.LEFT:\n case DIRECTION.FORCE_LEFT:\n return minPos;\n case DIRECTION.NONE:\n case DIRECTION.RIGHT:\n case DIRECTION.FORCE_RIGHT:\n default:\n return maxPos;\n }\n }\n\n totalInputPositions (fromPos: number=0, toPos: number=this._value.length): number {\n return this._isRawInput ? (toPos - fromPos) : 0;\n }\n\n extractInput (fromPos: number=0, toPos: number=this._value.length, flags: ExtractFlags={}): string {\n return flags.raw && this._isRawInput && this._value.slice(fromPos, toPos) || '';\n }\n\n get isComplete (): boolean {\n return true;\n }\n\n get isFilled (): boolean {\n return Boolean(this._value);\n }\n\n _appendChar (ch: string, flags: AppendFlags={}): ChangeDetails {\n if (this.isFilled) return new ChangeDetails();\n const appendEager = this.eager === true || this.eager === 'append';\n\n const appended = this.char === ch;\n const isResolved = appended && (this.isUnmasking || flags.input || flags.raw) && (!flags.raw || !appendEager) && !flags.tail;\n const details = new ChangeDetails({\n inserted: this.char,\n rawInserted: isResolved ? this.char: '',\n })\n this._value = this.char;\n this._isRawInput = isResolved && (flags.raw || flags.input);\n\n return details;\n }\n\n _appendEager (): ChangeDetails {\n return this._appendChar(this.char, { tail: true });\n }\n\n _appendPlaceholder (): ChangeDetails {\n const details = new ChangeDetails();\n if (this.isFilled) return details;\n\n this._value = details.inserted = this.char;\n return details;\n }\n\n extractTail (): TailDetails {\n return new ContinuousTailDetails('');\n }\n\n appendTail (tail: string | String | TailDetails): ChangeDetails {\n if (isString(tail)) tail = new ContinuousTailDetails(String(tail));\n\n return (tail as TailDetails).appendTo(this);\n }\n\n append (str: string, flags?: AppendFlags, tail?: TailDetails): ChangeDetails {\n const details = this._appendChar(str[0], flags);\n\n if (tail != null) {\n details.tailShift += this.appendTail(tail).tailShift;\n }\n\n return details;\n }\n\n doCommit () {}\n\n get state (): MaskedState {\n return {\n _value: this._value,\n _rawInputValue: this.rawInputValue,\n };\n }\n\n set state (state: MaskedState) {\n this._value = state._value;\n this._isRawInput = Boolean(state._rawInputValue);\n }\n}\n","import createMask, { type FactoryArg, type FactoryOpts, type FactoryReturnMasked } from '../factory';\nimport type Masked from '../base';\nimport type MaskedPattern from '../pattern';\nimport { type TailDetails } from '../../core/tail-details';\nimport { type ExtractFlags, type AppendFlags, type MaskedState } from '../base';\nimport ChangeDetails from '../../core/change-details';\nimport { DIRECTION, type Direction } from '../../core/utils';\nimport type PatternBlock from './block';\n\n\nexport\ntype PatternInputDefinitionOptions =\n Omit &\n Partial>;\n\nexport\ntype PatternInputDefinitionState = MaskedState & {\n masked: FactoryReturnMasked['state'],\n isFilled: boolean,\n};\n\n\nexport default\nclass PatternInputDefinition implements PatternBlock> {\n static DEFAULT_DEFINITIONS: { [k: string]: RegExp } = {\n '0': /\\d/,\n 'a': /[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/, // http://stackoverflow.com/a/22075070\n '*': /./\n }\n\n /** */\n declare readonly masked: FactoryReturnMasked;\n /** */\n declare parent: Masked;\n /** */\n declare isOptional: boolean;\n /** */\n declare isFilled: boolean;\n /** */\n declare lazy: MaskedPattern['lazy'];\n /** */\n declare eager: MaskedPattern['eager'];\n /** */\n declare placeholderChar: MaskedPattern['placeholderChar'];\n /** */\n declare displayChar: MaskedPattern['displayChar'];\n\n constructor(opts: PatternInputDefinitionOptions) {\n const { parent, isOptional, placeholderChar, displayChar, lazy, eager, ...maskOpts } = opts;\n\n this.masked = createMask(maskOpts as Opts);\n Object.assign(this, { parent, isOptional, placeholderChar, displayChar, lazy, eager });\n }\n\n reset () {\n this.isFilled = false;\n this.masked.reset();\n }\n\n remove (fromPos: number=0, toPos: number=this.value.length): ChangeDetails {\n if (fromPos === 0 && toPos >= 1) {\n this.isFilled = false;\n return this.masked.remove(fromPos, toPos);\n }\n\n return new ChangeDetails();\n }\n\n get value (): string {\n return this.masked.value ||\n (this.isFilled && !this.isOptional ?\n this.placeholderChar :\n '');\n }\n\n get unmaskedValue (): string {\n return this.masked.unmaskedValue;\n }\n\n get rawInputValue (): string {\n return this.masked.rawInputValue;\n }\n\n get displayValue (): string {\n return this.masked.value && this.displayChar || this.value;\n }\n\n get isComplete (): boolean {\n return Boolean(this.masked.value) || this.isOptional;\n }\n\n _appendChar (ch: string, flags: AppendFlags>={}): ChangeDetails {\n if (this.isFilled) return new ChangeDetails();\n\n const state = this.masked.state;\n // simulate input\n let details = this.masked._appendChar(ch, this.currentMaskFlags(flags));\n\n if (details.inserted && this.doValidate(flags) === false) {\n details = new ChangeDetails();\n this.masked.state = state;\n }\n\n if (!details.inserted && !this.isOptional && !this.lazy && !flags.input) {\n details.inserted = this.placeholderChar;\n }\n details.skip = !details.inserted && !this.isOptional;\n this.isFilled = Boolean(details.inserted);\n\n return details;\n }\n\n append (str: string, flags?: AppendFlags>, tail?: TailDetails): ChangeDetails {\n // TODO probably should be done via _appendChar\n return this.masked.append(str, this.currentMaskFlags(flags), tail);\n }\n\n _appendPlaceholder (): ChangeDetails {\n if (this.isFilled || this.isOptional) return new ChangeDetails();\n\n this.isFilled = true;\n return new ChangeDetails({ inserted: this.placeholderChar });\n }\n\n _appendEager (): ChangeDetails {\n return new ChangeDetails();\n }\n\n extractTail (fromPos?: number, toPos?: number): TailDetails {\n return this.masked.extractTail(fromPos, toPos);\n }\n\n appendTail (tail: string | TailDetails): ChangeDetails {\n return this.masked.appendTail(tail);\n }\n\n extractInput (fromPos: number=0, toPos: number=this.value.length, flags?: ExtractFlags): string {\n return this.masked.extractInput(fromPos, toPos, flags);\n }\n\n nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\n const minPos = 0;\n const maxPos = this.value.length;\n const boundPos = Math.min(Math.max(cursorPos, minPos), maxPos);\n\n switch (direction) {\n case DIRECTION.LEFT:\n case DIRECTION.FORCE_LEFT:\n return this.isComplete ? boundPos : minPos;\n case DIRECTION.RIGHT:\n case DIRECTION.FORCE_RIGHT:\n return this.isComplete ? boundPos : maxPos;\n case DIRECTION.NONE:\n default: return boundPos;\n }\n }\n\n totalInputPositions (fromPos: number=0, toPos: number=this.value.length): number {\n return this.value.slice(fromPos, toPos).length;\n }\n\n doValidate (flags: AppendFlags>): boolean {\n return this.masked.doValidate(this.currentMaskFlags(flags)) && (\n !this.parent || this.parent.doValidate(this.currentMaskFlags(flags)));\n }\n\n doCommit () {\n this.masked.doCommit();\n }\n\n get state (): PatternInputDefinitionState {\n return {\n _value: this.value,\n _rawInputValue: this.rawInputValue,\n masked: this.masked.state,\n isFilled: this.isFilled,\n };\n }\n\n set state (state: PatternInputDefinitionState) {\n this.masked.state = state.masked;\n this.isFilled = state.isFilled;\n }\n\n currentMaskFlags (flags?: AppendFlags>): AppendFlags {\n return {\n ...flags,\n _beforeTailState: flags?._beforeTailState?.masked || flags?._beforeTailState as unknown as MaskedState,\n };\n }\n}\n","import Masked, { type MaskedOptions } from './base';\nimport IMask from '../core/holder';\n\n\nexport\ntype MaskedRegExpOptions = MaskedOptions;\n\n/** Masking by RegExp */\nexport default\nclass MaskedRegExp extends Masked {\n /** */\n declare mask: RegExp;\n /** Enable characters overwriting */\n declare overwrite?: boolean | 'shift' | undefined;\n /** */\n declare eager?: boolean | 'remove' | 'append' | undefined;\n /** */\n declare skipInvalid?: boolean | undefined;\n\n override updateOptions (opts: Partial) {\n super.updateOptions(opts);\n }\n\n override _update (opts: Partial) {\n const mask = opts.mask;\n if (mask) opts.validate = (value) => value.search(mask) >= 0;\n super._update(opts);\n }\n}\n\n\nIMask.MaskedRegExp = MaskedRegExp;\n","import ChangeDetails from '../core/change-details';\nimport IMask from '../core/holder';\nimport { type TailDetails } from '../core/tail-details';\nimport { DIRECTION, type Direction } from '../core/utils';\nimport Masked, { type AppendFlags, type ExtractFlags, type MaskedOptions, type MaskedState } from './base';\nimport createMask, { type FactoryArg, normalizeOpts, type ExtendFactoryArgOptions, NormalizedOpts } from './factory';\nimport type PatternBlock from './pattern/block';\nimport ChunksTailDetails from './pattern/chunk-tail-details';\nimport PatternCursor from './pattern/cursor';\nimport PatternFixedDefinition from './pattern/fixed-definition';\nimport PatternInputDefinition from './pattern/input-definition';\nimport './regexp'; // support for default definitions which are regexp's\n\n\nexport\ntype MaskedPatternOptions<\n Value=string,\n M extends MaskedPattern=MaskedPattern,\n Props extends keyof M=never,\n> = MaskedOptions;\n\nexport\ntype Definitions = {\n [k: string]: FactoryArg,\n};\n\nexport\ntype MaskedPatternState = MaskedState & {\n _blocks: Array,\n};\n\nexport\ntype BlockPosData = {\n index: number,\n offset: number,\n};\n\nexport\ntype BlockExtraOptions = {\n expose?: boolean,\n repeat?: number | [number, number],\n};\n\n\n/** Pattern mask */\nexport default\nclass MaskedPattern extends Masked {\n static DEFAULTS: Record = {\n lazy: true,\n placeholderChar: '_'\n } satisfies Partial;\n static STOP_CHAR = '`';\n static ESCAPE_CHAR = '\\\\';\n static InputDefinition = PatternInputDefinition;\n static FixedDefinition = PatternFixedDefinition;\n\n declare mask: string;\n /** */\n declare blocks: { [key: string]: ExtendFactoryArgOptions };\n /** */\n declare definitions: Definitions;\n /** Single char for empty input */\n declare placeholderChar: string;\n /** Single char for filled input */\n declare displayChar: string;\n /** Show placeholder only when needed */\n declare lazy: boolean;\n /** Enable characters overwriting */\n declare overwrite?: boolean | 'shift' | undefined;\n /** */\n declare eager?: boolean | 'remove' | 'append' | undefined;\n /** */\n declare skipInvalid?: boolean | undefined;\n\n declare _blocks: Array;\n declare _maskedBlocks: {[key: string]: Array};\n declare _stops: Array;\n declare exposeBlock?: Masked;\n\n constructor (opts: MaskedPatternOptions) {\n super({\n ...MaskedPattern.DEFAULTS,\n ...opts,\n definitions: Object.assign({}, PatternInputDefinition.DEFAULT_DEFINITIONS, opts?.definitions),\n } as MaskedOptions);\n }\n\n override updateOptions (opts: Partial>) {\n super.updateOptions(opts);\n }\n\n override _update (opts: Partial>) {\n opts.definitions = Object.assign({}, this.definitions, opts.definitions);\n super._update(opts);\n this._rebuildMask();\n }\n\n _rebuildMask () {\n const defs = this.definitions;\n this._blocks = []; this.exposeBlock = undefined;\n this._stops = [];\n this._maskedBlocks = {};\n\n const pattern = this.mask;\n if (!pattern || !defs) return;\n\n let unmaskingBlock = false;\n let optionalBlock = false;\n\n for (let i=0; i p.indexOf(bName) === 0);\n // order by key length\n bNames.sort((a, b) => b.length - a.length);\n // use block name with max length\n const bName = bNames[0];\n if (bName) {\n const { expose, repeat, ...bOpts } = normalizeOpts(this.blocks[bName]) as NormalizedOpts & BlockExtraOptions; // TODO type Opts\n const blockOpts = {\n lazy: this.lazy,\n eager: this.eager,\n placeholderChar: this.placeholderChar,\n displayChar: this.displayChar,\n overwrite: this.overwrite,\n ...bOpts,\n repeat,\n parent: this,\n };\n const maskedBlock = repeat != null ? new IMask.RepeatBlock(blockOpts as any /* TODO */) : createMask(blockOpts);\n\n if (maskedBlock) {\n this._blocks.push(maskedBlock);\n if (expose) this.exposeBlock = maskedBlock;\n\n // store block index\n if (!this._maskedBlocks[bName]) this._maskedBlocks[bName] = [];\n this._maskedBlocks[bName].push(this._blocks.length - 1);\n }\n\n i += bName.length - 1;\n continue;\n }\n }\n\n let char = pattern[i];\n let isInput = char in defs;\n\n if (char === MaskedPattern.STOP_CHAR) {\n this._stops.push(this._blocks.length);\n continue;\n }\n\n if (char === '{' || char === '}') {\n unmaskingBlock = !unmaskingBlock;\n continue;\n }\n\n if (char === '[' || char === ']') {\n optionalBlock = !optionalBlock;\n continue;\n }\n\n if (char === MaskedPattern.ESCAPE_CHAR) {\n ++i;\n char = pattern[i];\n if (!char) break;\n isInput = false;\n }\n\n const def = isInput ?\n new PatternInputDefinition({\n isOptional: optionalBlock,\n lazy: this.lazy,\n eager: this.eager,\n placeholderChar: this.placeholderChar,\n displayChar: this.displayChar,\n ...normalizeOpts(defs[char]),\n parent: this,\n }) as PatternBlock :\n new PatternFixedDefinition({\n char,\n eager: this.eager,\n isUnmasking: unmaskingBlock,\n });\n\n this._blocks.push(def);\n }\n }\n\n override get state (): MaskedPatternState {\n return {\n ...super.state,\n _blocks: this._blocks.map(b => b.state),\n };\n }\n\n override set state (state: MaskedPatternState) {\n if (!state) { this.reset(); return; }\n\n const { _blocks, ...maskedState } = state;\n this._blocks.forEach((b, bi) => b.state = _blocks[bi]);\n super.state = maskedState;\n }\n\n override reset () {\n super.reset();\n this._blocks.forEach(b => b.reset());\n }\n\n override get isComplete (): boolean {\n return this.exposeBlock ? this.exposeBlock.isComplete :\n this._blocks.every(b => b.isComplete);\n }\n\n override get isFilled (): boolean {\n return this._blocks.every(b => b.isFilled);\n }\n\n get isFixed (): boolean {\n return this._blocks.every(b => b.isFixed);\n }\n\n get isOptional (): boolean {\n return this._blocks.every(b => b.isOptional);\n }\n\n override doCommit () {\n this._blocks.forEach(b => b.doCommit());\n super.doCommit();\n }\n\n override get unmaskedValue (): string {\n return this.exposeBlock ? this.exposeBlock.unmaskedValue :\n this._blocks.reduce((str, b) => str += b.unmaskedValue, '');\n }\n\n override set unmaskedValue (unmaskedValue: string) {\n if (this.exposeBlock) {\n const tail = this.extractTail(this._blockStartPos(this._blocks.indexOf(this.exposeBlock)) + this.exposeBlock.displayValue.length);\n this.exposeBlock.unmaskedValue = unmaskedValue;\n this.appendTail(tail);\n this.doCommit();\n }\n else super.unmaskedValue = unmaskedValue;\n }\n\n override get value (): string {\n return this.exposeBlock ? this.exposeBlock.value :\n // TODO return _value when not in change?\n this._blocks.reduce((str, b) => str += b.value, '');\n }\n\n override set value (value: string) {\n if (this.exposeBlock) {\n const tail = this.extractTail(this._blockStartPos(this._blocks.indexOf(this.exposeBlock)) + this.exposeBlock.displayValue.length);\n this.exposeBlock.value = value;\n this.appendTail(tail);\n this.doCommit();\n }\n else super.value = value;\n }\n\n override get typedValue (): Value {\n return this.exposeBlock ? this.exposeBlock.typedValue :\n super.typedValue;\n }\n\n override set typedValue (value: Value) {\n if (this.exposeBlock) {\n const tail = this.extractTail(this._blockStartPos(this._blocks.indexOf(this.exposeBlock)) + this.exposeBlock.displayValue.length);\n this.exposeBlock.typedValue = value;\n this.appendTail(tail);\n this.doCommit();\n }\n else super.typedValue = value;\n }\n\n override get displayValue (): string {\n return this._blocks.reduce((str, b) => str += b.displayValue, '');\n }\n\n override appendTail (tail: string | String | TailDetails): ChangeDetails {\n return super.appendTail(tail).aggregate(this._appendPlaceholder());\n }\n\n override _appendEager (): ChangeDetails {\n const details = new ChangeDetails();\n\n let startBlockIndex = this._mapPosToBlock(this.displayValue.length)?.index;\n if (startBlockIndex == null) return details;\n\n // TODO test if it works for nested pattern masks\n if (this._blocks[startBlockIndex].isFilled) ++startBlockIndex;\n\n for (let bi=startBlockIndex; bi={}): ChangeDetails {\n const blockIter = this._mapPosToBlock(this.displayValue.length);\n const details = new ChangeDetails();\n if (!blockIter) return details;\n\n for (let bi=blockIter.index, block; (block = this._blocks[bi]); ++bi) {\n const blockDetails = block._appendChar(ch, { ...flags, _beforeTailState: flags._beforeTailState?._blocks?.[bi] });\n\n details.aggregate(blockDetails);\n\n if (blockDetails.consumed) break; // go next char\n }\n\n return details;\n }\n\n override extractTail (fromPos: number=0, toPos: number=this.displayValue.length): ChunksTailDetails {\n const chunkTail = new ChunksTailDetails();\n if (fromPos === toPos) return chunkTail;\n\n this._forEachBlocksInRange(fromPos, toPos, (b, bi, bFromPos, bToPos) => {\n const blockChunk = b.extractTail(bFromPos, bToPos);\n blockChunk.stop = this._findStopBefore(bi);\n blockChunk.from = this._blockStartPos(bi);\n if (blockChunk instanceof ChunksTailDetails) blockChunk.blockIndex = bi;\n\n chunkTail.extend(blockChunk);\n });\n\n return chunkTail;\n }\n\n override extractInput (fromPos: number=0, toPos: number=this.displayValue.length, flags: ExtractFlags={}): string {\n if (fromPos === toPos) return '';\n\n let input = '';\n\n this._forEachBlocksInRange(fromPos, toPos, (b, _, fromPos, toPos) => {\n input += b.extractInput(fromPos, toPos, flags);\n });\n\n return input;\n }\n\n _findStopBefore (blockIndex: number): number | undefined {\n let stopBefore;\n for (let si=0; si {\n if (!b.lazy || toBlockIndex != null) {\n details.aggregate(b._appendPlaceholder((b as MaskedPattern)._blocks?.length));\n }\n });\n\n return details;\n }\n\n /** Finds block in pos */\n _mapPosToBlock (pos: number): BlockPosData | undefined {\n let accVal = '';\n for (let bi=0; bi pos += b.displayValue.length, 0);\n }\n\n _forEachBlocksInRange (fromPos: number, toPos: number=this.displayValue.length, fn: (block: PatternBlock, blockIndex: number, fromPos: number, toPos: number) => void) {\n const fromBlockIter = this._mapPosToBlock(fromPos);\n\n if (fromBlockIter) {\n const toBlockIter = this._mapPosToBlock(toPos);\n // process first block\n const isSameBlock = toBlockIter && fromBlockIter.index === toBlockIter.index;\n const fromBlockStartPos = fromBlockIter.offset;\n const fromBlockEndPos = toBlockIter && isSameBlock ?\n toBlockIter.offset :\n this._blocks[fromBlockIter.index].displayValue.length;\n fn(this._blocks[fromBlockIter.index], fromBlockIter.index, fromBlockStartPos, fromBlockEndPos);\n\n if (toBlockIter && !isSameBlock) {\n // process intermediate blocks\n for (let bi=fromBlockIter.index+1; bi {\n removeDetails.aggregate(b.remove(bFromPos, bToPos));\n });\n return removeDetails;\n }\n\n override nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\n if (!this._blocks.length) return 0;\n const cursor = new PatternCursor(this, cursorPos);\n\n if (direction === DIRECTION.NONE) {\n // -------------------------------------------------\n // NONE should only go out from fixed to the right!\n // -------------------------------------------------\n if (cursor.pushRightBeforeInput()) return cursor.pos;\n cursor.popState();\n if (cursor.pushLeftBeforeInput()) return cursor.pos;\n return this.displayValue.length;\n }\n\n // FORCE is only about a|* otherwise is 0\n if (direction === DIRECTION.LEFT || direction === DIRECTION.FORCE_LEFT) {\n // try to break fast when *|a\n if (direction === DIRECTION.LEFT) {\n cursor.pushRightBeforeFilled();\n if (cursor.ok && cursor.pos === cursorPos) return cursorPos;\n cursor.popState();\n }\n\n // forward flow\n cursor.pushLeftBeforeInput();\n cursor.pushLeftBeforeRequired();\n cursor.pushLeftBeforeFilled();\n\n // backward flow\n if (direction === DIRECTION.LEFT) {\n cursor.pushRightBeforeInput();\n cursor.pushRightBeforeRequired();\n if (cursor.ok && cursor.pos <= cursorPos) return cursor.pos;\n cursor.popState();\n if (cursor.ok && cursor.pos <= cursorPos) return cursor.pos;\n cursor.popState();\n }\n if (cursor.ok) return cursor.pos;\n if (direction === DIRECTION.FORCE_LEFT) return 0;\n\n cursor.popState();\n if (cursor.ok) return cursor.pos;\n\n cursor.popState();\n if (cursor.ok) return cursor.pos;\n\n return 0;\n }\n\n if (direction === DIRECTION.RIGHT || direction === DIRECTION.FORCE_RIGHT) {\n // forward flow\n cursor.pushRightBeforeInput();\n cursor.pushRightBeforeRequired();\n\n if (cursor.pushRightBeforeFilled()) return cursor.pos;\n if (direction === DIRECTION.FORCE_RIGHT) return this.displayValue.length;\n\n // backward flow\n cursor.popState();\n if (cursor.ok) return cursor.pos;\n\n cursor.popState();\n if (cursor.ok) return cursor.pos;\n\n return this.nearestInputPos(cursorPos, DIRECTION.LEFT);\n }\n\n return cursorPos;\n }\n\n override totalInputPositions (fromPos: number=0, toPos: number=this.displayValue.length): number {\n let total = 0;\n this._forEachBlocksInRange(fromPos, toPos, (b, _, bFromPos, bToPos) => {\n total += b.totalInputPositions(bFromPos, bToPos);\n });\n return total;\n }\n\n /** Get block by name */\n maskedBlock (name: string): PatternBlock | undefined {\n return this.maskedBlocks(name)[0];\n }\n\n /** Get all blocks by name */\n maskedBlocks (name: string): Array {\n const indices = this._maskedBlocks[name];\n if (!indices) return [];\n return indices.map(gi => this._blocks[gi]);\n }\n}\n\n\nIMask.MaskedPattern = MaskedPattern;\n","import ChangeDetails from '../core/change-details';\nimport IMask from '../core/holder';\nimport { type AppendFlags } from './base';\nimport MaskedPattern, { type MaskedPatternOptions } from './pattern';\n\n\ntype MaskedRangePatternOptions = MaskedPatternOptions &\n Pick &\n Partial>;\n\nexport\ntype MaskedRangeOptions = Omit;\n\n\n/** Pattern which accepts ranges */\nexport default\nclass MaskedRange extends MaskedPattern {\n /**\n Optionally sets max length of pattern.\n Used when pattern length is longer then `to` param length. Pads zeros at start in this case.\n */\n declare maxLength: number;\n /** Min bound */\n declare from: number;\n /** Max bound */\n declare to: number;\n /** */\n declare autofix?: boolean | 'pad';\n\n get _matchFrom (): number {\n return this.maxLength - String(this.from).length;\n }\n\n constructor (opts?: MaskedRangeOptions) {\n super(opts as MaskedPatternOptions); // mask will be created in _update\n }\n\n override updateOptions (opts: Partial) {\n super.updateOptions(opts);\n }\n\n override _update (opts: Partial) {\n const {\n to=this.to || 0,\n from=this.from || 0,\n maxLength=this.maxLength || 0,\n autofix=this.autofix,\n ...patternOpts\n }: Partial = opts;\n\n this.to = to;\n this.from = from;\n this.maxLength = Math.max(String(to).length, maxLength);\n this.autofix = autofix;\n\n const fromStr = String(this.from).padStart(this.maxLength, '0');\n const toStr = String(this.to).padStart(this.maxLength, '0');\n let sameCharsCount = 0;\n while (sameCharsCount < toStr.length && toStr[sameCharsCount] === fromStr[sameCharsCount]) ++sameCharsCount;\n patternOpts.mask = toStr.slice(0, sameCharsCount).replace(/0/g, '\\\\0') + '0'.repeat(this.maxLength - sameCharsCount);\n\n super._update(patternOpts);\n }\n\n override get isComplete (): boolean {\n return super.isComplete && Boolean(this.value);\n }\n\n boundaries (str: string): [string, string] {\n let minstr = '';\n let maxstr = '';\n\n const [, placeholder, num] = str.match(/^(\\D*)(\\d*)(\\D*)/) || [];\n if (num) {\n minstr = '0'.repeat(placeholder.length) + num;\n maxstr = '9'.repeat(placeholder.length) + num;\n }\n minstr = minstr.padEnd(this.maxLength, '0');\n maxstr = maxstr.padEnd(this.maxLength, '9');\n\n return [minstr, maxstr];\n }\n\n override doPrepareChar (ch: string, flags: AppendFlags={}): [string, ChangeDetails] {\n let details: ChangeDetails;\n [ch, details] = super.doPrepareChar(ch.replace(/\\D/g, ''), flags);\n\n if (!this.autofix || !ch) {\n details.skip = !this.isComplete;\n return [ch, details];\n }\n\n const fromStr = String(this.from).padStart(this.maxLength, '0');\n const toStr = String(this.to).padStart(this.maxLength, '0');\n\n const nextVal = this.value + ch;\n if (nextVal.length > this.maxLength) return ['', details];\n\n const [minstr, maxstr] = this.boundaries(nextVal);\n\n if (Number(maxstr) < this.from) return [fromStr[nextVal.length - 1], details];\n\n if (Number(minstr) > this.to) {\n if (this.autofix === 'pad' && nextVal.length < this.maxLength) {\n return ['', details.aggregate(this.append(fromStr[nextVal.length - 1]+ch, flags))];\n }\n return [toStr[nextVal.length - 1], details];\n }\n\n return [ch, details];\n }\n\n override doValidate (flags: AppendFlags): boolean {\n const str = this.value;\n\n const firstNonZero = str.search(/[^0]/);\n if (firstNonZero === -1 && str.length <= this._matchFrom) return true;\n\n const [minstr, maxstr] = this.boundaries(str);\n\n return this.from <= Number(maxstr) && Number(minstr) <= this.to &&\n super.doValidate(flags);\n }\n}\n\n\nIMask.MaskedRange = MaskedRange;\n","import MaskedPattern, { type MaskedPatternOptions } from './pattern';\nimport { type MaskedRangeOptions } from './range';\nimport MaskedRange from './range';\nimport IMask from '../core/holder';\nimport type Masked from './base';\nimport { type AppendFlags } from './base';\nimport { isString } from '../core/utils';\n\n\nexport\ntype DateMaskType = DateConstructor;\n\ntype DateOptionsKeys =\n | 'pattern'\n | 'min'\n | 'max'\n | 'autofix'\n;\n\nexport\ntype DateValue = Date | null;\n\nexport\ntype MaskedDateOptions =\n Omit, 'mask'> &\n Partial> &\n { mask?: string | DateMaskType }\n;\n\n/** Date mask */\nexport default\nclass MaskedDate extends MaskedPattern {\n static GET_DEFAULT_BLOCKS: () => { [k: string]: MaskedRangeOptions } = () => ({\n d: {\n mask: MaskedRange,\n from: 1,\n to: 31,\n maxLength: 2,\n },\n m: {\n mask: MaskedRange,\n from: 1,\n to: 12,\n maxLength: 2,\n },\n Y: {\n mask: MaskedRange,\n from: 1900,\n to: 9999,\n }\n });\n static DEFAULTS: Record = {\n mask: Date,\n pattern: 'd{.}`m{.}`Y',\n format: (date: DateValue, masked: Masked): string => {\n if (!date) return '';\n\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = date.getFullYear();\n\n return [day, month, year].join('.');\n },\n parse: (str: string, masked: Masked): DateValue => {\n const [day, month, year] = str.split('.').map(Number);\n return new Date(year, month - 1, day);\n },\n } satisfies Partial;\n\n static extractPatternOptions (opts: Partial): Partial & { mask: MaskedPatternOptions['mask'] }> {\n const { mask, pattern, ...patternOpts } = opts;\n return {\n ...patternOpts,\n mask: isString(mask) ? mask : pattern,\n };\n }\n\n /** Pattern mask for date according to {@link MaskedDate#format} */\n declare pattern: string;\n /** Start date */\n declare min?: Date;\n /** End date */\n declare max?: Date;\n /** */\n declare autofix?: boolean | 'pad' | undefined;\n /** Format typed value to string */\n declare format: (value: DateValue, masked: Masked) => string;\n /** Parse string to get typed value */\n declare parse: (str: string, masked: Masked) => DateValue;\n\n constructor (opts?: MaskedDateOptions) {\n super(MaskedDate.extractPatternOptions({\n ...(MaskedDate.DEFAULTS as MaskedDateOptions),\n ...opts,\n }));\n }\n\n override updateOptions (opts: Partial) {\n super.updateOptions(opts as Partial>);\n }\n\n override _update (opts: Partial) {\n const { mask, pattern, blocks, ...patternOpts } = {\n ...MaskedDate.DEFAULTS,\n ...opts,\n };\n\n const patternBlocks = Object.assign({}, MaskedDate.GET_DEFAULT_BLOCKS());\n // adjust year block\n if (opts.min) patternBlocks.Y.from = opts.min.getFullYear();\n if (opts.max) patternBlocks.Y.to = opts.max.getFullYear();\n if (opts.min && opts.max && patternBlocks.Y.from === patternBlocks.Y.to\n ) {\n patternBlocks.m.from = opts.min.getMonth() + 1;\n patternBlocks.m.to = opts.max.getMonth() + 1;\n\n if (patternBlocks.m.from === patternBlocks.m.to) {\n patternBlocks.d.from = opts.min.getDate();\n patternBlocks.d.to = opts.max.getDate();\n }\n }\n Object.assign(patternBlocks, this.blocks, blocks);\n\n // add autofix\n Object.keys(patternBlocks).forEach(bk => {\n const b = patternBlocks[bk];\n if (!('autofix' in b) && 'autofix' in opts) b.autofix = opts.autofix;\n });\n\n super._update({\n ...patternOpts,\n mask: isString(mask) ? mask : pattern,\n blocks: patternBlocks,\n });\n }\n\n override doValidate (flags: AppendFlags): boolean {\n const date = this.date;\n\n return super.doValidate(flags) &&\n (!this.isComplete ||\n this.isDateExist(this.value) && date != null &&\n (this.min == null || this.min <= date) &&\n (this.max == null || date <= this.max));\n }\n\n /** Checks if date is exists */\n isDateExist (str: string): boolean {\n return this.format(this.parse(str, this), this).indexOf(str) >= 0;\n }\n\n /** Parsed Date */\n get date (): DateValue {\n return this.typedValue;\n }\n set date (date: DateValue) {\n this.typedValue = date;\n }\n\n override get typedValue (): DateValue {\n return this.isComplete ? super.typedValue : null;\n }\n override set typedValue (value: DateValue) {\n super.typedValue = value;\n }\n\n override maskEquals (mask: any): boolean {\n return mask === Date || super.maskEquals(mask);\n }\n\n override optionsIsChanged (opts: Partial): boolean {\n return super.optionsIsChanged(MaskedDate.extractPatternOptions(opts));\n }\n}\n\n\nIMask.MaskedDate = MaskedDate;\n","import { objectIncludes } from '../core/utils';\nimport ChangeDetails from '../core/change-details';\nimport createMask, { type FactoryArg, type ExtendFactoryArgOptions, type NormalizedOpts, normalizeOpts } from './factory';\nimport Masked, { type AppendFlags, type MaskedState, type MaskedOptions, type ExtractFlags } from './base';\nimport { DIRECTION, type Direction } from '../core/utils';\nimport { type TailDetails } from '../core/tail-details';\nimport IMask from '../core/holder';\n\n\ntype MaskedDynamicNoRefState = MaskedState & {\n compiledMasks: Array\n};\n\ntype MaskedDynamicRefState = MaskedDynamicNoRefState & {\n currentMaskRef: Masked,\n currentMask: MaskedState,\n};\n\nexport\ntype MaskedDynamicState = MaskedDynamicNoRefState | MaskedDynamicRefState;\n\nexport\ntype DynamicMaskType = Array> | ArrayConstructor;\n\nexport\ntype MaskedDynamicOptions = MaskedOptions;\n\ntype HandleState = MaskedDynamicState | MaskedState;\n\n/** Dynamic mask for choosing appropriate mask in run-time */\nexport default\nclass MaskedDynamic extends Masked {\n static DEFAULTS: Partial;\n\n declare mask: DynamicMaskType;\n /** Currently chosen mask */\n declare currentMask?: Masked;\n /** Currently chosen mask */\n declare exposeMask?: Masked;\n /** Compliled {@link Masked} options */\n declare compiledMasks: Array;\n /** Chooses {@link Masked} depending on input value */\n declare dispatch: (appended: string, masked: MaskedDynamic, flags: AppendFlags, tail: string | String | TailDetails) => (Masked | undefined);\n\n declare _overwrite?: this['overwrite'];\n declare _eager?: this['eager'];\n declare _skipInvalid?: this['skipInvalid'];\n\n constructor (opts?: MaskedDynamicOptions) {\n super({\n ...MaskedDynamic.DEFAULTS,\n ...opts\n });\n\n this.currentMask = undefined;\n }\n\n override updateOptions (opts: Partial) {\n super.updateOptions(opts);\n }\n\n override _update (opts: Partial) {\n super._update(opts);\n\n if ('mask' in opts) {\n this.exposeMask = undefined;\n // mask could be totally dynamic with only `dispatch` option\n this.compiledMasks = Array.isArray(opts.mask) ?\n opts.mask.map(m => {\n const { expose, ...maskOpts } = normalizeOpts(m) as NormalizedOpts & { expose?: boolean };\n\n const masked = createMask({\n overwrite: this._overwrite,\n eager: this._eager,\n skipInvalid: this._skipInvalid,\n ...maskOpts,\n });\n\n if (expose) this.exposeMask = masked;\n\n return masked;\n }) :\n [];\n\n // this.currentMask = this.doDispatch(''); // probably not needed but lets see\n }\n }\n\n override _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\n const details = this._applyDispatch(ch, flags);\n\n if (this.currentMask) {\n details.aggregate(this.currentMask._appendChar(ch, this.currentMaskFlags(flags)));\n }\n\n return details;\n }\n\n _applyDispatch (appended: string='', flags: AppendFlags={}, tail: string | String | TailDetails = ''): ChangeDetails {\n const prevValueBeforeTail = flags.tail && flags._beforeTailState != null ?\n flags._beforeTailState._value :\n this.value;\n const inputValue = this.rawInputValue;\n const insertValue = flags.tail && flags._beforeTailState != null ?\n flags._beforeTailState._rawInputValue :\n inputValue;\n const tailValue = inputValue.slice(insertValue.length);\n const prevMask = this.currentMask;\n const details = new ChangeDetails();\n\n const prevMaskState = prevMask?.state;\n\n // clone flags to prevent overwriting `_beforeTailState`\n this.currentMask = this.doDispatch(appended, { ...flags }, tail);\n\n // restore state after dispatch\n if (this.currentMask) {\n if (this.currentMask !== prevMask) {\n // if mask changed reapply input\n this.currentMask.reset();\n\n if (insertValue) {\n this.currentMask.append(insertValue, { raw: true });\n details.tailShift = this.currentMask.value.length - prevValueBeforeTail.length;\n }\n\n if (tailValue) {\n details.tailShift += this.currentMask.append(tailValue, { raw: true, tail: true }).tailShift;\n }\n } else if (prevMaskState) {\n // Dispatch can do something bad with state, so\n // restore prev mask state\n this.currentMask.state = prevMaskState;\n }\n }\n\n return details;\n }\n\n override _appendPlaceholder (): ChangeDetails {\n const details = this._applyDispatch();\n\n if (this.currentMask) {\n details.aggregate(this.currentMask._appendPlaceholder());\n }\n\n return details;\n }\n\n override _appendEager (): ChangeDetails {\n const details = this._applyDispatch();\n\n if (this.currentMask) {\n details.aggregate(this.currentMask._appendEager());\n }\n\n return details;\n }\n\n override appendTail (tail: string | String | TailDetails): ChangeDetails {\n const details = new ChangeDetails();\n if (tail) details.aggregate(this._applyDispatch('', {}, tail));\n\n return details.aggregate(this.currentMask ?\n this.currentMask.appendTail(tail) :\n super.appendTail(tail));\n }\n\n currentMaskFlags (flags: AppendFlags): AppendFlags {\n return {\n ...flags,\n _beforeTailState:\n (flags._beforeTailState as MaskedDynamicRefState)?.currentMaskRef === this.currentMask &&\n (flags._beforeTailState as MaskedDynamicRefState)?.currentMask ||\n flags._beforeTailState,\n };\n }\n\n doDispatch(appended: string, flags: AppendFlags={}, tail: string | String | TailDetails=''): Masked | undefined {\n return this.dispatch(appended, this, flags, tail);\n }\n\n override doValidate (flags: AppendFlags): boolean {\n return super.doValidate(flags) && (\n !this.currentMask || this.currentMask.doValidate(this.currentMaskFlags(flags))\n );\n }\n\n override doPrepare (str: string, flags: AppendFlags={}): [string, ChangeDetails] {\n let [s, details] = super.doPrepare(str, flags);\n\n if (this.currentMask) {\n let currentDetails;\n ([s, currentDetails] = super.doPrepare(s, this.currentMaskFlags(flags)));\n details = details.aggregate(currentDetails);\n }\n\n return [s, details];\n }\n\n override doPrepareChar (str: string, flags: AppendFlags={}): [string, ChangeDetails] {\n let [s, details] = super.doPrepareChar(str, flags);\n\n if (this.currentMask) {\n let currentDetails;\n ([s, currentDetails] = super.doPrepareChar(s, this.currentMaskFlags(flags)));\n details = details.aggregate(currentDetails);\n }\n\n return [s, details];\n }\n\n override reset () {\n this.currentMask?.reset();\n this.compiledMasks.forEach(m => m.reset());\n }\n\n override get value (): string {\n return this.exposeMask ? this.exposeMask.value :\n this.currentMask ? this.currentMask.value :\n '';\n }\n\n override set value (value: string) {\n if (this.exposeMask) {\n this.exposeMask.value = value;\n this.currentMask = this.exposeMask;\n this._applyDispatch();\n }\n else super.value = value;\n }\n\n override get unmaskedValue (): string {\n return this.exposeMask ? this.exposeMask.unmaskedValue :\n this.currentMask ? this.currentMask.unmaskedValue :\n '';\n }\n\n override set unmaskedValue (unmaskedValue: string) {\n if (this.exposeMask) {\n this.exposeMask.unmaskedValue = unmaskedValue;\n this.currentMask = this.exposeMask;\n this._applyDispatch();\n }\n else super.unmaskedValue = unmaskedValue;\n }\n\n override get typedValue (): Value {\n return this.exposeMask ? this.exposeMask.typedValue :\n this.currentMask ? this.currentMask.typedValue :\n '';\n }\n\n override set typedValue (typedValue: Value) {\n if (this.exposeMask) {\n this.exposeMask.typedValue = typedValue;\n this.currentMask = this.exposeMask;\n this._applyDispatch();\n return;\n }\n\n let unmaskedValue = String(typedValue);\n\n // double check it\n if (this.currentMask) {\n this.currentMask.typedValue = typedValue;\n unmaskedValue = this.currentMask.unmaskedValue;\n }\n this.unmaskedValue = unmaskedValue;\n }\n\n override get displayValue (): string {\n return this.currentMask ? this.currentMask.displayValue : '';\n }\n\n override get isComplete (): boolean {\n return Boolean(this.currentMask?.isComplete);\n }\n\n override get isFilled (): boolean {\n return Boolean(this.currentMask?.isFilled);\n }\n\n override remove (fromPos?: number, toPos?: number): ChangeDetails {\n const details: ChangeDetails = new ChangeDetails();\n\n if (this.currentMask) {\n details.aggregate(this.currentMask.remove(fromPos, toPos))\n // update with dispatch\n .aggregate(this._applyDispatch());\n }\n\n return details;\n }\n\n override get state (): MaskedDynamicState {\n return {\n ...super.state,\n _rawInputValue: this.rawInputValue,\n compiledMasks: this.compiledMasks.map(m => m.state),\n currentMaskRef: this.currentMask,\n currentMask: this.currentMask?.state,\n };\n }\n\n override set state (state: HandleState) {\n const { compiledMasks, currentMaskRef, currentMask, ...maskedState } = state as MaskedDynamicRefState;\n if (compiledMasks) this.compiledMasks.forEach((m, mi) => m.state = compiledMasks[mi]);\n if (currentMaskRef != null) {\n this.currentMask = currentMaskRef;\n this.currentMask.state = currentMask;\n }\n super.state = maskedState;\n }\n\n override extractInput (fromPos?: number, toPos?: number, flags?: ExtractFlags): string {\n return this.currentMask ?\n this.currentMask.extractInput(fromPos, toPos, flags) :\n '';\n }\n\n override extractTail (fromPos?: number, toPos?: number): TailDetails {\n return this.currentMask ?\n this.currentMask.extractTail(fromPos, toPos) :\n super.extractTail(fromPos, toPos);\n }\n\n override doCommit () {\n if (this.currentMask) this.currentMask.doCommit();\n super.doCommit();\n }\n\n override nearestInputPos(cursorPos: number, direction?: Direction): number {\n return this.currentMask ?\n this.currentMask.nearestInputPos(cursorPos, direction) :\n super.nearestInputPos(cursorPos, direction);\n }\n\n override get overwrite (): boolean | 'shift' | undefined {\n return this.currentMask ?\n this.currentMask.overwrite :\n this._overwrite;\n }\n\n override set overwrite (overwrite: boolean | 'shift' | undefined) {\n this._overwrite = overwrite;\n }\n\n override get eager (): boolean | 'remove' | 'append' | undefined {\n return this.currentMask ?\n this.currentMask.eager :\n this._eager;\n }\n\n override set eager (eager: boolean | 'remove' | 'append' | undefined) {\n this._eager = eager;\n }\n\n override get skipInvalid (): boolean | undefined {\n return this.currentMask ?\n this.currentMask.skipInvalid :\n this._skipInvalid;\n }\n\n override set skipInvalid (skipInvalid: boolean | undefined) {\n this._skipInvalid = skipInvalid;\n }\n\n override maskEquals (mask: any): boolean {\n return Array.isArray(mask) ?\n this.compiledMasks.every((m, mi) => {\n if (!mask[mi]) return;\n\n const { mask: oldMask, ...restOpts } = mask[mi];\n return objectIncludes(m, restOpts) && m.maskEquals(oldMask);\n }) : super.maskEquals(mask);\n }\n\n override typedValueEquals (value: any): boolean {\n return Boolean(this.currentMask?.typedValueEquals(value));\n }\n}\n\nMaskedDynamic.DEFAULTS = {\n dispatch: (appended, masked, flags, tail) => {\n if (!masked.compiledMasks.length) return;\n\n const inputValue = masked.rawInputValue;\n\n // simulate input\n const inputs = masked.compiledMasks.map((m, index) => {\n const isCurrent = masked.currentMask === m;\n const startInputPos = isCurrent ? m.displayValue.length : m.nearestInputPos(m.displayValue.length, DIRECTION.FORCE_LEFT);\n\n if (m.rawInputValue !== inputValue) {\n m.reset();\n m.append(inputValue, { raw: true });\n } else if (!isCurrent) {\n m.remove(startInputPos);\n }\n m.append(appended, masked.currentMaskFlags(flags));\n m.appendTail(tail);\n\n return {\n index,\n weight: m.rawInputValue.length,\n totalInputPositions: m.totalInputPositions(\n 0,\n Math.max(startInputPos, m.nearestInputPos(m.displayValue.length, DIRECTION.FORCE_LEFT)),\n ),\n };\n });\n\n // pop masks with longer values first\n inputs.sort((i1, i2) => i2.weight - i1.weight || i2.totalInputPositions - i1.totalInputPositions);\n\n return masked.compiledMasks[inputs[0].index];\n }\n};\n\n\nIMask.MaskedDynamic = MaskedDynamic;\n","import MaskedPattern, { type MaskedPatternOptions } from './pattern';\nimport { AppendFlags } from './base';\nimport IMask from '../core/holder';\n\n\nexport\ntype MaskedEnumOptions = Omit & Pick;\n\nexport\ntype MaskedEnumPatternOptions = MaskedPatternOptions & Partial>;\n\n\n/** Pattern which validates enum values */\nexport default\nclass MaskedEnum extends MaskedPattern {\n declare enum: Array;\n\n constructor (opts?: MaskedEnumOptions) {\n super(opts as MaskedPatternOptions); // mask will be created in _update\n }\n\n override updateOptions (opts: Partial) {\n super.updateOptions(opts);\n }\n\n override _update (opts: Partial) {\n const { enum: _enum, ...eopts }: MaskedEnumPatternOptions = opts;\n\n if (_enum) {\n const lengths = _enum.map(e => e.length);\n const requiredLength = Math.min(...lengths);\n const optionalLength = Math.max(...lengths) - requiredLength;\n\n eopts.mask = '*'.repeat(requiredLength);\n if (optionalLength) eopts.mask += '[' + '*'.repeat(optionalLength) + ']';\n\n this.enum = _enum;\n }\n\n super._update(eopts);\n }\n\n override doValidate (flags: AppendFlags): boolean {\n return this.enum.some(e => e.indexOf(this.unmaskedValue) === 0) &&\n super.doValidate(flags);\n }\n}\n\n\nIMask.MaskedEnum = MaskedEnum;\n","import Masked, { type MaskedOptions } from './base';\nimport IMask from '../core/holder';\n\n\nexport\ntype MaskedFunctionOptions = MaskedOptions;\n\n/** Masking by custom Function */\nexport default\nclass MaskedFunction extends Masked {\n /** */\n declare mask: (value: string, masked: Masked) => boolean;\n /** Enable characters overwriting */\n declare overwrite?: boolean | 'shift' | undefined;\n /** */\n declare eager?: boolean | 'remove' | 'append' | undefined;\n /** */\n declare skipInvalid?: boolean | undefined;\n\n override updateOptions (opts: Partial) {\n super.updateOptions(opts);\n }\n\n override _update (opts: Partial) {\n super._update({\n ...opts,\n validate: opts.mask,\n });\n }\n}\n\n\nIMask.MaskedFunction = MaskedFunction;\n","import { escapeRegExp, type Direction, DIRECTION } from '../core/utils';\nimport ChangeDetails from '../core/change-details';\nimport { type TailDetails } from '../core/tail-details';\n\nimport Masked, { type MaskedOptions, type ExtractFlags, type AppendFlags } from './base';\nimport IMask from '../core/holder';\n\n\nexport\ntype MaskedNumberOptions = MaskedOptions;\n\n/** Number mask */\nexport default\nclass MaskedNumber extends Masked {\n static UNMASKED_RADIX = '.';\n static EMPTY_VALUES: Array = [...Masked.EMPTY_VALUES, 0];\n static DEFAULTS: Partial = {\n mask: Number,\n radix: ',',\n thousandsSeparator: '',\n mapToRadix: [MaskedNumber.UNMASKED_RADIX],\n min: Number.MIN_SAFE_INTEGER,\n max: Number.MAX_SAFE_INTEGER,\n scale: 2,\n normalizeZeros: true,\n padFractionalZeros: false,\n parse: Number,\n format: (n: number) => n.toLocaleString('en-US', { useGrouping: false, maximumFractionDigits: 20 }),\n };\n\n declare mask: NumberConstructor;\n /** Single char */\n declare radix: string;\n /** Single char */\n declare thousandsSeparator: string;\n /** Array of single chars */\n declare mapToRadix: Array;\n /** */\n declare min: number;\n /** */\n declare max: number;\n /** Digits after point */\n declare scale: number;\n /** Flag to remove leading and trailing zeros in the end of editing */\n declare normalizeZeros: boolean;\n /** Flag to pad trailing zeros after point in the end of editing */\n declare padFractionalZeros: boolean;\n /** Enable characters overwriting */\n declare overwrite?: boolean | 'shift' | undefined;\n /** */\n declare eager?: boolean | 'remove' | 'append' | undefined;\n /** */\n declare skipInvalid?: boolean | undefined;\n /** Format typed value to string */\n declare format: (value: number, masked: Masked) => string;\n /** Parse string to get typed value */\n declare parse: (str: string, masked: Masked) => number;\n /** */\n declare autofix?: boolean;\n\n declare _numberRegExp: RegExp;\n declare _thousandsSeparatorRegExp: RegExp;\n declare _mapToRadixRegExp: RegExp;\n declare _separatorsProcessed: boolean;\n\n constructor (opts?: MaskedNumberOptions) {\n super({\n ...MaskedNumber.DEFAULTS,\n ...opts,\n });\n }\n\n override updateOptions (opts: Partial) {\n super.updateOptions(opts);\n }\n\n override _update (opts: Partial) {\n super._update(opts);\n this._updateRegExps();\n }\n\n _updateRegExps () {\n const start = '^' + (this.allowNegative ? '[+|\\\\-]?' : '');\n const mid = '\\\\d*';\n const end = (this.scale ?\n `(${escapeRegExp(this.radix)}\\\\d{0,${this.scale}})?` :\n '') + '$';\n\n this._numberRegExp = new RegExp(start + mid + end);\n this._mapToRadixRegExp = new RegExp(`[${this.mapToRadix.map(escapeRegExp).join('')}]`, 'g');\n this._thousandsSeparatorRegExp = new RegExp(escapeRegExp(this.thousandsSeparator), 'g');\n }\n\n _removeThousandsSeparators (value: string): string {\n return value.replace(this._thousandsSeparatorRegExp, '');\n }\n\n _insertThousandsSeparators (value: string): string {\n // https://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n const parts = value.split(this.radix);\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, this.thousandsSeparator);\n return parts.join(this.radix);\n }\n\n override doPrepareChar (ch: string, flags: AppendFlags={}): [string, ChangeDetails] {\n const [prepCh, details] = super.doPrepareChar(this._removeThousandsSeparators(\n this.scale && this.mapToRadix.length && (\n /*\n radix should be mapped when\n 1) input is done from keyboard = flags.input && flags.raw\n 2) unmasked value is set = !flags.input && !flags.raw\n and should not be mapped when\n 1) value is set = flags.input && !flags.raw\n 2) raw value is set = !flags.input && flags.raw\n */\n flags.input && flags.raw ||\n !flags.input && !flags.raw\n ) ? ch.replace(this._mapToRadixRegExp, this.radix) : ch\n ), flags);\n if (ch && !prepCh) details.skip = true;\n\n if (prepCh && !this.allowPositive && !this.value && prepCh !== '-') details.aggregate(this._appendChar('-'));\n\n return [prepCh, details];\n }\n\n _separatorsCount (to: number, extendOnSeparators: boolean=false): number {\n let count = 0;\n\n for (let pos = 0; pos < to; ++pos) {\n if (this._value.indexOf(this.thousandsSeparator, pos) === pos) {\n ++count;\n if (extendOnSeparators) to += this.thousandsSeparator.length;\n }\n }\n\n return count;\n }\n\n _separatorsCountFromSlice (slice: string=this._value): number {\n return this._separatorsCount(this._removeThousandsSeparators(slice).length, true);\n }\n\n override extractInput (fromPos: number=0, toPos: number=this.displayValue.length, flags?: ExtractFlags): string {\n [fromPos, toPos] = this._adjustRangeWithSeparators(fromPos, toPos);\n\n return this._removeThousandsSeparators(super.extractInput(fromPos, toPos, flags));\n }\n\n \n override _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\n const prevBeforeTailValue = flags.tail && flags._beforeTailState ?\n flags._beforeTailState._value :\n this._value;\n const prevBeforeTailSeparatorsCount = this._separatorsCountFromSlice(prevBeforeTailValue);\n this._value = this._removeThousandsSeparators(this.value);\n\n const oldValue = this._value;\n\n this._value += ch;\n\n const num = this.number;\n let accepted = !isNaN(num);\n let skip = false;\n\n if (accepted) {\n let fixedNum;\n if (this.min != null && this.min < 0 && this.number < this.min) fixedNum = this.min;\n if (this.max != null && this.max > 0 && this.number > this.max) fixedNum = this.max;\n\n if (fixedNum != null) {\n if (this.autofix) {\n this._value = this.format(fixedNum, this).replace(MaskedNumber.UNMASKED_RADIX, this.radix);\n skip ||= oldValue === this._value && !flags.tail; // if not changed on tail it's still ok to proceed\n } else {\n accepted = false;\n }\n }\n accepted &&= Boolean(this._value.match(this._numberRegExp));\n }\n\n let appendDetails;\n if (!accepted) {\n this._value = oldValue;\n appendDetails = new ChangeDetails();\n } else {\n appendDetails = new ChangeDetails({\n inserted: this._value.slice(oldValue.length),\n rawInserted: skip ? '' : ch,\n skip,\n });\n }\n\n this._value = this._insertThousandsSeparators(this._value);\n const beforeTailValue = flags.tail && flags._beforeTailState ?\n flags._beforeTailState._value :\n this._value;\n const beforeTailSeparatorsCount = this._separatorsCountFromSlice(beforeTailValue);\n\n appendDetails.tailShift += (beforeTailSeparatorsCount - prevBeforeTailSeparatorsCount) * this.thousandsSeparator.length;\n return appendDetails;\n }\n\n _findSeparatorAround (pos: number): number {\n if (this.thousandsSeparator) {\n const searchFrom = pos - this.thousandsSeparator.length + 1;\n const separatorPos = this.value.indexOf(this.thousandsSeparator, searchFrom);\n if (separatorPos <= pos) return separatorPos;\n }\n\n return -1;\n }\n\n _adjustRangeWithSeparators (from: number, to: number): [number, number] {\n const separatorAroundFromPos = this._findSeparatorAround(from);\n if (separatorAroundFromPos >= 0) from = separatorAroundFromPos;\n\n const separatorAroundToPos = this._findSeparatorAround(to);\n if (separatorAroundToPos >= 0) to = separatorAroundToPos + this.thousandsSeparator.length;\n return [from, to];\n }\n\n \n override remove (fromPos: number=0, toPos: number=this.displayValue.length): ChangeDetails {\n [fromPos, toPos] = this._adjustRangeWithSeparators(fromPos, toPos);\n\n const valueBeforePos = this.value.slice(0, fromPos);\n const valueAfterPos = this.value.slice(toPos);\n\n const prevBeforeTailSeparatorsCount = this._separatorsCount(valueBeforePos.length);\n this._value = this._insertThousandsSeparators(this._removeThousandsSeparators(valueBeforePos + valueAfterPos));\n const beforeTailSeparatorsCount = this._separatorsCountFromSlice(valueBeforePos);\n\n return new ChangeDetails({\n tailShift: (beforeTailSeparatorsCount - prevBeforeTailSeparatorsCount) * this.thousandsSeparator.length,\n });\n }\n\n override nearestInputPos (cursorPos: number, direction?: Direction): number {\n if (!this.thousandsSeparator) return cursorPos;\n\n switch (direction) {\n case DIRECTION.NONE:\n case DIRECTION.LEFT:\n case DIRECTION.FORCE_LEFT: {\n const separatorAtLeftPos = this._findSeparatorAround(cursorPos - 1);\n if (separatorAtLeftPos >= 0) {\n const separatorAtLeftEndPos = separatorAtLeftPos + this.thousandsSeparator.length;\n if (cursorPos < separatorAtLeftEndPos ||\n this.value.length <= separatorAtLeftEndPos ||\n direction === DIRECTION.FORCE_LEFT\n ) {\n return separatorAtLeftPos;\n }\n }\n break;\n }\n case DIRECTION.RIGHT:\n case DIRECTION.FORCE_RIGHT: {\n const separatorAtRightPos = this._findSeparatorAround(cursorPos);\n if (separatorAtRightPos >= 0) {\n return separatorAtRightPos + this.thousandsSeparator.length;\n }\n }\n }\n\n return cursorPos;\n }\n\n override doCommit () {\n if (this.value) {\n const number = this.number;\n let validnum = number;\n\n // check bounds\n if (this.min != null) validnum = Math.max(validnum, this.min);\n if (this.max != null) validnum = Math.min(validnum, this.max);\n\n if (validnum !== number) this.unmaskedValue = this.format(validnum, this);\n\n let formatted = this.value;\n\n if (this.normalizeZeros) formatted = this._normalizeZeros(formatted);\n if (this.padFractionalZeros && this.scale > 0) formatted = this._padFractionalZeros(formatted);\n\n this._value = formatted;\n }\n\n super.doCommit();\n }\n\n _normalizeZeros (value: string): string {\n const parts = this._removeThousandsSeparators(value).split(this.radix);\n\n // remove leading zeros\n parts[0] = parts[0].replace(/^(\\D*)(0*)(\\d*)/, (match, sign, zeros, num) => sign + num);\n // add leading zero\n if (value.length && !/\\d$/.test(parts[0])) parts[0] = parts[0] + '0';\n\n if (parts.length > 1) {\n parts[1] = parts[1].replace(/0*$/, ''); // remove trailing zeros\n if (!parts[1].length) parts.length = 1; // remove fractional\n }\n\n return this._insertThousandsSeparators(parts.join(this.radix));\n }\n\n _padFractionalZeros (value: string): string {\n if (!value) return value;\n\n const parts = value.split(this.radix);\n if (parts.length < 2) parts.push('');\n parts[1] = parts[1].padEnd(this.scale, '0');\n return parts.join(this.radix);\n }\n\n override doSkipInvalid (ch: string, flags: AppendFlags={}, checkTail?: TailDetails): boolean {\n const dropFractional = this.scale === 0 && ch !== this.thousandsSeparator && (\n ch === this.radix ||\n ch === MaskedNumber.UNMASKED_RADIX ||\n this.mapToRadix.includes(ch)\n )\n return super.doSkipInvalid(ch, flags, checkTail) && !dropFractional;\n }\n\n override get unmaskedValue (): string {\n return this._removeThousandsSeparators(this._normalizeZeros(this.value))\n .replace(this.radix, MaskedNumber.UNMASKED_RADIX);\n }\n\n override set unmaskedValue (unmaskedValue: string) {\n super.unmaskedValue = unmaskedValue;\n }\n\n override get typedValue (): number {\n return this.parse(this.unmaskedValue, this);\n }\n\n override set typedValue (n: number) {\n this.rawInputValue = this.format(n, this).replace(MaskedNumber.UNMASKED_RADIX, this.radix);\n }\n\n /** Parsed Number */\n get number (): number {\n return this.typedValue;\n }\n\n set number (number: number) {\n this.typedValue = number;\n }\n\n get allowNegative (): boolean {\n return (this.min != null && this.min < 0) || (this.max != null && this.max < 0);\n }\n\n get allowPositive (): boolean {\n return (this.min != null && this.min > 0) || (this.max != null && this.max > 0);\n }\n\n override typedValueEquals (value: any): boolean {\n // handle 0 -> '' case (typed = 0 even if value = '')\n // for details see https://github.com/uNmAnNeR/imaskjs/issues/134\n return (\n super.typedValueEquals(value) ||\n MaskedNumber.EMPTY_VALUES.includes(value) && MaskedNumber.EMPTY_VALUES.includes(this.typedValue)\n ) && !(value === 0 && this.value === '');\n }\n}\n\n\nIMask.MaskedNumber = MaskedNumber;\n","import createMask, { type FactoryArg, type FactoryReturnMasked } from './factory';\nimport IMask from '../core/holder';\n\n\n/** Mask pipe source and destination types */\nexport\nconst PIPE_TYPE = {\n MASKED: 'value',\n UNMASKED: 'unmaskedValue',\n TYPED: 'typedValue',\n} as const;\n\ntype ValueOf = T[keyof T];\n\ntype TypedValueOf<\n Opts extends FactoryArg,\n Type extends ValueOf\n> = Type extends (typeof PIPE_TYPE.MASKED | typeof PIPE_TYPE.UNMASKED) ?\n string :\n FactoryReturnMasked['typedValue']\n;\n\n/** Creates new pipe function depending on mask type, source and destination options */\nexport\nfunction createPipe<\n Arg extends FactoryArg,\n From extends ValueOf = typeof PIPE_TYPE.MASKED,\n To extends ValueOf = typeof PIPE_TYPE.MASKED,\n> (\n arg: Arg,\n from: From=PIPE_TYPE.MASKED as From,\n to: To=PIPE_TYPE.MASKED as To,\n) {\n const masked = createMask(arg);\n return (value: TypedValueOf) => masked.runIsolated(m => {\n m[from] = value;\n return m[to] as TypedValueOf;\n });\n}\n\n/** Pipes value through mask depending on mask type, source and destination options */\nexport\nfunction pipe<\n Arg extends FactoryArg,\n From extends ValueOf = typeof PIPE_TYPE.MASKED,\n To extends ValueOf = typeof PIPE_TYPE.MASKED,\n> (\n value: TypedValueOf,\n mask: Arg,\n from?: From,\n to?: To,\n) {\n return createPipe(mask, from, to)(value);\n}\n\n\nIMask.PIPE_TYPE = PIPE_TYPE;\nIMask.createPipe = createPipe;\nIMask.pipe = pipe;\n","import ChangeDetails from '../core/change-details';\nimport IMask from '../core/holder';\nimport { type AppendFlags } from './base';\nimport createMask, { type FactoryArg, normalizeOpts, type ExtendFactoryArgOptions, type UpdateOpts } from './factory';\nimport MaskedPattern, { type BlockExtraOptions, type MaskedPatternOptions, type MaskedPatternState } from './pattern';\nimport type PatternBlock from './pattern/block';\n\n\nexport\ntype RepeatBlockExtraOptions = Pick;\n\nexport\ntype RepeatBlockOptions = ExtendFactoryArgOptions;\n\n\n/** Pattern mask */\nexport default\nclass RepeatBlock extends MaskedPattern {\n declare _blockOpts: M & { repeat?: number };\n declare repeat: Required['repeat'];\n\n\n get repeatFrom (): number {\n return (\n Array.isArray(this.repeat) ? this.repeat[0] :\n this.repeat === Infinity ? 0 : this.repeat\n ) ?? 0;\n }\n\n get repeatTo (): number {\n return (Array.isArray(this.repeat) ? this.repeat[1] : this.repeat) ?? Infinity;\n }\n\n constructor (opts: RepeatBlockOptions) {\n super(opts as MaskedPatternOptions);\n }\n\n override updateOptions (opts: UpdateOpts) {\n super.updateOptions(opts as MaskedPatternOptions);\n }\n\n override _update (opts: UpdateOpts & RepeatBlockExtraOptions) {\n const { repeat, ...blockOpts } = normalizeOpts(opts) as any; // TODO type\n this._blockOpts = Object.assign({}, this._blockOpts, blockOpts);\n const block = createMask(this._blockOpts);\n this.repeat = repeat ?? (block as any).repeat ?? this.repeat ?? Infinity; // TODO type\n\n super._update({\n mask: 'm'.repeat(Math.max(this.repeatTo === Infinity && this._blocks?.length || 0, this.repeatFrom)),\n blocks: { m: block },\n eager: block.eager,\n overwrite: block.overwrite,\n skipInvalid: block.skipInvalid,\n lazy: (block as MaskedPattern).lazy,\n placeholderChar: (block as MaskedPattern).placeholderChar,\n displayChar: (block as MaskedPattern).displayChar,\n });\n }\n\n _allocateBlock (bi: number): PatternBlock | undefined {\n if (bi < this._blocks.length) return this._blocks[bi];\n if (this.repeatTo === Infinity || this._blocks.length < this.repeatTo) {\n this._blocks.push(createMask(this._blockOpts));\n this.mask += 'm';\n return this._blocks[this._blocks.length - 1];\n }\n }\n\n override _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\n const details = new ChangeDetails();\n\n for (\n let bi=this._mapPosToBlock(this.displayValue.length)?.index ?? Math.max(this._blocks.length - 1, 0), block, allocated;\n // try to get a block or\n // try to allocate a new block if not allocated already\n (block = this._blocks[bi] ?? (allocated = !allocated && this._allocateBlock(bi)));\n ++bi\n ) {\n const blockDetails = block._appendChar(ch, { ...flags, _beforeTailState: flags._beforeTailState?._blocks?.[bi] });\n\n if (blockDetails.skip && allocated) {\n // remove the last allocated block and break\n this._blocks.pop();\n this.mask = this.mask.slice(1);\n break;\n }\n\n details.aggregate(blockDetails);\n\n if (blockDetails.consumed) break; // go next char\n }\n\n return details;\n }\n\n _trimEmptyTail (fromPos: number=0, toPos?: number): void {\n const firstBlockIndex = Math.max(this._mapPosToBlock(fromPos)?.index || 0, this.repeatFrom, 0);\n let lastBlockIndex;\n if (toPos != null) lastBlockIndex = this._mapPosToBlock(toPos)?.index;\n if (lastBlockIndex == null) lastBlockIndex = this._blocks.length - 1;\n\n let removeCount = 0;\n for (let blockIndex = lastBlockIndex; firstBlockIndex <= blockIndex; --blockIndex, ++removeCount) {\n if (this._blocks[blockIndex].unmaskedValue) break;\n }\n\n if (removeCount) {\n this._blocks.splice(lastBlockIndex - removeCount + 1, removeCount);\n this.mask = this.mask.slice(removeCount);\n }\n }\n\n override reset () {\n super.reset();\n this._trimEmptyTail();\n }\n\n override remove (fromPos: number=0, toPos: number=this.displayValue.length): ChangeDetails {\n const removeDetails = super.remove(fromPos, toPos);\n this._trimEmptyTail(fromPos, toPos);\n return removeDetails;\n }\n\n override totalInputPositions (fromPos: number=0, toPos?: number): number {\n if (toPos == null && this.repeatTo === Infinity) return Infinity;\n return super.totalInputPositions(fromPos, toPos);\n }\n\n override get state (): MaskedPatternState {\n return super.state;\n }\n\n override set state (state: MaskedPatternState) {\n this._blocks.length = state._blocks.length;\n this.mask = this.mask.slice(0, this._blocks.length);\n super.state = state;\n }\n}\n\n\nIMask.RepeatBlock = RepeatBlock;\n","import IMask from './imask';\nexport { default as HTMLContenteditableMaskElement } from './controls/html-contenteditable-mask-element';\nexport { default as HTMLInputMaskElement, type InputElement } from './controls/html-input-mask-element';\nexport { default as HTMLMaskElement } from './controls/html-mask-element';\nexport { default as InputMask, type InputMaskElement } from './controls/input';\nexport { default as MaskElement } from './controls/mask-element';\nexport { default as ChangeDetails, type ChangeDetailsOptions } from './core/change-details';\nexport { type AppendTail, type TailDetails } from './core/tail-details';\nexport { DIRECTION, forceDirection, type Direction, type Selection } from './core/utils';\nexport { default as Masked, type AppendFlags, type ExtractFlags, type MaskedOptions, type MaskedState } from './masked/base';\nexport { default as MaskedDate, type DateMaskType, type MaskedDateOptions } from './masked/date';\nexport { default as MaskedDynamic, type DynamicMaskType, type MaskedDynamicOptions, type MaskedDynamicState } from './masked/dynamic';\nexport { default as MaskedEnum, type MaskedEnumOptions } from './masked/enum';\nexport {\n default as createMask,\n normalizeOpts,\n type AllFactoryStaticOpts,\n type FactoryArg,\n type FactoryConstructorOpts,\n type FactoryConstructorReturnMasked,\n type FactoryInstanceOpts,\n type FactoryInstanceReturnMasked,\n type FactoryOpts,\n type FactoryReturnMasked,\n type FactoryStaticOpts,\n type FactoryStaticReturnMasked,\n type NormalizedOpts,\n type UpdateOpts,\n} from './masked/factory';\nexport { default as MaskedFunction, type MaskedFunctionOptions } from './masked/function';\nexport { default as MaskedNumber, type MaskedNumberOptions } from './masked/number';\nexport { default as MaskedPattern, type BlockPosData, type Definitions, type MaskedPatternOptions, type MaskedPatternState } from './masked/pattern';\nexport { type default as PatternBlock } from './masked/pattern/block';\nexport { default as ChunksTailDetails, type ChunksTailState } from './masked/pattern/chunk-tail-details';\nexport { default as PatternFixedDefinition, type PatternFixedDefinitionOptions } from './masked/pattern/fixed-definition';\nexport { default as PatternInputDefinition, type PatternInputDefinitionOptions, type PatternInputDefinitionState } from './masked/pattern/input-definition';\nexport { createPipe, pipe, PIPE_TYPE } from './masked/pipe';\nexport { default as MaskedRange, type MaskedRangeOptions } from './masked/range';\nexport { default as MaskedRegExp, type MaskedRegExpOptions } from './masked/regexp';\nexport { default as RepeatBlock, type RepeatBlockOptions } from './masked/repeat';\n\ntry { (globalThis as any).IMask = IMask; } catch {}\nexport default IMask;\n"],"names":["isString","str","String","isObject","obj","_obj$constructor","constructor","name","pick","keys","Array","isArray","_","k","includes","Object","entries","reduce","acc","_ref","v","DIRECTION","NONE","LEFT","FORCE_LEFT","RIGHT","FORCE_RIGHT","forceDirection","direction","escapeRegExp","replace","objectIncludes","b","a","arrA","arrB","i","length","dateA","Date","dateB","getTime","regexpA","RegExp","regexpB","toString","prototype","hasOwnProperty","call","ActionDetails","opts","assign","this","value","slice","startChangePos","oldValue","oldSelection","start","cursorPos","end","Math","min","insertedCount","inserted","substr","removedCount","max","removed","head","substring","tail","removeDirection","IMask","el","InputMask","maskedClass","mask","Error","MaskedRegExp","MaskedPattern","MaskedDate","Number","MaskedNumber","MaskedDynamic","Masked","Function","MaskedFunction","console","warn","normalizeOpts","instanceOpts","_mask","startsWith","createMask","nOpts","MaskedClass","MaskElement","selectionStart","_unsafeSelectionStart","selectionEnd","_unsafeSelectionEnd","select","_unsafeSelect","isActive","HTMLMaskElement","input","super","_onKeydown","bind","_onInput","_onBeforeinput","_onCompositionEnd","rootElement","_this$input$getRootNo","_this$input$getRootNo2","_this$input","getRootNode","document","activeElement","bindEvents","handlers","addEventListener","drop","click","focus","commit","_handlers","e","redo","keyCode","shiftKey","metaKey","ctrlKey","preventDefault","undo","isComposing","selectionChange","inputType","unbindEvents","removeEventListener","HTMLInputMaskElement","setSelectionRange","HTMLContenteditableMaskElement","root","selection","getSelection","anchorOffset","focusOffset","createRange","range","setStart","firstChild","setEnd","lastChild","removeAllRanges","addRange","textContent","InputHistory","states","currentIndex","currentState","isEmpty","push","state","MAX_LENGTH","shift","go","steps","clear","isContentEditable","tagName","masked","_listeners","_value","_unmaskedValue","_rawInputValue","history","_saveSelection","_onChange","_onDrop","_onFocus","_onClick","_onUndo","_onRedo","alignCursor","alignCursorFriendly","_bindEvents","updateValue","maskEquals","_this$masked","updateOptions","unmaskedValue","updateControl","rawInputValue","typedValue","val","typedValueEquals","displayValue","_unbindEvents","_fireEvent","ev","listeners","forEach","l","_cursorChanging","_changingCursorPos","pos","_selection","newUnmaskedValue","newValue","newRawInputValue","newDisplayValue","isChanged","_fireChangeEvents","_historyChanging","restOpts","updateMask","updateOpts","optionsIsChanged","updateCursor","_delayUpdateCursor","_abortUpdateCursor","setTimeout","_inputEvent","isComplete","clearTimeout","nearestInputPos","on","handler","off","hIndex","indexOf","splice","details","oldRawValue","offset","raw","doCommit","stopPropagation","_applyHistoryState","destroy","ChangeDetails","normalize","prep","rawInserted","tailShift","skip","aggregate","consumed","Boolean","ContinuousTailDetails","from","stop","extend","appendTo","append","_appendPlaceholder","unshift","beforePos","shiftChar","_update","DEFAULTS","_initialized","withValueRefresh","reset","resolve","flags","parse","format","extractInput","isFilled","totalInputPositions","fromPos","toPos","extractTail","appendTail","_appendCharRaw","ch","_appendChar","checkTail","consistentState","doPrepareChar","consistentTail","appended","doValidate","beforeTailState","overwrite","tailDetails","_appendEager","_beforeTailState","doPrepare","ci","d","doSkipInvalid","eager","remove","fn","_refreshing","rawInput","ret","runIsolated","_isolated","skipInvalid","prepare","prepareChar","validate","parent","deleteCount","tailPos","eagerRemove","valLength","tval","EMPTY_VALUES","undefined","ChunksTailDetails","chunks","map","join","tailChunk","lastChunk","extendLast","firstTailChunk","blockIndex","chunk","lastBlockIter","_mapPosToBlock","chunkBlock","index","_stops","_blocks","remainChars","c","props","cstate","chunkShiftPos","PatternCursor","_log","ok","block","_blockStartPos","s","pushState","popState","pop","bindBlock","_pushLeft","_this$block","_pushRight","pushLeftBeforeFilled","isFixed","pushLeftBeforeInput","pushLeftBeforeRequired","isOptional","pushRightBeforeFilled","pushRightBeforeInput","pushRightBeforeRequired","PatternFixedDefinition","isUnmasking","_isRawInput","maxPos","appendEager","isResolved","char","PatternInputDefinition","placeholderChar","displayChar","lazy","maskOpts","currentMaskFlags","boundPos","_flags$_beforeTailSta","DEFAULT_DEFINITIONS","search","definitions","_rebuildMask","defs","exposeBlock","_maskedBlocks","pattern","unmaskingBlock","optionalBlock","blocks","p","bNames","filter","bName","sort","expose","repeat","bOpts","blockOpts","maskedBlock","RepeatBlock","isInput","STOP_CHAR","ESCAPE_CHAR","def","maskedState","bi","every","_this$_mapPosToBlock","startBlockIndex","blockIter","blockDetails","chunkTail","_forEachBlocksInRange","bFromPos","bToPos","blockChunk","_findStopBefore","stopBefore","si","toBlockIndex","startBlockIter","endBlockIndex","_blocks2","accVal","blockStartPos","fromBlockIter","toBlockIter","isSameBlock","fromBlockStartPos","fromBlockEndPos","removeDetails","cursor","total","maskedBlocks","indices","gi","InputDefinition","FixedDefinition","MaskedRange","_matchFrom","maxLength","to","autofix","patternOpts","fromStr","padStart","toStr","sameCharsCount","boundaries","minstr","maxstr","placeholder","num","match","padEnd","nextVal","extractPatternOptions","patternBlocks","GET_DEFAULT_BLOCKS","Y","getFullYear","m","getMonth","getDate","bk","date","isDateExist","day","month","year","split","currentMask","exposeMask","compiledMasks","_overwrite","_eager","_skipInvalid","_applyDispatch","prevValueBeforeTail","inputValue","insertValue","tailValue","prevMask","prevMaskState","doDispatch","_flags$_beforeTailSta2","currentMaskRef","dispatch","currentDetails","_this$currentMask","_this$currentMask2","_this$currentMask3","_this$currentMask4","mi","oldMask","_this$currentMask5","inputs","isCurrent","startInputPos","weight","i1","i2","MaskedEnum","enum","_enum","eopts","lengths","requiredLength","optionalLength","some","_updateRegExps","allowNegative","scale","radix","_numberRegExp","_mapToRadixRegExp","mapToRadix","_thousandsSeparatorRegExp","thousandsSeparator","_removeThousandsSeparators","_insertThousandsSeparators","parts","prepCh","allowPositive","_separatorsCount","extendOnSeparators","count","_separatorsCountFromSlice","_adjustRangeWithSeparators","prevBeforeTailValue","prevBeforeTailSeparatorsCount","number","appendDetails","accepted","isNaN","fixedNum","UNMASKED_RADIX","beforeTailValue","beforeTailSeparatorsCount","_findSeparatorAround","searchFrom","separatorPos","separatorAroundFromPos","separatorAroundToPos","valueBeforePos","valueAfterPos","separatorAtLeftPos","separatorAtLeftEndPos","separatorAtRightPos","validnum","formatted","normalizeZeros","_normalizeZeros","padFractionalZeros","_padFractionalZeros","sign","zeros","test","dropFractional","n","_MaskedNumber","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","toLocaleString","useGrouping","maximumFractionDigits","PIPE_TYPE","MASKED","UNMASKED","TYPED","createPipe","arg","pipe","repeatFrom","Infinity","repeatTo","_ref2","_ref3","_ref4","_this$_blocks","_blockOpts","_allocateBlock","allocated","_this$_mapPosToBlock$","_this$_blocks$bi","_trimEmptyTail","_this$_mapPosToBlock2","_this$_mapPosToBlock3","firstBlockIndex","lastBlockIndex","removeCount","globalThis"],"mappings":"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"}