react-input-mask-format 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/hooks.ts","../src/utils/defer.ts","../src/utils/input.ts","../src/utils/helpers.ts","../src/constants.ts","../src/validate-props.ts","../src/utils/parse-mask.ts","../src/utils/mask.ts","../src/v2-compat.ts","../src/utils/transform.ts"],"sourcesContent":["import React, { useLayoutEffect, forwardRef } from \"react\";\n\nimport { useInputState, useInputElement, usePrevious } from \"./hooks\";\nimport { validateMaxLength, validateChildren, validateMaskPlaceholder } from \"./validate-props\";\nimport { defer } from \"./utils/defer\";\nimport { isInputFocused } from \"./utils/input\";\nimport { isFunction, toString, getElementDocument } from \"./utils/helpers\";\nimport MaskUtils from \"./utils/mask\";\nimport {\n resolveMaskPlaceholder,\n normalizeFormatChars,\n createBeforeMaskedStateChangeAdapter,\n warnDeprecatedOnce\n} from \"./v2-compat\";\nimport { resolveTransform } from \"./utils/transform\";\nimport type { InputMaskProps, InputState, V2MaskOptions } from \"./types\";\n\nconst InputMask = forwardRef<HTMLInputElement, InputMaskProps>(function InputMask(\n props,\n forwardedRef\n) {\n const {\n alwaysShowMask = false,\n children,\n mask,\n maskPlaceholder: maskPlaceholderProp,\n beforeMaskedStateChange: beforeMaskedStateChangeProp,\n transform,\n maskChar,\n formatChars,\n beforeMaskedValueChange,\n ...restProps\n } = props;\n\n if (maskChar !== undefined) {\n warnDeprecatedOnce(\"maskChar\", \"maskChar is deprecated, use maskPlaceholder instead. See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask\");\n }\n if (beforeMaskedValueChange !== undefined) {\n warnDeprecatedOnce(\"beforeMaskedValueChange\", \"beforeMaskedValueChange is deprecated, use beforeMaskedStateChange. See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask\");\n }\n\n const resolvedPlaceholder = resolveMaskPlaceholder(maskPlaceholderProp, maskChar);\n const maskPlaceholder = resolvedPlaceholder === undefined ? \"_\" : resolvedPlaceholder;\n\n validateMaxLength(props);\n validateMaskPlaceholder({ ...props, maskPlaceholder });\n\n const { formatChars: normalizedFormatChars, hasLegacyString } =\n normalizeFormatChars(formatChars);\n if (hasLegacyString) {\n warnDeprecatedOnce(\n \"formatChars\",\n \"string values in formatChars are deprecated, pass RegExp values instead (e.g. { \\\"#\\\": /[0-9]/ }). See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask\"\n );\n }\n\n const maskUtils = new MaskUtils({\n mask,\n maskPlaceholder,\n formatChars: normalizedFormatChars,\n transform: resolveTransform(transform)\n });\n\n let beforeMaskedStateChange = beforeMaskedStateChangeProp;\n if (!beforeMaskedStateChange && beforeMaskedValueChange) {\n const v2MaskOptions: V2MaskOptions = {\n mask,\n maskChar: maskPlaceholder,\n alwaysShowMask,\n formatChars: formatChars ?? { \"9\": \"[0-9]\", a: \"[A-Za-z]\", \"*\": \"[A-Za-z0-9]\" },\n permanents: maskUtils.maskOptions.permanents\n };\n beforeMaskedStateChange = createBeforeMaskedStateChangeAdapter(\n beforeMaskedValueChange,\n v2MaskOptions\n );\n }\n\n const isMasked = !!mask;\n const isEditable = !restProps.disabled && !restProps.readOnly;\n const isControlled = props.value !== null && props.value !== undefined;\n const previousIsMasked = usePrevious(isMasked);\n const initialValue = toString(\n (isControlled ? props.value : props.defaultValue) || \"\"\n );\n\n const {\n inputRef,\n getInputState,\n setInputState,\n getLastInputState\n } = useInputState(initialValue, isMasked);\n const getInputElement = useInputElement(inputRef);\n\n function onChange(event: React.ChangeEvent<HTMLInputElement>): void {\n const currentState = getInputState();\n const previousState = getLastInputState();\n let newInputState: InputState = maskUtils.processChange(currentState, previousState);\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState,\n previousState,\n nextState: newInputState\n });\n }\n\n setInputState(newInputState);\n\n if (props.onChange) {\n props.onChange(event);\n }\n }\n\n function onFocus(event: React.FocusEvent<HTMLInputElement>): void {\n // If autoFocus property is set, focus event fires before the ref handler gets called\n inputRef.current = event.target;\n\n const currentValue = getInputState().value;\n\n if (isMasked && !maskUtils.isValueFilled(currentValue)) {\n let newValue = maskUtils.formatValue(currentValue);\n let newSelection = maskUtils.getDefaultSelectionForValue(newValue);\n let newInputState: InputState = {\n value: newValue,\n selection: newSelection\n };\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState: getInputState(),\n nextState: newInputState\n });\n newValue = newInputState.value;\n newSelection = newInputState.selection;\n }\n\n setInputState(newInputState);\n\n if (newValue !== currentValue && props.onChange) {\n props.onChange(event as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n\n // Chrome resets selection after focus event,\n // so we want to restore it later\n defer(() => {\n setInputState(getLastInputState());\n });\n }\n\n if (props.onFocus) {\n props.onFocus(event);\n }\n }\n\n function onBlur(event: React.FocusEvent<HTMLInputElement>): void {\n const currentValue = getInputState().value;\n const lastValue = getLastInputState().value;\n\n if (isMasked && !alwaysShowMask && maskUtils.isValueEmpty(lastValue)) {\n let newValue = \"\";\n let newInputState: InputState = {\n value: newValue,\n selection: { start: null, end: null }\n };\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState: getInputState(),\n nextState: newInputState\n });\n newValue = newInputState.value;\n }\n\n setInputState(newInputState);\n\n if (newValue !== currentValue && props.onChange) {\n props.onChange(event as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n }\n\n if (props.onBlur) {\n props.onBlur(event);\n }\n }\n\n // Tiny unintentional mouse movements can break cursor\n // position on focus, so we have to restore it in that case\n //\n // https://github.com/sanniassin/react-input-mask/issues/108\n function onMouseDown(event: React.MouseEvent<HTMLInputElement>): void {\n const input = getInputElement();\n const { value } = getInputState();\n const inputDocument = getElementDocument(input);\n\n if (!isInputFocused(input as HTMLInputElement) && !maskUtils.isValueFilled(value)) {\n const mouseDownX = event.clientX;\n const mouseDownY = event.clientY;\n const mouseDownTime = new Date().getTime();\n\n const mouseUpHandler = (mouseUpEvent: MouseEvent): void => {\n inputDocument!.removeEventListener(\"mouseup\", mouseUpHandler);\n\n if (!isInputFocused(input as HTMLInputElement)) {\n return;\n }\n\n const deltaX = Math.abs(mouseUpEvent.clientX - mouseDownX);\n const deltaY = Math.abs(mouseUpEvent.clientY - mouseDownY);\n const axisDelta = Math.max(deltaX, deltaY);\n const timeDelta = new Date().getTime() - mouseDownTime;\n\n if (\n (axisDelta <= 10 && timeDelta <= 200) ||\n (axisDelta <= 5 && timeDelta <= 300)\n ) {\n const lastState = getLastInputState();\n const newSelection = maskUtils.getDefaultSelectionForValue(\n lastState.value\n );\n const newState = {\n ...lastState,\n selection: newSelection\n };\n setInputState(newState);\n }\n };\n\n inputDocument!.addEventListener(\"mouseup\", mouseUpHandler);\n }\n\n if (props.onMouseDown) {\n props.onMouseDown(event);\n }\n }\n\n // For controlled inputs we want to provide properly formatted value\n // prop. Computed purely during render; refs/DOM are synced in a layout\n // effect so render stays side-effect free (StrictMode / concurrent).\n let renderValue = props.value as string | undefined;\n if (isMasked && isControlled) {\n const input = getInputElement();\n const isFocused = !!input && isInputFocused(input);\n let newValue =\n isFocused || alwaysShowMask || props.value\n ? maskUtils.formatValue(props.value as string)\n : (props.value as string);\n\n if (beforeMaskedStateChange) {\n newValue = beforeMaskedStateChange({\n nextState: { value: newValue, selection: { start: null, end: null } }\n }).value;\n }\n\n renderValue = newValue;\n }\n\n const lastSelection = getLastInputState().selection;\n\n useLayoutEffect(() => {\n if (isMasked && isControlled) {\n setInputState({\n ...getLastInputState(),\n value: renderValue as string\n });\n }\n });\n\n useLayoutEffect(() => {\n if (!isMasked) {\n return;\n }\n\n const input = getInputElement();\n const isFocused = isInputFocused(input as HTMLInputElement);\n const previousSelection = lastSelection;\n const currentState = getInputState();\n let newInputState: InputState = { ...currentState };\n\n // Update value for uncontrolled inputs to make sure\n // it's always in sync with mask props\n if (!isControlled) {\n const currentValue = currentState.value;\n const formattedValue = maskUtils.formatValue(currentValue);\n const isValueEmpty = maskUtils.isValueEmpty(formattedValue);\n const shouldFormatValue = !isValueEmpty || isFocused || alwaysShowMask;\n if (shouldFormatValue) {\n newInputState.value = formattedValue;\n } else if (isValueEmpty && !isFocused) {\n newInputState.value = \"\";\n }\n }\n\n if (isFocused && !previousIsMasked) {\n // Adjust selection if input got masked while being focused\n newInputState.selection = maskUtils.getDefaultSelectionForValue(\n newInputState.value\n );\n } else if (isControlled && isFocused && previousSelection) {\n // Restore cursor position if value has changed outside change event\n if (previousSelection.start !== null && previousSelection.end !== null) {\n newInputState.selection = previousSelection;\n }\n }\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState,\n nextState: newInputState\n });\n }\n\n setInputState(newInputState);\n });\n\n const inputProps = {\n ...restProps,\n onFocus,\n onBlur,\n onChange: isMasked && isEditable ? onChange : props.onChange,\n onMouseDown: isMasked && isEditable ? onMouseDown : props.onMouseDown,\n // `ref` may target either the plain <input> DOM node or, when custom\n // children are used, whatever node the child's own ref forwards to.\n ref: (ref: unknown) => {\n inputRef.current = ref as HTMLInputElement | null;\n\n if (isFunction(forwardedRef)) {\n (forwardedRef as (instance: unknown) => void)(ref);\n } else if (forwardedRef !== null && typeof forwardedRef === \"object\") {\n (forwardedRef as React.MutableRefObject<unknown>).current = ref;\n }\n },\n value: isMasked && isControlled ? renderValue : props.value\n };\n\n if (children) {\n validateChildren(props, children);\n\n // Clone the child injecting our props and callback ref directly.\n // If the child forwards its ref to a non-input node, useInputElement\n // falls back to querySelector(\"input\") to find the real input.\n return React.cloneElement(children, inputProps);\n }\n\n return <input {...inputProps} />;\n});\n\nInputMask.displayName = \"InputMask\";\n\nexport { defaultFormatChars, extendedFormatChars } from \"./constants\";\nexport type {\n InputMaskProps,\n InputState,\n Selection,\n BeforeMaskedStateChangeFn,\n BeforeMaskedValueChangeFn,\n Mask,\n Transform,\n FormatChars\n} from \"./types\";\nexport default InputMask;\n","import { useCallback, useEffect, useLayoutEffect, useRef } from \"react\";\nimport type React from \"react\";\n\nimport { defer, cancelDefer } from \"./utils/defer\";\nimport { setInputSelection, getInputSelection, isInputFocused } from \"./utils/input\";\nimport { isDOMElement } from \"./utils/helpers\";\nimport type { InputState, Selection } from \"./types\";\n\nexport type InputElementGetter = () => HTMLInputElement | null;\n\nexport function useInputElement(\n inputRef: React.MutableRefObject<HTMLInputElement | null>\n): InputElementGetter {\n return useCallback(() => {\n let input: HTMLInputElement | Element | null = inputRef.current;\n const isDOMNode = typeof window !== \"undefined\" && isDOMElement(input);\n\n // workaround for react-test-renderer\n // https://github.com/sanniassin/react-input-mask/issues/147\n if (!input || !isDOMNode) {\n return null;\n }\n\n if (input.nodeName !== \"INPUT\") {\n input = input.querySelector(\"input\");\n }\n\n if (!input) {\n throw new Error(\"react-input-mask: inputComponent doesn't contain input node\");\n }\n\n return input as HTMLInputElement;\n }, [inputRef]);\n}\n\nfunction useDeferLoop(callback: () => void): [() => void, () => void] {\n const deferIdRef = useRef<number | null>(null);\n\n const runLoop = useCallback(() => {\n // If there are simulated focus events, runLoop could be\n // called multiple times without blur or re-render\n if (deferIdRef.current !== null) {\n return;\n }\n\n function loop() {\n callback();\n deferIdRef.current = defer(loop);\n }\n\n loop();\n }, [callback]);\n\n const stopLoop = useCallback(() => {\n cancelDefer(deferIdRef.current);\n deferIdRef.current = null;\n }, []);\n\n useEffect(() => {\n if (deferIdRef.current) {\n stopLoop();\n runLoop();\n }\n }, [runLoop, stopLoop]);\n\n useEffect(() => cancelDefer(deferIdRef.current), []);\n\n return [runLoop, stopLoop];\n}\n\nfunction useSelection(\n inputRef: React.MutableRefObject<HTMLInputElement | null>,\n isMasked: boolean\n) {\n const selectionRef = useRef<Selection>({ start: null, end: null });\n const getInputElement = useInputElement(inputRef);\n\n const getSelection = useCallback(() => {\n const input = getInputElement();\n return getInputSelection(input as HTMLInputElement);\n }, [getInputElement]);\n\n const getLastSelection = useCallback(() => {\n return selectionRef.current;\n }, []);\n\n const setSelection = useCallback(\n (selection: Selection) => {\n const input = getInputElement();\n\n // Don't change selection on unfocused input\n // because Safari sets focus on selection change (#154)\n if (!input || !isInputFocused(input)) {\n return;\n }\n\n setInputSelection(input, selection.start!, selection.end!);\n\n // Use actual selection in case the requested one was out of range\n selectionRef.current = getSelection();\n },\n [getInputElement, getSelection]\n );\n\n const selectionLoop = useCallback(() => {\n selectionRef.current = getSelection();\n }, [getSelection]);\n const [runSelectionLoop, stopSelectionLoop] = useDeferLoop(selectionLoop);\n\n useLayoutEffect(() => {\n if (!isMasked) {\n return;\n }\n\n const input = getInputElement();\n if (!input) return;\n input.addEventListener(\"focus\", runSelectionLoop);\n input.addEventListener(\"blur\", stopSelectionLoop);\n\n if (isInputFocused(input)) {\n runSelectionLoop();\n }\n\n return () => {\n input.removeEventListener(\"focus\", runSelectionLoop);\n input.removeEventListener(\"blur\", stopSelectionLoop);\n\n stopSelectionLoop();\n };\n });\n\n return { getSelection, getLastSelection, setSelection };\n}\n\nfunction useValue(\n inputRef: React.MutableRefObject<HTMLInputElement | null>,\n initialValue: string\n) {\n const getInputElement = useInputElement(inputRef);\n const valueRef = useRef(initialValue);\n\n const getValue = useCallback(() => {\n return getInputElement()!.value;\n }, [getInputElement]);\n\n const getLastValue = useCallback(() => {\n return valueRef.current;\n }, []);\n\n const setValue = useCallback(\n (newValue: string) => {\n valueRef.current = newValue;\n\n const input = getInputElement();\n if (input) {\n input.value = newValue;\n }\n },\n [getInputElement]\n );\n\n return {\n getValue,\n getLastValue,\n setValue\n };\n}\n\nexport function useInputState(\n initialValue: string,\n isMasked: boolean\n): {\n inputRef: React.MutableRefObject<HTMLInputElement | null>;\n getInputState: () => InputState;\n getLastInputState: () => InputState;\n setInputState: (state: InputState) => void;\n} {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const { getSelection, getLastSelection, setSelection } = useSelection(inputRef, isMasked);\n const { getValue, getLastValue, setValue } = useValue(inputRef, initialValue);\n\n function getLastInputState(): InputState {\n return {\n value: getLastValue(),\n selection: getLastSelection()\n };\n }\n\n function getInputState(): InputState {\n return {\n value: getValue(),\n selection: getSelection()\n };\n }\n\n function setInputState({ value, selection }: InputState): void {\n setValue(value);\n setSelection(selection);\n }\n\n return {\n inputRef,\n getInputState,\n getLastInputState,\n setInputState\n };\n}\n\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined);\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n","export function defer(fn: FrameRequestCallback): number {\n return requestAnimationFrame(fn);\n}\n\nexport function cancelDefer(deferId: number | null): void {\n if (deferId !== null) {\n cancelAnimationFrame(deferId);\n }\n}\n","import type { Selection } from \"../types\";\n\nexport function setInputSelection(\n input: HTMLInputElement,\n start: number,\n end?: number\n): void {\n if (end === undefined) {\n end = start;\n }\n input.setSelectionRange(start, end);\n}\n\nexport function getInputSelection(input: HTMLInputElement): Required<Selection> {\n const start = input.selectionStart;\n const end = input.selectionEnd;\n\n return {\n start,\n end,\n length: (end ?? 0) - (start ?? 0)\n };\n}\n\nexport function isInputFocused(input: HTMLInputElement): boolean {\n const inputDocument = input.ownerDocument;\n return inputDocument.hasFocus() && inputDocument.activeElement === input;\n}\n","// Element's window may differ from the one within React instance\n// if element rendered within iframe.\n// See https://github.com/sanniassin/react-input-mask/issues/182\nexport function getElementDocument(element: Element | null | undefined) {\n return element?.ownerDocument;\n}\n\nexport function getElementWindow(element: Element | null | undefined) {\n return getElementDocument(element)?.defaultView;\n}\n\nexport function isDOMElement(element: unknown): element is HTMLElement {\n const elementWindow = getElementWindow(element as Element | null);\n return (\n !!elementWindow && (element as Element) instanceof elementWindow.HTMLElement\n );\n}\n\nexport function isFunction(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n\nexport function findLastIndex<T>(\n array: readonly T[],\n predicate: (item: T, index: number) => boolean\n): number {\n for (let i = array.length - 1; i >= 0; i--) {\n const x = array[i];\n if (predicate(x, i)) {\n return i;\n }\n }\n return -1;\n}\n\nexport function repeat(string: string, n = 1): string {\n let result = \"\";\n for (let i = 0; i < n; i++) {\n result += string;\n }\n return result;\n}\n\nexport function toString(value: unknown): string {\n return `${value}`;\n}\n","import type { FormatChars } from \"./types\";\n\nexport const CONTROLLED_PROPS = [\n \"disabled\",\n \"onBlur\",\n \"onChange\",\n \"onFocus\",\n \"onMouseDown\",\n \"readOnly\",\n \"value\"\n] as const;\n\nexport const defaultFormatChars: FormatChars = {\n \"9\": /[0-9]/,\n a: /[A-Za-z]/,\n \"*\": /[A-Za-z0-9]/\n};\n\nexport const extendedFormatChars: FormatChars = {\n ...defaultFormatChars,\n A: /[A-Z]/,\n \"Я\": /[А-Яа-яЁёӘәҒғҚқҢңӨөҰұҮүҺһІі]/,\n \"#\": /[0-9A-Fa-f]/\n};\n","import type React from \"react\";\nimport { CONTROLLED_PROPS } from \"./constants\";\nimport type { InputMaskProps } from \"./types\";\n\nfunction warnDev(condition: boolean, message: string): void {\n if (process.env.NODE_ENV !== \"production\" && !condition) {\n console.error(`react-input-mask-format: ${message}`);\n }\n}\n\nfunction invariant(condition: boolean, message: string): void {\n if (!condition) {\n throw new Error(`react-input-mask-format: ${message}`);\n }\n}\n\nexport function validateMaxLength(props: InputMaskProps): void {\n warnDev(\n !props.maxLength || !props.mask,\n \"maxLength property shouldn't be passed to the masked input. It breaks masking and unnecessary because length is limited by the mask length.\"\n );\n}\n\nexport function validateMaskPlaceholder(props: InputMaskProps & { maskPlaceholder?: string | null }): void {\n const { mask, maskPlaceholder } = props;\n\n invariant(\n !mask ||\n !maskPlaceholder ||\n maskPlaceholder.length === 1 ||\n maskPlaceholder.length === mask.length,\n \"maskPlaceholder should either be a single character or have the same length as the mask:\\n\" +\n `mask: ${mask}\\n` +\n `maskPlaceholder: ${maskPlaceholder}`\n );\n}\n\nexport function validateChildren(\n props: InputMaskProps,\n inputElement: React.ReactElement\n): void {\n const conflictProps = CONTROLLED_PROPS.filter(\n propId =>\n (inputElement.props as Record<string, unknown>)[propId] != null &&\n (inputElement.props as Record<string, unknown>)[propId] !==\n (props as Record<string, unknown>)[propId]\n );\n\n invariant(\n !conflictProps.length,\n `the following props should be passed to the InputMask component, not to children: ${conflictProps.join(\",\")}`\n );\n}\n","import { defaultFormatChars } from \"../constants\";\nimport type { FormatChars, Mask } from \"../types\";\n\nexport interface ParsedMaskOptions {\n maskPlaceholder: string | null;\n mask: Array<string | RegExp> | null;\n prefix: string | null;\n lastEditablePosition: number | null;\n permanents: number[];\n}\n\nexport default function parseMask({\n mask,\n maskPlaceholder,\n formatChars = defaultFormatChars\n}: {\n mask?: Mask | null;\n maskPlaceholder?: string | null;\n formatChars?: FormatChars;\n}): ParsedMaskOptions {\n const permanents: number[] = [];\n\n if (!mask) {\n return {\n maskPlaceholder: null,\n mask: null,\n prefix: null,\n lastEditablePosition: null,\n permanents: []\n };\n }\n\n let parsedMask: Array<string | RegExp>;\n\n if (typeof mask === \"string\") {\n let isPermanent = false;\n let parsedMaskString = \"\";\n mask.split(\"\").forEach(character => {\n if (!isPermanent && character === \"\\\\\") {\n isPermanent = true;\n } else {\n if (isPermanent || !formatChars[character]) {\n permanents.push(parsedMaskString.length);\n }\n parsedMaskString += character;\n isPermanent = false;\n }\n });\n\n parsedMask = parsedMaskString.split(\"\").map((character, index) => {\n if (permanents.indexOf(index) === -1) {\n return formatChars[character];\n }\n return character;\n });\n } else {\n mask.forEach((character, index) => {\n if (typeof character === \"string\") {\n permanents.push(index);\n }\n });\n parsedMask = mask;\n }\n\n let parsedPlaceholder: string | null = maskPlaceholder ?? null;\n\n if (parsedPlaceholder) {\n let placeholderChars: Array<string | RegExp>;\n\n if (parsedPlaceholder.length === 1) {\n placeholderChars = parsedMask.map((character, index) => {\n if (permanents.indexOf(index) !== -1) {\n return character;\n }\n return parsedPlaceholder as string;\n });\n } else {\n placeholderChars = parsedPlaceholder.split(\"\");\n }\n\n permanents.forEach(position => {\n placeholderChars[position] = parsedMask[position];\n });\n\n parsedPlaceholder = placeholderChars.join(\"\");\n }\n\n const prefix = permanents\n .filter((position, index) => position === index)\n .map(position => parsedMask[position])\n .join(\"\");\n\n let lastEditablePosition = parsedMask.length - 1;\n while (permanents.indexOf(lastEditablePosition) !== -1) {\n lastEditablePosition--;\n }\n\n return {\n maskPlaceholder: parsedPlaceholder,\n prefix,\n mask: parsedMask,\n lastEditablePosition,\n permanents\n };\n}\n","import { findLastIndex, repeat } from \"./helpers\";\nimport parseMask, { ParsedMaskOptions } from \"./parse-mask\";\nimport type { FormatChars, InputState, Selection } from \"../types\";\n\nexport default class MaskUtils {\n maskOptions: ParsedMaskOptions;\n transform?: (char: string, position: number) => string;\n\n constructor(options: {\n mask?: string | Array<string | RegExp> | null;\n maskPlaceholder?: string | null;\n formatChars?: FormatChars;\n transform?: (char: string, position: number) => string;\n }) {\n this.maskOptions = parseMask(options);\n this.transform = options.transform;\n }\n\n isCharacterAllowedAtPosition = (character: string, position: number): boolean => {\n const { maskPlaceholder } = this.maskOptions;\n\n if (this.isCharacterFillingPosition(character, position)) {\n return true;\n }\n\n if (!maskPlaceholder) {\n return false;\n }\n\n return maskPlaceholder[position] === character;\n };\n\n isCharacterFillingPosition = (character: string, position: number): boolean => {\n const { mask } = this.maskOptions;\n\n if (!character || position >= mask!.length) {\n return false;\n }\n\n if (!this.isPositionEditable(position)) {\n return mask![position] === character;\n }\n\n const charRule = mask![position];\n return new RegExp(charRule).test(character);\n };\n\n isPositionEditable = (position: number): boolean => {\n const { mask, permanents } = this.maskOptions;\n return position < mask!.length && permanents.indexOf(position) === -1;\n };\n\n isValueEmpty = (value: string): boolean => {\n return value.split(\"\").every((character, position) => {\n return (\n !this.isPositionEditable(position) ||\n !this.isCharacterFillingPosition(character, position)\n );\n });\n };\n\n isValueFilled = (value: string): boolean => {\n return (\n this.getFilledLength(value) === this.maskOptions.lastEditablePosition! + 1\n );\n };\n\n getDefaultSelectionForValue = (value: string): Selection => {\n const filledLength = this.getFilledLength(value);\n const cursorPosition = this.getRightEditablePosition(filledLength);\n return { start: cursorPosition, end: cursorPosition };\n };\n\n getFilledLength = (value: string): number => {\n const characters = value.split(\"\");\n const lastFilledIndex = findLastIndex(characters, (character, position) => {\n return (\n this.isPositionEditable(position) &&\n this.isCharacterFillingPosition(character, position)\n );\n });\n return lastFilledIndex + 1;\n };\n\n getStringFillingLengthAtPosition = (string: string, position: number): number => {\n const characters = string.split(\"\");\n const insertedValue = characters.reduce((value, character) => {\n return this.insertCharacterAtPosition(value, character, value.length);\n }, repeat(\" \", position));\n\n return insertedValue.length - position;\n };\n\n getLeftEditablePosition = (position: number): number | null => {\n for (let i = position; i >= 0; i--) {\n if (this.isPositionEditable(i)) {\n return i;\n }\n }\n return null;\n };\n\n getRightEditablePosition = (position: number): number | null => {\n const { mask } = this.maskOptions;\n for (let i = position; i < mask!.length; i++) {\n if (this.isPositionEditable(i)) {\n return i;\n }\n }\n return null;\n };\n\n formatValue = (value: string): string => {\n const { maskPlaceholder, mask } = this.maskOptions;\n\n if (!maskPlaceholder) {\n value = this.insertStringAtPosition(\"\", value, 0);\n\n while (\n value.length < mask!.length &&\n !this.isPositionEditable(value.length)\n ) {\n value += mask![value.length];\n }\n\n return value;\n }\n\n return this.insertStringAtPosition(maskPlaceholder, value, 0);\n };\n\n clearRange = (value: string, start: number, len: number): string => {\n if (!len) {\n return value;\n }\n\n const end = start + len;\n const { maskPlaceholder, mask } = this.maskOptions;\n\n const clearedValue = value\n .split(\"\")\n .map((character, i) => {\n const isEditable = this.isPositionEditable(i);\n\n if (!maskPlaceholder && i >= end && !isEditable) {\n return \"\";\n }\n if (i < start || i >= end) {\n return character;\n }\n if (!isEditable) {\n return mask![i];\n }\n if (maskPlaceholder) {\n return maskPlaceholder[i];\n }\n return \"\";\n })\n .join(\"\");\n\n return this.formatValue(clearedValue);\n };\n\n insertCharacterAtPosition = (value: string, character: string, position: number): string => {\n const { mask, maskPlaceholder } = this.maskOptions;\n if (position >= mask!.length) {\n return value;\n }\n\n const transformedCharacter =\n this.transform && this.isPositionEditable(position)\n ? this.transform(character, position)\n : character;\n\n const isAllowed = this.isCharacterAllowedAtPosition(transformedCharacter, position);\n const isEditable = this.isPositionEditable(position);\n const nextEditablePosition = this.getRightEditablePosition(position);\n const isNextPlaceholder =\n maskPlaceholder && nextEditablePosition\n ? transformedCharacter === maskPlaceholder[nextEditablePosition]\n : null;\n const valueBefore = value.slice(0, position);\n\n if (isAllowed || !isEditable) {\n const insertedCharacter = isAllowed ? transformedCharacter : mask![position];\n value = valueBefore + insertedCharacter;\n }\n\n if (!isAllowed && !isEditable && !isNextPlaceholder) {\n value = this.insertCharacterAtPosition(value, character, position + 1);\n }\n\n return value;\n };\n\n insertStringAtPosition = (value: string, string: string, position: number): string => {\n const { mask, maskPlaceholder } = this.maskOptions;\n if (!string || position >= mask!.length) {\n return value;\n }\n\n const characters = string.split(\"\");\n const isFixedLength = this.isValueFilled(value) || !!maskPlaceholder;\n const valueAfter = value.slice(position);\n\n value = characters.reduce((value, character) => {\n return this.insertCharacterAtPosition(value, character, value.length);\n }, value.slice(0, position));\n\n if (isFixedLength) {\n value += valueAfter.slice(value.length - position);\n } else if (this.isValueFilled(value)) {\n value += mask!.slice(value.length).join(\"\");\n } else {\n const editableCharactersAfter = valueAfter\n .split(\"\")\n .filter((character, i) => {\n return this.isPositionEditable(position + i);\n });\n value = editableCharactersAfter.reduce((value, character) => {\n const nextEditablePosition = this.getRightEditablePosition(\n value.length\n );\n if (nextEditablePosition === null) {\n return value;\n }\n\n if (!this.isPositionEditable(value.length)) {\n value += mask!.slice(value.length, nextEditablePosition).join(\"\");\n }\n\n return this.insertCharacterAtPosition(value, character, value.length);\n }, value);\n }\n\n return value;\n };\n\n processChange = (currentState: InputState, previousState: InputState): InputState & { enteredString: string } => {\n const { mask, prefix, lastEditablePosition } = this.maskOptions;\n const { value, selection } = currentState;\n const previousValue = previousState.value;\n const previousSelection = previousState.selection;\n let newValue = value;\n let enteredString = \"\";\n let formattedEnteredStringLength = 0;\n let removedLength = 0;\n let cursorPosition = Math.min(previousSelection.start!, selection.start!);\n\n if (selection.end! > previousSelection.start!) {\n enteredString = newValue.slice(previousSelection.start!, selection.end!);\n formattedEnteredStringLength = this.getStringFillingLengthAtPosition(\n enteredString,\n cursorPosition\n );\n if (!formattedEnteredStringLength) {\n removedLength = 0;\n } else {\n removedLength = previousSelection.length!;\n }\n } else if (newValue.length < previousValue.length) {\n removedLength = previousValue.length - newValue.length;\n }\n\n newValue = previousValue;\n\n if (removedLength) {\n if (removedLength === 1 && !previousSelection.length) {\n const deleteFromRight = previousSelection.start === selection.start;\n cursorPosition = (deleteFromRight\n ? this.getRightEditablePosition(selection.start!)\n : this.getLeftEditablePosition(selection.start!))!;\n }\n newValue = this.clearRange(newValue, cursorPosition, removedLength);\n }\n\n newValue = this.insertStringAtPosition(\n newValue,\n enteredString,\n cursorPosition\n );\n\n cursorPosition += formattedEnteredStringLength;\n if (cursorPosition >= mask!.length) {\n cursorPosition = mask!.length;\n } else if (\n cursorPosition < prefix!.length &&\n !formattedEnteredStringLength\n ) {\n cursorPosition = prefix!.length;\n } else if (\n cursorPosition >= prefix!.length &&\n cursorPosition < lastEditablePosition! &&\n formattedEnteredStringLength\n ) {\n cursorPosition = this.getRightEditablePosition(cursorPosition)!;\n }\n\n newValue = this.formatValue(newValue);\n\n return {\n value: newValue,\n enteredString,\n selection: { start: cursorPosition, end: cursorPosition }\n };\n };\n}\n","import type {\n BeforeMaskedStateChangeFn,\n BeforeMaskedValueChangeFn,\n FormatChars,\n InputState,\n V2MaskOptions\n} from \"./types\";\n\nconst warned = new Set<string>();\n\nexport function __resetDeprecationWarnings(): void {\n warned.clear();\n}\n\nexport function warnDeprecatedOnce(prop: string, message: string): void {\n if (process.env.NODE_ENV !== \"production\" && !warned.has(prop)) {\n warned.add(prop);\n console.warn(`react-input-mask-format: ${message}`);\n }\n}\n\nexport function resolveMaskPlaceholder(\n maskPlaceholder: string | null | undefined,\n maskChar: string | null | undefined\n): string | null | undefined {\n if (maskPlaceholder !== undefined) {\n return maskPlaceholder;\n }\n return maskChar;\n}\n\nexport function normalizeFormatChars(\n formatChars: Record<string, RegExp | string> | undefined\n): { formatChars: FormatChars | undefined; hasLegacyString: boolean } {\n if (!formatChars) {\n return { formatChars: undefined, hasLegacyString: false };\n }\n const result: FormatChars = {};\n let hasLegacyString = false;\n for (const key of Object.keys(formatChars)) {\n const value = formatChars[key];\n if (typeof value === \"string\") {\n hasLegacyString = true;\n result[key] = new RegExp(value);\n } else {\n result[key] = value;\n }\n }\n return { formatChars: result, hasLegacyString };\n}\n\nexport function toRegExpFormatChars(\n formatChars: Record<string, RegExp | string> | undefined\n): FormatChars | undefined {\n return normalizeFormatChars(formatChars).formatChars;\n}\n\nexport function createBeforeMaskedStateChangeAdapter(\n beforeMaskedValueChange: BeforeMaskedValueChangeFn,\n maskOptions: V2MaskOptions\n): BeforeMaskedStateChangeFn {\n return ({ previousState, currentState, nextState }) =>\n beforeMaskedValueChange(\n nextState,\n previousState ?? currentState ?? null,\n (nextState as InputState & { enteredString?: string }).enteredString ?? null,\n maskOptions\n );\n}\n","import type { Transform } from \"../types\";\n\nexport function resolveTransform(\n transform: Transform | undefined\n): ((char: string, position: number) => string) | undefined {\n if (!transform) {\n return undefined;\n }\n if (transform === \"uppercase\") {\n return char => char.toUpperCase();\n }\n if (transform === \"lowercase\") {\n return char => char.toLowerCase();\n }\n if (typeof transform === \"function\") {\n return transform;\n }\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\n `react-input-mask-format: invalid transform \"${String(\n transform\n )}\", expected \"uppercase\" | \"lowercase\" | (char, position) => char`\n );\n }\n return undefined;\n}\n"],"mappings":"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","names":["import_react","value","InputMask","React"]}
1
+ {"version":3,"sources":["../src/index.tsx","../src/hooks.ts","../src/utils/defer.ts","../src/utils/input.ts","../src/utils/helpers.ts","../src/constants.ts","../src/validate-props.ts","../src/utils/parse-mask.ts","../src/utils/mask.ts","../src/v2-compat.ts","../src/utils/transform.ts","../src/use-mask.ts","../src/set-native-value.ts","../src/bind-mask.ts"],"sourcesContent":["import React, { useLayoutEffect, forwardRef } from \"react\";\n\nimport { useInputState, useInputElement, usePrevious } from \"./hooks\";\nimport { validateMaxLength, validateChildren, validateMaskPlaceholder } from \"./validate-props\";\nimport { defer } from \"./utils/defer\";\nimport { isInputFocused } from \"./utils/input\";\nimport { isFunction, toString, getElementDocument } from \"./utils/helpers\";\nimport MaskUtils from \"./utils/mask\";\nimport {\n resolveMaskPlaceholder,\n normalizeFormatChars,\n createBeforeMaskedStateChangeAdapter,\n warnDeprecatedOnce\n} from \"./v2-compat\";\nimport { resolveTransform } from \"./utils/transform\";\nimport type { InputMaskProps, InputState, V2MaskOptions } from \"./types\";\n\nconst InputMask = forwardRef<HTMLInputElement, InputMaskProps>(function InputMask(\n props,\n forwardedRef\n) {\n const {\n alwaysShowMask = false,\n children,\n mask,\n maskPlaceholder: maskPlaceholderProp,\n beforeMaskedStateChange: beforeMaskedStateChangeProp,\n transform,\n maskChar,\n formatChars,\n beforeMaskedValueChange,\n ...restProps\n } = props;\n\n if (maskChar !== undefined) {\n warnDeprecatedOnce(\"maskChar\", \"maskChar is deprecated, use maskPlaceholder instead. See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask\");\n }\n if (beforeMaskedValueChange !== undefined) {\n warnDeprecatedOnce(\"beforeMaskedValueChange\", \"beforeMaskedValueChange is deprecated, use beforeMaskedStateChange. See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask\");\n }\n\n const resolvedPlaceholder = resolveMaskPlaceholder(maskPlaceholderProp, maskChar);\n const maskPlaceholder = resolvedPlaceholder === undefined ? \"_\" : resolvedPlaceholder;\n\n validateMaxLength(props);\n validateMaskPlaceholder({ ...props, maskPlaceholder });\n\n const { formatChars: normalizedFormatChars, hasLegacyString } =\n normalizeFormatChars(formatChars);\n if (hasLegacyString) {\n warnDeprecatedOnce(\n \"formatChars\",\n \"string values in formatChars are deprecated, pass RegExp values instead (e.g. { \\\"#\\\": /[0-9]/ }). See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask\"\n );\n }\n\n const maskUtils = new MaskUtils({\n mask,\n maskPlaceholder,\n formatChars: normalizedFormatChars,\n transform: resolveTransform(transform)\n });\n\n let beforeMaskedStateChange = beforeMaskedStateChangeProp;\n if (!beforeMaskedStateChange && beforeMaskedValueChange) {\n const v2MaskOptions: V2MaskOptions = {\n mask,\n maskChar: maskPlaceholder,\n alwaysShowMask,\n formatChars: formatChars ?? { \"9\": \"[0-9]\", a: \"[A-Za-z]\", \"*\": \"[A-Za-z0-9]\" },\n permanents: maskUtils.maskOptions.permanents\n };\n beforeMaskedStateChange = createBeforeMaskedStateChangeAdapter(\n beforeMaskedValueChange,\n v2MaskOptions\n );\n }\n\n const isMasked = !!mask;\n const isEditable = !restProps.disabled && !restProps.readOnly;\n const isControlled = props.value !== null && props.value !== undefined;\n const previousIsMasked = usePrevious(isMasked);\n const initialValue = toString(\n (isControlled ? props.value : props.defaultValue) || \"\"\n );\n\n const {\n inputRef,\n getInputState,\n setInputState,\n getLastInputState\n } = useInputState(initialValue, isMasked);\n const getInputElement = useInputElement(inputRef);\n\n function onChange(event: React.ChangeEvent<HTMLInputElement>): void {\n const currentState = getInputState();\n const previousState = getLastInputState();\n let newInputState: InputState = maskUtils.processChange(currentState, previousState);\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState,\n previousState,\n nextState: newInputState\n });\n }\n\n setInputState(newInputState);\n\n if (props.onChange) {\n props.onChange(event);\n }\n }\n\n function onFocus(event: React.FocusEvent<HTMLInputElement>): void {\n // If autoFocus property is set, focus event fires before the ref handler gets called\n inputRef.current = event.target;\n\n const currentValue = getInputState().value;\n\n if (isMasked && !maskUtils.isValueFilled(currentValue)) {\n let newValue = maskUtils.formatValue(currentValue);\n let newSelection = maskUtils.getDefaultSelectionForValue(newValue);\n let newInputState: InputState = {\n value: newValue,\n selection: newSelection\n };\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState: getInputState(),\n nextState: newInputState\n });\n newValue = newInputState.value;\n newSelection = newInputState.selection;\n }\n\n setInputState(newInputState);\n\n if (newValue !== currentValue && props.onChange) {\n props.onChange(event as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n\n // Chrome resets selection after focus event,\n // so we want to restore it later\n defer(() => {\n setInputState(getLastInputState());\n });\n }\n\n if (props.onFocus) {\n props.onFocus(event);\n }\n }\n\n function onBlur(event: React.FocusEvent<HTMLInputElement>): void {\n const currentValue = getInputState().value;\n const lastValue = getLastInputState().value;\n\n if (isMasked && !alwaysShowMask && maskUtils.isValueEmpty(lastValue)) {\n let newValue = \"\";\n let newInputState: InputState = {\n value: newValue,\n selection: { start: null, end: null }\n };\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState: getInputState(),\n nextState: newInputState\n });\n newValue = newInputState.value;\n }\n\n setInputState(newInputState);\n\n if (newValue !== currentValue && props.onChange) {\n props.onChange(event as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n }\n\n if (props.onBlur) {\n props.onBlur(event);\n }\n }\n\n // Tiny unintentional mouse movements can break cursor\n // position on focus, so we have to restore it in that case\n //\n // https://github.com/sanniassin/react-input-mask/issues/108\n function onMouseDown(event: React.MouseEvent<HTMLInputElement>): void {\n const input = getInputElement();\n const { value } = getInputState();\n const inputDocument = getElementDocument(input);\n\n if (!isInputFocused(input as HTMLInputElement) && !maskUtils.isValueFilled(value)) {\n const mouseDownX = event.clientX;\n const mouseDownY = event.clientY;\n const mouseDownTime = new Date().getTime();\n\n const mouseUpHandler = (mouseUpEvent: MouseEvent): void => {\n inputDocument!.removeEventListener(\"mouseup\", mouseUpHandler);\n\n if (!isInputFocused(input as HTMLInputElement)) {\n return;\n }\n\n const deltaX = Math.abs(mouseUpEvent.clientX - mouseDownX);\n const deltaY = Math.abs(mouseUpEvent.clientY - mouseDownY);\n const axisDelta = Math.max(deltaX, deltaY);\n const timeDelta = new Date().getTime() - mouseDownTime;\n\n if (\n (axisDelta <= 10 && timeDelta <= 200) ||\n (axisDelta <= 5 && timeDelta <= 300)\n ) {\n const lastState = getLastInputState();\n const newSelection = maskUtils.getDefaultSelectionForValue(\n lastState.value\n );\n const newState = {\n ...lastState,\n selection: newSelection\n };\n setInputState(newState);\n }\n };\n\n inputDocument!.addEventListener(\"mouseup\", mouseUpHandler);\n }\n\n if (props.onMouseDown) {\n props.onMouseDown(event);\n }\n }\n\n // For controlled inputs we want to provide properly formatted value\n // prop. Computed purely during render; refs/DOM are synced in a layout\n // effect so render stays side-effect free (StrictMode / concurrent).\n let renderValue = props.value as string | undefined;\n if (isMasked && isControlled) {\n const input = getInputElement();\n const isFocused = !!input && isInputFocused(input);\n let newValue =\n isFocused || alwaysShowMask || props.value\n ? maskUtils.formatValue(props.value as string)\n : (props.value as string);\n\n if (beforeMaskedStateChange) {\n newValue = beforeMaskedStateChange({\n nextState: { value: newValue, selection: { start: null, end: null } }\n }).value;\n }\n\n renderValue = newValue;\n }\n\n const lastSelection = getLastInputState().selection;\n\n useLayoutEffect(() => {\n if (isMasked && isControlled) {\n setInputState({\n ...getLastInputState(),\n value: renderValue as string\n });\n }\n });\n\n useLayoutEffect(() => {\n if (!isMasked) {\n return;\n }\n\n const input = getInputElement();\n const isFocused = isInputFocused(input as HTMLInputElement);\n const previousSelection = lastSelection;\n const currentState = getInputState();\n let newInputState: InputState = { ...currentState };\n\n // Update value for uncontrolled inputs to make sure\n // it's always in sync with mask props\n if (!isControlled) {\n const currentValue = currentState.value;\n const formattedValue = maskUtils.formatValue(currentValue);\n const isValueEmpty = maskUtils.isValueEmpty(formattedValue);\n const shouldFormatValue = !isValueEmpty || isFocused || alwaysShowMask;\n if (shouldFormatValue) {\n newInputState.value = formattedValue;\n } else if (isValueEmpty && !isFocused) {\n newInputState.value = \"\";\n }\n }\n\n if (isFocused && !previousIsMasked) {\n // Adjust selection if input got masked while being focused\n newInputState.selection = maskUtils.getDefaultSelectionForValue(\n newInputState.value\n );\n } else if (isControlled && isFocused && previousSelection) {\n // Restore cursor position if value has changed outside change event\n if (previousSelection.start !== null && previousSelection.end !== null) {\n newInputState.selection = previousSelection;\n }\n }\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState,\n nextState: newInputState\n });\n }\n\n setInputState(newInputState);\n });\n\n const inputProps = {\n ...restProps,\n onFocus,\n onBlur,\n onChange: isMasked && isEditable ? onChange : props.onChange,\n onMouseDown: isMasked && isEditable ? onMouseDown : props.onMouseDown,\n // `ref` may target either the plain <input> DOM node or, when custom\n // children are used, whatever node the child's own ref forwards to.\n ref: (ref: unknown) => {\n inputRef.current = ref as HTMLInputElement | null;\n\n if (isFunction(forwardedRef)) {\n (forwardedRef as (instance: unknown) => void)(ref);\n } else if (forwardedRef !== null && typeof forwardedRef === \"object\") {\n (forwardedRef as React.MutableRefObject<unknown>).current = ref;\n }\n },\n value: isMasked && isControlled ? renderValue : props.value\n };\n\n if (children) {\n validateChildren(props, children);\n\n // Clone the child injecting our props and callback ref directly.\n // If the child forwards its ref to a non-input node, useInputElement\n // falls back to querySelector(\"input\") to find the real input.\n return React.cloneElement(children, inputProps);\n }\n\n return <input {...inputProps} />;\n});\n\nInputMask.displayName = \"InputMask\";\n\nexport { defaultFormatChars, extendedFormatChars } from \"./constants\";\nexport { useMask } from \"./use-mask\";\nexport type {\n InputMaskProps,\n InputState,\n Selection,\n BeforeMaskedStateChangeFn,\n BeforeMaskedValueChangeFn,\n Mask,\n Transform,\n FormatChars,\n UseMaskOptions\n} from \"./types\";\nexport default InputMask;\n","import { useCallback, useEffect, useLayoutEffect, useRef } from \"react\";\nimport type React from \"react\";\n\nimport { defer, cancelDefer } from \"./utils/defer\";\nimport { setInputSelection, getInputSelection, isInputFocused } from \"./utils/input\";\nimport { isDOMElement } from \"./utils/helpers\";\nimport type { InputState, Selection } from \"./types\";\n\nexport type InputElementGetter = () => HTMLInputElement | null;\n\nexport function useInputElement(\n inputRef: React.MutableRefObject<HTMLInputElement | null>\n): InputElementGetter {\n return useCallback(() => {\n let input: HTMLInputElement | Element | null = inputRef.current;\n const isDOMNode = typeof window !== \"undefined\" && isDOMElement(input);\n\n // workaround for react-test-renderer\n // https://github.com/sanniassin/react-input-mask/issues/147\n if (!input || !isDOMNode) {\n return null;\n }\n\n if (input.nodeName !== \"INPUT\") {\n input = input.querySelector(\"input\");\n }\n\n if (!input) {\n throw new Error(\"react-input-mask: inputComponent doesn't contain input node\");\n }\n\n return input as HTMLInputElement;\n }, [inputRef]);\n}\n\nfunction useDeferLoop(callback: () => void): [() => void, () => void] {\n const deferIdRef = useRef<number | null>(null);\n\n const runLoop = useCallback(() => {\n // If there are simulated focus events, runLoop could be\n // called multiple times without blur or re-render\n if (deferIdRef.current !== null) {\n return;\n }\n\n function loop() {\n callback();\n deferIdRef.current = defer(loop);\n }\n\n loop();\n }, [callback]);\n\n const stopLoop = useCallback(() => {\n cancelDefer(deferIdRef.current);\n deferIdRef.current = null;\n }, []);\n\n useEffect(() => {\n if (deferIdRef.current) {\n stopLoop();\n runLoop();\n }\n }, [runLoop, stopLoop]);\n\n useEffect(() => cancelDefer(deferIdRef.current), []);\n\n return [runLoop, stopLoop];\n}\n\nfunction useSelection(\n inputRef: React.MutableRefObject<HTMLInputElement | null>,\n isMasked: boolean\n) {\n const selectionRef = useRef<Selection>({ start: null, end: null });\n const getInputElement = useInputElement(inputRef);\n\n const getSelection = useCallback(() => {\n const input = getInputElement();\n return getInputSelection(input as HTMLInputElement);\n }, [getInputElement]);\n\n const getLastSelection = useCallback(() => {\n return selectionRef.current;\n }, []);\n\n const setSelection = useCallback(\n (selection: Selection) => {\n const input = getInputElement();\n\n // Don't change selection on unfocused input\n // because Safari sets focus on selection change (#154)\n if (!input || !isInputFocused(input)) {\n return;\n }\n\n setInputSelection(input, selection.start!, selection.end!);\n\n // Use actual selection in case the requested one was out of range\n selectionRef.current = getSelection();\n },\n [getInputElement, getSelection]\n );\n\n const selectionLoop = useCallback(() => {\n selectionRef.current = getSelection();\n }, [getSelection]);\n const [runSelectionLoop, stopSelectionLoop] = useDeferLoop(selectionLoop);\n\n useLayoutEffect(() => {\n if (!isMasked) {\n return;\n }\n\n const input = getInputElement();\n if (!input) return;\n input.addEventListener(\"focus\", runSelectionLoop);\n input.addEventListener(\"blur\", stopSelectionLoop);\n\n if (isInputFocused(input)) {\n runSelectionLoop();\n }\n\n return () => {\n input.removeEventListener(\"focus\", runSelectionLoop);\n input.removeEventListener(\"blur\", stopSelectionLoop);\n\n stopSelectionLoop();\n };\n });\n\n return { getSelection, getLastSelection, setSelection };\n}\n\nfunction useValue(\n inputRef: React.MutableRefObject<HTMLInputElement | null>,\n initialValue: string\n) {\n const getInputElement = useInputElement(inputRef);\n const valueRef = useRef(initialValue);\n\n const getValue = useCallback(() => {\n return getInputElement()!.value;\n }, [getInputElement]);\n\n const getLastValue = useCallback(() => {\n return valueRef.current;\n }, []);\n\n const setValue = useCallback(\n (newValue: string) => {\n valueRef.current = newValue;\n\n const input = getInputElement();\n if (input) {\n input.value = newValue;\n }\n },\n [getInputElement]\n );\n\n return {\n getValue,\n getLastValue,\n setValue\n };\n}\n\nexport function useInputState(\n initialValue: string,\n isMasked: boolean\n): {\n inputRef: React.MutableRefObject<HTMLInputElement | null>;\n getInputState: () => InputState;\n getLastInputState: () => InputState;\n setInputState: (state: InputState) => void;\n} {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const { getSelection, getLastSelection, setSelection } = useSelection(inputRef, isMasked);\n const { getValue, getLastValue, setValue } = useValue(inputRef, initialValue);\n\n function getLastInputState(): InputState {\n return {\n value: getLastValue(),\n selection: getLastSelection()\n };\n }\n\n function getInputState(): InputState {\n return {\n value: getValue(),\n selection: getSelection()\n };\n }\n\n function setInputState({ value, selection }: InputState): void {\n setValue(value);\n setSelection(selection);\n }\n\n return {\n inputRef,\n getInputState,\n getLastInputState,\n setInputState\n };\n}\n\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined);\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n","export function defer(fn: FrameRequestCallback): number {\n return requestAnimationFrame(fn);\n}\n\nexport function cancelDefer(deferId: number | null): void {\n if (deferId !== null) {\n cancelAnimationFrame(deferId);\n }\n}\n","import type { Selection } from \"../types\";\n\nexport function setInputSelection(\n input: HTMLInputElement,\n start: number,\n end?: number\n): void {\n if (end === undefined) {\n end = start;\n }\n input.setSelectionRange(start, end);\n}\n\nexport function getInputSelection(input: HTMLInputElement): Required<Selection> {\n const start = input.selectionStart;\n const end = input.selectionEnd;\n\n return {\n start,\n end,\n length: (end ?? 0) - (start ?? 0)\n };\n}\n\nexport function isInputFocused(input: HTMLInputElement): boolean {\n const inputDocument = input.ownerDocument;\n return inputDocument.hasFocus() && inputDocument.activeElement === input;\n}\n","// Element's window may differ from the one within React instance\n// if element rendered within iframe.\n// See https://github.com/sanniassin/react-input-mask/issues/182\nexport function getElementDocument(element: Element | null | undefined) {\n return element?.ownerDocument;\n}\n\nexport function getElementWindow(element: Element | null | undefined) {\n return getElementDocument(element)?.defaultView;\n}\n\nexport function isDOMElement(element: unknown): element is HTMLElement {\n const elementWindow = getElementWindow(element as Element | null);\n return (\n !!elementWindow && (element as Element) instanceof elementWindow.HTMLElement\n );\n}\n\nexport function isFunction(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n\nexport function findLastIndex<T>(\n array: readonly T[],\n predicate: (item: T, index: number) => boolean\n): number {\n for (let i = array.length - 1; i >= 0; i--) {\n const x = array[i];\n if (predicate(x, i)) {\n return i;\n }\n }\n return -1;\n}\n\nexport function repeat(string: string, n = 1): string {\n let result = \"\";\n for (let i = 0; i < n; i++) {\n result += string;\n }\n return result;\n}\n\nexport function toString(value: unknown): string {\n return `${value}`;\n}\n","import type { FormatChars } from \"./types\";\n\nexport const CONTROLLED_PROPS = [\n \"disabled\",\n \"onBlur\",\n \"onChange\",\n \"onFocus\",\n \"onMouseDown\",\n \"readOnly\",\n \"value\"\n] as const;\n\nexport const defaultFormatChars: FormatChars = {\n \"9\": /[0-9]/,\n a: /[A-Za-z]/,\n \"*\": /[A-Za-z0-9]/\n};\n\nexport const extendedFormatChars: FormatChars = {\n ...defaultFormatChars,\n A: /[A-Z]/,\n \"Я\": /[А-Яа-яЁёӘәҒғҚқҢңӨөҰұҮүҺһІі]/,\n \"#\": /[0-9A-Fa-f]/\n};\n","import type React from \"react\";\nimport { CONTROLLED_PROPS } from \"./constants\";\nimport type { InputMaskProps } from \"./types\";\n\nfunction warnDev(condition: boolean, message: string): void {\n if (process.env.NODE_ENV !== \"production\" && !condition) {\n console.error(`react-input-mask-format: ${message}`);\n }\n}\n\nfunction invariant(condition: boolean, message: string): void {\n if (!condition) {\n throw new Error(`react-input-mask-format: ${message}`);\n }\n}\n\nexport function validateMaxLength(props: InputMaskProps): void {\n warnDev(\n !props.maxLength || !props.mask,\n \"maxLength property shouldn't be passed to the masked input. It breaks masking and unnecessary because length is limited by the mask length.\"\n );\n}\n\nexport function validateMaskPlaceholder(props: InputMaskProps & { maskPlaceholder?: string | null }): void {\n const { mask, maskPlaceholder } = props;\n\n invariant(\n !mask ||\n !maskPlaceholder ||\n maskPlaceholder.length === 1 ||\n maskPlaceholder.length === mask.length,\n \"maskPlaceholder should either be a single character or have the same length as the mask:\\n\" +\n `mask: ${mask}\\n` +\n `maskPlaceholder: ${maskPlaceholder}`\n );\n}\n\nexport function validateChildren(\n props: InputMaskProps,\n inputElement: React.ReactElement\n): void {\n const conflictProps = CONTROLLED_PROPS.filter(\n propId =>\n (inputElement.props as Record<string, unknown>)[propId] != null &&\n (inputElement.props as Record<string, unknown>)[propId] !==\n (props as Record<string, unknown>)[propId]\n );\n\n invariant(\n !conflictProps.length,\n `the following props should be passed to the InputMask component, not to children: ${conflictProps.join(\",\")}`\n );\n}\n","import { defaultFormatChars } from \"../constants\";\nimport type { FormatChars, Mask } from \"../types\";\n\nexport interface ParsedMaskOptions {\n maskPlaceholder: string | null;\n mask: Array<string | RegExp> | null;\n prefix: string | null;\n lastEditablePosition: number | null;\n permanents: number[];\n}\n\nexport default function parseMask({\n mask,\n maskPlaceholder,\n formatChars = defaultFormatChars\n}: {\n mask?: Mask | null;\n maskPlaceholder?: string | null;\n formatChars?: FormatChars;\n}): ParsedMaskOptions {\n const permanents: number[] = [];\n\n if (!mask) {\n return {\n maskPlaceholder: null,\n mask: null,\n prefix: null,\n lastEditablePosition: null,\n permanents: []\n };\n }\n\n let parsedMask: Array<string | RegExp>;\n\n if (typeof mask === \"string\") {\n let isPermanent = false;\n let parsedMaskString = \"\";\n mask.split(\"\").forEach(character => {\n if (!isPermanent && character === \"\\\\\") {\n isPermanent = true;\n } else {\n if (isPermanent || !formatChars[character]) {\n permanents.push(parsedMaskString.length);\n }\n parsedMaskString += character;\n isPermanent = false;\n }\n });\n\n parsedMask = parsedMaskString.split(\"\").map((character, index) => {\n if (permanents.indexOf(index) === -1) {\n return formatChars[character];\n }\n return character;\n });\n } else {\n mask.forEach((character, index) => {\n if (typeof character === \"string\") {\n permanents.push(index);\n }\n });\n parsedMask = mask;\n }\n\n let parsedPlaceholder: string | null = maskPlaceholder ?? null;\n\n if (parsedPlaceholder) {\n let placeholderChars: Array<string | RegExp>;\n\n if (parsedPlaceholder.length === 1) {\n placeholderChars = parsedMask.map((character, index) => {\n if (permanents.indexOf(index) !== -1) {\n return character;\n }\n return parsedPlaceholder as string;\n });\n } else {\n placeholderChars = parsedPlaceholder.split(\"\");\n }\n\n permanents.forEach(position => {\n placeholderChars[position] = parsedMask[position];\n });\n\n parsedPlaceholder = placeholderChars.join(\"\");\n }\n\n const prefix = permanents\n .filter((position, index) => position === index)\n .map(position => parsedMask[position])\n .join(\"\");\n\n let lastEditablePosition = parsedMask.length - 1;\n while (permanents.indexOf(lastEditablePosition) !== -1) {\n lastEditablePosition--;\n }\n\n return {\n maskPlaceholder: parsedPlaceholder,\n prefix,\n mask: parsedMask,\n lastEditablePosition,\n permanents\n };\n}\n","import { findLastIndex, repeat } from \"./helpers\";\nimport parseMask, { ParsedMaskOptions } from \"./parse-mask\";\nimport type { FormatChars, InputState, Selection } from \"../types\";\n\nexport default class MaskUtils {\n maskOptions: ParsedMaskOptions;\n transform?: (char: string, position: number) => string;\n\n constructor(options: {\n mask?: string | Array<string | RegExp> | null;\n maskPlaceholder?: string | null;\n formatChars?: FormatChars;\n transform?: (char: string, position: number) => string;\n }) {\n this.maskOptions = parseMask(options);\n this.transform = options.transform;\n }\n\n isCharacterAllowedAtPosition = (character: string, position: number): boolean => {\n const { maskPlaceholder } = this.maskOptions;\n\n if (this.isCharacterFillingPosition(character, position)) {\n return true;\n }\n\n if (!maskPlaceholder) {\n return false;\n }\n\n return maskPlaceholder[position] === character;\n };\n\n isCharacterFillingPosition = (character: string, position: number): boolean => {\n const { mask } = this.maskOptions;\n\n if (!character || position >= mask!.length) {\n return false;\n }\n\n if (!this.isPositionEditable(position)) {\n return mask![position] === character;\n }\n\n const charRule = mask![position];\n return new RegExp(charRule).test(character);\n };\n\n isPositionEditable = (position: number): boolean => {\n const { mask, permanents } = this.maskOptions;\n return position < mask!.length && permanents.indexOf(position) === -1;\n };\n\n isValueEmpty = (value: string): boolean => {\n return value.split(\"\").every((character, position) => {\n return (\n !this.isPositionEditable(position) ||\n !this.isCharacterFillingPosition(character, position)\n );\n });\n };\n\n isValueFilled = (value: string): boolean => {\n return (\n this.getFilledLength(value) === this.maskOptions.lastEditablePosition! + 1\n );\n };\n\n getDefaultSelectionForValue = (value: string): Selection => {\n const filledLength = this.getFilledLength(value);\n const cursorPosition = this.getRightEditablePosition(filledLength);\n return { start: cursorPosition, end: cursorPosition };\n };\n\n getFilledLength = (value: string): number => {\n const characters = value.split(\"\");\n const lastFilledIndex = findLastIndex(characters, (character, position) => {\n return (\n this.isPositionEditable(position) &&\n this.isCharacterFillingPosition(character, position)\n );\n });\n return lastFilledIndex + 1;\n };\n\n getStringFillingLengthAtPosition = (string: string, position: number): number => {\n const characters = string.split(\"\");\n const insertedValue = characters.reduce((value, character) => {\n return this.insertCharacterAtPosition(value, character, value.length);\n }, repeat(\" \", position));\n\n return insertedValue.length - position;\n };\n\n getLeftEditablePosition = (position: number): number | null => {\n for (let i = position; i >= 0; i--) {\n if (this.isPositionEditable(i)) {\n return i;\n }\n }\n return null;\n };\n\n getRightEditablePosition = (position: number): number | null => {\n const { mask } = this.maskOptions;\n for (let i = position; i < mask!.length; i++) {\n if (this.isPositionEditable(i)) {\n return i;\n }\n }\n return null;\n };\n\n formatValue = (value: string): string => {\n const { maskPlaceholder, mask } = this.maskOptions;\n\n if (!maskPlaceholder) {\n value = this.insertStringAtPosition(\"\", value, 0);\n\n while (\n value.length < mask!.length &&\n !this.isPositionEditable(value.length)\n ) {\n value += mask![value.length];\n }\n\n return value;\n }\n\n return this.insertStringAtPosition(maskPlaceholder, value, 0);\n };\n\n clearRange = (value: string, start: number, len: number): string => {\n if (!len) {\n return value;\n }\n\n const end = start + len;\n const { maskPlaceholder, mask } = this.maskOptions;\n\n const clearedValue = value\n .split(\"\")\n .map((character, i) => {\n const isEditable = this.isPositionEditable(i);\n\n if (!maskPlaceholder && i >= end && !isEditable) {\n return \"\";\n }\n if (i < start || i >= end) {\n return character;\n }\n if (!isEditable) {\n return mask![i];\n }\n if (maskPlaceholder) {\n return maskPlaceholder[i];\n }\n return \"\";\n })\n .join(\"\");\n\n return this.formatValue(clearedValue);\n };\n\n insertCharacterAtPosition = (value: string, character: string, position: number): string => {\n const { mask, maskPlaceholder } = this.maskOptions;\n if (position >= mask!.length) {\n return value;\n }\n\n const transformedCharacter =\n this.transform && this.isPositionEditable(position)\n ? this.transform(character, position)\n : character;\n\n const isAllowed = this.isCharacterAllowedAtPosition(transformedCharacter, position);\n const isEditable = this.isPositionEditable(position);\n const nextEditablePosition = this.getRightEditablePosition(position);\n const isNextPlaceholder =\n maskPlaceholder && nextEditablePosition\n ? transformedCharacter === maskPlaceholder[nextEditablePosition]\n : null;\n const valueBefore = value.slice(0, position);\n\n if (isAllowed || !isEditable) {\n const insertedCharacter = isAllowed ? transformedCharacter : mask![position];\n value = valueBefore + insertedCharacter;\n }\n\n if (!isAllowed && !isEditable && !isNextPlaceholder) {\n value = this.insertCharacterAtPosition(value, character, position + 1);\n }\n\n return value;\n };\n\n insertStringAtPosition = (value: string, string: string, position: number): string => {\n const { mask, maskPlaceholder } = this.maskOptions;\n if (!string || position >= mask!.length) {\n return value;\n }\n\n const characters = string.split(\"\");\n const isFixedLength = this.isValueFilled(value) || !!maskPlaceholder;\n const valueAfter = value.slice(position);\n\n value = characters.reduce((value, character) => {\n return this.insertCharacterAtPosition(value, character, value.length);\n }, value.slice(0, position));\n\n if (isFixedLength) {\n value += valueAfter.slice(value.length - position);\n } else if (this.isValueFilled(value)) {\n value += mask!.slice(value.length).join(\"\");\n } else {\n const editableCharactersAfter = valueAfter\n .split(\"\")\n .filter((character, i) => {\n return this.isPositionEditable(position + i);\n });\n value = editableCharactersAfter.reduce((value, character) => {\n const nextEditablePosition = this.getRightEditablePosition(\n value.length\n );\n if (nextEditablePosition === null) {\n return value;\n }\n\n if (!this.isPositionEditable(value.length)) {\n value += mask!.slice(value.length, nextEditablePosition).join(\"\");\n }\n\n return this.insertCharacterAtPosition(value, character, value.length);\n }, value);\n }\n\n return value;\n };\n\n processChange = (currentState: InputState, previousState: InputState): InputState & { enteredString: string } => {\n const { mask, prefix, lastEditablePosition } = this.maskOptions;\n const { value, selection } = currentState;\n const previousValue = previousState.value;\n const previousSelection = previousState.selection;\n let newValue = value;\n let enteredString = \"\";\n let formattedEnteredStringLength = 0;\n let removedLength = 0;\n let cursorPosition = Math.min(previousSelection.start!, selection.start!);\n\n if (selection.end! > previousSelection.start!) {\n enteredString = newValue.slice(previousSelection.start!, selection.end!);\n formattedEnteredStringLength = this.getStringFillingLengthAtPosition(\n enteredString,\n cursorPosition\n );\n if (!formattedEnteredStringLength) {\n removedLength = 0;\n } else {\n removedLength = previousSelection.length!;\n }\n } else if (newValue.length < previousValue.length) {\n removedLength = previousValue.length - newValue.length;\n }\n\n newValue = previousValue;\n\n if (removedLength) {\n if (removedLength === 1 && !previousSelection.length) {\n const deleteFromRight = previousSelection.start === selection.start;\n cursorPosition = (deleteFromRight\n ? this.getRightEditablePosition(selection.start!)\n : this.getLeftEditablePosition(selection.start!))!;\n }\n newValue = this.clearRange(newValue, cursorPosition, removedLength);\n }\n\n newValue = this.insertStringAtPosition(\n newValue,\n enteredString,\n cursorPosition\n );\n\n cursorPosition += formattedEnteredStringLength;\n if (cursorPosition >= mask!.length) {\n cursorPosition = mask!.length;\n } else if (\n cursorPosition < prefix!.length &&\n !formattedEnteredStringLength\n ) {\n cursorPosition = prefix!.length;\n } else if (\n cursorPosition >= prefix!.length &&\n cursorPosition < lastEditablePosition! &&\n formattedEnteredStringLength\n ) {\n cursorPosition = this.getRightEditablePosition(cursorPosition)!;\n }\n\n newValue = this.formatValue(newValue);\n\n return {\n value: newValue,\n enteredString,\n selection: { start: cursorPosition, end: cursorPosition }\n };\n };\n}\n","import type {\n BeforeMaskedStateChangeFn,\n BeforeMaskedValueChangeFn,\n FormatChars,\n InputState,\n V2MaskOptions\n} from \"./types\";\n\nconst warned = new Set<string>();\n\nexport function __resetDeprecationWarnings(): void {\n warned.clear();\n}\n\nexport function warnDeprecatedOnce(prop: string, message: string): void {\n if (process.env.NODE_ENV !== \"production\" && !warned.has(prop)) {\n warned.add(prop);\n console.warn(`react-input-mask-format: ${message}`);\n }\n}\n\nexport function resolveMaskPlaceholder(\n maskPlaceholder: string | null | undefined,\n maskChar: string | null | undefined\n): string | null | undefined {\n if (maskPlaceholder !== undefined) {\n return maskPlaceholder;\n }\n return maskChar;\n}\n\nexport function normalizeFormatChars(\n formatChars: Record<string, RegExp | string> | undefined\n): { formatChars: FormatChars | undefined; hasLegacyString: boolean } {\n if (!formatChars) {\n return { formatChars: undefined, hasLegacyString: false };\n }\n const result: FormatChars = {};\n let hasLegacyString = false;\n for (const key of Object.keys(formatChars)) {\n const value = formatChars[key];\n if (typeof value === \"string\") {\n hasLegacyString = true;\n result[key] = new RegExp(value);\n } else {\n result[key] = value;\n }\n }\n return { formatChars: result, hasLegacyString };\n}\n\nexport function toRegExpFormatChars(\n formatChars: Record<string, RegExp | string> | undefined\n): FormatChars | undefined {\n return normalizeFormatChars(formatChars).formatChars;\n}\n\nexport function createBeforeMaskedStateChangeAdapter(\n beforeMaskedValueChange: BeforeMaskedValueChangeFn,\n maskOptions: V2MaskOptions\n): BeforeMaskedStateChangeFn {\n return ({ previousState, currentState, nextState }) =>\n beforeMaskedValueChange(\n nextState,\n previousState ?? currentState ?? null,\n (nextState as InputState & { enteredString?: string }).enteredString ?? null,\n maskOptions\n );\n}\n","import type { Transform } from \"../types\";\n\nexport function resolveTransform(\n transform: Transform | undefined\n): ((char: string, position: number) => string) | undefined {\n if (!transform) {\n return undefined;\n }\n if (transform === \"uppercase\") {\n return char => char.toUpperCase();\n }\n if (transform === \"lowercase\") {\n return char => char.toLowerCase();\n }\n if (typeof transform === \"function\") {\n return transform;\n }\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\n `react-input-mask-format: invalid transform \"${String(\n transform\n )}\", expected \"uppercase\" | \"lowercase\" | (char, position) => char`\n );\n }\n return undefined;\n}\n","import { useRef, useCallback, useEffect } from \"react\";\nimport type React from \"react\";\nimport MaskUtils from \"./utils/mask\";\nimport { createMaskController } from \"./bind-mask\";\nimport type { MaskController, MaskControllerOptions } from \"./bind-mask\";\nimport {\n resolveMaskPlaceholder,\n normalizeFormatChars,\n createBeforeMaskedStateChangeAdapter,\n warnDeprecatedOnce\n} from \"./v2-compat\";\nimport { resolveTransform } from \"./utils/transform\";\nimport type { UseMaskOptions, BeforeMaskedStateChangeFn, V2MaskOptions } from \"./types\";\n\nexport function useMask(options: UseMaskOptions): React.RefCallback<HTMLInputElement> {\n const {\n mask,\n maskPlaceholder: maskPlaceholderProp,\n alwaysShowMask = false,\n formatChars,\n transform,\n beforeMaskedStateChange: beforeMaskedStateChangeProp,\n beforeMaskedValueChange\n } = options;\n\n if (beforeMaskedValueChange !== undefined) {\n warnDeprecatedOnce(\n \"beforeMaskedValueChange\",\n \"beforeMaskedValueChange is deprecated, use beforeMaskedStateChange.\"\n );\n }\n\n const resolvedPlaceholder = resolveMaskPlaceholder(maskPlaceholderProp, undefined);\n const maskPlaceholder = resolvedPlaceholder === undefined ? \"_\" : resolvedPlaceholder;\n\n const { formatChars: normalizedFormatChars, hasLegacyString } = normalizeFormatChars(formatChars);\n if (hasLegacyString) {\n warnDeprecatedOnce(\n \"formatChars\",\n \"string values in formatChars are deprecated, pass RegExp values instead.\"\n );\n }\n\n const maskUtils = new MaskUtils({\n mask: mask ?? null,\n maskPlaceholder,\n formatChars: normalizedFormatChars,\n transform: resolveTransform(transform)\n });\n\n let beforeMaskedStateChange: BeforeMaskedStateChangeFn | undefined = beforeMaskedStateChangeProp;\n if (!beforeMaskedStateChange && beforeMaskedValueChange) {\n const v2MaskOptions: V2MaskOptions = {\n mask: mask ?? undefined,\n maskChar: maskPlaceholder,\n alwaysShowMask,\n formatChars: formatChars ?? { \"9\": \"[0-9]\", a: \"[A-Za-z]\", \"*\": \"[A-Za-z0-9]\" },\n permanents: maskUtils.maskOptions.permanents\n };\n beforeMaskedStateChange = createBeforeMaskedStateChangeAdapter(beforeMaskedValueChange, v2MaskOptions);\n }\n\n const controllerOptions: MaskControllerOptions = { alwaysShowMask, beforeMaskedStateChange };\n\n const controllerRef = useRef<MaskController | null>(null);\n\n // Keep the live controller's engine/options current across re-renders\n // without re-binding DOM listeners. Done in an effect (not during render)\n // so the hook stays render-pure under StrictMode / concurrent React.\n useEffect(() => {\n controllerRef.current?.update(maskUtils, controllerOptions);\n });\n\n return useCallback((el: HTMLInputElement | null) => {\n if (el) {\n const controller = createMaskController(maskUtils, controllerOptions);\n controller.bind(el);\n controllerRef.current = controller;\n } else {\n controllerRef.current?.unbind();\n controllerRef.current = null;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n","// Write to input.value through the native prototype setter so React's\n// internal value tracker stays stale. The user's keystroke `input` event then\n// bubbles into React's root listener, which sees masked value != stale tracker\n// and fires the consumer's onChange with the masked value. Using the tracked\n// (React-wrapped) setter instead would suppress that onChange.\nexport function setNativeValue(input: HTMLInputElement, value: string): void {\n const descriptor = Object.getOwnPropertyDescriptor(\n HTMLInputElement.prototype,\n \"value\"\n );\n const setter = descriptor && descriptor.set;\n if (setter) {\n setter.call(input, value);\n } else {\n input.value = value;\n }\n}\n","import type MaskUtils from \"./utils/mask\";\nimport type { BeforeMaskedStateChangeFn, InputState, Selection } from \"./types\";\nimport { getInputSelection, setInputSelection, isInputFocused } from \"./utils/input\";\nimport { setNativeValue } from \"./set-native-value\";\nimport { getElementDocument } from \"./utils/helpers\";\nimport { defer } from \"./utils/defer\";\n\nexport interface MaskControllerOptions {\n alwaysShowMask: boolean;\n beforeMaskedStateChange?: BeforeMaskedStateChangeFn;\n}\n\nconst IS_JSDOM =\n typeof navigator !== \"undefined\" && navigator.userAgent.includes(\"jsdom\");\n\nexport interface MaskController {\n bind(input: HTMLInputElement): void;\n unbind(): void;\n update(maskUtils: MaskUtils, options: MaskControllerOptions): void;\n}\n\nexport function createMaskController(\n maskUtils: MaskUtils,\n options: MaskControllerOptions\n): MaskController {\n let input: HTMLInputElement | null = null;\n let lastValue = \"\";\n let lastSelection: Selection = { start: null, end: null };\n\n function getInputState(): InputState {\n return { value: input!.value, selection: getInputSelection(input!) };\n }\n function getLastInputState(): InputState {\n return { value: lastValue, selection: lastSelection };\n }\n function setInputState({ value, selection }: InputState): void {\n setNativeValue(input!, value);\n lastValue = value;\n if (input && isInputFocused(input) && selection.start !== null && selection.end !== null) {\n setInputSelection(input, selection.start, selection.end);\n lastSelection = getInputSelection(input);\n } else {\n lastSelection = selection;\n }\n // JSDOM-ONLY: resync @testing-library/user-event v14's shadow-value cache.\n // setNativeValue() above bypasses React's value tracker so the consumer's\n // onChange fires with the masked value on the same bubbling event. That same\n // bypass leaves user-event's per-input shadow value stale, corrupting masking\n // from the 3rd keystroke — so under jsdom we resync it with a plain reassignment.\n // This MUST NOT run in a real browser: there, microtasks drain BETWEEN event\n // listeners, so this plain write would re-sync React's tracker before React's\n // delegated onChange listener runs, permanently suppressing onChange (verified\n // by the real-Chrome e2e). Real browsers read the live DOM value and need no\n // resync, so the gate is correct, not a workaround-hiding hack.\n if (IS_JSDOM) {\n const resyncValue = value;\n const resyncSelection = selection;\n queueMicrotask(() => {\n if (!input || input.value !== resyncValue) return;\n input.value = resyncValue;\n if (isInputFocused(input) && resyncSelection.start !== null && resyncSelection.end !== null) {\n setInputSelection(input, resyncSelection.start, resyncSelection.end);\n }\n });\n }\n }\n\n function handleInput(): void {\n const currentState = getInputState();\n const previousState = getLastInputState();\n let nextState: InputState = maskUtils.processChange(currentState, previousState);\n if (options.beforeMaskedStateChange) {\n nextState = options.beforeMaskedStateChange({ currentState, previousState, nextState });\n }\n setInputState(nextState);\n }\n\n function handleFocus(): void {\n const currentValue = getInputState().value;\n if (!maskUtils.isValueFilled(currentValue)) {\n const newValue = maskUtils.formatValue(currentValue);\n const newSelection = maskUtils.getDefaultSelectionForValue(newValue);\n let nextState: InputState = { value: newValue, selection: newSelection };\n if (options.beforeMaskedStateChange) {\n nextState = options.beforeMaskedStateChange({ currentState: getInputState(), nextState });\n }\n setInputState(nextState);\n // Chrome resets selection after focus; restore on next frame.\n defer(() => {\n if (input && isInputFocused(input)) {\n setInputSelection(input, lastSelection.start!, lastSelection.end!);\n }\n });\n }\n }\n\n function handleBlur(): void {\n const lastValueOnBlur = getLastInputState().value;\n if (!options.alwaysShowMask && maskUtils.isValueEmpty(lastValueOnBlur)) {\n let nextState: InputState = { value: \"\", selection: { start: null, end: null } };\n if (options.beforeMaskedStateChange) {\n nextState = options.beforeMaskedStateChange({ currentState: getInputState(), nextState });\n }\n setInputState(nextState);\n }\n }\n\n function handleMouseDown(event: MouseEvent): void {\n if (!input) return;\n const { value } = getInputState();\n const inputDocument = getElementDocument(input);\n if (!isInputFocused(input) && !maskUtils.isValueFilled(value)) {\n const mouseDownX = event.clientX;\n const mouseDownY = event.clientY;\n const mouseDownTime = new Date().getTime();\n const mouseUpHandler = (mouseUpEvent: MouseEvent): void => {\n inputDocument!.removeEventListener(\"mouseup\", mouseUpHandler);\n if (!input || !isInputFocused(input)) return;\n const deltaX = Math.abs(mouseUpEvent.clientX - mouseDownX);\n const deltaY = Math.abs(mouseUpEvent.clientY - mouseDownY);\n const axisDelta = Math.max(deltaX, deltaY);\n const timeDelta = new Date().getTime() - mouseDownTime;\n if ((axisDelta <= 10 && timeDelta <= 200) || (axisDelta <= 5 && timeDelta <= 300)) {\n const newSelection = maskUtils.getDefaultSelectionForValue(lastValue);\n if (newSelection.start !== null && newSelection.end !== null) {\n setInputSelection(input, newSelection.start, newSelection.end);\n lastSelection = getInputSelection(input);\n }\n }\n };\n inputDocument!.addEventListener(\"mouseup\", mouseUpHandler);\n }\n }\n\n function bind(el: HTMLInputElement): void {\n input = el;\n // Format any pre-existing (defaultValue) content.\n lastValue = el.value;\n lastSelection = getInputSelection(el);\n const formatted = maskUtils.formatValue(el.value);\n if (!maskUtils.isValueEmpty(formatted) || options.alwaysShowMask) {\n setNativeValue(el, formatted);\n lastValue = formatted;\n }\n el.addEventListener(\"input\", handleInput);\n el.addEventListener(\"focus\", handleFocus);\n el.addEventListener(\"blur\", handleBlur);\n el.addEventListener(\"mousedown\", handleMouseDown);\n }\n\n function unbind(): void {\n if (input) {\n input.removeEventListener(\"input\", handleInput);\n input.removeEventListener(\"focus\", handleFocus);\n input.removeEventListener(\"blur\", handleBlur);\n input.removeEventListener(\"mousedown\", handleMouseDown);\n }\n input = null;\n }\n\n function update(nextMaskUtils: MaskUtils, nextOptions: MaskControllerOptions): void {\n maskUtils = nextMaskUtils;\n options = nextOptions;\n }\n\n return { bind, unbind, update };\n}\n"],"mappings":"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","names":["import_react","value","import_react","InputMask","React"]}
package/dist/index.d.cts CHANGED
@@ -1,10 +1,12 @@
1
1
  import React__default from 'react';
