File: /var/www/elite/node_modules/imask/dist/imask.es.min.js.map
{"version":3,"file":"imask.es.min.js","sources":["../src/core/utils.js","../src/core/action-details.js","../src/core/change-details.js","../src/core/continuous-tail-details.js","../src/masked/base.js","../src/masked/factory.js","../src/masked/pattern/input-definition.js","../src/masked/pattern/fixed-definition.js","../src/masked/pattern/chunk-tail-details.js","../src/masked/pattern.js","../src/masked/range.js","../src/masked/date.js","../src/controls/mask-element.js","../src/controls/html-mask-element.js","../src/controls/input.js","../src/masked/enum.js","../src/masked/number.js","../src/masked/regexp.js","../src/masked/function.js","../src/masked/dynamic.js","../src/imask.js"],"sourcesContent":["// @flow\r\n\r\n\r\n/** Checks if value is string */\r\nexport\r\nfunction isString (str: mixed): boolean %checks {\r\n return typeof str === 'string' || str instanceof String;\r\n}\r\n\r\n/**\r\n Direction\r\n @prop {string} NONE\r\n @prop {string} LEFT\r\n @prop {string} FORCE_LEFT\r\n @prop {string} RIGHT\r\n @prop {string} FORCE_RIGHT\r\n*/\r\nexport\r\nconst DIRECTION = {\r\n NONE: 'NONE',\r\n LEFT: 'LEFT',\r\n FORCE_LEFT: 'FORCE_LEFT',\r\n RIGHT: 'RIGHT',\r\n FORCE_RIGHT: 'FORCE_RIGHT',\r\n}\r\n/**\r\n Direction\r\n @enum {string}\r\n*/\r\nexport\r\ntype Direction = $Values<typeof DIRECTION>;\r\n\r\n/** Returns next char index in direction */\r\nexport\r\nfunction indexInDirection (pos: number, direction: Direction): number {\r\n if (direction === DIRECTION.LEFT) --pos;\r\n return pos;\r\n}\r\n\r\n/** Returns next char position in direction */\r\nexport\r\nfunction posInDirection (pos: number, direction: Direction): number {\r\n switch (direction) {\r\n case DIRECTION.LEFT:\r\n case DIRECTION.FORCE_LEFT:\r\n return --pos;\r\n case DIRECTION.RIGHT:\r\n case DIRECTION.FORCE_RIGHT:\r\n return ++pos;\r\n default:\r\n return pos;\r\n }\r\n}\r\n\r\n/** */\r\nexport\r\nfunction forceDirection (direction: Direction): Direction {\r\n switch (direction) {\r\n case DIRECTION.LEFT:\r\n return DIRECTION.FORCE_LEFT;\r\n case DIRECTION.RIGHT:\r\n return DIRECTION.FORCE_RIGHT;\r\n default:\r\n return direction;\r\n }\r\n}\r\n\r\n/** Escapes regular expression control chars */\r\nexport\r\nfunction escapeRegExp (str: string): string {\r\n return str.replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1');\r\n}\r\n\r\n\r\n// cloned from https://github.com/epoberezkin/fast-deep-equal with small changes\r\nexport\r\nfunction objectIncludes (b: any, a: any): boolean {\r\n if (a === b) return true;\r\n\r\n var arrA = Array.isArray(a)\r\n , arrB = Array.isArray(b)\r\n , i;\r\n\r\n if (arrA && arrB) {\r\n if (a.length != b.length) return false;\r\n for (i = 0; i < a.length; i++)\r\n if (!objectIncludes(a[i], b[i])) return false;\r\n return true;\r\n }\r\n\r\n if (arrA != arrB) return false;\r\n\r\n if (a && b && typeof a === 'object' && typeof b === 'object') {\r\n var dateA = a instanceof Date\r\n , dateB = b instanceof Date;\r\n if (dateA && dateB) return a.getTime() == b.getTime();\r\n if (dateA != dateB) return false;\r\n\r\n var regexpA = a instanceof RegExp\r\n , regexpB = b instanceof RegExp;\r\n if (regexpA && regexpB) return a.toString() == b.toString();\r\n if (regexpA != regexpB) return false;\r\n\r\n var keys = Object.keys(a);\r\n // if (keys.length !== Object.keys(b).length) return false;\r\n\r\n for (i = 0; i < keys.length; i++)\r\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\r\n\r\n for (i = 0; i < keys.length; i++)\r\n if(!objectIncludes(b[keys[i]], a[keys[i]])) return false;\r\n\r\n return true;\r\n } else if (a && b && typeof a === 'function' && typeof b === 'function') {\r\n return a.toString() === b.toString()\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/* eslint-disable no-undef */\r\nexport\r\nconst g: any = typeof window !== 'undefined' && window ||\r\n typeof global !== 'undefined' && global.global === global && global ||\r\n typeof self !== 'undefined' && self.self === self && self ||\r\n {};\r\n/* eslint-enable no-undef */\r\n\r\n/** Selection range */\r\nexport\r\ntype Selection = {\r\n start: number;\r\n end: number;\r\n};\r\n","// @flow\r\nimport {type Direction, type Selection, DIRECTION} from './utils.js';\r\n\r\n\r\n/** Provides details of changing input */\r\nexport default\r\nclass ActionDetails {\r\n /** Current input value */\r\n value: string;\r\n /** Current cursor position */\r\n cursorPos: number;\r\n /** Old input value */\r\n oldValue: string;\r\n /** Old selection */\r\n oldSelection: Selection;\r\n\r\n constructor (\r\n value: string,\r\n cursorPos: number,\r\n oldValue: string,\r\n oldSelection: Selection\r\n ) {\r\n this.value = value;\r\n this.cursorPos = cursorPos;\r\n this.oldValue = oldValue;\r\n this.oldSelection = oldSelection;\r\n\r\n // double check if left part was changed (autofilling, other non-standard input triggers)\r\n while (this.value.slice(0, this.startChangePos) !== this.oldValue.slice(0, this.startChangePos)) {\r\n --this.oldSelection.start;\r\n }\r\n }\r\n\r\n /**\r\n Start changing position\r\n @readonly\r\n */\r\n get startChangePos (): number {\r\n return Math.min(this.cursorPos, this.oldSelection.start);\r\n }\r\n\r\n /**\r\n Inserted symbols count\r\n @readonly\r\n */\r\n get insertedCount (): number {\r\n return this.cursorPos - this.startChangePos;\r\n }\r\n\r\n /**\r\n Inserted symbols\r\n @readonly\r\n */\r\n get inserted (): string {\r\n return this.value.substr(this.startChangePos, this.insertedCount);\r\n }\r\n\r\n /**\r\n Removed symbols count\r\n @readonly\r\n */\r\n get removedCount (): number {\r\n // Math.max for opposite operation\r\n return Math.max((this.oldSelection.end - this.startChangePos) ||\r\n // for Delete\r\n this.oldValue.length - this.value.length, 0);\r\n }\r\n\r\n /**\r\n Removed symbols\r\n @readonly\r\n */\r\n get removed (): string {\r\n return this.oldValue.substr(this.startChangePos, this.removedCount);\r\n }\r\n\r\n /**\r\n Unchanged head symbols\r\n @readonly\r\n */\r\n get head (): string {\r\n return this.value.substring(0, this.startChangePos);\r\n }\r\n\r\n /**\r\n Unchanged tail symbols\r\n @readonly\r\n */\r\n get tail (): string {\r\n return this.value.substring(this.startChangePos + this.insertedCount);\r\n }\r\n\r\n /**\r\n Remove direction\r\n @readonly\r\n */\r\n get removeDirection (): Direction {\r\n if (!this.removedCount || this.insertedCount) return DIRECTION.NONE;\r\n\r\n // align right if delete at right or if range removed (event with backspace)\r\n return (this.oldSelection.end === this.cursorPos || this.oldSelection.start === this.cursorPos) ?\r\n DIRECTION.RIGHT :\r\n DIRECTION.LEFT;\r\n }\r\n}\r\n","// @flow\r\n\r\n\r\n/**\r\n Provides details of changing model value\r\n @param {Object} [details]\r\n @param {string} [details.inserted] - Inserted symbols\r\n @param {boolean} [details.skip] - Can skip chars\r\n @param {number} [details.removeCount] - Removed symbols count\r\n @param {number} [details.tailShift] - Additional offset if any changes occurred before tail\r\n*/\r\nexport default\r\nclass ChangeDetails {\r\n /** Inserted symbols */\r\n inserted: string;\r\n /** Can skip chars */\r\n skip: boolean;\r\n /** Additional offset if any changes occurred before tail */\r\n tailShift: number;\r\n /** Raw inserted is used by dynamic mask */\r\n rawInserted: string;\r\n\r\n constructor (details?: {\r\n inserted?: $PropertyType<ChangeDetails, 'inserted'>,\r\n rawInserted?: $PropertyType<ChangeDetails, 'rawInserted'>,\r\n skip?: $PropertyType<ChangeDetails, 'skip'>,\r\n tailShift?: $PropertyType<ChangeDetails, 'tailShift'>,\r\n }) {\r\n Object.assign(this, {\r\n inserted: '',\r\n rawInserted: '',\r\n skip: false,\r\n tailShift: 0,\r\n }, details);\r\n }\r\n\r\n /**\r\n Aggregate changes\r\n @returns {ChangeDetails} `this`\r\n */\r\n aggregate (details: ChangeDetails): ChangeDetails {\r\n this.rawInserted += details.rawInserted;\r\n this.skip = this.skip || details.skip;\r\n this.inserted += details.inserted;\r\n this.tailShift += details.tailShift;\r\n return this;\r\n }\r\n\r\n /** Total offset considering all changes */\r\n get offset (): number {\r\n return this.tailShift + this.inserted.length;\r\n }\r\n}\r\n","// @flow\r\nimport type { TailDetails, AppendTail } from './tail-details.js';\r\nimport type ChangeDetails from './change-details.js';\r\n\r\n\r\ntype ContinuousTailState = {\r\n value: $PropertyType<ContinuousTailDetails, 'value'>,\r\n from: $PropertyType<ContinuousTailDetails, 'from'>,\r\n stop?: $PropertyType<ContinuousTailDetails, 'stop'>,\r\n};\r\n\r\n/** Provides details of continuous extracted tail */\r\nexport default\r\nclass ContinuousTailDetails implements TailDetails {\r\n /** Tail value as string */\r\n value: string;\r\n /** Tail start position */\r\n from: number;\r\n /** Start position */\r\n stop: ?number;\r\n\r\n constructor (value?: string='', from?: number=0, stop?: number) {\r\n this.value = value;\r\n this.from = from;\r\n this.stop = stop;\r\n }\r\n\r\n toString (): string { return this.value; }\r\n\r\n extend (tail: string | TailDetails): void {\r\n this.value += String(tail);\r\n }\r\n\r\n appendTo (masked: AppendTail): ChangeDetails {\r\n return masked.append(this.toString(), { tail: true })\r\n .aggregate(masked._appendPlaceholder());\r\n }\r\n\r\n get state (): ContinuousTailState {\r\n return {\r\n value: this.value,\r\n from: this.from,\r\n stop: this.stop,\r\n };\r\n }\r\n\r\n set state (state: ContinuousTailState) {\r\n Object.assign(this, state);\r\n }\r\n\r\n shiftBefore (pos: number): string {\r\n if (this.from >= pos || !this.value.length) return '';\r\n\r\n const shiftChar = this.value[0];\r\n this.value = this.value.slice(1);\r\n return shiftChar;\r\n }\r\n}\r\n","// @flow\r\nimport ChangeDetails from '../core/change-details.js';\r\nimport ContinuousTailDetails from '../core/continuous-tail-details.js';\r\nimport { type Direction, DIRECTION, isString } from '../core/utils.js';\r\nimport { type TailDetails } from '../core/tail-details.js';\r\n\r\n\r\n/** Supported mask type */\r\nexport\r\ntype Mask =\r\n string |\r\n String |\r\n RegExp |\r\n Class<Number> |\r\n Class<Date> |\r\n Array<any> |\r\n $PropertyType<Masked<*>, 'validate'> |\r\n Masked<*> |\r\n Class<Masked<*>>;\r\n\r\nexport\r\ntype MaskedState = {|\r\n _value: string,\r\n|};\r\n\r\n/** Append flags */\r\nexport\r\ntype AppendFlags = {\r\n input?: boolean,\r\n tail?: boolean,\r\n raw?: boolean,\r\n _beforeTailState?: any, // TODO types...\r\n};\r\n\r\n/** Extract flags */\r\nexport\r\ntype ExtractFlags = {\r\n raw?: boolean\r\n};\r\n\r\nexport\r\ntype MaskedOptions<MaskType> = {\r\n mask: $PropertyType<Masked<MaskType>, 'mask'>,\r\n parent?: $PropertyType<Masked<*>, 'parent'>,\r\n prepare?: $PropertyType<Masked<MaskType>, 'prepare'>,\r\n validate?: $PropertyType<Masked<MaskType>, 'validate'>,\r\n commit?: $PropertyType<Masked<MaskType>, 'commit'>,\r\n overwrite?: $PropertyType<Masked<MaskType>, 'overwrite'>,\r\n};\r\n\r\n\r\n/** Provides common masking stuff */\r\nexport default\r\nclass Masked<MaskType> {\r\n static DEFAULTS: any; // $Shape<MaskedOptions>; TODO after fix https://github.com/facebook/flow/issues/4773\r\n\r\n /** @type {Mask} */\r\n mask: MaskType;\r\n /** */ // $FlowFixMe no ideas\r\n parent: ?Masked<*>;\r\n /** Transforms value before mask processing */\r\n prepare: (string, Masked<MaskType>, AppendFlags) => string;\r\n /** Validates if value is acceptable */\r\n validate: (string, Masked<MaskType>, AppendFlags) => boolean;\r\n /** Does additional processing in the end of editing */\r\n commit: (string, Masked<MaskType>) => void;\r\n /** Enable characters overwriting */\r\n overwrite: ?boolean;\r\n /** */\r\n isInitialized: boolean;\r\n _value: string;\r\n _refreshing: boolean;\r\n\r\n constructor (opts: {[string]: any}) {\r\n this._value = '';\r\n this._update(opts);\r\n this.isInitialized = true;\r\n }\r\n\r\n /** Sets and applies new options */\r\n updateOptions (opts: {[string]: any}) {\r\n if (!Object.keys(opts).length) return;\r\n this.withValueRefresh(this._update.bind(this, opts));\r\n }\r\n\r\n /**\r\n Sets new options\r\n @protected\r\n */\r\n _update (opts: {[string]: any}) {\r\n Object.assign(this, opts);\r\n }\r\n\r\n /** Mask state */\r\n get state (): any {\r\n return {\r\n _value: this.value,\r\n };\r\n }\r\n\r\n set state (state: any) {\r\n this._value = state._value;\r\n }\r\n\r\n /** Resets value */\r\n reset () {\r\n this._value = '';\r\n }\r\n\r\n /** */\r\n get value (): string {\r\n return this._value;\r\n }\r\n\r\n set value (value: string) {\r\n this.resolve(value);\r\n }\r\n\r\n /** Resolve new value */\r\n resolve (value: string): string {\r\n this.reset();\r\n this.append(value, {input: true}, '');\r\n this.doCommit();\r\n return this.value;\r\n }\r\n\r\n /** */\r\n get unmaskedValue (): string {\r\n return this.value;\r\n }\r\n\r\n set unmaskedValue (value: string) {\r\n this.reset();\r\n this.append(value, {}, '');\r\n this.doCommit();\r\n }\r\n\r\n /** */\r\n get typedValue (): any {\r\n return this.unmaskedValue;\r\n }\r\n\r\n set typedValue (value: any) {\r\n this.unmaskedValue = value;\r\n }\r\n\r\n /** Value that includes raw user input */\r\n get rawInputValue (): string {\r\n return this.extractInput(0, this.value.length, {raw: true});\r\n }\r\n\r\n set rawInputValue (value: string) {\r\n this.reset();\r\n this.append(value, {raw: true}, '');\r\n this.doCommit();\r\n }\r\n\r\n /** */\r\n get isComplete (): boolean {\r\n return true;\r\n }\r\n\r\n /** Finds nearest input position in direction */\r\n nearestInputPos (cursorPos: number, direction?: Direction): number {\r\n return cursorPos;\r\n }\r\n\r\n /** Extracts value in range considering flags */\r\n extractInput (fromPos?: number=0, toPos?: number=this.value.length, flags?: ExtractFlags): string {\r\n return this.value.slice(fromPos, toPos);\r\n }\r\n\r\n /** Extracts tail in range */\r\n extractTail (fromPos?: number=0, toPos?: number=this.value.length): TailDetails {\r\n return new ContinuousTailDetails(this.extractInput(fromPos, toPos), fromPos);\r\n }\r\n\r\n /** Appends tail */\r\n // $FlowFixMe no ideas\r\n appendTail (tail: string | TailDetails): ChangeDetails {\r\n if (isString(tail)) tail = new ContinuousTailDetails(String(tail));\r\n\r\n return tail.appendTo(this);\r\n }\r\n\r\n /** Appends char */\r\n _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\r\n ch = this.doPrepare(ch, flags);\r\n if (!ch) return new ChangeDetails();\r\n\r\n this._value += ch;\r\n return new ChangeDetails({\r\n inserted: ch,\r\n rawInserted: ch,\r\n });\r\n }\r\n\r\n /** Appends char */\r\n _appendChar (ch: string, flags: AppendFlags={}, checkTail?: TailDetails): ChangeDetails {\r\n const consistentState: MaskedState = this.state;\r\n const details: ChangeDetails = this._appendCharRaw(ch, flags);\r\n\r\n if (details.inserted) {\r\n let consistentTail;\r\n let appended = this.doValidate(flags) !== false;\r\n\r\n if (appended && checkTail != null) {\r\n // validation ok, check tail\r\n const beforeTailState = this.state;\r\n if (this.overwrite) {\r\n consistentTail = checkTail.state;\r\n checkTail.shiftBefore(this.value.length);\r\n }\r\n\r\n const tailDetails = this.appendTail(checkTail);\r\n\r\n appended = tailDetails.rawInserted === checkTail.toString();\r\n\r\n // if ok, rollback state after tail\r\n if (appended && tailDetails.inserted) this.state = beforeTailState;\r\n }\r\n\r\n // revert all if something went wrong\r\n if (!appended) {\r\n details.rawInserted = details.inserted = '';\r\n this.state = consistentState;\r\n if (checkTail && consistentTail) checkTail.state = consistentTail;\r\n }\r\n }\r\n return details;\r\n }\r\n\r\n /** Appends optional placeholder at end */\r\n _appendPlaceholder (): ChangeDetails {\r\n return new ChangeDetails();\r\n }\r\n\r\n /** Appends symbols considering flags */\r\n // $FlowFixMe no ideas\r\n append (str: string, flags?: AppendFlags, tail?: string | TailDetails): ChangeDetails {\r\n if (!isString(str)) throw new Error('value should be string');\r\n const details = new ChangeDetails();\r\n const checkTail = isString(tail) ? new ContinuousTailDetails(String(tail)) : tail;\r\n if (flags.tail) flags._beforeTailState = this.state;\r\n\r\n for (let ci=0; ci<str.length; ++ci) {\r\n details.aggregate(this._appendChar(str[ci], flags, checkTail));\r\n }\r\n\r\n // append tail but aggregate only tailShift\r\n if (checkTail != null) {\r\n details.tailShift += this.appendTail(checkTail).tailShift;\r\n // TODO it's a good idea to clear state after appending ends\r\n // but it causes bugs when one append calls another (when dynamic dispatch set rawInputValue)\r\n // this._resetBeforeTailState();\r\n }\r\n\r\n return details;\r\n }\r\n\r\n /** */\r\n remove (fromPos?: number=0, toPos?: number=this.value.length): ChangeDetails {\r\n this._value = this.value.slice(0, fromPos) + this.value.slice(toPos);\r\n return new ChangeDetails();\r\n }\r\n\r\n /** Calls function and reapplies current value */\r\n withValueRefresh<T>(fn: () => T): T {\r\n if (this._refreshing || !this.isInitialized) return fn();\r\n this._refreshing = true;\r\n\r\n const unmasked = this.unmaskedValue;\r\n const value = this.value;\r\n\r\n const ret = fn();\r\n\r\n // try to update with raw value first to keep fixed chars\r\n if (this.resolve(value) !== value) {\r\n // or fallback to unmasked\r\n this.unmaskedValue = unmasked;\r\n }\r\n\r\n delete this._refreshing;\r\n return ret;\r\n }\r\n\r\n /**\r\n Prepares string before mask processing\r\n @protected\r\n */\r\n doPrepare (str: string, flags: AppendFlags={}): string {\r\n return this.prepare ?\r\n this.prepare(str, this, flags) :\r\n str;\r\n }\r\n\r\n /**\r\n Validates if value is acceptable\r\n @protected\r\n */\r\n doValidate (flags: AppendFlags): boolean {\r\n return (!this.validate || this.validate(this.value, this, flags)) &&\r\n (!this.parent || this.parent.doValidate(flags));\r\n }\r\n\r\n /**\r\n Does additional processing in the end of editing\r\n @protected\r\n */\r\n doCommit () {\r\n if (this.commit) this.commit(this.value, this);\r\n }\r\n\r\n /** */\r\n splice (start: number, deleteCount: number, inserted: string, removeDirection: Direction): ChangeDetails {\r\n const tailPos: number = start + deleteCount;\r\n const tail: TailDetails = this.extractTail(tailPos);\r\n\r\n let startChangePos: number = this.nearestInputPos(start, removeDirection);\r\n const changeDetails: ChangeDetails = new ChangeDetails({\r\n tailShift: startChangePos - start // adjust tailShift if start was aligned\r\n }).aggregate(this.remove(startChangePos))\r\n .aggregate(this.append(inserted, {input: true}, tail));\r\n\r\n return changeDetails;\r\n }\r\n}\r\n","// @flow\r\nimport {g, isString} from '../core/utils.js';\r\nimport type Masked from './base.js';\r\nimport {type Mask} from './base.js';\r\n\r\n\r\n/** Get Masked class by mask type */\r\nexport\r\nfunction maskedClass (mask: Mask): Class<Masked<*>> {\r\n if (mask == null) {\r\n throw new Error('mask property should be defined');\r\n }\r\n\r\n if (mask instanceof RegExp) return g.IMask.MaskedRegExp;\r\n if (isString(mask)) return g.IMask.MaskedPattern;\r\n if (mask instanceof Date || mask === Date) return g.IMask.MaskedDate;\r\n if (mask instanceof Number || typeof mask === 'number' || mask === Number) return g.IMask.MaskedNumber;\r\n if (Array.isArray(mask) || mask === Array) return g.IMask.MaskedDynamic;\r\n // $FlowFixMe\r\n if (mask.prototype instanceof g.IMask.Masked) return mask;\r\n // $FlowFixMe\r\n if (mask instanceof Function) return g.IMask.MaskedFunction;\r\n\r\n console.warn('Mask not found for mask', mask); // eslint-disable-line no-console\r\n return g.IMask.Masked;\r\n}\r\n\r\n/** Creates new {@link Masked} depending on mask type */\r\nexport default\r\nfunction createMask (opts: {mask: Mask}): Masked<*> {\r\n opts = {...opts};\r\n const mask = opts.mask;\r\n\r\n if (mask instanceof g.IMask.Masked) return mask;\r\n\r\n const MaskedClass = maskedClass(mask);\r\n return new MaskedClass(opts);\r\n}\r\n","// @flow\r\nimport createMask from '../factory.js';\r\nimport type Masked from '../base.js';\r\nimport type MaskedPattern from '../pattern.js';\r\nimport {type TailDetails} from '../../core/tail-details.js';\r\nimport {type Mask, type ExtractFlags, type AppendFlags} from '../base.js';\r\nimport ChangeDetails from '../../core/change-details.js';\r\nimport {DIRECTION, type Direction} from '../../core/utils.js';\r\nimport {type PatternBlock} from './block.js';\r\n\r\n\r\nexport\r\ntype Definitions = {[string]: Mask};\r\n\r\n/** */\r\ntype PatternInputDefinitionOptions = {\r\n parent: $PropertyType<PatternInputDefinition, 'parent'>,\r\n mask: Mask,\r\n isOptional: $PropertyType<PatternInputDefinition, 'isOptional'>,\r\n lazy: $PropertyType<PatternInputDefinition, 'lazy'>,\r\n placeholderChar: $PropertyType<PatternInputDefinition, 'placeholderChar'>,\r\n};\r\n\r\ntype PatternInputDefinitionState = {\r\n masked: *,\r\n _isFilled: boolean,\r\n};\r\n\r\nexport\r\nconst DEFAULT_INPUT_DEFINITIONS = {\r\n '0': /\\d/,\r\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\r\n '*': /./\r\n};\r\n\r\n\r\n/** */\r\nexport default\r\nclass PatternInputDefinition implements PatternBlock {\r\n /** */\r\n +masked: Masked<*>;\r\n /** */\r\n parent: Masked<*>;\r\n /** */\r\n isOptional: boolean;\r\n /** */\r\n _isFilled: boolean;\r\n /** */\r\n lazy: $PropertyType<MaskedPattern, 'lazy'>;\r\n /** */\r\n placeholderChar: $PropertyType<MaskedPattern, 'placeholderChar'>;\r\n\r\n\r\n constructor(opts: PatternInputDefinitionOptions) {\r\n const {mask, ...blockOpts} = opts;\r\n\r\n this.masked = createMask({mask});\r\n Object.assign(this, blockOpts);\r\n }\r\n\r\n reset () {\r\n this._isFilled = false;\r\n this.masked.reset();\r\n }\r\n\r\n remove (fromPos?: number=0, toPos?: number=this.value.length): ChangeDetails {\r\n if (fromPos === 0 && toPos >= 1) {\r\n this._isFilled = false;\r\n return this.masked.remove(fromPos, toPos);\r\n }\r\n\r\n return new ChangeDetails();\r\n }\r\n\r\n get value (): string {\r\n return this.masked.value ||\r\n (this._isFilled && !this.isOptional ?\r\n this.placeholderChar :\r\n '');\r\n }\r\n\r\n get unmaskedValue (): string {\r\n return this.masked.unmaskedValue;\r\n }\r\n\r\n get isComplete (): boolean {\r\n return Boolean(this.masked.value) || this.isOptional;\r\n }\r\n\r\n _appendChar (str: string, flags: AppendFlags={}): ChangeDetails {\r\n if (this._isFilled) return new ChangeDetails();\r\n\r\n const state = this.masked.state;\r\n // simulate input\r\n const details = this.masked._appendChar(str, flags);\r\n\r\n if (details.inserted && this.doValidate(flags) === false) {\r\n details.inserted = details.rawInserted = '';\r\n this.masked.state = state;\r\n }\r\n\r\n if (!details.inserted && !this.isOptional && !this.lazy && !flags.input) {\r\n details.inserted = this.placeholderChar;\r\n }\r\n details.skip = !details.inserted && !this.isOptional;\r\n this._isFilled = Boolean(details.inserted);\r\n\r\n return details;\r\n }\r\n\r\n append (...args: *): ChangeDetails {\r\n return this.masked.append(...args);\r\n }\r\n\r\n _appendPlaceholder (): ChangeDetails {\r\n const details = new ChangeDetails();\r\n\r\n if (this._isFilled || this.isOptional) return details;\r\n\r\n this._isFilled = true;\r\n details.inserted = this.placeholderChar;\r\n return details;\r\n }\r\n\r\n extractTail (...args: *): TailDetails {\r\n return this.masked.extractTail(...args);\r\n }\r\n\r\n appendTail (...args: *): ChangeDetails {\r\n return this.masked.appendTail(...args);\r\n }\r\n\r\n extractInput (fromPos?: number=0, toPos?: number=this.value.length, flags?: ExtractFlags): string {\r\n return this.masked.extractInput(fromPos, toPos, flags);\r\n }\r\n\r\n nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\r\n const minPos = 0;\r\n const maxPos = this.value.length;\r\n const boundPos = Math.min(Math.max(cursorPos, minPos), maxPos);\r\n\r\n switch (direction) {\r\n case DIRECTION.LEFT:\r\n case DIRECTION.FORCE_LEFT:\r\n return this.isComplete ? boundPos : minPos;\r\n case DIRECTION.RIGHT:\r\n case DIRECTION.FORCE_RIGHT:\r\n return this.isComplete ? boundPos : maxPos;\r\n case DIRECTION.NONE:\r\n default: return boundPos;\r\n }\r\n }\r\n\r\n doValidate (...args: *) {\r\n return this.masked.doValidate(...args) && (\r\n !this.parent || this.parent.doValidate(...args));\r\n }\r\n\r\n doCommit () {\r\n this.masked.doCommit();\r\n }\r\n\r\n get state (): PatternInputDefinitionState {\r\n return {\r\n masked: this.masked.state,\r\n _isFilled: this._isFilled,\r\n };\r\n }\r\n\r\n set state (state: PatternInputDefinitionState) {\r\n this.masked.state = state.masked;\r\n this._isFilled = state._isFilled;\r\n }\r\n}\r\n","// @flow\r\nimport ChangeDetails from '../../core/change-details.js';\r\nimport { DIRECTION, type Direction, isString } from '../../core/utils.js';\r\nimport { type TailDetails } from '../../core/tail-details.js';\r\nimport ContinuousTailDetails from '../../core/continuous-tail-details.js';\r\nimport { type ExtractFlags, type AppendFlags, type MaskedState } from '../base.js';\r\nimport { type PatternBlock } from './block.js';\r\n\r\n\r\n/** */\r\ntype PatternFixedDefinitionOptions = {\r\n char: $PropertyType<PatternFixedDefinition, 'char'>,\r\n isUnmasking?: $PropertyType<PatternFixedDefinition, 'isUnmasking'>,\r\n};\r\n\r\ntype PatternFixedDefinitionState = {|\r\n ...MaskedState,\r\n _isRawInput: ?boolean,\r\n|};\r\n\r\nexport default\r\nclass PatternFixedDefinition implements PatternBlock {\r\n /** */\r\n _value: string;\r\n /** */\r\n char: string;\r\n /** */\r\n isUnmasking: ?boolean;\r\n /** */\r\n _isRawInput: ?boolean;\r\n\r\n constructor(opts: PatternFixedDefinitionOptions) {\r\n Object.assign(this, opts);\r\n this._value = '';\r\n }\r\n\r\n get value (): string {\r\n return this._value;\r\n }\r\n\r\n get unmaskedValue (): string {\r\n return this.isUnmasking ? this.value : '';\r\n }\r\n\r\n reset () {\r\n this._isRawInput = false;\r\n this._value = '';\r\n }\r\n\r\n remove (fromPos?: number=0, toPos?: number=this._value.length): ChangeDetails {\r\n this._value = this._value.slice(0, fromPos) + this._value.slice(toPos);\r\n if (!this._value) this._isRawInput = false;\r\n\r\n return new ChangeDetails();\r\n }\r\n\r\n nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\r\n const minPos = 0;\r\n const maxPos = this._value.length;\r\n\r\n switch (direction) {\r\n case DIRECTION.LEFT:\r\n case DIRECTION.FORCE_LEFT:\r\n return minPos;\r\n case DIRECTION.NONE:\r\n case DIRECTION.RIGHT:\r\n case DIRECTION.FORCE_RIGHT:\r\n default: return maxPos;\r\n }\r\n }\r\n\r\n extractInput (fromPos?: number=0, toPos?: number=this._value.length, flags?: ExtractFlags={}) {\r\n return flags.raw && this._isRawInput && this._value.slice(fromPos, toPos) || '';\r\n }\r\n\r\n get isComplete (): boolean {\r\n return true;\r\n }\r\n\r\n _appendChar (str: string, flags?: AppendFlags={}) {\r\n const details = new ChangeDetails();\r\n\r\n if (this._value) return details;\r\n\r\n const appended = this.char === str[0];\r\n const isResolved = appended && (this.isUnmasking || flags.input || flags.raw) && !flags.tail;\r\n if (isResolved) details.rawInserted = this.char;\r\n this._value = details.inserted = this.char;\r\n this._isRawInput = isResolved && (flags.raw || flags.input);\r\n\r\n return details;\r\n }\r\n\r\n _appendPlaceholder (): ChangeDetails {\r\n const details = new ChangeDetails();\r\n if (this._value) return details;\r\n\r\n this._value = details.inserted = this.char;\r\n return details;\r\n }\r\n\r\n extractTail (fromPos?: number=0, toPos?: number=this.value.length): TailDetails {\r\n return new ContinuousTailDetails('');\r\n }\r\n\r\n // $FlowFixMe no ideas\r\n appendTail (tail: string | TailDetails): ChangeDetails {\r\n if (isString(tail)) tail = new ContinuousTailDetails(String(tail));\r\n\r\n return tail.appendTo(this);\r\n }\r\n\r\n append (str: string, flags?: AppendFlags, tail?: TailDetails): ChangeDetails {\r\n const details = this._appendChar(str, flags);\r\n\r\n if (tail != null) {\r\n details.tailShift += this.appendTail(tail).tailShift;\r\n }\r\n\r\n return details;\r\n }\r\n\r\n doCommit () {}\r\n\r\n get state (): PatternFixedDefinitionState {\r\n return {\r\n _value: this._value,\r\n _isRawInput: this._isRawInput,\r\n };\r\n }\r\n\r\n set state (state: PatternFixedDefinitionState) {\r\n Object.assign(this, state);\r\n }\r\n}\r\n","// @flow\r\nimport { g } from '../../core/utils.js';\r\nimport type { TailDetails, AppendTail } from '../../core/tail-details.js';\r\nimport ChangeDetails from '../../core/change-details.js';\r\nimport { isString } from '../../core/utils.js';\r\nimport ContinuousTailDetails from '../../core/continuous-tail-details.js';\r\n\r\n\r\ntype ChunksTailState = {\r\n chunks: $PropertyType<ChunksTailDetails, 'chunks'>,\r\n from: $PropertyType<ChunksTailDetails, 'from'>,\r\n stop?: $PropertyType<ChunksTailDetails, 'stop'>,\r\n blockIndex?: $PropertyType<ChunksTailDetails, 'blockIndex'>,\r\n};\r\n\r\nexport default\r\nclass ChunksTailDetails implements TailDetails {\r\n chunks: Array<TailDetails>;\r\n from: number;\r\n stop: ?number;\r\n /** */\r\n blockIndex: ?number;\r\n\r\n constructor (chunks?: Array<TailDetails>=[], from?: number=0) {\r\n this.chunks = chunks;\r\n this.from = from;\r\n }\r\n\r\n toString (): string {\r\n return this.chunks.map(String).join('');\r\n }\r\n\r\n // $FlowFixMe no ideas\r\n extend (tailChunk: string | TailDetails): void {\r\n if (!String(tailChunk)) return;\r\n if (isString(tailChunk)) tailChunk = new ContinuousTailDetails(String(tailChunk));\r\n\r\n const lastChunk = this.chunks[this.chunks.length-1];\r\n const extendLast = lastChunk &&\r\n // if stops are same or tail has no stop\r\n (lastChunk.stop === tailChunk.stop || tailChunk.stop == null) &&\r\n // if tail chunk goes just after last chunk\r\n tailChunk.from === (lastChunk.from + lastChunk.toString().length);\r\n\r\n if (tailChunk instanceof ContinuousTailDetails) {\r\n // check the ability to extend previous chunk\r\n if (extendLast) {\r\n // extend previous chunk\r\n lastChunk.extend(tailChunk.toString());\r\n } else {\r\n // append new chunk\r\n this.chunks.push(tailChunk);\r\n }\r\n } else if (tailChunk instanceof ChunksTailDetails) {\r\n if (tailChunk.stop == null) {\r\n // unwrap floating chunks to parent, keeping `from` pos\r\n let firstTailChunk;\r\n while (tailChunk.chunks.length && tailChunk.chunks[0].stop == null) {\r\n firstTailChunk = tailChunk.chunks.shift();\r\n firstTailChunk.from += tailChunk.from;\r\n this.extend(firstTailChunk);\r\n }\r\n }\r\n\r\n // if tail chunk still has value\r\n if (tailChunk.toString()) {\r\n // if chunks contains stops, then popup stop to container\r\n tailChunk.stop = tailChunk.blockIndex;\r\n this.chunks.push(tailChunk);\r\n }\r\n }\r\n }\r\n\r\n appendTo (masked: AppendTail): ChangeDetails {\r\n if (!(masked instanceof g.IMask.MaskedPattern)) {\r\n const tail = new ContinuousTailDetails(this.toString());\r\n return tail.appendTo(masked);\r\n }\r\n\r\n const details = new ChangeDetails();\r\n\r\n for (let ci=0; ci < this.chunks.length && !details.skip; ++ci) {\r\n const chunk = this.chunks[ci];\r\n\r\n const lastBlockIter = masked._mapPosToBlock(masked.value.length);\r\n const stop = chunk.stop;\r\n let chunkBlock;\r\n if (stop &&\r\n // if block not found or stop is behind lastBlock\r\n (!lastBlockIter || lastBlockIter.index <= stop)\r\n ) {\r\n if (\r\n chunk instanceof ChunksTailDetails ||\r\n // for continuous block also check if stop is exist\r\n masked._stops.indexOf(stop) >= 0\r\n ) {\r\n details.aggregate(masked._appendPlaceholder(stop));\r\n }\r\n chunkBlock = chunk instanceof ChunksTailDetails && masked._blocks[stop];\r\n }\r\n\r\n if (chunkBlock) {\r\n const tailDetails = chunkBlock.appendTail(chunk);\r\n tailDetails.skip = false; // always ignore skip, it will be set on last\r\n details.aggregate(tailDetails);\r\n masked._value += tailDetails.inserted;\r\n\r\n // get not inserted chars\r\n const remainChars = chunk.toString().slice(tailDetails.rawInserted.length);\r\n if (remainChars) details.aggregate(masked.append(remainChars, { tail: true }));\r\n } else {\r\n details.aggregate(masked.append(chunk.toString(), { tail: true }));\r\n }\r\n };\r\n\r\n return details;\r\n }\r\n\r\n get state (): ChunksTailState {\r\n return {\r\n chunks: this.chunks.map(c => c.state),\r\n from: this.from,\r\n stop: this.stop,\r\n blockIndex: this.blockIndex,\r\n };\r\n }\r\n\r\n set state (state: ChunksTailState) {\r\n const { chunks, ...props } = state;\r\n Object.assign(this, props);\r\n this.chunks = chunks.map(cstate => {\r\n const chunk = \"chunks\" in cstate ?\r\n new ChunksTailDetails() :\r\n new ContinuousTailDetails();\r\n // $FlowFixMe already checked above\r\n chunk.state = cstate;\r\n return chunk;\r\n });\r\n }\r\n\r\n shiftBefore (pos: number): string {\r\n if (this.from >= pos || !this.chunks.length) return '';\r\n\r\n const chunkShiftPos = pos - this.from;\r\n let ci=0;\r\n while (ci < this.chunks.length) {\r\n const chunk = this.chunks[ci];\r\n const shiftChar = chunk.shiftBefore(chunkShiftPos);\r\n\r\n if (chunk.toString()) {\r\n // chunk still contains value\r\n // but not shifted - means no more available chars to shift\r\n if (!shiftChar) break;\r\n ++ci;\r\n } else {\r\n // clean if chunk has no value\r\n this.chunks.splice(ci, 1);\r\n }\r\n\r\n if (shiftChar) return shiftChar;\r\n }\r\n\r\n return '';\r\n }\r\n}\r\n","// @flow\r\nimport {DIRECTION, type Direction, forceDirection} from '../core/utils.js';\r\nimport ChangeDetails from '../core/change-details.js';\r\nimport Masked, {type AppendFlags, type ExtractFlags, type MaskedOptions, type MaskedState} from './base.js';\r\nimport PatternInputDefinition, {DEFAULT_INPUT_DEFINITIONS, type Definitions} from './pattern/input-definition.js';\r\nimport PatternFixedDefinition from './pattern/fixed-definition.js';\r\nimport { type TailDetails } from '../core/tail-details.js';\r\nimport ChunksTailDetails from './pattern/chunk-tail-details.js';\r\nimport ContinuousTailDetails from '../core/continuous-tail-details.js';\r\nimport {type PatternBlock} from './pattern/block.js';\r\nimport createMask from './factory.js';\r\n\r\n\r\ntype MaskedPatternOptions = {\r\n ...MaskedOptions<string>,\r\n definitions?: $PropertyType<MaskedPattern, 'definitions'>,\r\n blocks?: $PropertyType<MaskedPattern, 'blocks'>,\r\n placeholderChar?: $PropertyType<MaskedPattern, 'placeholderChar'>,\r\n lazy?: $PropertyType<MaskedPattern, 'lazy'>,\r\n};\r\n\r\ntype MaskedPatternState = {|\r\n ...MaskedState,\r\n _blocks: Array<*>,\r\n|};\r\n\r\ntype BlockPosData = {\r\n index: number,\r\n offset: number,\r\n};\r\n\r\n/**\r\n Pattern mask\r\n @param {Object} opts\r\n @param {Object} opts.blocks\r\n @param {Object} opts.definitions\r\n @param {string} opts.placeholderChar\r\n @param {boolean} opts.lazy\r\n*/\r\nexport default\r\nclass MaskedPattern extends Masked<string> {\r\n static DEFAULTS: any;\r\n static STOP_CHAR: string;\r\n static ESCAPE_CHAR: string;\r\n static InputDefinition: Class<PatternInputDefinition>;\r\n static FixedDefinition: Class<PatternFixedDefinition>;\r\n\r\n /** */\r\n blocks: {[string]: Masked<*>};\r\n /** */\r\n definitions: Definitions;\r\n /** Single char for empty input */\r\n placeholderChar: string;\r\n /** Show placeholder only when needed */\r\n lazy: boolean;\r\n _blocks: Array<PatternBlock>;\r\n _maskedBlocks: {[string]: Array<number>};\r\n _stops: Array<number>;\r\n\r\n constructor (opts: any={}) { // TODO type $Shape<MaskedPatternOptions>={} does not work\r\n opts.definitions = Object.assign({}, DEFAULT_INPUT_DEFINITIONS, opts.definitions);\r\n super({\r\n ...MaskedPattern.DEFAULTS,\r\n ...opts,\r\n });\r\n }\r\n\r\n /**\r\n @override\r\n @param {Object} opts\r\n */\r\n _update (opts: $Shape<MaskedPatternOptions>={}) {\r\n opts.definitions = Object.assign({}, this.definitions, opts.definitions);\r\n super._update(opts);\r\n this._rebuildMask();\r\n }\r\n\r\n /** */\r\n _rebuildMask () {\r\n const defs = this.definitions;\r\n this._blocks = [];\r\n this._stops = [];\r\n this._maskedBlocks = {};\r\n\r\n let pattern = this.mask;\r\n if (!pattern || !defs) return;\r\n\r\n let unmaskingBlock = false;\r\n let optionalBlock = false;\r\n\r\n for (let i=0; i<pattern.length; ++i) {\r\n if (this.blocks) {\r\n const p = pattern.slice(i);\r\n const bNames = Object.keys(this.blocks).filter(bName => p.indexOf(bName) === 0);\r\n // order by key length\r\n bNames.sort((a, b) => b.length - a.length);\r\n // use block name with max length\r\n const bName = bNames[0];\r\n if (bName) {\r\n const maskedBlock = createMask({\r\n parent: this,\r\n lazy: this.lazy,\r\n placeholderChar: this.placeholderChar,\r\n overwrite: this.overwrite,\r\n ...this.blocks[bName]\r\n });\r\n\r\n if (maskedBlock) {\r\n this._blocks.push(maskedBlock);\r\n\r\n // store block index\r\n if (!this._maskedBlocks[bName]) this._maskedBlocks[bName] = [];\r\n this._maskedBlocks[bName].push(this._blocks.length - 1);\r\n }\r\n\r\n i += bName.length - 1;\r\n continue;\r\n }\r\n }\r\n\r\n let char = pattern[i];\r\n let isInput = char in defs;\r\n\r\n if (char === MaskedPattern.STOP_CHAR) {\r\n this._stops.push(this._blocks.length);\r\n continue;\r\n }\r\n\r\n if (char === '{' || char === '}') {\r\n unmaskingBlock = !unmaskingBlock;\r\n continue;\r\n }\r\n\r\n if (char === '[' || char === ']') {\r\n optionalBlock = !optionalBlock;\r\n continue;\r\n }\r\n\r\n if (char === MaskedPattern.ESCAPE_CHAR) {\r\n ++i;\r\n char = pattern[i];\r\n if (!char) break;\r\n isInput = false;\r\n }\r\n\r\n const def = isInput ?\r\n new PatternInputDefinition({\r\n parent: this,\r\n lazy: this.lazy,\r\n placeholderChar: this.placeholderChar,\r\n mask: defs[char],\r\n isOptional: optionalBlock,\r\n }) :\r\n new PatternFixedDefinition({\r\n char,\r\n isUnmasking: unmaskingBlock,\r\n });\r\n\r\n this._blocks.push(def);\r\n }\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get state (): MaskedPatternState {\r\n return {\r\n ...super.state,\r\n _blocks: this._blocks.map(b => b.state),\r\n };\r\n }\r\n\r\n set state (state: MaskedPatternState) {\r\n const {_blocks, ...maskedState} = state;\r\n this._blocks.forEach((b, bi) => b.state = _blocks[bi]);\r\n super.state = maskedState;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n reset () {\r\n super.reset();\r\n this._blocks.forEach(b => b.reset());\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get isComplete (): boolean {\r\n return this._blocks.every(b => b.isComplete);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n doCommit () {\r\n this._blocks.forEach(b => b.doCommit());\r\n super.doCommit();\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get unmaskedValue (): string {\r\n return this._blocks.reduce((str, b) => str += b.unmaskedValue, '');\r\n }\r\n\r\n set unmaskedValue (unmaskedValue: string) {\r\n super.unmaskedValue = unmaskedValue;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get value (): string {\r\n // TODO return _value when not in change?\r\n return this._blocks.reduce((str, b) => str += b.value, '');\r\n }\r\n\r\n set value (value: string) {\r\n super.value = value;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n appendTail (tail: string | TailDetails): ChangeDetails {\r\n return super.appendTail(tail).aggregate(this._appendPlaceholder());\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\r\n ch = this.doPrepare(ch, flags);\r\n const blockIter = this._mapPosToBlock(this.value.length);\r\n const details = new ChangeDetails();\r\n if (!blockIter) return details;\r\n\r\n for (let bi=blockIter.index; ; ++bi) {\r\n const block = this._blocks[bi];\r\n if (!block) break;\r\n\r\n const blockDetails = block._appendChar(ch, flags);\r\n\r\n const skip = blockDetails.skip;\r\n details.aggregate(blockDetails);\r\n\r\n if (skip || blockDetails.rawInserted) break; // go next char\r\n }\r\n\r\n return details;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n extractTail (fromPos?: number=0, toPos?: number=this.value.length): ChunksTailDetails {\r\n const chunkTail = new ChunksTailDetails();\r\n if (fromPos === toPos) return chunkTail;\r\n\r\n this._forEachBlocksInRange(fromPos, toPos, (b, bi, bFromPos, bToPos) => {\r\n const blockChunk = b.extractTail(bFromPos, bToPos);\r\n blockChunk.stop = this._findStopBefore(bi);\r\n blockChunk.from = this._blockStartPos(bi);\r\n if (blockChunk instanceof ChunksTailDetails) blockChunk.blockIndex = bi;\r\n\r\n chunkTail.extend(blockChunk);\r\n });\r\n\r\n return chunkTail;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n extractInput (fromPos?: number=0, toPos?: number=this.value.length, flags: ExtractFlags={}): string {\r\n if (fromPos === toPos) return '';\r\n\r\n let input = '';\r\n\r\n this._forEachBlocksInRange(fromPos, toPos, (b, _, fromPos, toPos) => {\r\n input += b.extractInput(fromPos, toPos, flags);\r\n });\r\n\r\n return input;\r\n }\r\n\r\n _findStopBefore (blockIndex: number): ?number {\r\n let stopBefore;\r\n for (let si=0; si<this._stops.length; ++si) {\r\n const stop = this._stops[si];\r\n if (stop <= blockIndex) stopBefore = stop;\r\n else break;\r\n }\r\n return stopBefore;\r\n }\r\n\r\n /** Appends placeholder depending on laziness */\r\n _appendPlaceholder (toBlockIndex: ?number): ChangeDetails {\r\n const details = new ChangeDetails();\r\n if (this.lazy && toBlockIndex == null) return details;\r\n\r\n const startBlockIter = this._mapPosToBlock(this.value.length);\r\n if (!startBlockIter) return details;\r\n\r\n const startBlockIndex = startBlockIter.index;\r\n const endBlockIndex = toBlockIndex != null ? toBlockIndex : this._blocks.length;\r\n\r\n this._blocks.slice(startBlockIndex, endBlockIndex)\r\n .forEach(b => {\r\n if (!b.lazy || toBlockIndex != null) {\r\n // $FlowFixMe `_blocks` may not be present\r\n const args = b._blocks != null ? [b._blocks.length] : [];\r\n const bDetails = b._appendPlaceholder(...args);\r\n this._value += bDetails.inserted;\r\n details.aggregate(bDetails);\r\n }\r\n });\r\n\r\n return details;\r\n }\r\n\r\n /** Finds block in pos */\r\n _mapPosToBlock (pos: number): ?BlockPosData {\r\n let accVal = '';\r\n for (let bi=0; bi<this._blocks.length; ++bi) {\r\n const block = this._blocks[bi];\r\n const blockStartPos = accVal.length;\r\n\r\n accVal += block.value;\r\n\r\n if (pos <= accVal.length) {\r\n return {\r\n index: bi,\r\n offset: pos - blockStartPos,\r\n };\r\n }\r\n }\r\n }\r\n\r\n /** */\r\n _blockStartPos (blockIndex: number): number {\r\n return this._blocks\r\n .slice(0, blockIndex)\r\n .reduce((pos, b) => pos += b.value.length, 0);\r\n }\r\n\r\n /** */\r\n _forEachBlocksInRange (fromPos: number, toPos: number=this.value.length, fn: (block: PatternBlock, blockIndex: number, fromPos: number, toPos: number) => void) {\r\n const fromBlockIter = this._mapPosToBlock(fromPos);\r\n\r\n if (fromBlockIter) {\r\n const toBlockIter = this._mapPosToBlock(toPos);\r\n // process first block\r\n const isSameBlock = toBlockIter && fromBlockIter.index === toBlockIter.index;\r\n const fromBlockStartPos = fromBlockIter.offset;\r\n const fromBlockEndPos = toBlockIter && isSameBlock ?\r\n toBlockIter.offset :\r\n this._blocks[fromBlockIter.index].value.length;\r\n fn(this._blocks[fromBlockIter.index], fromBlockIter.index, fromBlockStartPos, fromBlockEndPos);\r\n\r\n if (toBlockIter && !isSameBlock) {\r\n // process intermediate blocks\r\n for (let bi=fromBlockIter.index+1; bi<toBlockIter.index; ++bi) {\r\n fn(this._blocks[bi], bi, 0, this._blocks[bi].value.length);\r\n }\r\n\r\n // process last block\r\n fn(this._blocks[toBlockIter.index], toBlockIter.index, 0, toBlockIter.offset);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n remove (fromPos: number=0, toPos: number=this.value.length): ChangeDetails {\r\n const removeDetails = super.remove(fromPos, toPos);\r\n this._forEachBlocksInRange(fromPos, toPos, (b, _, bFromPos, bToPos) => {\r\n removeDetails.aggregate(b.remove(bFromPos, bToPos));\r\n });\r\n return removeDetails;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n nearestInputPos (cursorPos: number, direction: Direction=DIRECTION.NONE): number {\r\n // TODO refactor - extract alignblock\r\n\r\n const beginBlockData = this._mapPosToBlock(cursorPos) || {index: 0, offset: 0};\r\n const {\r\n offset: beginBlockOffset,\r\n index: beginBlockIndex,\r\n } = beginBlockData;\r\n const beginBlock = this._blocks[beginBlockIndex];\r\n\r\n if (!beginBlock) return cursorPos;\r\n\r\n let beginBlockCursorPos = beginBlockOffset;\r\n // if position inside block - try to adjust it\r\n if (beginBlockCursorPos !== 0 && beginBlockCursorPos < beginBlock.value.length) {\r\n beginBlockCursorPos = beginBlock.nearestInputPos(beginBlockOffset, forceDirection(direction));\r\n }\r\n\r\n const cursorAtRight = beginBlockCursorPos === beginBlock.value.length;\r\n const cursorAtLeft = beginBlockCursorPos === 0;\r\n\r\n // cursor is INSIDE first block (not at bounds)\r\n if (!cursorAtLeft && !cursorAtRight) return this._blockStartPos(beginBlockIndex) + beginBlockCursorPos;\r\n\r\n const searchBlockIndex = cursorAtRight ? beginBlockIndex + 1 : beginBlockIndex;\r\n\r\n if (direction === DIRECTION.NONE) {\r\n // NONE direction used to calculate start input position if no chars were removed\r\n // FOR NONE:\r\n // -\r\n // input|any\r\n // ->\r\n // any|input\r\n // <-\r\n // filled-input|any\r\n\r\n // check if first block at left is input\r\n if (searchBlockIndex > 0) {\r\n const blockIndexAtLeft = searchBlockIndex-1;\r\n const blockAtLeft = this._blocks[blockIndexAtLeft];\r\n const blockInputPos = blockAtLeft.nearestInputPos(0, DIRECTION.NONE);\r\n // is input\r\n if (!blockAtLeft.value.length || blockInputPos !== blockAtLeft.value.length) {\r\n return this._blockStartPos(searchBlockIndex);\r\n }\r\n }\r\n\r\n // ->\r\n let firstInputAtRight = searchBlockIndex;\r\n for (let bi=firstInputAtRight; bi < this._blocks.length; ++bi) {\r\n const blockAtRight = this._blocks[bi];\r\n const blockInputPos = blockAtRight.nearestInputPos(0, DIRECTION.NONE);\r\n if (!blockAtRight.value.length || blockInputPos !== blockAtRight.value.length) {\r\n return this._blockStartPos(bi) + blockInputPos;\r\n }\r\n }\r\n\r\n // <-\r\n // find first non-fixed symbol\r\n for (let bi=searchBlockIndex-1; bi >= 0; --bi) {\r\n const block = this._blocks[bi];\r\n const blockInputPos = block.nearestInputPos(0, DIRECTION.NONE);\r\n // is input\r\n if (!block.value.length || blockInputPos !== block.value.length) {\r\n return this._blockStartPos(bi) + block.value.length;\r\n }\r\n }\r\n\r\n return cursorPos;\r\n }\r\n\r\n if (direction === DIRECTION.LEFT || direction === DIRECTION.FORCE_LEFT) {\r\n // -\r\n // any|filled-input\r\n // <-\r\n // any|first not empty is not-len-aligned\r\n // not-0-aligned|any\r\n // ->\r\n // any|not-len-aligned or end\r\n\r\n // check if first block at right is filled input\r\n let firstFilledBlockIndexAtRight;\r\n for (let bi=searchBlockIndex; bi < this._blocks.length; ++bi) {\r\n if (this._blocks[bi].value) {\r\n firstFilledBlockIndexAtRight = bi;\r\n break;\r\n }\r\n }\r\n if (firstFilledBlockIndexAtRight != null) {\r\n const filledBlock = this._blocks[firstFilledBlockIndexAtRight];\r\n const blockInputPos = filledBlock.nearestInputPos(0, DIRECTION.RIGHT);\r\n if (blockInputPos === 0 && filledBlock.unmaskedValue.length) {\r\n // filled block is input\r\n return this._blockStartPos(firstFilledBlockIndexAtRight) + blockInputPos;\r\n }\r\n }\r\n\r\n // <-\r\n // find this vars\r\n let firstFilledInputBlockIndex = -1;\r\n let firstEmptyInputBlockIndex; // TODO consider nested empty inputs\r\n for (let bi=searchBlockIndex-1; bi >= 0; --bi) {\r\n const block = this._blocks[bi];\r\n const blockInputPos = block.nearestInputPos(block.value.length, DIRECTION.FORCE_LEFT);\r\n if (!block.value || blockInputPos !== 0) firstEmptyInputBlockIndex = bi;\r\n if (blockInputPos !== 0) {\r\n if (blockInputPos !== block.value.length) {\r\n // aligned inside block - return immediately\r\n return this._blockStartPos(bi) + blockInputPos;\r\n } else {\r\n // found filled\r\n firstFilledInputBlockIndex = bi;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (direction === DIRECTION.LEFT) {\r\n // try find first empty input before start searching position only when not forced\r\n for (let bi=firstFilledInputBlockIndex+1; bi <= Math.min(searchBlockIndex, this._blocks.length-1); ++bi) {\r\n const block = this._blocks[bi];\r\n const blockInputPos = block.nearestInputPos(0, DIRECTION.NONE);\r\n const blockAlignedPos = this._blockStartPos(bi) + blockInputPos;\r\n\r\n if (blockAlignedPos > cursorPos) break;\r\n // if block is not lazy input\r\n if (blockInputPos !== block.value.length) return blockAlignedPos;\r\n }\r\n }\r\n\r\n // process overflow\r\n if (firstFilledInputBlockIndex >= 0) {\r\n return this._blockStartPos(firstFilledInputBlockIndex) + this._blocks[firstFilledInputBlockIndex].value.length;\r\n }\r\n\r\n // for lazy if has aligned left inside fixed and has came to the start - use start position\r\n if (\r\n direction === DIRECTION.FORCE_LEFT ||\r\n this.lazy && !this.extractInput() && !isInput(this._blocks[searchBlockIndex])\r\n ) {\r\n return 0;\r\n }\r\n\r\n if (firstEmptyInputBlockIndex != null) {\r\n return this._blockStartPos(firstEmptyInputBlockIndex);\r\n }\r\n\r\n // find first input\r\n for (let bi=searchBlockIndex; bi < this._blocks.length; ++bi) {\r\n const block = this._blocks[bi];\r\n const blockInputPos = block.nearestInputPos(0, DIRECTION.NONE);\r\n // is input\r\n if (!block.value.length || blockInputPos !== block.value.length) {\r\n return this._blockStartPos(bi) + blockInputPos;\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n if (direction === DIRECTION.RIGHT || direction === DIRECTION.FORCE_RIGHT) {\r\n // ->\r\n // any|not-len-aligned and filled\r\n // any|not-len-aligned\r\n // <-\r\n // not-0-aligned or start|any\r\n let firstInputBlockAlignedIndex: ?number;\r\n let firstInputBlockAlignedPos: ?number;\r\n for (let bi=searchBlockIndex; bi < this._blocks.length; ++bi) {\r\n const block = this._blocks[bi];\r\n const blockInputPos = block.nearestInputPos(0, DIRECTION.NONE);\r\n if (blockInputPos !== block.value.length) {\r\n firstInputBlockAlignedPos = this._blockStartPos(bi) + blockInputPos;\r\n firstInputBlockAlignedIndex = bi;\r\n break;\r\n }\r\n }\r\n\r\n if (firstInputBlockAlignedIndex != null && firstInputBlockAlignedPos != null) {\r\n for (let bi=firstInputBlockAlignedIndex; bi < this._blocks.length; ++bi) {\r\n const block = this._blocks[bi];\r\n const blockInputPos = block.nearestInputPos(0, DIRECTION.FORCE_RIGHT);\r\n if (blockInputPos !== block.value.length) {\r\n return this._blockStartPos(bi) + blockInputPos;\r\n }\r\n }\r\n return direction === DIRECTION.FORCE_RIGHT ?\r\n this.value.length :\r\n firstInputBlockAlignedPos;\r\n }\r\n\r\n for (let bi=Math.min(searchBlockIndex, this._blocks.length-1); bi >= 0; --bi) {\r\n const block = this._blocks[bi];\r\n const blockInputPos = block.nearestInputPos(block.value.length, DIRECTION.LEFT);\r\n if (blockInputPos !== 0) {\r\n const alignedPos = this._blockStartPos(bi) + blockInputPos;\r\n if (alignedPos >= cursorPos) return alignedPos;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return cursorPos;\r\n }\r\n\r\n /** Get block by name */\r\n maskedBlock (name: string): ?PatternBlock {\r\n return this.maskedBlocks(name)[0];\r\n }\r\n\r\n /** Get all blocks by name */\r\n maskedBlocks (name: string): Array<PatternBlock> {\r\n const indices = this._maskedBlocks[name];\r\n if (!indices) return [];\r\n return indices.map(gi => this._blocks[gi]);\r\n }\r\n}\r\nMaskedPattern.DEFAULTS = {\r\n lazy: true,\r\n placeholderChar: '_'\r\n};\r\nMaskedPattern.STOP_CHAR = '`';\r\nMaskedPattern.ESCAPE_CHAR = '\\\\';\r\nMaskedPattern.InputDefinition = PatternInputDefinition;\r\nMaskedPattern.FixedDefinition = PatternFixedDefinition;\r\n\r\nfunction isInput (block: PatternBlock): boolean {\r\n if (!block) return false;\r\n\r\n const value = block.value;\r\n return !value || block.nearestInputPos(0, DIRECTION.NONE) !== value.length;\r\n}\r\n","// @flow\r\nimport MaskedPattern from './pattern.js';\r\nimport { type AppendFlags } from './base.js';\r\n\r\n\r\n/** Pattern which accepts ranges */\r\nexport default\r\nclass MaskedRange extends MaskedPattern {\r\n /**\r\n Optionally sets max length of pattern.\r\n Used when pattern length is longer then `to` param length. Pads zeros at start in this case.\r\n */\r\n maxLength: number;\r\n /** Min bound */\r\n from: number;\r\n /** Max bound */\r\n to: number;\r\n /** */\r\n autofix: boolean;\r\n\r\n get _matchFrom (): number {\r\n return this.maxLength - String(this.from).length;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n _update (opts: any) { // TODO type\r\n opts = {\r\n to: this.to || 0,\r\n from: this.from || 0,\r\n ...opts,\r\n };\r\n\r\n let maxLength = String(opts.to).length;\r\n if (opts.maxLength != null) maxLength = Math.max(maxLength, opts.maxLength);\r\n opts.maxLength = maxLength;\r\n\r\n const fromStr = String(opts.from).padStart(maxLength, '0');\r\n const toStr = String(opts.to).padStart(maxLength, '0');\r\n let sameCharsCount = 0;\r\n while (sameCharsCount < toStr.length && toStr[sameCharsCount] === fromStr[sameCharsCount]) ++sameCharsCount;\r\n opts.mask = toStr.slice(0, sameCharsCount).replace(/0/g, '\\\\0') + '0'.repeat(maxLength - sameCharsCount);\r\n\r\n super._update(opts);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get isComplete (): boolean {\r\n return super.isComplete && Boolean(this.value);\r\n }\r\n\r\n boundaries (str: string): [string, string] {\r\n let minstr = '';\r\n let maxstr = '';\r\n\r\n const [, placeholder, num] = str.match(/^(\\D*)(\\d*)(\\D*)/) || [];\r\n if (num) {\r\n minstr = '0'.repeat(placeholder.length) + num;\r\n maxstr = '9'.repeat(placeholder.length) + num;\r\n }\r\n minstr = minstr.padEnd(this.maxLength, '0');\r\n maxstr = maxstr.padEnd(this.maxLength, '9');\r\n\r\n return [minstr, maxstr];\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n doPrepare (str: string, flags: AppendFlags={}): string {\r\n str = super.doPrepare(str, flags).replace(/\\D/g, '');\r\n if (!this.autofix) return str;\r\n\r\n const fromStr = String(this.from).padStart(this.maxLength, '0');\r\n const toStr = String(this.to).padStart(this.maxLength, '0');\r\n\r\n const val = this.value;\r\n let prepStr = '';\r\n for (let ci=0; ci<str.length; ++ci) {\r\n const nextVal = val + prepStr + str[ci];\r\n const [minstr, maxstr] = this.boundaries(nextVal);\r\n\r\n if (Number(maxstr) < this.from) prepStr += fromStr[nextVal.length - 1];\r\n else if (Number(minstr) > this.to) prepStr += toStr[nextVal.length - 1];\r\n else prepStr += str[ci];\r\n }\r\n\r\n return prepStr;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n doValidate (...args: *): boolean {\r\n const str = this.value;\r\n\r\n const firstNonZero = str.search(/[^0]/);\r\n if (firstNonZero === -1 && str.length <= this._matchFrom) return true;\r\n\r\n const [minstr, maxstr] = this.boundaries(str);\r\n\r\n return this.from <= Number(maxstr) && Number(minstr) <= this.to &&\r\n super.doValidate(...args);\r\n }\r\n}\r\n","// @flow\r\nimport MaskedPattern from './pattern.js';\r\nimport MaskedRange from './range.js';\r\n\r\n\r\n/** Date mask */\r\nexport default\r\nclass MaskedDate extends MaskedPattern {\r\n static GET_DEFAULT_BLOCKS: () => {[string]: any};\r\n static DEFAULTS: any;\r\n\r\n /** Parse string to Date */\r\n parse: (string) => Date;\r\n /** Format Date to string */\r\n format: (Date) => string;\r\n /** Pattern mask for date according to {@link MaskedDate#format} */\r\n pattern: string;\r\n /** Start date */\r\n min: ?Date;\r\n /** End date */\r\n max: ?Date;\r\n /** */\r\n autofix: boolean;\r\n\r\n /**\r\n @param {Object} opts\r\n */\r\n constructor (opts: any) {\r\n super({\r\n ...MaskedDate.DEFAULTS,\r\n ...opts\r\n });\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n _update (opts: any) {\r\n if (opts.mask === Date) delete opts.mask;\r\n if (opts.pattern) opts.mask = opts.pattern;\r\n\r\n const blocks = opts.blocks;\r\n opts.blocks = Object.assign({}, MaskedDate.GET_DEFAULT_BLOCKS());\r\n // adjust year block\r\n if (opts.min) opts.blocks.Y.from = opts.min.getFullYear();\r\n if (opts.max) opts.blocks.Y.to = opts.max.getFullYear();\r\n if (opts.min && opts.max && opts.blocks.Y.from === opts.blocks.Y.to\r\n ) {\r\n opts.blocks.m.from = opts.min.getMonth() + 1;\r\n opts.blocks.m.to = opts.max.getMonth() + 1;\r\n\r\n if (opts.blocks.m.from === opts.blocks.m.to) {\r\n opts.blocks.d.from = opts.min.getDate();\r\n opts.blocks.d.to = opts.max.getDate();\r\n }\r\n }\r\n Object.assign(opts.blocks, blocks);\r\n\r\n // add autofix\r\n Object.keys(opts.blocks).forEach(bk => {\r\n const b = opts.blocks[bk];\r\n if (!('autofix' in b)) b.autofix = opts.autofix;\r\n });\r\n\r\n super._update(opts);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n doValidate (...args: *): boolean {\r\n const date = this.date;\r\n\r\n return super.doValidate(...args) &&\r\n (!this.isComplete ||\r\n this.isDateExist(this.value) && date != null &&\r\n (this.min == null || this.min <= date) &&\r\n (this.max == null || date <= this.max));\r\n }\r\n\r\n /** Checks if date is exists */\r\n isDateExist (str: string): boolean {\r\n return this.format(this.parse(str)) === str;\r\n }\r\n\r\n /** Parsed Date */\r\n get date (): ?Date {\r\n return this.isComplete ?\r\n this.parse(this.value) :\r\n null;\r\n }\r\n set date (date: Date) {\r\n this.value = this.format(date);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get typedValue (): ?Date {\r\n return this.date;\r\n }\r\n set typedValue (value: Date) {\r\n this.date = value;\r\n }\r\n}\r\nMaskedDate.DEFAULTS = {\r\n pattern: 'd{.}`m{.}`Y',\r\n format: date => {\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const year = date.getFullYear();\r\n\r\n return [day, month, year].join('.');\r\n },\r\n parse: str => {\r\n const [day, month, year] = str.split('.');\r\n return new Date(year, month - 1, day);\r\n },\r\n};\r\nMaskedDate.GET_DEFAULT_BLOCKS = () => ({\r\n d: {\r\n mask: MaskedRange,\r\n from: 1,\r\n to: 31,\r\n maxLength: 2,\r\n },\r\n m: {\r\n mask: MaskedRange,\r\n from: 1,\r\n to: 12,\r\n maxLength: 2,\r\n },\r\n Y: {\r\n mask: MaskedRange,\r\n from: 1900,\r\n to: 9999,\r\n }\r\n});\r\n","// @flow\r\n\r\nexport\r\ntype ElementEvent =\r\n 'selectionChange' |\r\n 'input' |\r\n 'drop' |\r\n 'click' |\r\n 'focus' |\r\n 'commit';\r\n\r\n/**\r\n Generic element API to use with mask\r\n @interface\r\n*/\r\nexport default\r\nclass MaskElement {\r\n /** */\r\n +_unsafeSelectionStart: number;\r\n /** */\r\n +_unsafeSelectionEnd: number;\r\n /** */\r\n value: string;\r\n\r\n /** Safely returns selection start */\r\n get selectionStart (): number {\r\n let start;\r\n try {\r\n start = this._unsafeSelectionStart;\r\n } catch (e) {}\r\n\r\n return start != null ?\r\n start :\r\n this.value.length;\r\n }\r\n\r\n /** Safely returns selection end */\r\n get selectionEnd (): number {\r\n let end;\r\n try {\r\n end = this._unsafeSelectionEnd;\r\n } catch (e) {}\r\n\r\n return end != null ?\r\n end :\r\n this.value.length;\r\n }\r\n\r\n /** Safely sets element selection */\r\n select (start: number, end: number) {\r\n if (start == null || end == null ||\r\n start === this.selectionStart && end === this.selectionEnd) return;\r\n\r\n try {\r\n this._unsafeSelect(start, end);\r\n } catch (e) {}\r\n }\r\n\r\n /** Should be overriden in subclasses */\r\n _unsafeSelect (start: number, end: number): void {}\r\n /** Should be overriden in subclasses */\r\n get isActive (): boolean { return false; }\r\n /** Should be overriden in subclasses */\r\n bindEvents (handlers: {[ElementEvent]: Function}) {}\r\n /** Should be overriden in subclasses */\r\n unbindEvents (): void {}\r\n}\r\n","// @flow\r\nimport MaskElement, {type ElementEvent} from './mask-element.js';\r\n\r\n\r\n/** Bridge between HTMLElement and {@link Masked} */\r\nexport default\r\nclass HTMLMaskElement extends MaskElement {\r\n /** Mapping between HTMLElement events and mask internal events */\r\n static EVENTS_MAP: {[ElementEvent]: string};\r\n /** HTMLElement to use mask on */\r\n input: HTMLTextAreaElement | HTMLInputElement;\r\n _handlers: {[string]: Function};\r\n\r\n /**\r\n @param {HTMLInputElement|HTMLTextAreaElement} input\r\n */\r\n constructor (input: HTMLTextAreaElement | HTMLInputElement) {\r\n super();\r\n this.input = input;\r\n this._handlers = {};\r\n }\r\n\r\n /**\r\n Is element in focus\r\n @readonly\r\n */\r\n get isActive (): boolean {\r\n return this.input === document.activeElement;\r\n }\r\n\r\n /**\r\n Returns HTMLElement selection start\r\n @override\r\n */\r\n get _unsafeSelectionStart (): number {\r\n return this.input.selectionStart;\r\n }\r\n\r\n /**\r\n Returns HTMLElement selection end\r\n @override\r\n */\r\n get _unsafeSelectionEnd (): number {\r\n return this.input.selectionEnd;\r\n }\r\n\r\n /**\r\n Sets HTMLElement selection\r\n @override\r\n */\r\n _unsafeSelect (start: number, end: number) {\r\n this.input.setSelectionRange(start, end);\r\n }\r\n\r\n /**\r\n HTMLElement value\r\n @override\r\n */\r\n get value (): string {\r\n return this.input.value;\r\n }\r\n set value (value: string) {\r\n this.input.value = value;\r\n }\r\n\r\n /**\r\n Binds HTMLElement events to mask internal events\r\n @override\r\n */\r\n bindEvents (handlers: {[ElementEvent]: Function}) {\r\n Object.keys(handlers)\r\n .forEach(event => this._toggleEventHandler(HTMLMaskElement.EVENTS_MAP[event], handlers[event]));\r\n }\r\n\r\n /**\r\n Unbinds HTMLElement events to mask internal events\r\n @override\r\n */\r\n unbindEvents () {\r\n Object.keys(this._handlers)\r\n .forEach(event => this._toggleEventHandler(event));\r\n }\r\n\r\n /** */\r\n _toggleEventHandler (event: string, handler?: Function): void {\r\n if (this._handlers[event]) {\r\n this.input.removeEventListener(event, this._handlers[event]);\r\n delete this._handlers[event];\r\n }\r\n\r\n if (handler) {\r\n this.input.addEventListener(event, handler);\r\n this._handlers[event] = handler;\r\n }\r\n }\r\n}\r\nHTMLMaskElement.EVENTS_MAP = {\r\n selectionChange: 'keydown',\r\n input: 'input',\r\n drop: 'drop',\r\n click: 'click',\r\n focus: 'focus',\r\n commit: 'blur',\r\n};\r\n","// @flow\r\nimport {objectIncludes, DIRECTION, type Selection} from '../core/utils.js';\r\nimport ActionDetails from '../core/action-details.js';\r\nimport MaskedDate from '../masked/date.js';\r\nimport createMask, {maskedClass} from '../masked/factory.js';\r\nimport type Masked from '../masked/base.js';\r\nimport {type Mask} from '../masked/base.js';\r\nimport MaskElement from './mask-element.js';\r\nimport HTMLMaskElement from './html-mask-element.js';\r\n\r\n\r\n/** Listens to element events and controls changes between element and {@link Masked} */\r\nexport default\r\nclass InputMask {\r\n /**\r\n View element\r\n @readonly\r\n */\r\n el: MaskElement;\r\n\r\n /**\r\n Internal {@link Masked} model\r\n @readonly\r\n */\r\n masked: Masked<*>;\r\n alignCursor: () => void;\r\n alignCursorFriendly: () => void;\r\n\r\n _listeners: {[string]: Array<Function>};\r\n _value: string;\r\n _changingCursorPos: number;\r\n _unmaskedValue: string;\r\n _saveSelection: (?Event) => void;\r\n _selection: Selection;\r\n _onInput: () => void;\r\n _onChange: () => void;\r\n _onDrop: (Event) => void;\r\n _onFocus: (Event) => void;\r\n _cursorChanging: TimeoutID;\r\n\r\n /**\r\n @param {MaskElement|HTMLInputElement|HTMLTextAreaElement} el\r\n @param {Object} opts\r\n */\r\n constructor (el: MaskElement | HTMLTextAreaElement | HTMLInputElement, opts: {[string]: any}) {\r\n this.el = (el instanceof MaskElement) ?\r\n el :\r\n new HTMLMaskElement(el);\r\n this.masked = createMask(opts);\r\n\r\n this._listeners = {};\r\n this._value = '';\r\n this._unmaskedValue = '';\r\n\r\n this._saveSelection = this._saveSelection.bind(this);\r\n this._onInput = this._onInput.bind(this);\r\n this._onChange = this._onChange.bind(this);\r\n this._onDrop = this._onDrop.bind(this);\r\n this._onFocus = this._onFocus.bind(this);\r\n this.alignCursor = this.alignCursor.bind(this);\r\n this.alignCursorFriendly = this.alignCursorFriendly.bind(this);\r\n\r\n this._bindEvents();\r\n\r\n // refresh\r\n this.updateValue();\r\n this._onChange();\r\n }\r\n\r\n /** Read or update mask */\r\n get mask (): Mask {\r\n return this.masked.mask;\r\n }\r\n\r\n maskEquals (mask: Mask) {\r\n return mask == null ||\r\n mask === this.masked.mask ||\r\n mask === Date && this.masked instanceof MaskedDate;\r\n }\r\n\r\n set mask (mask: Mask) {\r\n if (this.maskEquals(mask)) return;\r\n\r\n if (this.masked.constructor === maskedClass(mask)) {\r\n this.masked.updateOptions({mask});\r\n return;\r\n }\r\n\r\n const masked = createMask({mask});\r\n masked.unmaskedValue = this.masked.unmaskedValue;\r\n this.masked = masked;\r\n }\r\n\r\n /** Raw value */\r\n get value (): string {\r\n return this._value;\r\n }\r\n\r\n set value (str: string) {\r\n this.masked.value = str;\r\n this.updateControl();\r\n this.alignCursor();\r\n }\r\n\r\n /** Unmasked value */\r\n get unmaskedValue (): string {\r\n return this._unmaskedValue;\r\n }\r\n\r\n set unmaskedValue (str: string) {\r\n this.masked.unmaskedValue = str;\r\n this.updateControl();\r\n this.alignCursor();\r\n }\r\n\r\n /** Typed unmasked value */\r\n get typedValue (): any {\r\n return this.masked.typedValue;\r\n }\r\n\r\n set typedValue (val: any) {\r\n this.masked.typedValue = val;\r\n this.updateControl();\r\n this.alignCursor();\r\n }\r\n\r\n /**\r\n Starts listening to element events\r\n @protected\r\n */\r\n _bindEvents () {\r\n this.el.bindEvents({\r\n selectionChange: this._saveSelection,\r\n input: this._onInput,\r\n drop: this._onDrop,\r\n click: this.alignCursorFriendly,\r\n focus: this._onFocus,\r\n commit: this._onChange,\r\n });\r\n }\r\n\r\n /**\r\n Stops listening to element events\r\n @protected\r\n */\r\n _unbindEvents () {\r\n this.el.unbindEvents();\r\n }\r\n\r\n /**\r\n Fires custom event\r\n @protected\r\n */\r\n _fireEvent (ev: string) {\r\n const listeners = this._listeners[ev];\r\n if (!listeners) return;\r\n\r\n listeners.forEach(l => l());\r\n }\r\n\r\n /**\r\n Current selection start\r\n @readonly\r\n */\r\n get selectionStart (): number {\r\n return this._cursorChanging ?\r\n this._changingCursorPos :\r\n\r\n this.el.selectionStart;\r\n }\r\n\r\n /** Current cursor position */\r\n get cursorPos (): number {\r\n return this._cursorChanging ?\r\n this._changingCursorPos :\r\n\r\n this.el.selectionEnd;\r\n }\r\n set cursorPos (pos: number) {\r\n if (!this.el.isActive) return;\r\n\r\n this.el.select(pos, pos);\r\n this._saveSelection();\r\n }\r\n\r\n /**\r\n Stores current selection\r\n @protected\r\n */\r\n _saveSelection (/* ev */) {\r\n if (this.value !== this.el.value) {\r\n console.warn('Element value was changed outside of mask. Syncronize mask using `mask.updateValue()` to work properly.'); // eslint-disable-line no-console\r\n }\r\n this._selection = {\r\n start: this.selectionStart,\r\n end: this.cursorPos\r\n };\r\n }\r\n\r\n /** Syncronizes model value from view */\r\n updateValue () {\r\n this.masked.value = this.el.value;\r\n this._value = this.masked.value;\r\n }\r\n\r\n /** Syncronizes view from model value, fires change events */\r\n updateControl () {\r\n const newUnmaskedValue = this.masked.unmaskedValue;\r\n const newValue = this.masked.value;\r\n const isChanged = (this.unmaskedValue !== newUnmaskedValue ||\r\n this.value !== newValue);\r\n\r\n this._unmaskedValue = newUnmaskedValue;\r\n this._value = newValue;\r\n\r\n if (this.el.value !== newValue) this.el.value = newValue;\r\n if (isChanged) this._fireChangeEvents();\r\n }\r\n\r\n /** Updates options with deep equal check, recreates @{link Masked} model if mask type changes */\r\n updateOptions (opts: {[string]: any}) {\r\n const { mask, ...restOpts } = opts;\r\n\r\n const updateMask = !this.maskEquals(mask);\r\n const updateOpts = !objectIncludes(this.masked, restOpts);\r\n\r\n if (updateMask) this.mask = mask;\r\n if (updateOpts) this.masked.updateOptions(restOpts);\r\n\r\n if (updateMask || updateOpts) this.updateControl();\r\n }\r\n\r\n /** Updates cursor */\r\n updateCursor (cursorPos: number) {\r\n if (cursorPos == null) return;\r\n this.cursorPos = cursorPos;\r\n\r\n // also queue change cursor for mobile browsers\r\n this._delayUpdateCursor(cursorPos);\r\n }\r\n\r\n /**\r\n Delays cursor update to support mobile browsers\r\n @private\r\n */\r\n _delayUpdateCursor (cursorPos: number) {\r\n this._abortUpdateCursor();\r\n this._changingCursorPos = cursorPos;\r\n this._cursorChanging = setTimeout(() => {\r\n if (!this.el) return; // if was destroyed\r\n this.cursorPos = this._changingCursorPos;\r\n this._abortUpdateCursor();\r\n }, 10);\r\n }\r\n\r\n /**\r\n Fires custom events\r\n @protected\r\n */\r\n _fireChangeEvents () {\r\n this._fireEvent('accept');\r\n if (this.masked.isComplete) this._fireEvent('complete');\r\n }\r\n\r\n /**\r\n Aborts delayed cursor update\r\n @private\r\n */\r\n _abortUpdateCursor () {\r\n if (this._cursorChanging) {\r\n clearTimeout(this._cursorChanging);\r\n delete this._cursorChanging;\r\n }\r\n }\r\n\r\n /** Aligns cursor to nearest available position */\r\n alignCursor () {\r\n this.cursorPos = this.masked.nearestInputPos(this.cursorPos, DIRECTION.LEFT);\r\n }\r\n\r\n /** Aligns cursor only if selection is empty */\r\n alignCursorFriendly () {\r\n if (this.selectionStart !== this.cursorPos) return; // skip if range is selected\r\n this.alignCursor();\r\n }\r\n\r\n /** Adds listener on custom event */\r\n on (ev: string, handler: Function) {\r\n if (!this._listeners[ev]) this._listeners[ev] = [];\r\n this._listeners[ev].push(handler);\r\n return this;\r\n }\r\n\r\n /** Removes custom event listener */\r\n off (ev: string, handler: Function) {\r\n if (!this._listeners[ev]) return this;\r\n if (!handler) {\r\n delete this._listeners[ev];\r\n return this;\r\n }\r\n const hIndex = this._listeners[ev].indexOf(handler);\r\n if (hIndex >= 0) this._listeners[ev].splice(hIndex, 1);\r\n return this;\r\n }\r\n\r\n /** Handles view input event */\r\n _onInput () {\r\n this._abortUpdateCursor();\r\n\r\n // fix strange IE behavior\r\n if (!this._selection) return this.updateValue();\r\n\r\n const details = new ActionDetails(\r\n // new state\r\n this.el.value, this.cursorPos,\r\n // old state\r\n this.value, this._selection);\r\n\r\n const oldRawValue = this.masked.rawInputValue;\r\n\r\n const offset = this.masked.splice(\r\n details.startChangePos,\r\n details.removed.length,\r\n details.inserted,\r\n details.removeDirection).offset;\r\n\r\n // force align in remove direction only if no input chars were removed\r\n // otherwise we still need to align with NONE (to get out from fixed symbols for instance)\r\n const removeDirection = oldRawValue === this.masked.rawInputValue ?\r\n details.removeDirection :\r\n DIRECTION.NONE;\r\n\r\n const cursorPos = this.masked.nearestInputPos(\r\n details.startChangePos + offset,\r\n removeDirection,\r\n );\r\n\r\n this.updateControl();\r\n this.updateCursor(cursorPos);\r\n }\r\n\r\n /** Handles view change event and commits model value */\r\n _onChange () {\r\n if (this.value !== this.el.value) {\r\n this.updateValue();\r\n }\r\n this.masked.doCommit();\r\n this.updateControl();\r\n this._saveSelection();\r\n }\r\n\r\n /** Handles view drop event, prevents by default */\r\n _onDrop (ev: Event) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n\r\n /** Restore last selection on focus */\r\n _onFocus (ev: Event) {\r\n if (this.selectionStart !== this.cursorPos) return; // skip if range is selected\r\n if (this._selection) this.cursorPos = this._selection.end;\r\n this.alignCursorFriendly();\r\n }\r\n\r\n /** Unbind view events and removes element reference */\r\n destroy () {\r\n this._unbindEvents();\r\n // $FlowFixMe why not do so?\r\n this._listeners.length = 0;\r\n delete this.el;\r\n }\r\n}\r\n","// @flow\r\nimport MaskedPattern from './pattern.js';\r\n\r\n\r\n/** Pattern which validates enum values */\r\nexport default\r\nclass MaskedEnum extends MaskedPattern {\r\n enum: Array<string>;\r\n\r\n /**\r\n @override\r\n @param {Object} opts\r\n */\r\n _update (opts: any) { // TODO type\r\n if (opts.enum) opts.mask = '*'.repeat(opts.enum[0].length);\r\n\r\n super._update(opts);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n doValidate (...args: *): boolean {\r\n return this.enum.some(e => e.indexOf(this.unmaskedValue) >= 0) &&\r\n super.doValidate(...args);\r\n }\r\n}\r\n","// @flow\r\nimport {escapeRegExp, indexInDirection, posInDirection, type Direction, DIRECTION} from '../core/utils.js';\r\nimport ChangeDetails from '../core/change-details.js';\r\n\r\nimport Masked, {type MaskedOptions, type ExtractFlags, type AppendFlags} from './base.js';\r\n\r\n\r\ntype MaskedNumberOptions = {\r\n ...MaskedOptions<Number>,\r\n radix: $PropertyType<MaskedNumber, 'radix'>,\r\n thousandsSeparator: $PropertyType<MaskedNumber, 'thousandsSeparator'>,\r\n mapToRadix: $PropertyType<MaskedNumber, 'mapToRadix'>,\r\n scale: $PropertyType<MaskedNumber, 'scale'>,\r\n signed: $PropertyType<MaskedNumber, 'signed'>,\r\n normalizeZeros: $PropertyType<MaskedNumber, 'normalizeZeros'>,\r\n padFractionalZeros: $PropertyType<MaskedNumber, 'padFractionalZeros'>,\r\n};\r\n\r\n/**\r\n Number mask\r\n @param {Object} opts\r\n @param {string} opts.radix - Single char\r\n @param {string} opts.thousandsSeparator - Single char\r\n @param {Array<string>} opts.mapToRadix - Array of single chars\r\n @param {number} opts.min\r\n @param {number} opts.max\r\n @param {number} opts.scale - Digits after point\r\n @param {boolean} opts.signed - Allow negative\r\n @param {boolean} opts.normalizeZeros - Flag to remove leading and trailing zeros in the end of editing\r\n @param {boolean} opts.padFractionalZeros - Flag to pad trailing zeros after point in the end of editing\r\n*/\r\nexport default\r\nclass MaskedNumber extends Masked<Class<Number>> {\r\n static DEFAULTS: $Shape<MaskedNumberOptions>;\r\n\r\n /** Single char */\r\n radix: string;\r\n /** Single char */\r\n thousandsSeparator: string;\r\n /** Array of single chars */\r\n mapToRadix: Array<string>;\r\n /** */\r\n min: number;\r\n /** */\r\n max: number;\r\n /** Digits after point */\r\n scale: number;\r\n /** */\r\n signed: boolean;\r\n /** Flag to remove leading and trailing zeros in the end of editing */\r\n normalizeZeros: boolean;\r\n /** Flag to pad trailing zeros after point in the end of editing */\r\n padFractionalZeros: boolean;\r\n _numberRegExp: RegExp;\r\n _numberRegExpInput: RegExp;\r\n _thousandsSeparatorRegExp: RegExp;\r\n _mapToRadixRegExp: RegExp;\r\n _separatorsProcessed: boolean;\r\n\r\n constructor (opts: $Shape<MaskedNumberOptions>) {\r\n super({\r\n ...MaskedNumber.DEFAULTS,\r\n ...opts\r\n });\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n _update (opts: MaskedNumberOptions) {\r\n super._update(opts);\r\n this._updateRegExps();\r\n }\r\n\r\n /** */\r\n _updateRegExps () {\r\n // use different regexp to process user input (more strict, input suffix) and tail shifting\r\n let start = '^' + (this.allowNegative ? '[+|\\\\-]?' : '');\r\n let midInput = '(0|([1-9]+\\\\d*))?';\r\n let mid = '\\\\d*';\r\n\r\n let end = (this.scale ?\r\n '(' + escapeRegExp(this.radix) + '\\\\d{0,' + this.scale + '})?' :\r\n '') + '$';\r\n\r\n this._numberRegExpInput = new RegExp(start + midInput + end);\r\n this._numberRegExp = new RegExp(start + mid + end);\r\n this._mapToRadixRegExp = new RegExp('[' +\r\n this.mapToRadix.map(escapeRegExp).join('') +\r\n ']', 'g');\r\n this._thousandsSeparatorRegExp = new RegExp(escapeRegExp(this.thousandsSeparator), 'g');\r\n }\r\n\r\n /** */\r\n _removeThousandsSeparators (value: string): string {\r\n return value.replace(this._thousandsSeparatorRegExp, '');\r\n }\r\n\r\n /** */\r\n _insertThousandsSeparators (value: string): string {\r\n // https://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\r\n const parts = value.split(this.radix);\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, this.thousandsSeparator);\r\n return parts.join(this.radix);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n doPrepare (str: string, ...args: *) {\r\n return super.doPrepare(this._removeThousandsSeparators(str.replace(this._mapToRadixRegExp, this.radix)), ...args);\r\n }\r\n\r\n /** */\r\n _separatorsCount (to: number, extendOnSeparators: boolean=false): number {\r\n let count = 0;\r\n\r\n for (let pos = 0; pos < to; ++pos) {\r\n if (this._value.indexOf(this.thousandsSeparator, pos) === pos) {\r\n ++count;\r\n if (extendOnSeparators) to += this.thousandsSeparator.length;\r\n }\r\n }\r\n\r\n return count;\r\n }\r\n\r\n /** */\r\n _separatorsCountFromSlice (slice: string=this._value): number {\r\n return this._separatorsCount(this._removeThousandsSeparators(slice).length, true);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n extractInput (fromPos?: number=0, toPos?: number=this.value.length, flags?: ExtractFlags): string {\r\n [fromPos, toPos] = this._adjustRangeWithSeparators(fromPos, toPos);\r\n\r\n return this._removeThousandsSeparators(super.extractInput(fromPos, toPos, flags));\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n _appendCharRaw (ch: string, flags: AppendFlags={}): ChangeDetails {\r\n if (!this.thousandsSeparator) return super._appendCharRaw(ch, flags);\r\n\r\n const prevBeforeTailValue = flags.tail && flags._beforeTailState ?\r\n flags._beforeTailState._value :\r\n this._value;\r\n const prevBeforeTailSeparatorsCount = this._separatorsCountFromSlice(prevBeforeTailValue);\r\n this._value = this._removeThousandsSeparators(this.value);\r\n\r\n const appendDetails = super._appendCharRaw(ch, flags);\r\n\r\n this._value = this._insertThousandsSeparators(this._value);\r\n const beforeTailValue = flags.tail && flags._beforeTailState ?\r\n flags._beforeTailState._value :\r\n this._value;\r\n const beforeTailSeparatorsCount = this._separatorsCountFromSlice(beforeTailValue);\r\n\r\n appendDetails.tailShift += (beforeTailSeparatorsCount - prevBeforeTailSeparatorsCount) * this.thousandsSeparator.length;\r\n return appendDetails;\r\n }\r\n\r\n /** */\r\n _findSeparatorAround (pos: number): number {\r\n if (this.thousandsSeparator) {\r\n const searchFrom = pos - this.thousandsSeparator.length + 1;\r\n const separatorPos = this.value.indexOf(this.thousandsSeparator, searchFrom);\r\n if (separatorPos <= pos) return separatorPos;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n _adjustRangeWithSeparators (from: number, to: number): [number, number] {\r\n const separatorAroundFromPos = this._findSeparatorAround(from);\r\n if (separatorAroundFromPos >= 0) from = separatorAroundFromPos;\r\n\r\n const separatorAroundToPos = this._findSeparatorAround(to);\r\n if (separatorAroundToPos >= 0) to = separatorAroundToPos + this.thousandsSeparator.length;\r\n return [from, to];\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n remove (fromPos?: number=0, toPos?: number=this.value.length): ChangeDetails {\r\n [fromPos, toPos] = this._adjustRangeWithSeparators(fromPos, toPos);\r\n\r\n const valueBeforePos = this.value.slice(0, fromPos);\r\n const valueAfterPos = this.value.slice(toPos);\r\n\r\n const prevBeforeTailSeparatorsCount = this._separatorsCount(valueBeforePos.length);\r\n this._value = this._insertThousandsSeparators(this._removeThousandsSeparators(valueBeforePos + valueAfterPos));\r\n const beforeTailSeparatorsCount = this._separatorsCountFromSlice(valueBeforePos);\r\n\r\n return new ChangeDetails({\r\n tailShift: (beforeTailSeparatorsCount - prevBeforeTailSeparatorsCount) * this.thousandsSeparator.length,\r\n });\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n nearestInputPos (cursorPos: number, direction?: Direction): number {\r\n if (!this.thousandsSeparator) return cursorPos;\r\n\r\n switch (direction) {\r\n case DIRECTION.NONE:\r\n case DIRECTION.LEFT:\r\n case DIRECTION.FORCE_LEFT: {\r\n const separatorAtLeftPos = this._findSeparatorAround(cursorPos - 1);\r\n if (separatorAtLeftPos >= 0) {\r\n const separatorAtLeftEndPos = separatorAtLeftPos + this.thousandsSeparator.length;\r\n if (cursorPos < separatorAtLeftEndPos ||\r\n this.value.length <= separatorAtLeftEndPos ||\r\n direction === DIRECTION.FORCE_LEFT\r\n ) {\r\n return separatorAtLeftPos;\r\n }\r\n }\r\n break;\r\n }\r\n case DIRECTION.RIGHT:\r\n case DIRECTION.FORCE_RIGHT: {\r\n const separatorAtRightPos = this._findSeparatorAround(cursorPos);\r\n if (separatorAtRightPos >= 0) {\r\n return separatorAtRightPos + this.thousandsSeparator.length;\r\n }\r\n }\r\n }\r\n\r\n return cursorPos;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n doValidate (flags: AppendFlags) {\r\n const regexp = flags.input ? this._numberRegExpInput : this._numberRegExp;\r\n\r\n // validate as string\r\n let valid = regexp.test(this._removeThousandsSeparators(this.value));\r\n\r\n if (valid) {\r\n // validate as number\r\n const number = this.number;\r\n valid = valid && !isNaN(number) &&\r\n // check min bound for negative values\r\n (this.min == null || this.min >= 0 || this.min <= this.number) &&\r\n // check max bound for positive values\r\n (this.max == null || this.max <= 0 || this.number <= this.max);\r\n }\r\n\r\n return valid && super.doValidate(flags);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n doCommit () {\r\n if (this.value) {\r\n const number = this.number;\r\n let validnum = number;\r\n\r\n // check bounds\r\n if (this.min != null) validnum = Math.max(validnum, this.min);\r\n if (this.max != null) validnum = Math.min(validnum, this.max);\r\n\r\n if (validnum !== number) this.unmaskedValue = String(validnum);\r\n\r\n let formatted = this.value;\r\n\r\n if (this.normalizeZeros) formatted = this._normalizeZeros(formatted);\r\n if (this.padFractionalZeros) formatted = this._padFractionalZeros(formatted);\r\n\r\n this._value = formatted;\r\n }\r\n\r\n super.doCommit();\r\n }\r\n\r\n /** */\r\n _normalizeZeros (value: string): string {\r\n const parts = this._removeThousandsSeparators(value).split(this.radix);\r\n\r\n // remove leading zeros\r\n parts[0] = parts[0].replace(/^(\\D*)(0*)(\\d*)/, (match, sign, zeros, num) => sign + num);\r\n // add leading zero\r\n if (value.length && !/\\d$/.test(parts[0])) parts[0] = parts[0] + '0';\r\n\r\n if (parts.length > 1) {\r\n parts[1] = parts[1].replace(/0*$/, ''); // remove trailing zeros\r\n if (!parts[1].length) parts.length = 1; // remove fractional\r\n }\r\n\r\n return this._insertThousandsSeparators(parts.join(this.radix));\r\n }\r\n\r\n /** */\r\n _padFractionalZeros (value: string): string {\r\n if (!value) return value;\r\n\r\n const parts = value.split(this.radix);\r\n if (parts.length < 2) parts.push('');\r\n parts[1] = parts[1].padEnd(this.scale, '0');\r\n return parts.join(this.radix);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get unmaskedValue (): string {\r\n return this._removeThousandsSeparators(\r\n this._normalizeZeros(\r\n this.value))\r\n .replace(this.radix, '.');\r\n }\r\n\r\n set unmaskedValue (unmaskedValue: string) {\r\n super.unmaskedValue = unmaskedValue.replace('.', this.radix);\r\n }\r\n\r\n /** Parsed Number */\r\n get number (): number {\r\n return Number(this.unmaskedValue);\r\n }\r\n\r\n set number (number: number) {\r\n this.unmaskedValue = String(number);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get typedValue (): number {\r\n return this.number;\r\n }\r\n\r\n set typedValue (value: number) {\r\n this.number = value;\r\n }\r\n\r\n /**\r\n Is negative allowed\r\n @readonly\r\n */\r\n get allowNegative (): boolean {\r\n return this.signed ||\r\n (this.min != null && this.min < 0) ||\r\n (this.max != null && this.max < 0);\r\n }\r\n}\r\nMaskedNumber.DEFAULTS = {\r\n radix: ',',\r\n thousandsSeparator: '',\r\n mapToRadix: ['.'],\r\n scale: 2,\r\n signed: false,\r\n normalizeZeros: true,\r\n padFractionalZeros: false,\r\n};\r\n","// @flow\r\nimport Masked, {type MaskedOptions} from './base.js';\r\n\r\n\r\n/** Masking by RegExp */\r\nexport default\r\nclass MaskedRegExp extends Masked<RegExp> {\r\n /**\r\n @override\r\n @param {Object} opts\r\n */\r\n _update (opts: $Shape<MaskedOptions<RegExp>>) {\r\n if (opts.mask) opts.validate = (value) => value.search(opts.mask) >= 0;\r\n super._update(opts);\r\n }\r\n}\r\n","// @flow\r\nimport Masked, {type MaskedOptions} from './base.js';\r\n\r\n\r\n/** Masking by custom Function */\r\nexport default\r\nclass MaskedFunction extends Masked<Function> {\r\n /**\r\n @override\r\n @param {Object} opts\r\n */\r\n _update (opts: MaskedOptions<Function>) {\r\n if (opts.mask) opts.validate = opts.mask;\r\n super._update(opts);\r\n }\r\n}\r\n","// @flow\r\nimport ChangeDetails from '../core/change-details.js';\r\nimport createMask from './factory.js';\r\nimport Masked, {type AppendFlags, type MaskedState} from './base.js';\r\nimport { type TailDetails } from '../core/tail-details.js';\r\n\r\n\r\ntype MaskedDynamicState = {|\r\n ...MaskedState,\r\n _rawInputValue: string,\r\n compiledMasks: Array<*>,\r\n currentMaskRef: ?Masked<*>,\r\n currentMask: *,\r\n|};\r\n\r\ntype DynamicMaskType = Array<{[string]: any}>;\r\n/** Dynamic mask for choosing apropriate mask in run-time */\r\nexport default\r\nclass MaskedDynamic extends Masked<DynamicMaskType> {\r\n /** Currently chosen mask */\r\n currentMask: ?Masked<*>;\r\n /** Compliled {@link Masked} options */\r\n compiledMasks: Array<Masked<*>>;\r\n /** Chooses {@link Masked} depending on input value */\r\n dispatch: (string, Masked<*>, AppendFlags) => Masked<*>;\r\n\r\n /**\r\n @param {Object} opts\r\n */\r\n constructor (opts: any) {\r\n super({\r\n ...MaskedDynamic.DEFAULTS,\r\n ...opts\r\n });\r\n\r\n this.currentMask = null;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n _update (opts: any) {\r\n super._update(opts);\r\n if ('mask' in opts) {\r\n // mask could be totally dynamic with only `dispatch` option\r\n this.compiledMasks = Array.isArray(opts.mask) ?\r\n opts.mask.map(m => createMask(m)) :\r\n [];\r\n }\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n _appendCharRaw (...args: *): ChangeDetails {\r\n const details = this._applyDispatch(...args);\r\n\r\n if (this.currentMask) {\r\n details.aggregate(this.currentMask._appendChar(...args));\r\n }\r\n\r\n return details;\r\n }\r\n\r\n _applyDispatch (appended: string='', flags: AppendFlags={}) {\r\n const prevValueBeforeTail = flags.tail && flags._beforeTailState != null ?\r\n flags._beforeTailState._value :\r\n this.value;\r\n const inputValue = this.rawInputValue;\r\n const insertValue = flags.tail && flags._beforeTailState != null ?\r\n // $FlowFixMe - tired to fight with type system\r\n flags._beforeTailState._rawInputValue :\r\n inputValue;\r\n const tailValue = inputValue.slice(insertValue.length);\r\n const prevMask = this.currentMask;\r\n const details = new ChangeDetails();\r\n\r\n const prevMaskState = prevMask && prevMask.state;\r\n\r\n // clone flags to prevent overwriting `_beforeTailState`\r\n this.currentMask = this.doDispatch(appended, { ...flags });\r\n\r\n // restore state after dispatch\r\n if (this.currentMask) {\r\n if (this.currentMask !== prevMask) {\r\n // if mask changed reapply input\r\n this.currentMask.reset();\r\n\r\n // $FlowFixMe - it's ok, we don't change current mask above\r\n const d = this.currentMask.append(insertValue, {raw: true});\r\n details.tailShift = d.inserted.length - prevValueBeforeTail.length;\r\n\r\n if (tailValue) {\r\n // $FlowFixMe - it's ok, we don't change current mask above\r\n details.tailShift += this.currentMask.append(tailValue, {raw: true, tail: true}).tailShift;\r\n }\r\n } else {\r\n // Dispatch can do something bad with state, so\r\n // restore prev mask state\r\n this.currentMask.state = prevMaskState;\r\n }\r\n }\r\n\r\n return details;\r\n }\r\n\r\n _appendPlaceholder (...args: *) {\r\n const details = this._applyDispatch(...args);\r\n\r\n if (this.currentMask) {\r\n details.aggregate(this.currentMask._appendPlaceholder());\r\n }\r\n\r\n return details;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n doDispatch(appended: string, flags: AppendFlags={}) {\r\n return this.dispatch(appended, this, flags);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n doValidate (...args: *): boolean {\r\n return super.doValidate(...args) && (\r\n !this.currentMask || this.currentMask.doValidate(...args));\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n reset () {\r\n if (this.currentMask) this.currentMask.reset();\r\n this.compiledMasks.forEach(m => m.reset());\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get value (): string {\r\n return this.currentMask ? this.currentMask.value : '';\r\n }\r\n\r\n set value (value: string) {\r\n super.value = value;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get unmaskedValue (): string {\r\n return this.currentMask ? this.currentMask.unmaskedValue : '';\r\n }\r\n\r\n set unmaskedValue (unmaskedValue: string) {\r\n super.unmaskedValue = unmaskedValue;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get typedValue (): any {\r\n return this.currentMask ? this.currentMask.typedValue : '';\r\n }\r\n\r\n // probably typedValue should not be used with dynamic\r\n set typedValue (value: any) {\r\n let unmaskedValue = String(value);\r\n\r\n // double check it\r\n if (this.currentMask) {\r\n this.currentMask.typedValue = value;\r\n unmaskedValue = this.currentMask.unmaskedValue;\r\n }\r\n this.unmaskedValue = unmaskedValue;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get isComplete (): boolean {\r\n return !!this.currentMask && this.currentMask.isComplete;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n remove (...args: *): ChangeDetails {\r\n const details: ChangeDetails = new ChangeDetails();\r\n if (this.currentMask) {\r\n details.aggregate(this.currentMask.remove(...args))\r\n // update with dispatch\r\n .aggregate(this._applyDispatch());\r\n }\r\n\r\n return details;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n get state (): MaskedDynamicState {\r\n return {\r\n ...super.state,\r\n _rawInputValue: this.rawInputValue,\r\n compiledMasks: this.compiledMasks.map(m => m.state),\r\n currentMaskRef: this.currentMask,\r\n currentMask: this.currentMask && this.currentMask.state,\r\n };\r\n }\r\n\r\n set state (state: MaskedDynamicState) {\r\n const {compiledMasks, currentMaskRef, currentMask, ...maskedState} = state;\r\n this.compiledMasks.forEach((m, mi) => m.state = compiledMasks[mi]);\r\n if (currentMaskRef != null) {\r\n this.currentMask = currentMaskRef;\r\n this.currentMask.state = currentMask;\r\n }\r\n super.state = maskedState;\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n extractInput (...args: *): string {\r\n return this.currentMask ?\r\n this.currentMask.extractInput(...args) :\r\n '';\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n extractTail (...args: *): TailDetails {\r\n return this.currentMask ?\r\n this.currentMask.extractTail(...args) :\r\n super.extractTail(...args);\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n doCommit () {\r\n if (this.currentMask) this.currentMask.doCommit();\r\n super.doCommit();\r\n }\r\n\r\n /**\r\n @override\r\n */\r\n nearestInputPos(...args: *): number {\r\n return this.currentMask ?\r\n this.currentMask.nearestInputPos(...args) :\r\n super.nearestInputPos(...args);\r\n }\r\n\r\n get overwrite () {\r\n return this.currentMask ?\r\n this.currentMask.overwrite :\r\n super.overwrite;\r\n }\r\n\r\n set overwrite (overwrite: *) {\r\n console.warn('\"overwrite\" option is not available in dynamic mask, use this option in siblings');\r\n }\r\n}\r\n\r\nMaskedDynamic.DEFAULTS = {\r\n dispatch: (appended, masked, flags) => {\r\n if (!masked.compiledMasks.length) return;\r\n\r\n const inputValue = masked.rawInputValue;\r\n\r\n // simulate input\r\n const inputs = masked.compiledMasks.map((m, index) => {\r\n m.reset();\r\n m.append(inputValue, { raw: true });\r\n m.append(appended, flags);\r\n const weight = m.rawInputValue.length;\r\n\r\n return {weight, index};\r\n });\r\n\r\n // pop masks with longer values first\r\n inputs.sort((i1, i2) => i2.weight - i1.weight);\r\n\r\n return masked.compiledMasks[inputs[0].index];\r\n }\r\n};\r\n","import {g} from './core/utils.js';\r\n\r\nimport InputMask from './controls/input.js';\r\n\r\nimport Masked from './masked/base.js';\r\nimport MaskedPattern from './masked/pattern.js';\r\nimport MaskedEnum from './masked/enum.js';\r\nimport MaskedRange from './masked/range.js';\r\nimport MaskedNumber from './masked/number.js';\r\nimport MaskedDate from './masked/date.js';\r\nimport MaskedRegExp from './masked/regexp.js';\r\nimport MaskedFunction from './masked/function.js';\r\nimport MaskedDynamic from './masked/dynamic.js';\r\nimport createMask from './masked/factory.js';\r\nimport MaskElement from './controls/mask-element.js';\r\nimport HTMLMaskElement from './controls/html-mask-element.js';\r\n\r\n\r\n/**\r\n * Applies mask on element.\r\n * @constructor\r\n * @param {HTMLInputElement|HTMLTextAreaElement|MaskElement} el - Element to apply mask\r\n * @param {Object} opts - Custom mask options\r\n * @return {InputMask}\r\n */\r\nfunction IMask (el, opts={}) {\r\n\t// currently available only for input-like elements\r\n return new InputMask(el, opts);\r\n}\r\n\r\n/** {@link InputMask} */\r\nIMask.InputMask = InputMask;\r\n\r\n/** {@link Masked} */\r\nIMask.Masked = Masked;\r\n/** {@link MaskedPattern} */\r\nIMask.MaskedPattern = MaskedPattern;\r\n/** {@link MaskedEnum} */\r\nIMask.MaskedEnum = MaskedEnum;\r\n/** {@link MaskedRange} */\r\nIMask.MaskedRange = MaskedRange;\r\n/** {@link MaskedNumber} */\r\nIMask.MaskedNumber = MaskedNumber;\r\n/** {@link MaskedDate} */\r\nIMask.MaskedDate = MaskedDate;\r\n/** {@link MaskedRegExp} */\r\nIMask.MaskedRegExp = MaskedRegExp;\r\n/** {@link MaskedFunction} */\r\nIMask.MaskedFunction = MaskedFunction;\r\n/** {@link MaskedDynamic} */\r\nIMask.MaskedDynamic = MaskedDynamic;\r\n/** {@link createMask} */\r\nIMask.createMask = createMask;\r\n/** {@link MaskElement} */\r\nIMask.MaskElement = MaskElement;\r\n/** {@link HTMLMaskElement} */\r\nIMask.HTMLMaskElement = HTMLMaskElement;\r\n\r\ng.IMask = IMask;\r\n\r\nexport default IMask;\r\nexport {\r\n InputMask,\r\n Masked,\r\n MaskedPattern,\r\n MaskedEnum,\r\n MaskedRange,\r\n MaskedNumber,\r\n MaskedDate,\r\n MaskedRegExp,\r\n MaskedFunction,\r\n MaskedDynamic,\r\n createMask,\r\n MaskElement,\r\n HTMLMaskElement,\r\n};\r\n"],"names":["isString","str","String","DIRECTION","NONE","LEFT","FORCE_LEFT","RIGHT","FORCE_RIGHT","escapeRegExp","replace","g","window","global","self","ActionDetails","constructor","value","cursorPos","oldValue","oldSelection","this","slice","startChangePos","start","Math","min","substr","insertedCount","max","end","length","removedCount","substring","ChangeDetails","details","Object","assign","inserted","rawInserted","skip","tailShift","aggregate","ContinuousTailDetails","from","stop","toString","extend","tail","appendTo","masked","append","_appendPlaceholder","state","shiftBefore","pos","shiftChar","Masked","opts","_value","_update","isInitialized","updateOptions","keys","withValueRefresh","bind","reset","resolve","input","doCommit","unmaskedValue","extractInput","raw","nearestInputPos","direction","fromPos","toPos","extractTail","appendTail","_appendCharRaw","ch","flags","doPrepare","_appendChar","checkTail","consistentState","consistentTail","appended","doValidate","beforeTailState","overwrite","tailDetails","Error","_beforeTailState","ci","remove","fn","_refreshing","unmasked","ret","prepare","validate","parent","commit","splice","deleteCount","removeDirection","tailPos","maskedClass","mask","RegExp","IMask","MaskedRegExp","MaskedPattern","Date","MaskedDate","Number","MaskedNumber","Array","isArray","MaskedDynamic","prototype","Function","MaskedFunction","console","warn","createMask","DEFAULT_INPUT_DEFINITIONS","PatternInputDefinition","blockOpts","_isFilled","isOptional","placeholderChar","Boolean","lazy","maxPos","boundPos","isComplete","PatternFixedDefinition","isUnmasking","_isRawInput","isResolved","char","ChunksTailDetails","chunks","map","join","tailChunk","lastChunk","extendLast","push","firstTailChunk","shift","blockIndex","chunk","lastBlockIter","_mapPosToBlock","chunkBlock","index","_stops","indexOf","_blocks","remainChars","c","props","cstate","chunkShiftPos","definitions","DEFAULTS","_rebuildMask","defs","_maskedBlocks","pattern","unmaskingBlock","optionalBlock","i","blocks","p","bNames","_this","filter","bName","sort","a","b","maskedBlock","isInput","STOP_CHAR","ESCAPE_CHAR","def","super","maskedState","forEach","bi","every","reduce","blockIter","block","blockDetails","chunkTail","_forEachBlocksInRange","bFromPos","bToPos","blockChunk","_findStopBefore","_blockStartPos","_","stopBefore","si","toBlockIndex","startBlockIter","startBlockIndex","endBlockIndex","args","bDetails","accVal","blockStartPos","offset","fromBlockIter","toBlockIter","isSameBlock","fromBlockStartPos","fromBlockEndPos","removeDetails","beginBlockData","beginBlockOffset","beginBlockIndex","beginBlock","beginBlockCursorPos","forceDirection","cursorAtRight","searchBlockIndex","blockIndexAtLeft","blockAtLeft","blockInputPos","blockAtRight","firstFilledBlockIndexAtRight","filledBlock","firstEmptyInputBlockIndex","firstFilledInputBlockIndex","blockAlignedPos","firstInputBlockAlignedIndex","firstInputBlockAlignedPos","alignedPos","name","maskedBlocks","indices","gi","InputDefinition","FixedDefinition","MaskedRange","maxLength","to","fromStr","padStart","toStr","sameCharsCount","repeat","boundaries","minstr","maxstr","placeholder","num","match","padEnd","autofix","val","prepStr","nextVal","search","_matchFrom","GET_DEFAULT_BLOCKS","Y","getFullYear","m","getMonth","d","getDate","bk","date","isDateExist","format","parse","day","month","year","split","MaskElement","_unsafeSelectionStart","e","_unsafeSelectionEnd","select","selectionStart","selectionEnd","_unsafeSelect","bindEvents","handlers","unbindEvents","HTMLMaskElement","_handlers","document","activeElement","setSelectionRange","event","_toggleEventHandler","EVENTS_MAP","handler","removeEventListener","addEventListener","selectionChange","drop","click","focus","InputMask","el","_listeners","_unmaskedValue","_saveSelection","_onInput","_onChange","_onDrop","_onFocus","alignCursor","alignCursorFriendly","_bindEvents","updateValue","maskEquals","updateControl","typedValue","_unbindEvents","_fireEvent","ev","listeners","l","_cursorChanging","_changingCursorPos","isActive","_selection","newUnmaskedValue","newValue","isChanged","_fireChangeEvents","restOpts","updateMask","updateOpts","objectIncludes","arrA","arrB","dateA","dateB","getTime","regexpA","regexpB","hasOwnProperty","call","updateCursor","_delayUpdateCursor","_abortUpdateCursor","setTimeout","clearTimeout","on","off","hIndex","oldRawValue","rawInputValue","removed","preventDefault","stopPropagation","destroy","MaskedEnum","enum","some","_updateRegExps","allowNegative","scale","radix","_numberRegExpInput","_numberRegExp","_mapToRadixRegExp","mapToRadix","_thousandsSeparatorRegExp","thousandsSeparator","_removeThousandsSeparators","_insertThousandsSeparators","parts","_separatorsCount","extendOnSeparators","count","_separatorsCountFromSlice","_adjustRangeWithSeparators","prevBeforeTailValue","prevBeforeTailSeparatorsCount","appendDetails","beforeTailValue","beforeTailSeparatorsCount","_findSeparatorAround","searchFrom","separatorPos","separatorAroundFromPos","separatorAroundToPos","valueBeforePos","valueAfterPos","separatorAtLeftPos","separatorAtLeftEndPos","separatorAtRightPos","valid","test","number","isNaN","validnum","formatted","normalizeZeros","_normalizeZeros","padFractionalZeros","_padFractionalZeros","sign","zeros","signed","currentMask","compiledMasks","_applyDispatch","prevValueBeforeTail","inputValue","insertValue","_rawInputValue","tailValue","prevMask","prevMaskState","doDispatch","dispatch","currentMaskRef","mi","inputs","weight","i1","i2"],"mappings":"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"}