{"version":3,"file":"imask.min.js","sources":["../src/core/change-details.js","../src/core/utils.js","../src/core/action-details.js","../src/core/continuous-tail-details.js","../src/core/holder.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":["// @flow\n\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","// @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","/**\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\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};\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;\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 /** */\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 /** 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);\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 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): string {\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 let oldRawValue;\n if (this.eager) {\n removeDirection = forceDirection(removeDirection);\n oldRawValue = this.extractInput(0, tailPos, {raw: true});\n }\n\n let startChangePos: number = this.nearestInputPos(start, deleteCount > 1 && start !== 0 && !this.eager ? DIRECTION.NONE : removeDirection);\n const details: ChangeDetails = new ChangeDetails({\n tailShift: startChangePos - start // adjust tailShift if start was aligned\n }).aggregate(this.remove(startChangePos));\n\n if (this.eager && 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: v => v,\n parse: v => v,\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 = {[string]: Mask};\n\n/** */\ntype PatternInputDefinitionOptions = {\n parent: $PropertyType,\n mask: Mask,\n isOptional: $PropertyType,\n lazy: $PropertyType,\n eager: $PropertyType,\n placeholderChar: $PropertyType,\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\n constructor(opts: PatternInputDefinitionOptions) {\n const {mask, ...blockOpts} = opts;\n\n this.masked = createMask({mask});\n Object.assign(this, blockOpts);\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 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 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;\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 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 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._value) return details;\n\n const appended = this.char === ch;\n const isResolved = appended && (this.isUnmasking || flags.input || flags.raw) && (!flags.raw || !this.eager) && !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._value) 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 details.aggregate(masked._appendPlaceholder(stop));\n }\n chunkBlock = chunk instanceof ChunksTailDetails && masked._blocks[stop];\n }\n\n if (chunkBlock) {\n const tailDetails = chunkBlock.appendTail(chunk);\n 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 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 {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 /** 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 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 def = isInput ?\n new PatternInputDefinition({\n parent: this,\n lazy: this.lazy,\n eager: this.eager,\n placeholderChar: this.placeholderChar,\n mask: defs[char],\n isOptional: optionalBlock,\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 /**\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 /** 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 /**\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.value !== 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 isChanged = (this.unmaskedValue !== newUnmaskedValue ||\n this.value !== newValue);\n\n this._unmaskedValue = newUnmaskedValue;\n this._value = newValue;\n\n if (this.el.value !== newValue) this.el.value = newValue;\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.value, 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.value !== 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';\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\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 _numberRegExpInput: 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 // use different regexp to process user input (more strict, input suffix) and tail shifting\n let start = '^' + (this.allowNegative ? '[+|\\\\-]?' : '');\n let midInput = '(0|([1-9]+\\\\d*))?';\n let mid = '\\\\d*';\n\n let end = (this.scale ?\n '(' + escapeRegExp(this.radix) + '\\\\d{0,' + this.scale + '})?' :\n '') + '$';\n\n this._numberRegExpInput = new RegExp(start + midInput + end);\n this._numberRegExp = new RegExp(start + mid + end);\n this._mapToRadixRegExp = new RegExp('[' +\n this.mapToRadix.map(escapeRegExp).join('') +\n ']', '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, ...args: *): string | [string, ChangeDetails] {\n ch = ch.replace(this._mapToRadixRegExp, this.radix);\n const noSepCh = this._removeThousandsSeparators(ch);\n const [prepCh, details] = normalizePrepare(super.doPrepare(noSepCh, ...args));\n if (ch && !noSepCh) 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 const regexp = flags.input ? this._numberRegExpInput : this._numberRegExp;\n\n // validate as string\n let valid = regexp.test(this._removeThousandsSeparators(this.value));\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 = String(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 @override\n */\n get unmaskedValue (): string {\n return this._removeThousandsSeparators(\n this._normalizeZeros(\n this.value))\n .replace(this.radix, '.');\n }\n\n set unmaskedValue (unmaskedValue: string) {\n super.unmaskedValue = unmaskedValue.replace('.', this.radix);\n }\n\n /**\n @override\n */\n get typedValue (): number {\n return Number(this.unmaskedValue);\n }\n\n set typedValue (n: number) {\n super.unmaskedValue = String(n);\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}\nMaskedNumber.DEFAULTS = {\n radix: ',',\n thousandsSeparator: '',\n mapToRadix: ['.'],\n scale: 2,\n signed: false,\n normalizeZeros: true,\n padFractionalZeros: false,\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 ChangeDetails from '../core/change-details.js';\nimport createMask from './factory.js';\nimport Masked, { type AppendFlags, type MaskedState } from './base.js';\nimport { normalizePrepare } 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) => 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 }\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={}): 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 });\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 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={}): ?Masked<*> {\n return this.dispatch(appended, this, flags);\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 /**\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 {\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 /**\n @override\n */\n maskEquals (mask: any): boolean {\n return Array.isArray(mask) &&\n this.compiledMasks.every((m, mi) => m.maskEquals(mask[mi]?.mask));\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) => {\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 m.reset();\n m.append(inputValue, { raw: true });\n m.append(appended, masked.currentMaskFlags(flags));\n const weight = m.rawInputValue.length;\n\n return {weight, index};\n });\n\n // pop masks with longer values first\n inputs.sort((i1, i2) => i2.weight - i1.weight);\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\ntry {\n globalThis.IMask = IMask;\n} catch(e) {}\nexport default IMask;\n"],"names":["ChangeDetails","details","_classCallCheck","this","Object","assign","inserted","rawInserted","skip","tailShift","value","length","isString","str","String","DIRECTION","forceDirection","direction","escapeRegExp","replace","normalizePrepare","prep","Array","isArray","objectIncludes","b","a","i","arrA","arrB","_typeof","dateA","Date","dateB","getTime","regexpA","RegExp","regexpB","toString","keys","prototype","hasOwnProperty","call","ActionDetails","cursorPos","oldValue","oldSelection","slice","startChangePos","start","Math","min","substr","insertedCount","max","end","removedCount","substring","ContinuousTailDetails","from","stop","arguments","undefined","tail","masked","append","aggregate","_appendPlaceholder","set","state","beforePos","shiftChar","IMask","el","opts","InputMask","Masked","_value","_update","DEFAULTS","isInitialized","withValueRefresh","bind","resolve","reset","input","doCommit","doParse","doFormat","extractInput","raw","isComplete","fromPos","toPos","appendTo","ch","flags","checkTail","consistentState","doPrepare","_normalizePrepare2","_slicedToArray","_normalizePrepare","_appendCharRaw","consistentTail","appended","doValidate","beforeTailState","overwrite","unshift","tailDetails","appendTail","shift","Error","_beforeTailState","ci","_appendChar","eager","_appendEager","fn","_refreshing","rawInput","rawInputValue","ret","indexOf","_isolated","prepare","validate","parent","commit","format","parse","deleteCount","removeDirection","oldRawValue","tailPos","extractTail","nearestInputPos","remove","valLength","mask","tval","typedValue","EMPTY_VALUES","includes","maskedClass","MaskedRegExp","MaskedPattern","MaskedDate","Number","MaskedNumber","MaskedDynamic","constructor","Function","MaskedFunction","console","warn","createMask","MaskedClass","v","DEFAULT_INPUT_DEFINITIONS","PatternInputDefinition","blockOpts","_excluded","isFilled","isOptional","placeholderChar","unmaskedValue","Boolean","lazy","_this$masked","apply","_this$masked2","_this$masked3","minPos","maxPos","boundPos","_this$masked4","_this$parent","PatternFixedDefinition","isFixed","isUnmasking","_isRawInput","char","isResolved","ChunksTailDetails","chunks","map","join","tailChunk","lastChunk","extendLast","extend","push","firstTailChunk","blockIndex","chunk","lastBlockIter","_mapPosToBlock","chunkBlock","index","_stops","_blocks","remainChars","c","props","cstate","chunkShiftPos","splice","PatternCursor","pos","_log","offset","ok","_blockStartPos","s","pop","block","pushState","bindBlock","_this$block","_this","_pushLeft","_this2","_this3","_this4","_pushRight","_this5","_this6","search","_get","_getPrototypeOf","definitions","_super","_rebuildMask","defs","_maskedBlocks","pattern","unmaskingBlock","optionalBlock","blocks","p","bNames","filter","bName","sort","maskedBlock","isInput","STOP_CHAR","ESCAPE_CHAR","def","maskedState","forEach","bi","_set","every","reduce","_this$_mapPosToBlock","startBlockIndex","d","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","pushRightBeforeInput","popState","pushLeftBeforeInput","pushRightBeforeFilled","pushLeftBeforeRequired","pushLeftBeforeFilled","pushRightBeforeRequired","name","maskedBlocks","indices","gi","InputDefinition","FixedDefinition","MaskedRange","maxLength","to","fromStr","padStart","toStr","sameCharsCount","repeat","minstr","maxstr","_ref2","match","placeholder","num","padEnd","autofix","nextVal","_this$boundaries","boundaries","_this$boundaries2","_get2","firstNonZero","_matchFrom","_this$boundaries3","_this$boundaries4","_len","_key","concat","GET_DEFAULT_BLOCKS","Y","getFullYear","m","getMonth","getDate","bk","date","isDateExist","_str$split2","split","day","month","year","MaskElement","_unsafeSelectionStart","e","_unsafeSelectionEnd","selectionStart","selectionEnd","_unsafeSelect","handlers","HTMLMaskElement","_handlers","_this$input$getRootNo","_this$input$getRootNo2","_this$input","getRootNode","document","rootElement","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","maskEquals","updateOptions","updateControl","val","typedValueEquals","bindEvents","unbindEvents","ev","listeners","l","_cursorChanging","_changingCursorPos","isActive","select","_selection","newUnmaskedValue","newValue","isChanged","_fireChangeEvents","restOpts","updateMask","updateOpts","_delayUpdateCursor","_abortUpdateCursor","setTimeout","_fireEvent","_inputEvent","clearTimeout","hIndex","removed","updateCursor","preventDefault","stopPropagation","_unbindEvents","MaskedEnum","enum","some","_updateRegExps","allowNegative","scale","radix","_numberRegExpInput","_numberRegExp","_mapToRadixRegExp","mapToRadix","_thousandsSeparatorRegExp","thousandsSeparator","parts","noSepCh","_removeThousandsSeparators","prepCh","extendOnSeparators","count","_separatorsCount","_this$_adjustRangeWit","_adjustRangeWithSeparators","_this$_adjustRangeWit2","prevBeforeTailValue","prevBeforeTailSeparatorsCount","_separatorsCountFromSlice","appendDetails","_insertThousandsSeparators","beforeTailValue","beforeTailSeparatorsCount","searchFrom","separatorPos","separatorAroundFromPos","_findSeparatorAround","separatorAroundToPos","_this$_adjustRangeWit3","_this$_adjustRangeWit4","valueBeforePos","valueAfterPos","separatorAtLeftPos","separatorAtLeftEndPos","separatorAtRightPos","valid","test","number","isNaN","validnum","formatted","normalizeZeros","_normalizeZeros","padFractionalZeros","_padFractionalZeros","sign","zeros","n","signed","currentMask","compiledMasks","_applyDispatch","currentMaskFlags","prevValueBeforeTail","inputValue","insertValue","_rawInputValue","tailValue","prevMask","prevMaskState","doDispatch","currentMaskRef","dispatch","currentDetails","_normalizePrepare4","_normalizePrepare3","_this$currentMask","_this$currentMask2","_this$currentMask3","_this$currentMask4","_this$currentMask5","mi","_this$currentMask6","_this$currentMask7","_this$currentMask8","_get3","_len2","_key2","_mask$mi","_this$currentMask9","inputs","weight","i1","i2","PIPE_TYPE","MASKED","UNMASKED","TYPED","createPipe","runIsolated","pipe","pipeArgs","globalThis"],"mappings":"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"}