2
- import { F as FormatChars, I as InputMaskProps } from './types-Bfu5Jmh0.cjs';
3
- export { B as BeforeMaskedStateChangeFn, a as BeforeMaskedValueChangeFn, b as InputState, M as Mask, S as Selection, T as Transform } from './types-Bfu5Jmh0.cjs';
2
+ import { F as FormatChars, U as UseMaskOptions, I as InputMaskProps } from './types-BTNqtchO.cjs';
3
+ export { B as BeforeMaskedStateChangeFn, a as BeforeMaskedValueChangeFn, b as InputState, M as Mask, S as Selection, T as Transform } from './types-BTNqtchO.cjs';
4
4
 
5
5
  declare const defaultFormatChars: FormatChars;
6
6
  declare const extendedFormatChars: FormatChars;
7
7
 
8
+ declare function useMask(options: UseMaskOptions): React__default.RefCallback<HTMLInputElement>;
9
+
8
10
  declare const InputMask: React__default.ForwardRefExoticComponent<InputMaskProps & React__default.RefAttributes<HTMLInputElement>>;
9
11
 
10
- export { FormatChars, InputMaskProps, InputMask as default, defaultFormatChars, extendedFormatChars };
12
+ export { FormatChars, InputMaskProps, UseMaskOptions, InputMask as default, defaultFormatChars, extendedFormatChars, useMask };
package/dist/index.d.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  import React__default from 'react';
2
- import { F as FormatChars, I as InputMaskProps } from './types-Bfu5Jmh0.js';
3
- export { B as BeforeMaskedStateChangeFn, a as BeforeMaskedValueChangeFn, b as InputState, M as Mask, S as Selection, T as Transform } from './types-Bfu5Jmh0.js';
2
+ import { F as FormatChars, U as UseMaskOptions, I as InputMaskProps } from './types-BTNqtchO.js';
3
+ export { B as BeforeMaskedStateChangeFn, a as BeforeMaskedValueChangeFn, b as InputState, M as Mask, S as Selection, T as Transform } from './types-BTNqtchO.js';
4
4
 
