{"version":3,"file":"imask.min.js","sources":["../src/core/holder.js","../src/core/change-details.js","../src/core/utils.js","../src/core/action-details.js","../src/core/continuous-tail-details.js","../src/masked/base.js","../src/masked/factory.js","../src/masked/pattern/input-definition.js","../src/masked/pattern/fixed-definition.js","../src/masked/pattern/chunk-tail-details.js","../src/masked/pattern/cursor.js","../src/masked/regexp.js","../src/masked/pattern.js","../src/masked/range.js","../src/masked/date.js","../src/controls/mask-element.js","../src/controls/html-mask-element.js","../src/controls/html-contenteditable-mask-element.js","../src/controls/input.js","../src/masked/enum.js","../src/masked/number.js","../src/masked/function.js","../src/masked/dynamic.js","../src/masked/pipe.js","../src/index.js"],"sourcesContent":["/**\n * Applies mask on element.\n * @constructor\n * @param {HTMLInputElement|HTMLTextAreaElement|MaskElement} el - Element to apply mask\n * @param {Object} opts - Custom mask options\n * @return {InputMask}\n */\nexport default\nfunction IMask (el, opts={}) {\n // currently available only for input-like elements\n return new IMask.InputMask(el, opts);\n}\n","// @flow\n\n\nimport IMask from \"./holder\";\n\n/**\n Provides details of changing model value\n @param {Object} [details]\n @param {string} [details.inserted] - Inserted symbols\n @param {boolean} [details.skip] - Can skip chars\n @param {number} [details.removeCount] - Removed symbols count\n @param {number} [details.tailShift] - Additional offset if any changes occurred before tail\n*/\nexport default\nclass ChangeDetails {\n /** Inserted symbols */\n inserted: string;\n /** Can skip chars */\n skip: boolean;\n /** Additional offset if any changes occurred before tail */\n tailShift: number;\n /** Raw inserted is used by dynamic mask */\n rawInserted: string;\n\n constructor (details?: {\n inserted?: $PropertyType,\n rawInserted?: $PropertyType,\n skip?: $PropertyType,\n tailShift?: $PropertyType,\n }) {\n Object.assign(this, {\n inserted: '',\n rawInserted: '',\n skip: false,\n tailShift: 0,\n }, details);\n }\n\n /**\n Aggregate changes\n @returns {ChangeDetails} `this`\n */\n aggregate (details: ChangeDetails): ChangeDetails {\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\nIMask.ChangeDetails = ChangeDetails;\n","// @flow\nimport ChangeDetails from './change-details.js';\n\n\n/** Checks if value is string */\nexport\nfunction isString (str: mixed): boolean %checks {\n return typeof str === 'string' || str instanceof String;\n}\n\n/**\n Direction\n @prop {string} NONE\n @prop {string} LEFT\n @prop {string} FORCE_LEFT\n @prop {string} RIGHT\n @prop {string} FORCE_RIGHT\n*/\nexport\nconst DIRECTION = {\n NONE: 'NONE',\n LEFT: 'LEFT',\n FORCE_LEFT: 'FORCE_LEFT',\n RIGHT: 'RIGHT',\n FORCE_RIGHT: 'FORCE_RIGHT',\n}\n/**\n Direction\n @enum {string}\n*/\nexport\ntype Direction = $Values;\n\n/** Returns next char index in direction */\nexport\nfunction indexInDirection (pos: number, direction: Direction): number {\n if (direction === DIRECTION.LEFT) --pos;\n return pos;\n}\n\n/** Returns next char position in direction */\nexport\nfunction posInDirection (pos: number, direction: Direction): number {\n switch (direction) {\n case DIRECTION.LEFT:\n case DIRECTION.FORCE_LEFT:\n return --pos;\n case DIRECTION.RIGHT:\n case DIRECTION.FORCE_RIGHT:\n return ++pos;\n default:\n return pos;\n }\n}\n\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\nexport\nfunction normalizePrepare (prep: string | [string, ChangeDetails]): [string, ChangeDetails] {\n return Array.isArray(prep) ? prep : [\n prep,\n new ChangeDetails(),\n ];\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 var arrA = Array.isArray(a)\n , arrB = Array.isArray(b)\n , 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 var dateA = a instanceof Date\n , dateB = b instanceof Date;\n if (dateA && dateB) return a.getTime() == b.getTime();\n if (dateA != dateB) return false;\n\n var regexpA = a instanceof RegExp\n , regexpB = b instanceof RegExp;\n if (regexpA && regexpB) return a.toString() == b.toString();\n if (regexpA != regexpB) return false;\n\n var keys = Object.keys(a);\n // if (keys.length !== Object.keys(b).length) return false;\n\n for (i = 0; i < keys.length; i++)\n // $FlowFixMe ... ???\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","// @flow\nimport {type Direction, type Selection, DIRECTION} from './utils.js';\n\n\n/** Provides details of changing input */\nexport default\nclass ActionDetails {\n /** Current input value */\n value: string;\n /** Current cursor position */\n cursorPos: number;\n /** Old input value */\n oldValue: string;\n /** Old selection */\n oldSelection: Selection;\n\n constructor (\n value: string,\n cursorPos: number,\n oldValue: string,\n oldSelection: Selection\n ) {\n this.value = value;\n this.cursorPos = cursorPos;\n this.oldValue = oldValue;\n this.oldSelection = oldSelection;\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 /**\n Start changing position\n @readonly\n */\n get startChangePos (): number {\n return Math.min(this.cursorPos, this.oldSelection.start);\n }\n\n /**\n Inserted symbols count\n @readonly\n */\n get insertedCount (): number {\n return this.cursorPos - this.startChangePos;\n }\n\n /**\n Inserted symbols\n @readonly\n */\n get inserted (): string {\n return this.value.substr(this.startChangePos, this.insertedCount);\n }\n\n /**\n Removed symbols count\n @readonly\n */\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 /**\n Removed symbols\n @readonly\n */\n get removed (): string {\n return this.oldValue.substr(this.startChangePos, this.removedCount);\n }\n\n /**\n Unchanged head symbols\n @readonly\n */\n get head (): string {\n return this.value.substring(0, this.startChangePos);\n }\n\n /**\n Unchanged tail symbols\n @readonly\n */\n get tail (): string {\n return this.value.substring(this.startChangePos + this.insertedCount);\n }\n\n /**\n Remove direction\n @readonly\n */\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","// @flow\nimport type { TailDetails, AppendTail } from './tail-details.js';\nimport type ChangeDetails from './change-details.js';\n\n\ntype ContinuousTailState = {\n value: $PropertyType,\n from: $PropertyType,\n stop?: $PropertyType,\n};\n\n/** Provides details of continuous extracted tail */\nexport default\nclass ContinuousTailDetails implements TailDetails {\n /** Tail value as string */\n value: string;\n /** Tail start position */\n from: number;\n /** Start position */\n 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","// @flow\nimport ChangeDetails from '../core/change-details.js';\nimport ContinuousTailDetails from '../core/continuous-tail-details.js';\nimport { type Direction, DIRECTION, isString, normalizePrepare, forceDirection } from '../core/utils.js';\nimport { type TailDetails } from '../core/tail-details.js';\nimport IMask from '../core/holder.js';\n\n\n/** Supported mask type */\nexport\ntype Mask =\n string |\n String |\n RegExp |\n Class |\n Class |\n Array |\n $PropertyType, 'validate'> |\n Masked<*> |\n Class>;\n\nexport\ntype MaskedState = {|\n _value: string,\n|};\n\n/** Append flags */\nexport\ntype AppendFlags = {\n input?: boolean,\n tail?: boolean,\n raw?: boolean,\n _beforeTailState?: any, // TODO types...\n};\n\n/** Extract flags */\nexport\ntype ExtractFlags = {\n raw?: boolean\n};\n\nexport\ntype MaskedOptions = {\n mask: $PropertyType, 'mask'>,\n parent?: $PropertyType, 'parent'>,\n prepare?: $PropertyType, 'prepare'>,\n validate?: $PropertyType, 'validate'>,\n commit?: $PropertyType, 'commit'>,\n overwrite?: $PropertyType, 'overwrite'>,\n eager?: $PropertyType, 'eager'>,\n format?: $PropertyType, 'format'>,\n parse?: $PropertyType, 'parse'>,\n skipInvalid?: $PropertyType, 'skipInvalid'>,\n};\n\n\n/** Provides common masking stuff */\nexport default\nclass Masked {\n static DEFAULTS: any; // $Shape; TODO after fix https://github.com/facebook/flow/issues/4773\n static EMPTY_VALUES: any;\n\n /** @type {Mask} */\n mask: MaskType;\n /** */ // $FlowFixMe no ideas\n parent: ?Masked<*>;\n /** Transforms value before mask processing */\n prepare: (string, Masked, AppendFlags) => string | [string, ChangeDetails];\n /** Validates if value is acceptable */\n validate: (string, Masked, AppendFlags) => boolean;\n /** Does additional processing in the end of editing */\n commit: (string, Masked) => void;\n /** Format typed value to string */\n format: (any, Masked) => string;\n /** Parse strgin to get typed value */\n parse: (string, Masked) => any;\n /** Enable characters overwriting */\n overwrite: ?boolean | 'shift';\n /** */\n eager: boolean | 'remove' | 'append';\n /** */\n skipInvalid: boolean;\n /** */\n isInitialized: boolean;\n _value: string;\n _refreshing: ?boolean;\n _isolated: ?boolean;\n\n constructor (opts: {[string]: any}) {\n this._value = '';\n this._update({\n ...Masked.DEFAULTS,\n ...opts,\n });\n this.isInitialized = true;\n }\n\n /** Sets and applies new options */\n updateOptions (opts: {[string]: any}) {\n if (!Object.keys(opts).length) return;\n // $FlowFixMe\n this.withValueRefresh(this._update.bind(this, opts));\n }\n\n /**\n Sets new options\n @protected\n */\n _update (opts: {[string]: any}) {\n Object.assign(this, opts);\n }\n\n /** Mask state */\n get state (): any {\n return {\n _value: this.value,\n };\n }\n\n set state (state: any) {\n this._value = state._value;\n }\n\n /** Resets value */\n reset () {\n this._value = '';\n }\n\n /** */\n get value (): string {\n return this._value;\n }\n\n set value (value: string) {\n this.resolve(value);\n }\n\n /** Resolve new value */\n resolve (value: string): string {\n this.reset();\n this.append(value, {input: true}, '');\n this.doCommit();\n return this.value;\n }\n\n /** */\n get unmaskedValue (): string {\n return this.value;\n }\n\n set unmaskedValue (value: string) {\n this.reset();\n this.append(value, {}, '');\n this.doCommit();\n }\n\n /** */\n get typedValue (): any {\n return this.doParse(this.value);\n }\n\n set typedValue (value: any) {\n this.value = this.doFormat(value);\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.reset();\n this.append(value, {raw: true}, '');\n this.doCommit();\n }\n\n get displayValue (): string {\n return this.value;\n }\n\n /** */\n get isComplete (): boolean {\n return true;\n }\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 // $FlowFixMe no ideas\n appendTail (tail: string | String | TailDetails): ChangeDetails {\n if (isString(tail)) tail = new ContinuousTailDetails(String(tail));\n\n return tail.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] = normalizePrepare(this.doPrepare(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 end */\n _appendPlaceholder (): ChangeDetails {\n return new ChangeDetails();\n }\n\n /** Appends optional eager placeholder at end */\n _appendEager (): ChangeDetails {\n return new ChangeDetails();\n }\n\n /** Appends symbols considering flags */\n // $FlowFixMe no ideas\n append (str: string, flags?: AppendFlags, tail?: string | String | TailDetails): ChangeDetails {\n if (!isString(str)) throw new Error('value should be string');\n const details = new ChangeDetails();\n const checkTail = isString(tail) ? new ContinuousTailDetails(String(tail)) : tail;\n if (flags?.tail) flags._beforeTailState = this.state;\n\n for (let ci=0; ci(fn: () => T): T {\n if (this._refreshing || !this.isInitialized) 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 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 /** */\n runIsolated(fn: (masked: any) => T): T {\n if (this._isolated || !this.isInitialized) 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 /** */\n doSkipInvalid (ch: string, flags: AppendFlags={}, checkTail?: TailDetails): boolean {\n return this.skipInvalid;\n }\n\n /**\n Prepares string before mask processing\n @protected\n */\n doPrepare (str: string, flags: AppendFlags={}): string | [string, ChangeDetails] {\n return this.prepare ?\n this.prepare(str, this, flags) :\n str;\n }\n\n /**\n Validates if value is acceptable\n @protected\n */\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 /**\n Does additional processing in the end of editing\n @protected\n */\n doCommit () {\n if (this.commit) this.commit(this.value, this);\n }\n\n /** */\n doFormat (value: any): string {\n return this.format ? this.format(value, this) : value;\n }\n\n /** */\n doParse (str: string): any {\n return this.parse ? this.parse(str, this) : str;\n }\n\n /** */\n splice (start: number, deleteCount: number, inserted: string, removeDirection: Direction, 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.doFormat(value) === this.doFormat(this.typedValue);\n }\n}\nMasked.DEFAULTS = {\n format: String,\n parse: v => v,\n skipInvalid: true,\n};\nMasked.EMPTY_VALUES = [undefined, null, ''];\n\n\nIMask.Masked = Masked;\n","// @flow\nimport { isString } from '../core/utils.js';\nimport type Masked from './base.js';\nimport { type Mask } from './base.js';\nimport IMask from '../core/holder.js';\n\n\n/** Get Masked class by mask type */\nexport\nfunction maskedClass (mask: Mask): Class> {\n if (mask == null) {\n throw new Error('mask property should be defined');\n }\n\n // $FlowFixMe\n if (mask instanceof RegExp) return IMask.MaskedRegExp;\n // $FlowFixMe\n if (isString(mask)) return IMask.MaskedPattern;\n // $FlowFixMe\n if (mask instanceof Date || mask === Date) return IMask.MaskedDate;\n // $FlowFixMe\n if (mask instanceof Number || typeof mask === 'number' || mask === Number) return IMask.MaskedNumber;\n // $FlowFixMe\n if (Array.isArray(mask) || mask === Array) return IMask.MaskedDynamic;\n // $FlowFixMe\n if (IMask.Masked && mask.prototype instanceof IMask.Masked) return mask;\n // $FlowFixMe\n if (mask instanceof IMask.Masked) return mask.constructor;\n // $FlowFixMe\n if (mask instanceof Function) return IMask.MaskedFunction;\n\n console.warn('Mask not found for mask', mask); // eslint-disable-line no-console\n // $FlowFixMe\n return IMask.Masked;\n}\n\n/** Creates new {@link Masked} depending on mask type */\nexport default\nfunction createMask (opts: {mask: Mask} | Masked<*>): Masked<*> {\n // $FlowFixMe\n if (IMask.Masked && (opts instanceof IMask.Masked)) return opts;\n\n opts = {...opts};\n const mask = opts.mask;\n\n // $FlowFixMe\n if (IMask.Masked && (mask instanceof IMask.Masked)) return mask;\n\n const MaskedClass = maskedClass(mask);\n if (!MaskedClass) throw new Error('Masked class is not found for provided mask, appropriate module needs to be import manually before creating mask.');\n return new MaskedClass(opts);\n}\n\n\nIMask.createMask = createMask;\n","// @flow\nimport createMask from '../factory.js';\nimport type Masked from '../base.js';\nimport type MaskedPattern from '../pattern.js';\nimport { type TailDetails } from '../../core/tail-details.js';\nimport { type Mask, type ExtractFlags, type AppendFlags } from '../base.js';\nimport ChangeDetails from '../../core/change-details.js';\nimport { DIRECTION, type Direction } from '../../core/utils.js';\nimport { type PatternBlock } from './block.js';\n\n\nexport\ntype Definitions = {\n [string]: any, // TODO\n};\n\n/** */\ntype PatternInputDefinitionOptions = {\n parent: $PropertyType,\n isOptional: $PropertyType,\n lazy: $PropertyType,\n eager: $PropertyType,\n placeholderChar: $PropertyType,\n displayChar: $PropertyType,\n mask: Mask,\n [string]: any, // TODO\n};\n\ntype PatternInputDefinitionState = {\n masked: *,\n isFilled: boolean,\n};\n\nexport\nconst DEFAULT_INPUT_DEFINITIONS: { [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/** */\nexport default\nclass PatternInputDefinition implements PatternBlock {\n /** */\n +masked: Masked<*>;\n /** */\n parent: Masked<*>;\n /** */\n isOptional: boolean;\n /** */\n isFilled: boolean;\n /** */\n lazy: $PropertyType;\n /** */\n eager: $PropertyType, 'eager'>;\n /** */\n placeholderChar: $PropertyType;\n /** */\n displayChar: $PropertyType;\n\n\n constructor(opts: PatternInputDefinitionOptions) {\n const { parent, isOptional, placeholderChar, displayChar, lazy, eager, ...maskOpts } = opts;\n\n this.masked = createMask(maskOpts);\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 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, 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 (...args: *): ChangeDetails {\n // TODO probably should be done via _appendChar\n return this.masked.append(...args);\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 (...args: *): TailDetails {\n return this.masked.extractTail(...args);\n }\n\n appendTail (...args: *): ChangeDetails {\n return this.masked.appendTail(...args);\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 (...args: *): boolean {\n return this.masked.doValidate(...args) && (\n !this.parent || this.parent.doValidate(...args));\n }\n\n doCommit () {\n this.masked.doCommit();\n }\n\n get state (): PatternInputDefinitionState {\n return {\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","// @flow\nimport ChangeDetails from '../../core/change-details.js';\nimport { DIRECTION, type Direction, isString } from '../../core/utils.js';\nimport { type TailDetails } from '../../core/tail-details.js';\nimport ContinuousTailDetails from '../../core/continuous-tail-details.js';\nimport { type ExtractFlags, type AppendFlags, type MaskedState } from '../base.js';\nimport { type PatternBlock } from './block.js';\n\n\n/** */\ntype PatternFixedDefinitionOptions = {\n char: $PropertyType,\n isUnmasking?: $PropertyType,\n};\n\ntype PatternFixedDefinitionState = {|\n ...MaskedState,\n _isRawInput: ?boolean,\n|};\n\nexport default\nclass PatternFixedDefinition implements PatternBlock {\n /** */\n _value: string;\n /** */\n char: string;\n /** */\n isUnmasking: ?boolean;\n /** */\n eager: boolean | 'remove' | 'append';\n /** */\n _isRawInput: ?boolean;\n /** */\n 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 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 (fromPos?: number=0, toPos?: number=this.value.length): TailDetails {\n return new ContinuousTailDetails('');\n }\n\n // $FlowFixMe no ideas\n appendTail (tail: string | String | TailDetails): ChangeDetails {\n if (isString(tail)) tail = new ContinuousTailDetails(String(tail));\n\n return tail.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 (): PatternFixedDefinitionState {\n return {\n _value: this._value,\n _isRawInput: this._isRawInput,\n };\n }\n\n set state (state: PatternFixedDefinitionState) {\n Object.assign(this, state);\n }\n}\n","// @flow\nimport type { TailDetails, AppendTail } from '../../core/tail-details.js';\nimport ChangeDetails from '../../core/change-details.js';\nimport { isString } from '../../core/utils.js';\nimport ContinuousTailDetails from '../../core/continuous-tail-details.js';\nimport IMask from '../../core/holder.js';\n\n\ntype ChunksTailState = {\n chunks: $PropertyType,\n from: $PropertyType,\n stop?: $PropertyType,\n blockIndex?: $PropertyType,\n};\n\nexport default\nclass ChunksTailDetails implements TailDetails {\n chunks: Array;\n from: number;\n stop: ?number;\n /** */\n 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 // $FlowFixMe no ideas\n extend (tailChunk: string | String | TailDetails): void {\n if (!String(tailChunk)) return;\n if (isString(tailChunk)) tailChunk = new ContinuousTailDetails(String(tailChunk));\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): ChangeDetails {\n // $FlowFixMe\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 // $FlowFixMe already checked above\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","// @flow\nimport { DIRECTION } from '../../core/utils.js';\nimport type MaskedPattern from '../pattern.js';\nimport { type PatternBlock } from './block.js';\n\n\ntype PatternCursorState = { offset: number, index: number, ok: boolean };\n\nexport default\nclass PatternCursor {\n masked: MaskedPattern;\n offset: number;\n index: number;\n ok: boolean;\n _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): 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): 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","// @flow\nimport Masked, { type MaskedOptions } from './base.js';\nimport IMask from '../core/holder.js';\n\n\n/** Masking by RegExp */\nexport default\nclass MaskedRegExp extends Masked {\n /**\n @override\n @param {Object} opts\n */\n _update (opts: $Shape>) {\n if (opts.mask) opts.validate = (value) => value.search(opts.mask) >= 0;\n super._update(opts);\n }\n}\n\n\nIMask.MaskedRegExp = MaskedRegExp;\n","// @flow\nimport {DIRECTION, type Direction, forceDirection} from '../core/utils.js';\nimport ChangeDetails from '../core/change-details.js';\nimport Masked, { type AppendFlags, type ExtractFlags, type MaskedOptions, type MaskedState } from './base.js';\nimport PatternInputDefinition, { DEFAULT_INPUT_DEFINITIONS, type Definitions } from './pattern/input-definition.js';\nimport PatternFixedDefinition from './pattern/fixed-definition.js';\nimport { type TailDetails } from '../core/tail-details.js';\nimport ChunksTailDetails from './pattern/chunk-tail-details.js';\nimport ContinuousTailDetails from '../core/continuous-tail-details.js';\nimport { type PatternBlock } from './pattern/block.js';\nimport PatternCursor from './pattern/cursor.js';\nimport createMask from './factory.js';\nimport IMask from '../core/holder.js';\nimport './regexp.js'; // support for default definitions which are regexp's\n\n\ntype MaskedPatternOptions = {\n ...MaskedOptions,\n definitions?: $PropertyType,\n blocks?: $PropertyType,\n placeholderChar?: $PropertyType,\n displayChar?: $PropertyType,\n lazy?: $PropertyType,\n};\n\ntype MaskedPatternState = {|\n ...MaskedState,\n _blocks: Array<*>,\n|};\n\ntype BlockPosData = {\n index: number,\n offset: number,\n};\n\n/**\n Pattern mask\n @param {Object} opts\n @param {Object} opts.blocks\n @param {Object} opts.definitions\n @param {string} opts.placeholderChar\n @param {string} opts.displayChar\n @param {boolean} opts.lazy\n*/\nexport default\nclass MaskedPattern extends Masked {\n static DEFAULTS: any;\n static STOP_CHAR: string;\n static ESCAPE_CHAR: string;\n static InputDefinition: Class;\n static FixedDefinition: Class;\n\n /** */\n blocks: {[string]: MaskedOptions};\n /** */\n definitions: Definitions;\n /** Single char for empty input */\n placeholderChar: string;\n /** Single char for filled input */\n displayChar: string;\n /** Show placeholder only when needed */\n lazy: boolean;\n _blocks: Array;\n _maskedBlocks: {[string]: Array};\n _stops: Array;\n\n constructor (opts: any={}) { // TODO type $Shape={} does not work\n opts.definitions = Object.assign({}, DEFAULT_INPUT_DEFINITIONS, opts.definitions);\n super({\n ...MaskedPattern.DEFAULTS,\n ...opts,\n });\n }\n\n /**\n @override\n @param {Object} opts\n */\n _update (opts: $Shape={}) {\n opts.definitions = Object.assign({}, this.definitions, opts.definitions);\n super._update(opts);\n this._rebuildMask();\n }\n\n /** */\n _rebuildMask () {\n const defs = this.definitions;\n this._blocks = [];\n this._stops = [];\n this._maskedBlocks = {};\n\n let 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 // $FlowFixMe no ideas\n const maskedBlock = createMask({\n parent: this,\n lazy: this.lazy,\n eager: this.eager,\n placeholderChar: this.placeholderChar,\n displayChar: this.displayChar,\n overwrite: this.overwrite,\n ...this.blocks[bName],\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 maskOpts = defs[char]?.mask && !(defs[char]?.mask.prototype instanceof IMask.Masked) ? defs[char] : { mask: defs[char] };\n const def = isInput ?\n new PatternInputDefinition({\n parent: this,\n isOptional: optionalBlock,\n lazy: this.lazy,\n eager: this.eager,\n placeholderChar: this.placeholderChar,\n displayChar: this.displayChar,\n ...maskOpts,\n }) :\n new PatternFixedDefinition({\n char,\n eager: this.eager,\n isUnmasking: unmaskingBlock,\n });\n\n this._blocks.push(def);\n }\n }\n\n /**\n @override\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 /**\n @override\n */\n reset () {\n super.reset();\n this._blocks.forEach(b => b.reset());\n }\n\n /**\n @override\n */\n get isComplete (): boolean {\n return this._blocks.every(b => b.isComplete);\n }\n\n /**\n @override\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 /**\n @override\n */\n doCommit () {\n this._blocks.forEach(b => b.doCommit());\n super.doCommit();\n }\n\n /**\n @override\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 /**\n @override\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 /**\n @override\n */\n appendTail (tail: string | String | TailDetails): ChangeDetails {\n return super.appendTail(tail).aggregate(this._appendPlaceholder());\n }\n\n /**\n @override\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 {\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 /**\n @override\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 {\n let stopBefore;\n for (let si=0; si {\n if (!b.lazy || toBlockIndex != null) {\n // $FlowFixMe `_blocks` may not be present\n const args = b._blocks != null ? [b._blocks.length] : [];\n const bDetails = b._appendPlaceholder(...args);\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 {\n let accVal = '';\n for (let bi=0; bi pos += b.value.length, 0);\n }\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 /**\n @override\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 // cursor.popState();\n // if (\n // cursor.pushRightBeforeInput() &&\n // // TODO HACK for lazy if has aligned left inside fixed and has came to the start - use start position\n // (!this.lazy || this.extractInput())\n // ) 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 /**\n @override\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 {\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}\nMaskedPattern.DEFAULTS = {\n lazy: true,\n placeholderChar: '_'\n};\nMaskedPattern.STOP_CHAR = '`';\nMaskedPattern.ESCAPE_CHAR = '\\\\';\nMaskedPattern.InputDefinition = PatternInputDefinition;\nMaskedPattern.FixedDefinition = PatternFixedDefinition;\n\n\nIMask.MaskedPattern = MaskedPattern;\n","// @flow\nimport MaskedPattern from './pattern.js';\nimport ChangeDetails from '../core/change-details.js';\nimport { normalizePrepare } from '../core/utils.js';\nimport { type AppendFlags } from './base.js';\nimport IMask from '../core/holder.js';\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 maxLength: number;\n /** Min bound */\n from: number;\n /** Max bound */\n to: number;\n /** */\n autofix: boolean | 'pad';\n\n get _matchFrom (): number {\n return this.maxLength - String(this.from).length;\n }\n\n /**\n @override\n */\n _update (opts: any) { // TODO type\n opts = {\n to: this.to || 0,\n from: this.from || 0,\n maxLength: this.maxLength || 0,\n ...opts,\n };\n\n let maxLength = String(opts.to).length;\n if (opts.maxLength != null) maxLength = Math.max(maxLength, opts.maxLength);\n opts.maxLength = maxLength;\n\n const fromStr = String(opts.from).padStart(maxLength, '0');\n const toStr = String(opts.to).padStart(maxLength, '0');\n let sameCharsCount = 0;\n while (sameCharsCount < toStr.length && toStr[sameCharsCount] === fromStr[sameCharsCount]) ++sameCharsCount;\n opts.mask = toStr.slice(0, sameCharsCount).replace(/0/g, '\\\\0') + '0'.repeat(maxLength - sameCharsCount);\n\n super._update(opts);\n }\n\n /**\n @override\n */\n 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 // TODO str is a single char everytime\n /**\n @override\n */ \n doPrepare (ch: string, flags: AppendFlags={}): string | [string, ChangeDetails] {\n let details: ChangeDetails;\n [ch, details] = normalizePrepare(super.doPrepare(ch.replace(/\\D/g, ''), flags));\n\n if (!this.autofix || !ch) return ch;\n\n const fromStr = String(this.from).padStart(this.maxLength, '0');\n const toStr = String(this.to).padStart(this.maxLength, '0');\n\n let nextVal = this.value + ch;\n if (nextVal.length > this.maxLength) return '';\n\n const [minstr, maxstr] = this.boundaries(nextVal);\n\n if (Number(maxstr) < this.from) return fromStr[nextVal.length - 1];\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];\n }\n\n return ch;\n }\n\n /**\n @override\n */\n doValidate (...args: *): 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(...args);\n }\n}\n\n\nIMask.MaskedRange = MaskedRange;\n","// @flow\nimport MaskedPattern from './pattern.js';\nimport MaskedRange from './range.js';\nimport IMask from '../core/holder.js';\n\n\n/** Date mask */\nexport default\nclass MaskedDate extends MaskedPattern {\n static GET_DEFAULT_BLOCKS: () => {[string]: any};\n static DEFAULTS: any;\n\n /** Pattern mask for date according to {@link MaskedDate#format} */\n pattern: string;\n /** Start date */\n min: ?Date;\n /** End date */\n max: ?Date;\n /** */\n autofix: boolean | 'pad';\n\n /**\n @param {Object} opts\n */\n constructor (opts: any) {\n super({\n ...MaskedDate.DEFAULTS,\n ...opts\n });\n }\n\n /**\n @override\n */\n _update (opts: any) {\n if (opts.mask === Date) delete opts.mask;\n if (opts.pattern) opts.mask = opts.pattern;\n\n const blocks = opts.blocks;\n opts.blocks = Object.assign({}, MaskedDate.GET_DEFAULT_BLOCKS());\n // adjust year block\n if (opts.min) opts.blocks.Y.from = opts.min.getFullYear();\n if (opts.max) opts.blocks.Y.to = opts.max.getFullYear();\n if (opts.min && opts.max && opts.blocks.Y.from === opts.blocks.Y.to\n ) {\n opts.blocks.m.from = opts.min.getMonth() + 1;\n opts.blocks.m.to = opts.max.getMonth() + 1;\n\n if (opts.blocks.m.from === opts.blocks.m.to) {\n opts.blocks.d.from = opts.min.getDate();\n opts.blocks.d.to = opts.max.getDate();\n }\n }\n Object.assign(opts.blocks, this.blocks, blocks);\n\n // add autofix\n Object.keys(opts.blocks).forEach(bk => {\n const b = opts.blocks[bk];\n if (!('autofix' in b) && 'autofix' in opts) b.autofix = opts.autofix;\n });\n\n super._update(opts);\n }\n\n /**\n @override\n */\n doValidate (...args: *): boolean {\n const date = this.date;\n\n return super.doValidate(...args) &&\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 (): ?Date {\n return this.typedValue;\n }\n set date (date: Date) {\n this.typedValue = date;\n }\n\n /**\n @override\n */\n get typedValue (): ?Date {\n return this.isComplete ? super.typedValue : null;\n }\n set typedValue (value: Date) {\n super.typedValue = value;\n }\n\n /**\n @override\n */\n maskEquals (mask: any): boolean {\n return mask === Date || super.maskEquals(mask);\n }\n}\nMaskedDate.DEFAULTS = {\n pattern: 'd{.}`m{.}`Y',\n format: 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 => {\n const [day, month, year] = str.split('.');\n return new Date(year, month - 1, day);\n },\n};\nMaskedDate.GET_DEFAULT_BLOCKS = () => ({\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\n\nIMask.MaskedDate = MaskedDate;\n","// @flow\nimport IMask from '../core/holder.js';\n\n\nexport\ntype ElementEvent =\n 'selectionChange' |\n 'input' |\n 'drop' |\n 'click' |\n 'focus' |\n 'commit';\n\n/**\n Generic element API to use with mask\n @interface\n*/\nexport default\nclass MaskElement {\n /** */\n +_unsafeSelectionStart: number;\n /** */\n +_unsafeSelectionEnd: number;\n /** */\n value: string;\n\n /** Safely returns selection start */\n get selectionStart (): number {\n let start;\n try {\n start = this._unsafeSelectionStart;\n } catch (e) {}\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 (e) {}\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 (e) {}\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: {[ElementEvent]: Function}) {}\n /** Should be overriden in subclasses */\n unbindEvents (): void {}\n}\n\n\nIMask.MaskElement = MaskElement;\n","// @flow\nimport MaskElement, {type ElementEvent} from './mask-element.js';\nimport IMask from '../core/holder.js';\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: {[ElementEvent]: string};\n /** HTMLElement to use mask on */\n input: HTMLTextAreaElement | HTMLInputElement;\n _handlers: {[string]: Function};\n\n /**\n @param {HTMLInputElement|HTMLTextAreaElement} input\n */\n constructor (input: HTMLTextAreaElement | HTMLInputElement) {\n super();\n this.input = input;\n this._handlers = {};\n }\n\n /** */\n // $FlowFixMe https://github.com/facebook/flow/issues/2839\n get rootElement (): HTMLDocument {\n return this.input.getRootNode?.() ?? document;\n }\n\n /**\n Is element in focus\n @readonly\n */\n get isActive (): boolean {\n //$FlowFixMe\n return this.input === this.rootElement.activeElement;\n }\n\n /**\n Returns HTMLElement selection start\n @override\n */\n get _unsafeSelectionStart (): number {\n return this.input.selectionStart;\n }\n\n /**\n Returns HTMLElement selection end\n @override\n */\n get _unsafeSelectionEnd (): number {\n return this.input.selectionEnd;\n }\n\n /**\n Sets HTMLElement selection\n @override\n */\n _unsafeSelect (start: number, end: number) {\n this.input.setSelectionRange(start, end);\n }\n\n /**\n HTMLElement value\n @override\n */\n get value (): string {\n return this.input.value;\n }\n set value (value: string) {\n this.input.value = value;\n }\n\n /**\n Binds HTMLElement events to mask internal events\n @override\n */\n bindEvents (handlers: {[ElementEvent]: Function}) {\n Object.keys(handlers)\n .forEach(event => this._toggleEventHandler(HTMLMaskElement.EVENTS_MAP[event], handlers[event]));\n }\n\n /**\n Unbinds HTMLElement events to mask internal events\n @override\n */\n unbindEvents () {\n Object.keys(this._handlers)\n .forEach(event => this._toggleEventHandler(event));\n }\n\n /** */\n _toggleEventHandler (event: string, handler?: Function): 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}\nHTMLMaskElement.EVENTS_MAP = {\n selectionChange: 'keydown',\n input: 'input',\n drop: 'drop',\n click: 'click',\n focus: 'focus',\n commit: 'blur',\n};\n\n\nIMask.HTMLMaskElement = HTMLMaskElement;\n","// @flow\nimport HTMLMaskElement from './html-mask-element.js';\nimport IMask from '../core/holder.js';\n\n\nexport default\nclass HTMLContenteditableMaskElement extends HTMLMaskElement {\n /**\n Returns HTMLElement selection start\n @override\n */\n 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 /**\n Returns HTMLElement selection end\n @override\n */\n 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 /**\n Sets HTMLElement selection\n @override\n */\n _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 /**\n HTMLElement value\n @override\n */\n get value (): string {\n // $FlowFixMe\n return this.input.textContent;\n }\n set value (value: string) {\n this.input.textContent = value;\n }\n}\n\n\nIMask.HTMLContenteditableMaskElement = HTMLContenteditableMaskElement;\n","// @flow\nimport {objectIncludes, DIRECTION, type Selection} from '../core/utils.js';\nimport ActionDetails from '../core/action-details.js';\nimport MaskedDate from '../masked/date.js';\nimport createMask, {maskedClass} from '../masked/factory.js';\nimport type Masked from '../masked/base.js';\nimport {type Mask} from '../masked/base.js';\nimport MaskElement from './mask-element.js';\nimport HTMLMaskElement from './html-mask-element.js';\nimport HTMLContenteditableMaskElement from './html-contenteditable-mask-element.js';\nimport IMask from '../core/holder.js';\n\n\n/** Listens to element events and controls changes between element and {@link Masked} */\nexport default\nclass InputMask {\n /**\n View element\n @readonly\n */\n el: MaskElement;\n\n /**\n Internal {@link Masked} model\n @readonly\n */\n masked: Masked<*>;\n alignCursor: () => void;\n alignCursorFriendly: () => void;\n\n _listeners: {[string]: Array};\n _value: string;\n _changingCursorPos: number;\n _unmaskedValue: string;\n _saveSelection: (?Event) => void;\n _selection: Selection;\n _onInput: () => void;\n _onChange: () => void;\n _onDrop: (Event) => void;\n _onFocus: (Event) => void;\n _onClick: (Event) => void;\n _cursorChanging: ?TimeoutID;\n _inputEvent: ?InputEvent;\n\n /**\n @param {MaskElement|HTMLInputElement|HTMLTextAreaElement} el\n @param {Object} opts\n */\n constructor (el: MaskElement | HTMLTextAreaElement | HTMLInputElement, opts: {[string]: any} | Masked<*>) {\n this.el =\n (el instanceof MaskElement) ? el :\n (el.isContentEditable && el.tagName !== 'INPUT' && el.tagName !== 'TEXTAREA') ? new HTMLContenteditableMaskElement(el) :\n new HTMLMaskElement(el);\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 /** Read or update mask */\n get mask (): Mask {\n return this.masked.mask;\n }\n\n maskEquals (mask: Mask): boolean {\n return mask == null || this.masked?.maskEquals(mask);\n }\n\n set mask (mask: Mask) {\n if (this.maskEquals(mask)) return;\n\n // $FlowFixMe No ideas ... after update\n if (!(mask instanceof IMask.Masked) && this.masked.constructor === maskedClass(mask)) {\n this.masked.updateOptions({mask});\n return;\n }\n\n const masked = createMask({mask});\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 (): any {\n return this.masked.typedValue;\n }\n\n set typedValue (val: any) {\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 /**\n Starts listening to element events\n @protected\n */\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 /**\n Stops listening to element events\n @protected\n */\n _unbindEvents () {\n if (this.el) this.el.unbindEvents();\n }\n\n /**\n Fires custom event\n @protected\n */\n _fireEvent (ev: string, ...args: *) {\n const listeners = this._listeners[ev];\n if (!listeners) return;\n\n listeners.forEach(l => l(...args));\n }\n\n /**\n Current selection start\n @readonly\n */\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 /**\n Stores current selection\n @protected\n */\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: {[string]: any}) {\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);\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 /**\n Delays cursor update to support mobile browsers\n @private\n */\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 /**\n Fires custom events\n @protected\n */\n _fireChangeEvents () {\n this._fireEvent('accept', this._inputEvent);\n if (this.masked.isComplete) this._fireEvent('complete', this._inputEvent);\n }\n\n /**\n Aborts delayed cursor update\n @private\n */\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: Function): 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: Function): 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 this.el.value, this.cursorPos,\n // old state\n this.displayValue, 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 // $FlowFixMe why not do so?\n this._listeners.length = 0;\n // $FlowFixMe\n delete this.el;\n }\n}\n\n\nIMask.InputMask = InputMask;\n","// @flow\nimport MaskedPattern from './pattern.js';\nimport IMask from '../core/holder.js';\n\n\n/** Pattern which validates enum values */\nexport default\nclass MaskedEnum extends MaskedPattern {\n enum: Array;\n\n /**\n @override\n @param {Object} opts\n */\n _update (opts: any) { // TODO type\n if (opts.enum) opts.mask = '*'.repeat(opts.enum[0].length);\n\n super._update(opts);\n }\n\n /**\n @override\n */\n doValidate (...args: *): boolean {\n return this.enum.some(e => e.indexOf(this.unmaskedValue) >= 0) &&\n super.doValidate(...args);\n }\n}\n\n\nIMask.MaskedEnum = MaskedEnum;\n","// @flow\nimport { escapeRegExp, indexInDirection, posInDirection, type Direction, DIRECTION, normalizePrepare } from '../core/utils.js';\nimport ChangeDetails from '../core/change-details.js';\nimport { type TailDetails } from '../core/tail-details.js';\n\nimport Masked, { type MaskedOptions, type ExtractFlags, type AppendFlags } from './base.js';\nimport IMask from '../core/holder.js';\n\n\ntype MaskedNumberOptions = {\n ...MaskedOptions>,\n radix: $PropertyType,\n thousandsSeparator: $PropertyType,\n mapToRadix: $PropertyType,\n scale: $PropertyType,\n signed: $PropertyType,\n normalizeZeros: $PropertyType,\n padFractionalZeros: $PropertyType,\n};\n\n/**\n Number mask\n @param {Object} opts\n @param {string} opts.radix - Single char\n @param {string} opts.thousandsSeparator - Single char\n @param {Array} opts.mapToRadix - Array of single chars\n @param {number} opts.min\n @param {number} opts.max\n @param {number} opts.scale - Digits after point\n @param {boolean} opts.signed - Allow negative\n @param {boolean} opts.normalizeZeros - Flag to remove leading and trailing zeros in the end of editing\n @param {boolean} opts.padFractionalZeros - Flag to pad trailing zeros after point in the end of editing\n*/\nexport default\nclass MaskedNumber extends Masked> {\n static DEFAULTS: $Shape;\n static UNMASKED_RADIX: string;\n\n /** Single char */\n radix: string;\n /** Single char */\n thousandsSeparator: string;\n /** Array of single chars */\n mapToRadix: Array;\n /** */\n min: number;\n /** */\n max: number;\n /** Digits after point */\n scale: number;\n /** */\n signed: boolean;\n /** Flag to remove leading and trailing zeros in the end of editing */\n normalizeZeros: boolean;\n /** Flag to pad trailing zeros after point in the end of editing */\n padFractionalZeros: boolean;\n\n _numberRegExp: RegExp;\n _thousandsSeparatorRegExp: RegExp;\n _mapToRadixRegExp: RegExp;\n _separatorsProcessed: boolean;\n\n constructor (opts: $Shape) {\n super({\n ...MaskedNumber.DEFAULTS,\n ...opts\n });\n }\n\n /**\n @override\n */\n _update (opts: MaskedNumberOptions) {\n super._update(opts);\n this._updateRegExps();\n }\n\n /** */\n _updateRegExps () {\n let start = '^' + (this.allowNegative ? '[+|\\\\-]?' : '');\n let mid = '\\\\d*';\n let 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 /** */\n _removeThousandsSeparators (value: string): string {\n return value.replace(this._thousandsSeparatorRegExp, '');\n }\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 /**\n @override\n */\n doPrepare (ch: string, flags: AppendFlags={}): string | [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 const [prepCh, details] = normalizePrepare(super.doPrepare(ch, flags));\n if (ch && !prepCh) details.skip = true;\n return [prepCh, details];\n }\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 /** */\n _separatorsCountFromSlice (slice: string=this._value): number {\n return this._separatorsCount(this._removeThousandsSeparators(slice).length, true);\n }\n\n /**\n @override\n */\n 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\n */\n _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 /** */\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\n */\n 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 /**\n @override\n */\n 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 /**\n @override\n */\n 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 /**\n @override\n */\n 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.doFormat(validnum);\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 /** */\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 /** */\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 /** */\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 /**\n @override\n */\n get unmaskedValue (): string {\n return this._removeThousandsSeparators(\n this._normalizeZeros(\n this.value))\n .replace(this.radix, MaskedNumber.UNMASKED_RADIX);\n }\n\n set unmaskedValue (unmaskedValue: string) {\n super.unmaskedValue = unmaskedValue;\n }\n\n /**\n @override\n */\n get typedValue (): number {\n return this.doParse(this.unmaskedValue);\n }\n\n set typedValue (n: number) {\n this.rawInputValue = this.doFormat(n).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 @readonly\n */\n get allowNegative (): boolean {\n return this.signed ||\n (this.min != null && this.min < 0) ||\n (this.max != null && this.max < 0);\n }\n\n /**\n @override\n */\n 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\nMaskedNumber.UNMASKED_RADIX = '.';\nMaskedNumber.DEFAULTS = {\n radix: ',',\n thousandsSeparator: '',\n mapToRadix: [MaskedNumber.UNMASKED_RADIX],\n scale: 2,\n signed: false,\n normalizeZeros: true,\n padFractionalZeros: false,\n parse: Number,\n format: n => n.toLocaleString('en-US', { useGrouping: false, maximumFractionDigits: 20 }),\n};\nMaskedNumber.EMPTY_VALUES = [...Masked.EMPTY_VALUES, 0];\n\nIMask.MaskedNumber = MaskedNumber;\n","// @flow\nimport Masked, { type MaskedOptions } from './base.js';\nimport IMask from '../core/holder.js';\n\n\n/** Masking by custom Function */\nexport default\nclass MaskedFunction extends Masked {\n /**\n @override\n @param {Object} opts\n */\n _update (opts: MaskedOptions) {\n if (opts.mask) opts.validate = opts.mask;\n super._update(opts);\n }\n}\n\n\nIMask.MaskedFunction = MaskedFunction;\n","// @flow\nimport { objectIncludes } from '../core/utils.js';\nimport ChangeDetails from '../core/change-details.js';\nimport createMask from './factory.js';\nimport Masked, { type AppendFlags, type MaskedState } from './base.js';\nimport { normalizePrepare, DIRECTION } from '../core/utils.js';\nimport { type TailDetails } from '../core/tail-details.js';\nimport IMask from '../core/holder.js';\n\n\ntype MaskedDynamicState = {|\n ...MaskedState,\n _rawInputValue: string,\n compiledMasks: Array<*>,\n currentMaskRef: ?Masked<*>,\n currentMask: *,\n|};\n\ntype DynamicMaskType = Array<{[string]: any}>;\n/** Dynamic mask for choosing apropriate mask in run-time */\nexport default\nclass MaskedDynamic extends Masked {\n /** Currently chosen mask */\n currentMask: ?Masked<*>;\n /** Compliled {@link Masked} options */\n compiledMasks: Array>;\n /** Chooses {@link Masked} depending on input value */\n dispatch: (string, Masked<*>, AppendFlags, string | String | TailDetails) => Masked<*>;\n\n /**\n @param {Object} opts\n */\n constructor (opts: any) {\n super({\n ...MaskedDynamic.DEFAULTS,\n ...opts\n });\n\n this.currentMask = null;\n }\n\n /**\n @override\n */\n _update (opts: any) {\n super._update(opts);\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(m)) :\n [];\n\n // this.currentMask = this.doDispatch(''); // probably not needed but lets see\n }\n }\n\n /**\n @override\n */\n _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 // $FlowFixMe - tired to fight with type system\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 // $FlowFixMe - it's ok, we don't change current mask above\n const d = this.currentMask.append(insertValue, {raw: true});\n details.tailShift = d.inserted.length - prevValueBeforeTail.length;\n }\n\n if (tailValue) {\n // $FlowFixMe - it's ok, we don't change current mask above\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 _appendPlaceholder (...args: *): ChangeDetails {\n const details = this._applyDispatch(...args);\n\n if (this.currentMask) {\n details.aggregate(this.currentMask._appendPlaceholder());\n }\n\n return details;\n }\n\n /**\n @override\n */\n _appendEager (...args: *): ChangeDetails {\n const details = this._applyDispatch(...args);\n\n if (this.currentMask) {\n details.aggregate(this.currentMask._appendEager());\n }\n\n return details;\n }\n\n 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: flags._beforeTailState?.currentMaskRef === this.currentMask && flags._beforeTailState?.currentMask ||\n flags._beforeTailState,\n };\n }\n\n /**\n @override\n */\n doDispatch(appended: string, flags: AppendFlags={}, tail: string | String | TailDetails=''): ?Masked<*> {\n return this.dispatch(appended, this, flags, tail);\n }\n\n /**\n @override\n */\n doValidate (flags: AppendFlags): boolean {\n return super.doValidate(flags) && (\n !this.currentMask || this.currentMask.doValidate(this.currentMaskFlags(flags))\n );\n }\n\n /**\n @override\n */\n doPrepare (str: string, flags: AppendFlags={}): string | [string, ChangeDetails] {\n let [s, details] = normalizePrepare(super.doPrepare(str, flags));\n\n if (this.currentMask) {\n let currentDetails;\n ([s, currentDetails] = normalizePrepare(super.doPrepare(s, this.currentMaskFlags(flags))));\n details = details.aggregate(currentDetails);\n }\n\n return [s, details];\n }\n\n /**\n @override\n */\n reset () {\n this.currentMask?.reset();\n this.compiledMasks.forEach(m => m.reset());\n }\n\n /**\n @override\n */\n get value (): string {\n return this.currentMask ? this.currentMask.value : '';\n }\n\n set value (value: string) {\n super.value = value;\n }\n\n /**\n @override\n */\n get unmaskedValue (): string {\n return this.currentMask ? this.currentMask.unmaskedValue : '';\n }\n\n set unmaskedValue (unmaskedValue: string) {\n super.unmaskedValue = unmaskedValue;\n }\n\n /**\n @override\n */\n get typedValue (): any {\n return this.currentMask ? this.currentMask.typedValue : '';\n }\n\n // probably typedValue should not be used with dynamic\n set typedValue (value: any) {\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 get displayValue (): string {\n return this.currentMask ? this.currentMask.displayValue : '';\n }\n\n /**\n @override\n */\n get isComplete (): boolean {\n return Boolean(this.currentMask?.isComplete);\n }\n\n /**\n @override\n */\n get isFilled (): boolean {\n return Boolean(this.currentMask?.isFilled);\n }\n\n /**\n @override\n */\n remove (...args: *): ChangeDetails {\n const details: ChangeDetails = new ChangeDetails();\n if (this.currentMask) {\n details.aggregate(this.currentMask.remove(...args))\n // update with dispatch\n .aggregate(this._applyDispatch());\n }\n\n return details;\n }\n\n /**\n @override\n */\n 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 set state (state: MaskedDynamicState) {\n const {compiledMasks, currentMaskRef, currentMask, ...maskedState} = state;\n 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 /**\n @override\n */\n extractInput (...args: *): string {\n return this.currentMask ?\n this.currentMask.extractInput(...args) :\n '';\n }\n\n /**\n @override\n */\n extractTail (...args: *): TailDetails {\n return this.currentMask ?\n this.currentMask.extractTail(...args) :\n super.extractTail(...args);\n }\n\n /**\n @override\n */\n doCommit () {\n if (this.currentMask) this.currentMask.doCommit();\n super.doCommit();\n }\n\n /**\n @override\n */\n nearestInputPos(...args: *): number {\n return this.currentMask ?\n this.currentMask.nearestInputPos(...args) :\n super.nearestInputPos(...args);\n }\n\n get overwrite (): ?boolean | 'shift' {\n return this.currentMask ?\n this.currentMask.overwrite :\n super.overwrite;\n }\n\n set overwrite (overwrite: *) {\n console.warn('\"overwrite\" option is not available in dynamic mask, use this option in siblings');\n }\n\n get eager (): boolean | 'remove' | 'append' {\n return this.currentMask ?\n this.currentMask.eager :\n super.eager;\n }\n\n set eager (eager: *) {\n console.warn('\"eager\" option is not available in dynamic mask, use this option in siblings');\n }\n\n get skipInvalid (): boolean {\n return this.currentMask ?\n this.currentMask.skipInvalid :\n super.skipInvalid;\n }\n\n set skipInvalid (skipInvalid: boolean) {\n if (this.isInitialized || skipInvalid !== Masked.DEFAULTS.skipInvalid) {\n console.warn('\"skipInvalid\" option is not available in dynamic mask, use this option in siblings');\n }\n }\n\n /**\n @override\n */\n 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 });\n }\n\n /**\n @override\n */\n 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 createMask from './factory';\nimport IMask from '../core/holder.js';\n\n\n/** Mask pipe source and destination types */\nexport\nconst PIPE_TYPE = {\n MASKED: 'value',\n UNMASKED: 'unmaskedValue',\n TYPED: 'typedValue',\n};\n\n/** Creates new pipe function depending on mask type, source and destination options */\nexport\nfunction createPipe (mask, from=PIPE_TYPE.MASKED, to=PIPE_TYPE.MASKED) {\n const masked = createMask(mask);\n return (value) => masked.runIsolated(m => {\n m[from] = value;\n return m[to];\n });\n}\n\n/** Pipes value through mask depending on mask type, source and destination options */\nexport\nfunction pipe (value, ...pipeArgs) {\n return createPipe(...pipeArgs)(value);\n}\n\n\nIMask.PIPE_TYPE = PIPE_TYPE;\nIMask.createPipe = createPipe;\nIMask.pipe = pipe;\n","import IMask from './imask.js';\nexport { default as InputMask } from './controls/input.js';\n\nexport { default as Masked } from './masked/base.js';\nexport { default as MaskedPattern } from './masked/pattern.js';\nexport { default as MaskedEnum } from './masked/enum.js';\nexport { default as MaskedRange } from './masked/range.js';\nexport { default as MaskedNumber } from './masked/number.js';\nexport { default as MaskedDate } from './masked/date.js';\nexport { default as MaskedRegExp } from './masked/regexp.js';\nexport { default as MaskedFunction } from './masked/function.js';\nexport { default as MaskedDynamic } from './masked/dynamic.js';\nexport { default as createMask } from './masked/factory.js';\nexport { default as MaskElement } from './controls/mask-element.js';\nexport { default as HTMLMaskElement } from './controls/html-mask-element.js';\nexport { default as HTMLContenteditableMaskElement } from './controls/html-contenteditable-mask-element.js';\nexport { createPipe, pipe, PIPE_TYPE } from './masked/pipe.js';\n\nexport { default as ChangeDetails } from './core/change-details.js';\n\n\ntry {\n globalThis.IMask = IMask;\n} catch(e) {}\nexport default IMask;\n"],"names":["IMask","el","opts","arguments","length","undefined","InputMask","ChangeDetails","constructor","details","Object","assign","this","inserted","rawInserted","skip","tailShift","aggregate","offset","isString","str","String","DIRECTION","NONE","LEFT","FORCE_LEFT","RIGHT","FORCE_RIGHT","escapeRegExp","replace","normalizePrepare","prep","Array","isArray","objectIncludes","b","a","i","arrA","arrB","dateA","Date","dateB","getTime","regexpA","RegExp","regexpB","toString","keys","prototype","hasOwnProperty","call","ActionDetails","value","cursorPos","oldValue","oldSelection","slice","startChangePos","start","Math","min","insertedCount","substr","removedCount","max","end","removed","head","substring","tail","removeDirection","ContinuousTailDetails","from","stop","extend","appendTo","masked","append","_appendPlaceholder","state","unshift","beforePos","shiftChar","shift","Masked","_value","_update","DEFAULTS","isInitialized","updateOptions","withValueRefresh","bind","reset","resolve","input","doCommit","unmaskedValue","typedValue","doParse","doFormat","rawInputValue","extractInput","raw","displayValue","isComplete","isFilled","nearestInputPos","direction","totalInputPositions","fromPos","toPos","extractTail","appendTail","_appendCharRaw","ch","_appendChar","flags","checkTail","consistentState","doPrepare","consistentTail","appended","doValidate","beforeTailState","overwrite","tailDetails","_appendEager","Error","_beforeTailState","ci","d","doSkipInvalid","eager","remove","fn","_refreshing","rawInput","ret","indexOf","runIsolated","_isolated","skipInvalid","prepare","validate","parent","commit","format","parse","splice","deleteCount","tailPos","eagerRemove","oldRawValue","forceDirection","valLength","maskEquals","mask","typedValueEquals","tval","EMPTY_VALUES","includes","maskedClass","MaskedRegExp","MaskedPattern","MaskedDate","Number","MaskedNumber","MaskedDynamic","Function","MaskedFunction","console","warn","createMask","MaskedClass","v","DEFAULT_INPUT_DEFINITIONS","PatternInputDefinition","isOptional","placeholderChar","displayChar","lazy","maskOpts","_objectWithoutPropertiesLoose","_excluded","Boolean","maxPos","boundPos","PatternFixedDefinition","isFixed","isUnmasking","_isRawInput","appendEager","isResolved","char","ChunksTailDetails","chunks","map","join","tailChunk","lastChunk","extendLast","push","firstTailChunk","blockIndex","chunk","lastBlockIter","_mapPosToBlock","chunkBlock","index","_stops","phDetails","_blocks","remainChars","c","props","cstate","chunkShiftPos","PatternCursor","pos","_log","ok","block","_blockStartPos","s","pushState","popState","pop","bindBlock","_pushLeft","_this$block","_pushRight","pushLeftBeforeFilled","pushLeftBeforeInput","pushLeftBeforeRequired","pushRightBeforeFilled","pushRightBeforeInput","pushRightBeforeRequired","search","super","definitions","_rebuildMask","defs","_maskedBlocks","pattern","unmaskingBlock","optionalBlock","_defs$char","_defs$char2","blocks","p","bNames","filter","bName","sort","maskedBlock","isInput","STOP_CHAR","ESCAPE_CHAR","def","maskedState","forEach","bi","every","reduce","_this$_mapPosToBlock","startBlockIndex","blockIter","_flags$_beforeTailSta","_flags$_beforeTailSta2","blockDetails","chunkTail","_forEachBlocksInRange","bFromPos","bToPos","blockChunk","_findStopBefore","_","stopBefore","si","toBlockIndex","startBlockIter","endBlockIndex","args","bDetails","accVal","blockStartPos","fromBlockIter","toBlockIter","isSameBlock","fromBlockStartPos","fromBlockEndPos","removeDetails","cursor","total","name","maskedBlocks","indices","gi","InputDefinition","FixedDefinition","MaskedRange","_matchFrom","maxLength","to","fromStr","padStart","toStr","sameCharsCount","repeat","boundaries","minstr","maxstr","placeholder","num","match","padEnd","autofix","nextVal","GET_DEFAULT_BLOCKS","Y","getFullYear","m","getMonth","getDate","bk","date","isDateExist","day","month","year","split","MaskElement","selectionStart","_unsafeSelectionStart","e","selectionEnd","_unsafeSelectionEnd","select","_unsafeSelect","isActive","bindEvents","handlers","unbindEvents","HTMLMaskElement","_handlers","rootElement","_this$input$getRootNo","_this$input$getRootNo2","_this$input","getRootNode","document","activeElement","setSelectionRange","event","_toggleEventHandler","EVENTS_MAP","handler","removeEventListener","addEventListener","selectionChange","drop","click","focus","HTMLContenteditableMaskElement","root","selection","getSelection","anchorOffset","focusOffset","createRange","range","setStart","firstChild","setEnd","lastChild","removeAllRanges","addRange","textContent","isContentEditable","tagName","_listeners","_unmaskedValue","_saveSelection","_onInput","_onChange","_onDrop","_onFocus","_onClick","alignCursor","alignCursorFriendly","_bindEvents","updateValue","_this$masked","updateControl","val","_unbindEvents","_fireEvent","ev","_len","_key","listeners","l","_cursorChanging","_changingCursorPos","_selection","newUnmaskedValue","newValue","newDisplayValue","isChanged","_fireChangeEvents","restOpts","updateMask","updateOpts","updateCursor","_delayUpdateCursor","_abortUpdateCursor","setTimeout","_inputEvent","clearTimeout","on","off","hIndex","preventDefault","stopPropagation","destroy","MaskedEnum","enum","some","_updateRegExps","allowNegative","scale","concat","radix","_numberRegExp","_mapToRadixRegExp","mapToRadix","_thousandsSeparatorRegExp","thousandsSeparator","_removeThousandsSeparators","_insertThousandsSeparators","parts","prepCh","_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","signed","toLocaleString","useGrouping","maximumFractionDigits","currentMask","compiledMasks","_applyDispatch","currentMaskFlags","prevValueBeforeTail","inputValue","insertValue","_rawInputValue","tailValue","prevMask","prevMaskState","doDispatch","currentMaskRef","dispatch","currentDetails","_this$currentMask","_this$currentMask2","_this$currentMask3","_this$currentMask4","mi","_mask$mi","oldMask","_excluded2","_this$currentMask5","inputs","isCurrent","startInputPos","weight","i1","i2","PIPE_TYPE","MASKED","UNMASKED","TYPED","createPipe","pipe","pipeArgs","globalThis"],"mappings":"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"}