{"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.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/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 (\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\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 _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 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 MaskedEnumOptions ? MaskedEnum :\n Opts extends MaskedRangeOptions ? MaskedRange :\n Opts extends MaskedPatternOptions ? MaskedPattern :\n Opts extends MaskedDynamicOptions ? MaskedDynamic :\n Opts extends MaskedRegExpOptions ? MaskedRegExp :\n Opts extends MaskedFunctionOptions ? MaskedFunction :\n never\n;\n\n\nexport\ntype FactoryInstanceOpts = MaskedOptions & { mask: Masked };\n\nexport\ntype FactoryInstanceReturnMasked = Opts extends { mask: infer M } ? M : never;\n\nexport\ntype FactoryConstructorOpts = MaskedOptions & { mask:\n | typeof Masked\n | typeof MaskedDate\n | typeof MaskedNumber\n | typeof MaskedEnum\n | typeof MaskedRange\n | typeof MaskedRegExp\n | typeof MaskedFunction\n | typeof MaskedPattern\n | typeof MaskedDynamic\n | typeof MaskedRegExp\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;\n\nexport\ntype FactoryReturnMasked =\n Opts extends Masked ? Opts :\n Opts extends FactoryConstructorOpts ? FactoryConstructorReturnMasked :\n Opts extends FactoryInstanceOpts ? FactoryInstanceReturnMasked :\n Opts extends FactoryStaticOpts ? FactoryStaticReturnMasked :\n never\n;\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 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 opts.mask instanceof IMask.Masked ? opts : {};\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, 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/** Generic element API to use with mask */\nexport default\nclass MaskElement {\n /** */\n declare readonly _unsafeSelectionStart: number;\n /** */\n declare readonly _unsafeSelectionEnd: number;\n /** */\n declare 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 /** Should be overriden in subclasses */\n _unsafeSelect (start: number, end: number): void {}\n /** Should be overriden in subclasses */\n get isActive (): boolean { return false; }\n /** Should be overriden in subclasses */\n bindEvents (handlers: {[key in ElementEvent]: Function}) {}\n /** Should be overriden in subclasses */\n unbindEvents (): void {}\n}\n\n\nIMask.MaskElement = MaskElement;\n","import MaskElement, { type ElementEvent } from './mask-element';\nimport IMask from '../core/holder';\n\n\n/** Bridge between HTMLElement and {@link Masked} */\nexport default\nclass HTMLMaskElement extends MaskElement {\n /** Mapping between HTMLElement events and mask internal events */\n static EVENTS_MAP = {\n selectionChange: 'keydown',\n input: 'input',\n drop: 'drop',\n click: 'click',\n focus: 'focus',\n commit: 'blur',\n } as const;\n /** HTMLElement to use mask on */\n declare input: HTMLElement;\n declare _handlers: {[k: string]: EventListener};\n\n constructor (input: HTMLElement) {\n super();\n this.input = input;\n this._handlers = {};\n }\n\n get rootElement (): HTMLDocument {\n return (this.input.getRootNode?.() ?? document) as HTMLDocument;\n }\n\n /**\n Is element in focus\n */\n get isActive (): boolean {\n return this.input === this.rootElement.activeElement;\n }\n\n /**\n Binds HTMLElement events to mask internal events\n */\n override bindEvents (handlers: {[key in ElementEvent]: EventListener}) {\n (Object.keys(handlers) as Array)\n .forEach(event => this._toggleEventHandler(HTMLMaskElement.EVENTS_MAP[event], handlers[event]));\n }\n\n /**\n Unbinds HTMLElement events to mask internal events\n */\n override unbindEvents () {\n Object.keys(this._handlers)\n .forEach(event => this._toggleEventHandler(event));\n }\n\n _toggleEventHandler (event: string, handler?: EventListener): void {\n if (this._handlers[event]) {\n this.input.removeEventListener(event, this._handlers[event]);\n delete this._handlers[event];\n }\n\n if (handler) {\n this.input.addEventListener(event, handler);\n this._handlers[event] = handler;\n }\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 this._handlers = {};\n }\n\n /** Returns InputElement selection start */\n // @ts-ignore\n override get _unsafeSelectionStart (): number {\n return this.input.selectionStart;\n }\n\n /** Returns InputElement selection end */\n // @ts-ignore\n override get _unsafeSelectionEnd (): number {\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 // @ts-ignore\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 // @ts-ignore\n override get _unsafeSelectionStart (): number {\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 // @ts-ignore\n override get _unsafeSelectionEnd (): number {\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 // @ts-ignore\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 { objectIncludes, DIRECTION, type Selection } from '../core/utils';\nimport ActionDetails from '../core/action-details';\nimport createMask, { 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';\n\n\nexport\ntype InputMaskElement = MaskElement | InputElement | HTMLElement;\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 _selection: Selection;\n declare _cursorChanging?: ReturnType;\n declare _inputEvent?: InputEvent;\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\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.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 /** Read or update mask */\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();\n this.alignCursor();\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();\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();\n this.alignCursor();\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 });\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 () {\n const newUnmaskedValue = this.masked.unmaskedValue;\n const newValue = this.masked.value;\n const newDisplayValue = this.displayValue;\n const isChanged = (this.unmaskedValue !== newUnmaskedValue ||\n this.value !== newValue);\n\n this._unmaskedValue = newUnmaskedValue;\n this._value = newValue;\n\n if (this.el.value !== newDisplayValue) this.el.value = newDisplayValue;\n if (isChanged) this._fireChangeEvents();\n }\n\n /** Updates options with deep equal check, recreates @{link Masked} model if mask type changes */\n updateOptions (opts: Partial) {\n const { mask, ...restOpts } = opts;\n\n const updateMask = !this.maskEquals(mask);\n const updateOpts = !objectIncludes(this.masked, restOpts);\n\n if (updateMask) this.mask = mask;\n if (updateOpts) this.masked.updateOptions(restOpts as any); // TODO \"any\" no idea\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: EventListener): 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: EventListener): 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 // fix strange IE behavior\n if (!this._selection) return this.updateValue();\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();\n this.updateCursor(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 /** Unbind view events and removes element reference */\n destroy () {\n this._unbindEvents();\n // @ts-ignore why not\n this._listeners.length = 0;\n delete this.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 /** Can skip chars */\n declare skip: boolean;\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\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 skip: false,\n tailShift: 0,\n }, details);\n }\n\n /** Aggregate changes */\n aggregate (details: ChangeDetails): this {\n this.rawInserted += details.rawInserted;\n this.skip = this.skip || details.skip;\n this.inserted += details.inserted;\n this.tailShift += details.tailShift;\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\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 } 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\nclass Masked {\n static DEFAULTS: Partial = {\n skipInvalid: true,\n };\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: this, flags: AppendFlags) => string | [string, ChangeDetails];\n /** Transforms each char before mask processing */\n declare prepareChar?: (chars: string, masked: this, flags: AppendFlags) => string | [string, ChangeDetails];\n /** Validates if value is acceptable */\n declare validate?: (value: string, masked: this, flags: AppendFlags) => boolean;\n /** Does additional processing at the end of editing */\n declare commit?: (value: string, masked: this) => void;\n /** Format typed value to string */\n declare format?: (value: Value, masked: this) => string;\n /** Parse strgin to get typed value */\n declare parse?: (str: string, masked: this) => Value;\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 /** */\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 (!Object.keys(opts).length) 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.value.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.value.length): number {\n return Math.min(this.value.length, toPos - fromPos);\n }\n\n /** Extracts value in range considering flags */\n extractInput (fromPos: number=0, toPos: number=this.value.length, flags?: ExtractFlags): string {\n return this.value.slice(fromPos, toPos);\n }\n\n /** Extracts tail in range */\n extractTail (fromPos: number=0, toPos: number=this.value.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 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 checkTail.unshift(this.value.length - details.tailShift);\n }\n\n let tailDetails = this.appendTail(checkTail);\n appended = tailDetails.rawInserted === checkTail.toString();\n\n // not ok, try shift\n if (!(appended && tailDetails.inserted) && this.overwrite === 'shift') {\n this.state = beforeTailState;\n consistentTail = checkTail.state;\n checkTail.shift();\n\n tailDetails = this.appendTail(checkTail);\n appended = tailDetails.rawInserted === checkTail.toString();\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.value.length), {}, '');\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.value.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 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);\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();\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 && !details.skip; ++ci) {\n const chunk = this.chunks[ci];\n\n const lastBlockIter = masked._mapPosToBlock(masked.value.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 const phDetails = masked._appendPlaceholder(stop);\n details.aggregate(phDetails);\n }\n chunkBlock = chunk instanceof ChunksTailDetails && masked._blocks[stop];\n }\n\n if (chunkBlock) {\n const tailDetails = chunkBlock.appendTail(chunk);\n tailDetails.skip = false; // always ignore skip, it will be set on last\n details.aggregate(tailDetails);\n masked._value += tailDetails.inserted;\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 {\n const s = this._log.pop();\n 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.value.length;\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?.value.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';\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 const details = new ChangeDetails();\n\n if (this.isFilled) return details;\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 if (isResolved) details.rawInserted = this.char;\n this._value = details.inserted = 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 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 const details = this.masked._appendChar(ch, this.currentMaskFlags(flags));\n\n if (details.inserted && this.doValidate(flags) === false) {\n details.inserted = details.rawInserted = '';\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 const details = new ChangeDetails();\n\n if (this.isFilled || this.isOptional) return details;\n\n this.isFilled = true;\n details.inserted = this.placeholderChar;\n return details;\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 declare mask: RegExp;\n\n override updateOptions (opts: Partial) {\n super.updateOptions(opts);\n }\n\n override _update (opts: Partial) {\n if (opts.mask) opts.validate = (value) => value.search(opts.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 FactoryOpts, normalizeOpts } 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=MaskedPattern, Props extends keyof M=never> = MaskedOptions;\n\nexport\ntype Definitions = {\n [k: string]: FactoryOpts,\n};\n\nexport\ntype MaskedPatternState = MaskedState & {\n _blocks: Array,\n};\n\nexport\ntype BlockPosData = {\n index: number,\n offset: number,\n};\n\n\n/**\n Pattern mask\n*/\nexport default\nclass MaskedPattern extends Masked {\n static DEFAULTS: Partial = {\n lazy: true,\n placeholderChar: '_'\n };\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]: FactoryOpts };\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\n declare _blocks: Array;\n declare _maskedBlocks: {[key: string]: Array};\n declare _stops: Array;\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 = [];\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 maskedBlock = createMask({\n lazy: this.lazy,\n eager: this.eager,\n placeholderChar: this.placeholderChar,\n displayChar: this.displayChar,\n overwrite: this.overwrite,\n ...normalizeOpts(this.blocks[bName]),\n parent: this,\n });\n\n if (maskedBlock) {\n this._blocks.push(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 }) :\n new PatternFixedDefinition({\n char,\n eager: this.eager,\n isUnmasking: unmaskingBlock,\n });\n\n this._blocks.push(def);\n }\n }\n\n get state (): MaskedPatternState {\n return {\n ...super.state,\n _blocks: this._blocks.map(b => b.state),\n };\n }\n\n set state (state: MaskedPatternState) {\n const {_blocks, ...maskedState} = state;\n this._blocks.forEach((b, bi) => b.state = _blocks[bi]);\n super.state = maskedState;\n }\n\n reset () {\n super.reset();\n this._blocks.forEach(b => b.reset());\n }\n\n get isComplete (): boolean {\n return this._blocks.every(b => b.isComplete);\n }\n\n 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 doCommit () {\n this._blocks.forEach(b => b.doCommit());\n super.doCommit();\n }\n\n get unmaskedValue (): string {\n return this._blocks.reduce((str, b) => str += b.unmaskedValue, '');\n }\n\n set unmaskedValue (unmaskedValue: string) {\n super.unmaskedValue = unmaskedValue;\n }\n\n get value (): string {\n // TODO return _value when not in change?\n return this._blocks.reduce((str, b) => str += b.value, '');\n }\n\n set value (value: string) {\n super.value = value;\n }\n\n get displayValue (): string {\n return this._blocks.reduce((str, b) => str += b.displayValue, '');\n }\n\n appendTail (tail: string | String | TailDetails): ChangeDetails {\n return super.appendTail(tail).aggregate(this._appendPlaceholder());\n }\n\n _appendEager (): ChangeDetails {\n const details = new ChangeDetails();\n\n let startBlockIndex = this._mapPosToBlock(this.value.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.value.length);\n const details = new ChangeDetails();\n if (!blockIter) return details;\n\n for (let bi=blockIter.index; ; ++bi) {\n const block = this._blocks[bi];\n if (!block) break;\n\n const blockDetails = block._appendChar(ch, { ...flags, _beforeTailState: flags._beforeTailState?._blocks?.[bi] });\n\n const skip = blockDetails.skip;\n details.aggregate(blockDetails);\n\n if (skip || blockDetails.rawInserted) break; // go next char\n }\n\n return details;\n }\n\n extractTail (fromPos: number=0, toPos: number=this.value.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 extractInput (fromPos: number=0, toPos: number=this.value.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 const bDetails = b._appendPlaceholder((b as MaskedPattern)._blocks?.length);\n this._value += bDetails.inserted;\n details.aggregate(bDetails);\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.value.length, 0);\n }\n\n _forEachBlocksInRange (fromPos: number, toPos: number=this.value.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].value.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 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.value.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.value.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 totalInputPositions (fromPos: number=0, toPos: number=this.value.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\nexport\ntype MaskedRangeOptions = Omit &\n Pick;\n\ntype MaskedRangePatternOptions = MaskedPatternOptions &\n Pick;\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) return [ch, details];\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 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 MaskedDateOptions =\n Omit, 'mask'> &\n Partial, DateOptionsKeys>> &\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: Partial, DateOptionsKeys>> = {\n mask: Date as any,\n pattern: 'd{.}`m{.}`Y',\n format: (date: Date) => {\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) => {\n const [day, month, year] = str.split('.').map(Number);\n return new Date(year, month - 1, day);\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\n constructor (opts?: MaskedDateOptions) {\n const { mask, pattern, ...patternOpts } = {\n ...(MaskedDate.DEFAULTS as MaskedDateOptions),\n ...opts,\n };\n\n super({\n ...patternOpts,\n mask: isString(mask) ? mask : pattern,\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 (): Value | null {\n return this.typedValue;\n }\n set date (date: Value) {\n this.typedValue = date;\n }\n\n override get typedValue (): Value | null {\n return this.isComplete ? super.typedValue : null;\n }\n override set typedValue (value: Value) {\n super.typedValue = value;\n }\n\n override maskEquals (mask: any): boolean {\n return mask === Date || super.maskEquals(mask);\n }\n}\n\n\nIMask.MaskedDate = MaskedDate;\n","import { objectIncludes } from '../core/utils';\nimport ChangeDetails from '../core/change-details';\nimport createMask, { type FactoryArg, 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\nexport\ntype MaskedDynamicState = MaskedState & {\n compiledMasks: Array,\n currentMaskRef?: Masked,\n currentMask: MaskedState,\n};\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 // TODO types\n /** Currently chosen mask */\n declare currentMask?: 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 = null;\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 // mask could be totally dynamic with only `dispatch` option\n this.compiledMasks = Array.isArray(opts.mask) ?\n opts.mask.map(m => createMask({\n overwrite: this._overwrite,\n eager: this._eager,\n skipInvalid: this._skipInvalid,\n ...normalizeOpts(m),\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 const d = this.currentMask.append(insertValue, {raw: true});\n details.tailShift = d.inserted.length - prevValueBeforeTail.length;\n }\n\n if (tailValue) {\n details.tailShift += this.currentMask.append(tailValue, {raw: true, tail: true}).tailShift;\n }\n } else {\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 MaskedDynamicState)?.currentMaskRef === this.currentMask &&\n (flags._beforeTailState as MaskedDynamicState)?.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.currentMask ? this.currentMask.value : '';\n }\n\n override set value (value: string) {\n super.value = value;\n }\n\n override get unmaskedValue (): string {\n return this.currentMask ? this.currentMask.unmaskedValue : '';\n }\n\n override set unmaskedValue (unmaskedValue: string) {\n super.unmaskedValue = unmaskedValue;\n }\n\n override get typedValue (): Value {\n return this.currentMask ? this.currentMask.typedValue : '';\n }\n\n // probably typedValue should not be used with dynamic\n override set typedValue (value: Value) {\n let unmaskedValue = String(value);\n\n // double check it\n if (this.currentMask) {\n this.currentMask.typedValue = value;\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 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 MaskedDynamicState;\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 // @ts-ignore i don't mind overriding\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') {\n this._overwrite = overwrite;\n }\n\n // @ts-ignore i don't mind overriding\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') {\n this._eager = eager;\n }\n\n // @ts-ignore i don't mind overriding\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.value.length : m.nearestInputPos(m.value.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.value.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 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 eopts.mask = '*'.repeat(_enum[0].length);\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 declare mask: (value: string, masked: this) => boolean;\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/**\n Number mask\n*/\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\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 ch = 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 );\n\n const [prepCh, details] = super.doPrepareChar(ch, 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.value.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 if (!this.thousandsSeparator) return super._appendCharRaw(ch, flags);\n\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 appendDetails = super._appendCharRaw(ch, flags);\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 appendDetails.skip = !appendDetails.rawInserted && ch === this.thousandsSeparator;\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.value.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 doValidate (flags: AppendFlags): boolean {\n // validate as string\n let valid = Boolean(this._removeThousandsSeparators(this.value).match(this._numberRegExp));\n\n if (valid) {\n // validate as number\n const number = this.number;\n valid = valid && !isNaN(number) &&\n // check min bound for negative values\n (this.min == null || this.min >= 0 || this.min <= this.number) &&\n // check max bound for positive values\n (this.max == null || this.max <= 0 || this.number <= this.max);\n }\n\n return valid && super.doValidate(flags);\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 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(\n this._normalizeZeros(\n 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 /**\n Is negative allowed\n */\n get allowNegative (): boolean {\n return (this.min != null && this.min < 0) || (this.max != null && this.max < 0);\n }\n\n /**\n Is positive allowed\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 = 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 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} 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';\n\ntry {\n (globalThis as any).IMask = IMask;\n} catch {}\nexport default IMask;\n"],"names":["isString","str","String","pick","obj","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","constructor","opts","assign","this","value","slice","startChangePos","oldValue","oldSelection","start","Math","min","cursorPos","insertedCount","inserted","substr","removedCount","max","end","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","_obj$constructor","name","createMask","nOpts","MaskedClass","MaskElement","selectionStart","_unsafeSelectionStart","selectionEnd","_unsafeSelectionEnd","select","_unsafeSelect","isActive","bindEvents","handlers","unbindEvents","HTMLMaskElement","input","super","_handlers","rootElement","_this$input$getRootNo","_this$input$getRootNo2","_this$input","getRootNode","document","activeElement","forEach","event","_toggleEventHandler","EVENTS_MAP","handler","removeEventListener","addEventListener","selectionChange","drop","click","focus","commit","HTMLInputMaskElement","setSelectionRange","HTMLContenteditableMaskElement","root","selection","getSelection","anchorOffset","focusOffset","createRange","range","setStart","firstChild","setEnd","lastChild","removeAllRanges","addRange","textContent","isContentEditable","tagName","masked","_listeners","_value","_unmaskedValue","_saveSelection","bind","_onInput","_onChange","_onDrop","_onFocus","_onClick","alignCursor","alignCursorFriendly","_bindEvents","updateValue","maskEquals","_this$masked","updateOptions","unmaskedValue","updateControl","typedValue","val","typedValueEquals","displayValue","_unbindEvents","_fireEvent","ev","e","listeners","l","_cursorChanging","_changingCursorPos","pos","_selection","newUnmaskedValue","newValue","newDisplayValue","isChanged","_fireChangeEvents","restOpts","updateMask","updateOpts","updateCursor","_delayUpdateCursor","_abortUpdateCursor","setTimeout","_inputEvent","isComplete","clearTimeout","nearestInputPos","on","push","off","hIndex","indexOf","splice","details","oldRawValue","rawInputValue","offset","raw","doCommit","preventDefault","stopPropagation","destroy","ChangeDetails","static","prep","rawInserted","skip","tailShift","aggregate","ContinuousTailDetails","from","stop","extend","appendTo","append","_appendPlaceholder","state","unshift","beforePos","shiftChar","shift","_update","DEFAULTS","_initialized","withValueRefresh","_rawInputValue","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","Boolean","skipInvalid","normalize","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","phDetails","_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","_maskedBlocks","pattern","unmaskingBlock","optionalBlock","blocks","p","bNames","filter","bName","sort","maskedBlock","isInput","STOP_CHAR","ESCAPE_CHAR","def","maskedState","bi","every","_this$_mapPosToBlock","startBlockIndex","blockIter","_flags$_beforeTailSta2","blockDetails","chunkTail","_forEachBlocksInRange","bFromPos","bToPos","blockChunk","_findStopBefore","stopBefore","si","toBlockIndex","startBlockIter","endBlockIndex","_blocks2","bDetails","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","repeat","boundaries","minstr","maxstr","placeholder","num","match","padEnd","nextVal","patternBlocks","GET_DEFAULT_BLOCKS","Y","getFullYear","m","getMonth","getDate","bk","date","isDateExist","day","month","year","split","currentMask","compiledMasks","_overwrite","_eager","_skipInvalid","_applyDispatch","prevValueBeforeTail","inputValue","insertValue","tailValue","prevMask","prevMaskState","doDispatch","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","some","_updateRegExps","allowNegative","scale","radix","_numberRegExp","_mapToRadixRegExp","mapToRadix","_thousandsSeparatorRegExp","thousandsSeparator","_removeThousandsSeparators","_insertThousandsSeparators","parts","prepCh","allowPositive","_separatorsCount","extendOnSeparators","count","_separatorsCountFromSlice","_adjustRangeWithSeparators","prevBeforeTailValue","prevBeforeTailSeparatorsCount","appendDetails","beforeTailValue","beforeTailSeparatorsCount","_findSeparatorAround","searchFrom","separatorPos","separatorAroundFromPos","separatorAroundToPos","valueBeforePos","valueAfterPos","separatorAtLeftPos","separatorAtLeftEndPos","separatorAtRightPos","valid","number","isNaN","validnum","formatted","normalizeZeros","_normalizeZeros","padFractionalZeros","_padFractionalZeros","sign","zeros","test","dropFractional","UNMASKED_RADIX","n","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","toLocaleString","useGrouping","maximumFractionDigits","PIPE_TYPE","MASKED","UNMASKED","TYPED","createPipe","arg","pipe","globalThis"],"mappings":"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"}