5
5
  declare const defaultFormatChars: FormatChars;
6
6
  declare const extendedFormatChars: FormatChars;
7
7
 
8
+ declare function useMask(options: UseMaskOptions): React__default.RefCallback<HTMLInputElement>;
9
+
8
10
  declare const InputMask: React__default.ForwardRefExoticComponent<InputMaskProps & React__default.RefAttributes<HTMLInputElement>>;
9
11
 
10
- export { FormatChars, InputMaskProps, InputMask as default, defaultFormatChars, extendedFormatChars };
12
+ export { FormatChars, InputMaskProps, UseMaskOptions, InputMask as default, defaultFormatChars, extendedFormatChars, useMask };
package/dist/index.js CHANGED
@@ -1,3 +1,10 @@
1
+ import {
2
+ getInputSelection,
3
+ isInputFocused,
4
+ setInputSelection,
5
+ setNativeValue
6
+ } from "./chunk-CEZXZ7IJ.js";
7
+
1
8
  // src/index.tsx
2
9
  import React, { useLayoutEffect as useLayoutEffect2, forwardRef } from "react";
3
10
 
@@ -14,27 +21,6 @@ function cancelDefer(deferId) {
14
21
  }
15
22
  }
16
23
 
17
- // src/utils/input.ts
18
- function setInputSelection(input, start, end) {
19
- if (end === void 0) {
20
- end = start;
21
- }
22
- input.setSelectionRange(start, end);
23
- }
24
- function getInputSelection(input) {
25
- const start = input.selectionStart;
26
- const end = input.selectionEnd;
27
- return {
28
- start,
29
- end,
30
- length: (end != null ? end : 0) - (start != null ? start : 0)
31
- };
32
- }
33
- function isInputFocused(input) {
34
- const inputDocument = input.ownerDocument;
35
- return inputDocument.hasFocus() && inputDocument.activeElement === input;
36
- }
37
-
38
24
  // src/utils/helpers.ts
39
25
  function getElementDocument(element) {
40
26
  return element == null ? void 0 : element.ownerDocument;
@@ -636,6 +622,196 @@ function resolveTransform(transform) {
636
622
  return void 0;
637
623
  }
638
624
 
625
+ // src/use-mask.ts
626
+ import { useRef as useRef2, useCallback as useCallback2, useEffect as useEffect2 } from "react";
627
+
628
+ // src/bind-mask.ts
629
+ var IS_JSDOM = typeof navigator !== "undefined" && navigator.userAgent.includes("jsdom");
630
+ function createMaskController(maskUtils, options) {
631
+ let input = null;
632
+ let lastValue = "";
633
+ let lastSelection = { start: null, end: null };
634
+ function getInputState() {
635
+ return { value: input.value, selection: getInputSelection(input) };
636
+ }
637
+ function getLastInputState() {
638
+ return { value: lastValue, selection: lastSelection };
639
+ }
640
+ function setInputState({ value, selection }) {
641
+ setNativeValue(input, value);
642
+ lastValue = value;
643
+ if (input && isInputFocused(input) && selection.start !== null && selection.end !== null) {
644
+ setInputSelection(input, selection.start, selection.end);
645
+ lastSelection = getInputSelection(input);
646
+ } else {
647
+ lastSelection = selection;
648
+ }
649
+ if (IS_JSDOM) {
650
+ const resyncValue = value;
651
+ const resyncSelection = selection;
652
+ queueMicrotask(() => {
653
+ if (!input || input.value !== resyncValue) return;
654
+ input.value = resyncValue;
655
+ if (isInputFocused(input) && resyncSelection.start !== null && resyncSelection.end !== null) {
656
+ setInputSelection(input, resyncSelection.start, resyncSelection.end);
657
+ }
658
+ });
659
+ }
660
+ }
661
+ function handleInput() {
662
+ const currentState = getInputState();
663
+ const previousState = getLastInputState();
664
+ let nextState = maskUtils.processChange(currentState, previousState);
665
+ if (options.beforeMaskedStateChange) {
666
+ nextState = options.beforeMaskedStateChange({ currentState, previousState, nextState });
667
+ }
668
+ setInputState(nextState);
669
+ }
670
+ function handleFocus() {
671
+ const currentValue = getInputState().value;
672
+ if (!maskUtils.isValueFilled(currentValue)) {
673
+ const newValue = maskUtils.formatValue(currentValue);
674
+ const newSelection = maskUtils.getDefaultSelectionForValue(newValue);
675
+ let nextState = { value: newValue, selection: newSelection };
676
+ if (options.beforeMaskedStateChange) {
677
+ nextState = options.beforeMaskedStateChange({ currentState: getInputState(), nextState });
678
+ }
679
+ setInputState(nextState);
680
+ defer(() => {
681
+ if (input && isInputFocused(input)) {
682
+ setInputSelection(input, lastSelection.start, lastSelection.end);
683
+ }
684
+ });
685
+ }
686
+ }
687
+ function handleBlur() {
688
+ const lastValueOnBlur = getLastInputState().value;
689
+ if (!options.alwaysShowMask && maskUtils.isValueEmpty(lastValueOnBlur)) {
690
+ let nextState = { value: "", selection: { start: null, end: null } };
691
+ if (options.beforeMaskedStateChange) {
692
+ nextState = options.beforeMaskedStateChange({ currentState: getInputState(), nextState });
693
+ }
694
+ setInputState(nextState);
695
+ }
696
+ }
697
+ function handleMouseDown(event) {
698
+ if (!input) return;
699
+ const { value } = getInputState();
700
+ const inputDocument = getElementDocument(input);
701
+ if (!isInputFocused(input) && !maskUtils.isValueFilled(value)) {
702
+ const mouseDownX = event.clientX;
703
+ const mouseDownY = event.clientY;
704
+ const mouseDownTime = (/* @__PURE__ */ new Date()).getTime();
705
+ const mouseUpHandler = (mouseUpEvent) => {
706
+ inputDocument.removeEventListener("mouseup", mouseUpHandler);
707
+ if (!input || !isInputFocused(input)) return;
708
+ const deltaX = Math.abs(mouseUpEvent.clientX - mouseDownX);
709
+ const deltaY = Math.abs(mouseUpEvent.clientY - mouseDownY);
710
+ const axisDelta = Math.max(deltaX, deltaY);
711
+ const timeDelta = (/* @__PURE__ */ new Date()).getTime() - mouseDownTime;
712
+ if (axisDelta <= 10 && timeDelta <= 200 || axisDelta <= 5 && timeDelta <= 300) {
713
+ const newSelection = maskUtils.getDefaultSelectionForValue(lastValue);
714
+ if (newSelection.start !== null && newSelection.end !== null) {
715
+ setInputSelection(input, newSelection.start, newSelection.end);
716
+ lastSelection = getInputSelection(input);
717
+ }
718
+ }
719
+ };
720
+ inputDocument.addEventListener("mouseup", mouseUpHandler);
721
+ }
722
+ }
723
+ function bind(el) {
724
+ input = el;
725
+ lastValue = el.value;
726
+ lastSelection = getInputSelection(el);
727
+ const formatted = maskUtils.formatValue(el.value);
728
+ if (!maskUtils.isValueEmpty(formatted) || options.alwaysShowMask) {
729
+ setNativeValue(el, formatted);
730
+ lastValue = formatted;
731
+ }
732
+ el.addEventListener("input", handleInput);
733
+ el.addEventListener("focus", handleFocus);
734
+ el.addEventListener("blur", handleBlur);
735
+ el.addEventListener("mousedown", handleMouseDown);
736
+ }
737
+ function unbind() {
738
+ if (input) {
739
+ input.removeEventListener("input", handleInput);
740
+ input.removeEventListener("focus", handleFocus);
741
+ input.removeEventListener("blur", handleBlur);
742
+ input.removeEventListener("mousedown", handleMouseDown);
743
+ }
744
+ input = null;
745
+ }
746
+ function update(nextMaskUtils, nextOptions) {
747
+ maskUtils = nextMaskUtils;
748
+ options = nextOptions;
749
+ }
750
+ return { bind, unbind, update };
751
+ }
752
+
753
+ // src/use-mask.ts
754
+ function useMask(options) {
755
+ const {
756
+ mask,
757
+ maskPlaceholder: maskPlaceholderProp,
758
+ alwaysShowMask = false,
759
+ formatChars,
760
+ transform,
761
+ beforeMaskedStateChange: beforeMaskedStateChangeProp,
762
+ beforeMaskedValueChange
763
+ } = options;
764
+ if (beforeMaskedValueChange !== void 0) {
765
+ warnDeprecatedOnce(
766
+ "beforeMaskedValueChange",
767
+ "beforeMaskedValueChange is deprecated, use beforeMaskedStateChange."
768
+ );
769
+ }
770
+ const resolvedPlaceholder = resolveMaskPlaceholder(maskPlaceholderProp, void 0);
771
+ const maskPlaceholder = resolvedPlaceholder === void 0 ? "_" : resolvedPlaceholder;
772
+ const { formatChars: normalizedFormatChars, hasLegacyString } = normalizeFormatChars(formatChars);
773
+ if (hasLegacyString) {
774
+ warnDeprecatedOnce(
775
+ "formatChars",
776
+ "string values in formatChars are deprecated, pass RegExp values instead."
777
+ );
778
+ }
779
+ const maskUtils = new MaskUtils({
780
+ mask: mask != null ? mask : null,
781
+ maskPlaceholder,
782
+ formatChars: normalizedFormatChars,
783
+ transform: resolveTransform(transform)
784
+ });
785
+ let beforeMaskedStateChange = beforeMaskedStateChangeProp;
786
+ if (!beforeMaskedStateChange && beforeMaskedValueChange) {
787
+ const v2MaskOptions = {
788
+ mask: mask != null ? mask : void 0,
789
+ maskChar: maskPlaceholder,
790
+ alwaysShowMask,
791
+ formatChars: formatChars != null ? formatChars : { "9": "[0-9]", a: "[A-Za-z]", "*": "[A-Za-z0-9]" },
792
+ permanents: maskUtils.maskOptions.permanents
793
+ };
794
+ beforeMaskedStateChange = createBeforeMaskedStateChangeAdapter(beforeMaskedValueChange, v2MaskOptions);
795
+ }
796
+ const controllerOptions = { alwaysShowMask, beforeMaskedStateChange };
797
+ const controllerRef = useRef2(null);
798
+ useEffect2(() => {
799
+ var _a;
800
+ (_a = controllerRef.current) == null ? void 0 : _a.update(maskUtils, controllerOptions);
801
+ });
802
+ return useCallback2((el) => {
803
+ var _a;
804
+ if (el) {
805
+ const controller = createMaskController(maskUtils, controllerOptions);
806
+ controller.bind(el);
807
+ controllerRef.current = controller;
808
+ } else {
809
+ (_a = controllerRef.current) == null ? void 0 : _a.unbind();
810
+ controllerRef.current = null;
811
+ }
812
+ }, []);
813
+ }
814
+
639
815
  // src/index.tsx
640
816
  var InputMask = forwardRef(function InputMask2(props, forwardedRef) {
641
817
  const {
@@ -894,6 +1070,7 @@ var src_default = InputMask;
894
1070
  export {
895
1071
  src_default as default,
896
1072
  defaultFormatChars,
897
- extendedFormatChars
1073
+ extendedFormatChars,
1074
+ useMask
898
1075
  };
899
1076
  //# sourceMappingURL=index.js.map