react-input-mask-format 1.0.5 → 2.1.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.
@@ -0,0 +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":["useLayoutEffect","value","InputMask","useLayoutEffect"]}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/presets/index.ts
21
+ var presets_exports = {};
22
+ __export(presets_exports, {
23
+ card: () => card,
24
+ kzBin: () => kzBin,
25
+ kzIban: () => kzIban,
26
+ kzIin: () => kzIin,
27
+ kzPhone: () => kzPhone,
28
+ kzPlate: () => kzPlate,
29
+ kzPostal: () => kzPostal
30
+ });
31
+ module.exports = __toCommonJS(presets_exports);
32
+ var card = {
33
+ mask: "9999 9999 9999 9999",
34
+ maskPlaceholder: "_"
35
+ };
36
+ var kzPhone = {
37
+ mask: "+7 (799) 999-99-99",
38
+ maskPlaceholder: "_"
39
+ };
40
+ var kzIin = {
41
+ mask: "999999999999",
42
+ maskPlaceholder: "_"
43
+ };
44
+ var kzBin = {
45
+ mask: "999999999999",
46
+ maskPlaceholder: "_"
47
+ };
48
+ var kzIban = {
49
+ // KZ + 2 check + 3 bank digits + 13 alnum account, grouped by 4
50
+ mask: "KZ99 999* **** **** ****",
51
+ maskPlaceholder: "_",
52
+ transform: "uppercase"
53
+ };
54
+ var KZ_PLATE_LETTER = /[ABCEHKMNOPTXY]/i;
55
+ var kzPlate = {
56
+ // 3 digits · 3 letters (Latin look-alikes of Cyrillic) · 2-digit region
57
+ mask: [
58
+ /[0-9]/,
59
+ /[0-9]/,
60
+ /[0-9]/,
61
+ " ",
62
+ KZ_PLATE_LETTER,
63
+ KZ_PLATE_LETTER,
64
+ KZ_PLATE_LETTER,
65
+ " ",
66
+ /[0-9]/,
67
+ /[0-9]/
68
+ ],
69
+ maskPlaceholder: "_",
70
+ transform: "uppercase"
71
+ };
72
+ var kzPostal = {
73
+ mask: "999999",
74
+ maskPlaceholder: "_"
75
+ };
76
+ // Annotate the CommonJS export names for ESM import in node:
77
+ 0 && (module.exports = {
78
+ card,
79
+ kzBin,
80
+ kzIban,
81
+ kzIin,
82
+ kzPhone,
83
+ kzPlate,
84
+ kzPostal
85
+ });
86
+ //# sourceMappingURL=presets.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/presets/index.ts"],"sourcesContent":["import type { Mask, Transform, FormatChars } from \"../types\";\n\nexport interface MaskPreset {\n mask: Mask;\n maskPlaceholder?: string | null;\n transform?: Transform;\n formatChars?: FormatChars;\n}\n\n// ── Generic (country-agnostic) ───────────────────────────────\nexport const card: MaskPreset = {\n mask: \"9999 9999 9999 9999\",\n maskPlaceholder: \"_\"\n};\n\n// ── Kazakhstan ───────────────────────────────────────────────\nexport const kzPhone: MaskPreset = {\n mask: \"+7 (799) 999-99-99\",\n maskPlaceholder: \"_\"\n};\n\nexport const kzIin: MaskPreset = {\n mask: \"999999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const kzBin: MaskPreset = {\n mask: \"999999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const kzIban: MaskPreset = {\n // KZ + 2 check + 3 bank digits + 13 alnum account, grouped by 4\n mask: \"KZ99 999* **** **** ****\",\n maskPlaceholder: \"_\",\n transform: \"uppercase\"\n};\n\nconst KZ_PLATE_LETTER = /[ABCEHKMNOPTXY]/i;\nexport const kzPlate: MaskPreset = {\n // 3 digits · 3 letters (Latin look-alikes of Cyrillic) · 2-digit region\n mask: [\n /[0-9]/, /[0-9]/, /[0-9]/, \" \",\n KZ_PLATE_LETTER, KZ_PLATE_LETTER, KZ_PLATE_LETTER, \" \",\n /[0-9]/, /[0-9]/\n ],\n maskPlaceholder: \"_\",\n transform: \"uppercase\"\n};\n\nexport const kzPostal: MaskPreset = {\n mask: \"999999\",\n maskPlaceholder: \"_\"\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUO,IAAM,OAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAGO,IAAM,UAAsB;AAAA,EACjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,SAAqB;AAAA;AAAA,EAEhC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEA,IAAM,kBAAkB;AACjB,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,IACJ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAC3B;AAAA,IAAiB;AAAA,IAAiB;AAAA,IAAiB;AAAA,IACnD;AAAA,IAAS;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;","names":[]}
@@ -0,0 +1,18 @@
1
+ import { M as Mask, T as Transform, F as FormatChars } from './types-Bfu5Jmh0.cjs';
2
+ import 'react';
3
+
4
+ interface MaskPreset {
5
+ mask: Mask;
6
+ maskPlaceholder?: string | null;
7
+ transform?: Transform;
8
+ formatChars?: FormatChars;
9
+ }
10
+ declare const card: MaskPreset;
11
+ declare const kzPhone: MaskPreset;
12
+ declare const kzIin: MaskPreset;
13
+ declare const kzBin: MaskPreset;
14
+ declare const kzIban: MaskPreset;
15
+ declare const kzPlate: MaskPreset;
16
+ declare const kzPostal: MaskPreset;
17
+
18
+ export { type MaskPreset, card, kzBin, kzIban, kzIin, kzPhone, kzPlate, kzPostal };
@@ -0,0 +1,18 @@
1
+ import { M as Mask, T as Transform, F as FormatChars } from './types-Bfu5Jmh0.js';
2
+ import 'react';
3
+
4
+ interface MaskPreset {
5
+ mask: Mask;
6
+ maskPlaceholder?: string | null;
7
+ transform?: Transform;
8
+ formatChars?: FormatChars;
9
+ }
10
+ declare const card: MaskPreset;
11
+ declare const kzPhone: MaskPreset;
12
+ declare const kzIin: MaskPreset;
13
+ declare const kzBin: MaskPreset;
14
+ declare const kzIban: MaskPreset;
15
+ declare const kzPlate: MaskPreset;
16
+ declare const kzPostal: MaskPreset;
17
+
18
+ export { type MaskPreset, card, kzBin, kzIban, kzIin, kzPhone, kzPlate, kzPostal };
@@ -0,0 +1,55 @@
1
+ // src/presets/index.ts
2
+ var card = {
3
+ mask: "9999 9999 9999 9999",
4
+ maskPlaceholder: "_"
5
+ };
6
+ var kzPhone = {
7
+ mask: "+7 (799) 999-99-99",
8
+ maskPlaceholder: "_"
9
+ };
10
+ var kzIin = {
11
+ mask: "999999999999",
12
+ maskPlaceholder: "_"
13
+ };
14
+ var kzBin = {
15
+ mask: "999999999999",
16
+ maskPlaceholder: "_"
17
+ };
18
+ var kzIban = {
19
+ // KZ + 2 check + 3 bank digits + 13 alnum account, grouped by 4
20
+ mask: "KZ99 999* **** **** ****",
21
+ maskPlaceholder: "_",
22
+ transform: "uppercase"
23
+ };
24
+ var KZ_PLATE_LETTER = /[ABCEHKMNOPTXY]/i;
25
+ var kzPlate = {
26
+ // 3 digits · 3 letters (Latin look-alikes of Cyrillic) · 2-digit region
27
+ mask: [
28
+ /[0-9]/,
29
+ /[0-9]/,
30
+ /[0-9]/,
31
+ " ",
32
+ KZ_PLATE_LETTER,
33
+ KZ_PLATE_LETTER,
34
+ KZ_PLATE_LETTER,
35
+ " ",
36
+ /[0-9]/,
37
+ /[0-9]/
38
+ ],
39
+ maskPlaceholder: "_",
40
+ transform: "uppercase"
41
+ };
42
+ var kzPostal = {
43
+ mask: "999999",
44
+ maskPlaceholder: "_"
45
+ };
46
+ export {
47
+ card,
48
+ kzBin,
49
+ kzIban,
50
+ kzIin,
51
+ kzPhone,
52
+ kzPlate,
53
+ kzPostal
54
+ };
55
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/presets/index.ts"],"sourcesContent":["import type { Mask, Transform, FormatChars } from \"../types\";\n\nexport interface MaskPreset {\n mask: Mask;\n maskPlaceholder?: string | null;\n transform?: Transform;\n formatChars?: FormatChars;\n}\n\n// ── Generic (country-agnostic) ───────────────────────────────\nexport const card: MaskPreset = {\n mask: \"9999 9999 9999 9999\",\n maskPlaceholder: \"_\"\n};\n\n// ── Kazakhstan ───────────────────────────────────────────────\nexport const kzPhone: MaskPreset = {\n mask: \"+7 (799) 999-99-99\",\n maskPlaceholder: \"_\"\n};\n\nexport const kzIin: MaskPreset = {\n mask: \"999999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const kzBin: MaskPreset = {\n mask: \"999999999999\",\n maskPlaceholder: \"_\"\n};\n\nexport const kzIban: MaskPreset = {\n // KZ + 2 check + 3 bank digits + 13 alnum account, grouped by 4\n mask: \"KZ99 999* **** **** ****\",\n maskPlaceholder: \"_\",\n transform: \"uppercase\"\n};\n\nconst KZ_PLATE_LETTER = /[ABCEHKMNOPTXY]/i;\nexport const kzPlate: MaskPreset = {\n // 3 digits · 3 letters (Latin look-alikes of Cyrillic) · 2-digit region\n mask: [\n /[0-9]/, /[0-9]/, /[0-9]/, \" \",\n KZ_PLATE_LETTER, KZ_PLATE_LETTER, KZ_PLATE_LETTER, \" \",\n /[0-9]/, /[0-9]/\n ],\n maskPlaceholder: \"_\",\n transform: \"uppercase\"\n};\n\nexport const kzPostal: MaskPreset = {\n mask: \"999999\",\n maskPlaceholder: \"_\"\n};\n"],"mappings":";AAUO,IAAM,OAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAGO,IAAM,UAAsB;AAAA,EACjC,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,QAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,iBAAiB;AACnB;AAEO,IAAM,SAAqB;AAAA;AAAA,EAEhC,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEA,IAAM,kBAAkB;AACjB,IAAM,UAAsB;AAAA;AAAA,EAEjC,MAAM;AAAA,IACJ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAC3B;AAAA,IAAiB;AAAA,IAAiB;AAAA,IAAiB;AAAA,IACnD;AAAA,IAAS;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW;AACb;AAEO,IAAM,WAAuB;AAAA,EAClC,MAAM;AAAA,EACN,iBAAiB;AACnB;","names":[]}
@@ -0,0 +1,61 @@
1
+ import * as React from 'react';
2
+
3
+ type Mask = string | Array<string | RegExp>;
4
+ type Transform = "uppercase" | "lowercase" | ((char: string, position: number) => string);
5
+ type FormatChars = Record<string, RegExp>;
6
+ interface Selection {
7
+ start: number | null;
8
+ end: number | null;
9
+ length?: number;
10
+ }
11
+ interface InputState {
12
+ value: string;
13
+ selection: Selection;
14
+ }
15
+ type BeforeMaskedStateChangeFn = (states: {
16
+ previousState?: InputState;
17
+ currentState?: InputState;
18
+ nextState: InputState;
19
+ }) => InputState;
20
+ /**
21
+ * Legacy (react-input-mask v2) signature for the before-change hook.
22
+ * @deprecated Use BeforeMaskedStateChangeFn with beforeMaskedStateChange.
23
+ */
24
+ type BeforeMaskedValueChangeFn = (newState: InputState, oldState: InputState | null, userInput: string | null, maskOptions: V2MaskOptions) => InputState;
25
+ /** Mask options shape passed to the legacy beforeMaskedValueChange callback. */
26
+ interface V2MaskOptions {
27
+ mask?: Mask;
28
+ maskChar: string | null;
29
+ alwaysShowMask: boolean;
30
+ formatChars: Record<string, RegExp | string>;
31
+ permanents: number[];
32
+ }
33
+ interface InputMaskProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "children"> {
34
+ /**
35
+ * Mask format. Either a string (9 = 0-9, a = A-Za-z, * = A-Za-z0-9,
36
+ * backslash escapes) or an array of constant characters and RegExps.
37
+ */
38
+ mask?: Mask;
39
+ /** Character(s) to cover unfilled parts. Default "_", null — empty. */
40
+ maskPlaceholder?: string | null;
41
+ /** Show mask even when input is empty and unfocused. */
42
+ alwaysShowMask?: boolean;
43
+ /** Modify masked value and cursor position before they are applied. */
44
+ beforeMaskedStateChange?: BeforeMaskedStateChangeFn;
45
+ /** Normalize each entered character. "uppercase" | "lowercase" | (char, position) => char. Must be pure. */
46
+ transform?: Transform;
47
+ /** Custom input component. */
48
+ children?: React.ReactElement;
49
+ /** @deprecated Use maskPlaceholder. */
50
+ maskChar?: string | null;
51
+ /**
52
+ * Map of custom mask tokens to character classes. Prefer RegExp values
53
+ * (e.g. `{ "#": /[0-9]/ }`); a ready-made `extendedFormatChars` is exported.
54
+ * String values are a deprecated legacy form and emit a one-time warning.
55
+ */
56
+ formatChars?: Record<string, RegExp | string>;
57
+ /** @deprecated Use beforeMaskedStateChange. */
58
+ beforeMaskedValueChange?: BeforeMaskedValueChangeFn;
59
+ }
60
+
61
+ export type { BeforeMaskedStateChangeFn as B, FormatChars as F, InputMaskProps as I, Mask as M, Selection as S, Transform as T, BeforeMaskedValueChangeFn as a, InputState as b };
@@ -0,0 +1,61 @@
1
+ import * as React from 'react';
2
+
3
+ type Mask = string | Array<string | RegExp>;
4
+ type Transform = "uppercase" | "lowercase" | ((char: string, position: number) => string);
5
+ type FormatChars = Record<string, RegExp>;
6
+ interface Selection {
7
+ start: number | null;
8
+ end: number | null;
9
+ length?: number;
10
+ }
11
+ interface InputState {
12
+ value: string;
13
+ selection: Selection;
14
+ }
15
+ type BeforeMaskedStateChangeFn = (states: {
16
+ previousState?: InputState;
17
+ currentState?: InputState;
18
+ nextState: InputState;
19
+ }) => InputState;
20
+ /**
21
+ * Legacy (react-input-mask v2) signature for the before-change hook.
22
+ * @deprecated Use BeforeMaskedStateChangeFn with beforeMaskedStateChange.
23
+ */
24
+ type BeforeMaskedValueChangeFn = (newState: InputState, oldState: InputState | null, userInput: string | null, maskOptions: V2MaskOptions) => InputState;
25
+ /** Mask options shape passed to the legacy beforeMaskedValueChange callback. */
26
+ interface V2MaskOptions {
27
+ mask?: Mask;
28
+ maskChar: string | null;
29
+ alwaysShowMask: boolean;
30
+ formatChars: Record<string, RegExp | string>;
31
+ permanents: number[];
32
+ }
33
+ interface InputMaskProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "children"> {
34
+ /**
35
+ * Mask format. Either a string (9 = 0-9, a = A-Za-z, * = A-Za-z0-9,
36
+ * backslash escapes) or an array of constant characters and RegExps.
37
+ */
38
+ mask?: Mask;
39
+ /** Character(s) to cover unfilled parts. Default "_", null — empty. */
40
+ maskPlaceholder?: string | null;
41
+ /** Show mask even when input is empty and unfocused. */
42
+ alwaysShowMask?: boolean;
43
+ /** Modify masked value and cursor position before they are applied. */
44
+ beforeMaskedStateChange?: BeforeMaskedStateChangeFn;
45
+ /** Normalize each entered character. "uppercase" | "lowercase" | (char, position) => char. Must be pure. */
46
+ transform?: Transform;
47
+ /** Custom input component. */
48
+ children?: React.ReactElement;
49
+ /** @deprecated Use maskPlaceholder. */
50
+ maskChar?: string | null;
51
+ /**
52
+ * Map of custom mask tokens to character classes. Prefer RegExp values
53
+ * (e.g. `{ "#": /[0-9]/ }`); a ready-made `extendedFormatChars` is exported.
54
+ * String values are a deprecated legacy form and emit a one-time warning.
55
+ */
56
+ formatChars?: Record<string, RegExp | string>;
57
+ /** @deprecated Use beforeMaskedStateChange. */
58
+ beforeMaskedValueChange?: BeforeMaskedValueChangeFn;
59
+ }
60
+
61
+ export type { BeforeMaskedStateChangeFn as B, FormatChars as F, InputMaskProps as I, Mask as M, Selection as S, Transform as T, BeforeMaskedValueChangeFn as a, InputState as b };
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/validators/index.ts
21
+ var validators_exports = {};
22
+ __export(validators_exports, {
23
+ isValidBin: () => isValidBin,
24
+ isValidIin: () => isValidIin,
25
+ isValidKzIban: () => isValidKzIban,
26
+ luhn: () => luhn
27
+ });
28
+ module.exports = __toCommonJS(validators_exports);
29
+ function digitsOnly(value) {
30
+ return (value != null ? value : "").replace(/\D/g, "");
31
+ }
32
+ function luhn(value) {
33
+ const digits = digitsOnly(value);
34
+ if (digits.length === 0) {
35
+ return false;
36
+ }
37
+ let sum = 0;
38
+ let double = false;
39
+ for (let i = digits.length - 1; i >= 0; i--) {
40
+ let d = digits.charCodeAt(i) - 48;
41
+ if (double) {
42
+ d *= 2;
43
+ if (d > 9) {
44
+ d -= 9;
45
+ }
46
+ }
47
+ sum += d;
48
+ double = !double;
49
+ }
50
+ return sum % 10 === 0;
51
+ }
52
+ var IIN_W1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
53
+ var IIN_W2 = [3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2];
54
+ function iinBinChecksum(value) {
55
+ const digits = digitsOnly(value);
56
+ if (digits.length !== 12) {
57
+ return false;
58
+ }
59
+ const d = digits.split("").map((c) => c.charCodeAt(0) - 48);
60
+ const weighted = (w) => w.reduce((sum, wi, i) => sum + wi * d[i], 0) % 11;
61
+ let control = weighted(IIN_W1);
62
+ if (control === 10) {
63
+ control = weighted(IIN_W2);
64
+ if (control === 10) {
65
+ return false;
66
+ }
67
+ }
68
+ return control === d[11];
69
+ }
70
+ function isValidIin(value) {
71
+ return iinBinChecksum(value);
72
+ }
73
+ function isValidBin(value) {
74
+ return iinBinChecksum(value);
75
+ }
76
+ function isValidKzIban(value) {
77
+ const s = (value != null ? value : "").replace(/\s+/g, "").toUpperCase();
78
+ if (s.length !== 20 || !s.startsWith("KZ") || !/^[0-9A-Z]+$/.test(s)) {
79
+ return false;
80
+ }
81
+ const rearranged = s.slice(4) + s.slice(0, 4);
82
+ let remainder = 0;
83
+ for (let i = 0; i < rearranged.length; i++) {
84
+ const ch = rearranged[i];
85
+ const chunk = ch >= "A" && ch <= "Z" ? String(ch.charCodeAt(0) - 55) : ch;
86
+ for (let j = 0; j < chunk.length; j++) {
87
+ remainder = (remainder * 10 + (chunk.charCodeAt(j) - 48)) % 97;
88
+ }
89
+ }
90
+ return remainder === 1;
91
+ }
92
+ // Annotate the CommonJS export names for ESM import in node:
93
+ 0 && (module.exports = {
94
+ isValidBin,
95
+ isValidIin,
96
+ isValidKzIban,
97
+ luhn
98
+ });
99
+ //# sourceMappingURL=validators.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/validators/index.ts"],"sourcesContent":["function digitsOnly(value: string): string {\n return (value ?? \"\").replace(/\\D/g, \"\");\n}\n\nexport function luhn(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length === 0) {\n return false;\n }\n let sum = 0;\n let double = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let d = digits.charCodeAt(i) - 48;\n if (double) {\n d *= 2;\n if (d > 9) {\n d -= 9;\n }\n }\n sum += d;\n double = !double;\n }\n return sum % 10 === 0;\n}\n\nconst IIN_W1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];\nconst IIN_W2 = [3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2];\n\nfunction iinBinChecksum(value: string): boolean {\n const digits = digitsOnly(value);\n if (digits.length !== 12) {\n return false;\n }\n const d = digits.split(\"\").map(c => c.charCodeAt(0) - 48);\n const weighted = (w: number[]): number =>\n w.reduce((sum, wi, i) => sum + wi * d[i], 0) % 11;\n let control = weighted(IIN_W1);\n if (control === 10) {\n control = weighted(IIN_W2);\n if (control === 10) {\n return false;\n }\n }\n return control === d[11];\n}\n\nexport function isValidIin(value: string): boolean {\n return iinBinChecksum(value);\n}\n\nexport function isValidBin(value: string): boolean {\n return iinBinChecksum(value);\n}\n\nexport function isValidKzIban(value: string): boolean {\n const s = (value ?? \"\").replace(/\\s+/g, \"\").toUpperCase();\n if (s.length !== 20 || !s.startsWith(\"KZ\") || !/^[0-9A-Z]+$/.test(s)) {\n return false;\n }\n const rearranged = s.slice(4) + s.slice(0, 4);\n let remainder = 0;\n for (let i = 0; i < rearranged.length; i++) {\n const ch = rearranged[i];\n // A→10 … Z→35, digits stay as-is\n const chunk = ch >= \"A\" && ch <= \"Z\" ? String(ch.charCodeAt(0) - 55) : ch;\n for (let j = 0; j < chunk.length; j++) {\n remainder = (remainder * 10 + (chunk.charCodeAt(j) - 48)) % 97;\n }\n }\n return remainder === 1;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,WAAW,OAAuB;AACzC,UAAQ,wBAAS,IAAI,QAAQ,OAAO,EAAE;AACxC;AAEO,SAAS,KAAK,OAAwB;AAC3C,QAAM,SAAS,WAAW,KAAK;AAC/B,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI,MAAM;AACV,MAAI,SAAS;AACb,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,QAAI,IAAI,OAAO,WAAW,CAAC,IAAI;AAC/B,QAAI,QAAQ;AACV,WAAK;AACL,UAAI,IAAI,GAAG;AACT,aAAK;AAAA,MACP;AAAA,IACF;AACA,WAAO;AACP,aAAS,CAAC;AAAA,EACZ;AACA,SAAO,MAAM,OAAO;AACtB;AAEA,IAAM,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AACjD,IAAM,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC;AAEjD,SAAS,eAAe,OAAwB;AAC9C,QAAM,SAAS,WAAW,KAAK;AAC/B,MAAI,OAAO,WAAW,IAAI;AACxB,WAAO;AAAA,EACT;AACA,QAAM,IAAI,OAAO,MAAM,EAAE,EAAE,IAAI,OAAK,EAAE,WAAW,CAAC,IAAI,EAAE;AACxD,QAAM,WAAW,CAAC,MAChB,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM,MAAM,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI;AACjD,MAAI,UAAU,SAAS,MAAM;AAC7B,MAAI,YAAY,IAAI;AAClB,cAAU,SAAS,MAAM;AACzB,QAAI,YAAY,IAAI;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,YAAY,EAAE,EAAE;AACzB;AAEO,SAAS,WAAW,OAAwB;AACjD,SAAO,eAAe,KAAK;AAC7B;AAEO,SAAS,WAAW,OAAwB;AACjD,SAAO,eAAe,KAAK;AAC7B;AAEO,SAAS,cAAc,OAAwB;AACpD,QAAM,KAAK,wBAAS,IAAI,QAAQ,QAAQ,EAAE,EAAE,YAAY;AACxD,MAAI,EAAE,WAAW,MAAM,CAAC,EAAE,WAAW,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,GAAG;AACpE,WAAO;AAAA,EACT;AACA,QAAM,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;AAC5C,MAAI,YAAY;AAChB,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAM,KAAK,WAAW,CAAC;AAEvB,UAAM,QAAQ,MAAM,OAAO,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI;AACvE,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,mBAAa,YAAY,MAAM,MAAM,WAAW,CAAC,IAAI,OAAO;AAAA,IAC9D;AAAA,EACF;AACA,SAAO,cAAc;AACvB;","names":[]}
@@ -0,0 +1,6 @@
1
+ declare function luhn(value: string): boolean;
2
+ declare function isValidIin(value: string): boolean;
3
+ declare function isValidBin(value: string): boolean;
4
+ declare function isValidKzIban(value: string): boolean;
5
+
6
+ export { isValidBin, isValidIin, isValidKzIban, luhn };
@@ -0,0 +1,6 @@
1
+ declare function luhn(value: string): boolean;
2
+ declare function isValidIin(value: string): boolean;
3
+ declare function isValidBin(value: string): boolean;
4
+ declare function isValidKzIban(value: string): boolean;
5
+
6
+ export { isValidBin, isValidIin, isValidKzIban, luhn };
@@ -0,0 +1,71 @@
1
+ // src/validators/index.ts
2
+ function digitsOnly(value) {
3
+ return (value != null ? value : "").replace(/\D/g, "");
4
+ }
5
+ function luhn(value) {
6
+ const digits = digitsOnly(value);
7
+ if (digits.length === 0) {
8
+ return false;
9
+ }
10
+ let sum = 0;
11
+ let double = false;
12
+ for (let i = digits.length - 1; i >= 0; i--) {
13
+ let d = digits.charCodeAt(i) - 48;
14
+ if (double) {
15
+ d *= 2;
16
+ if (d > 9) {
17
+ d -= 9;
18
+ }
19
+ }
20
+ sum += d;
21
+ double = !double;
22
+ }
23
+ return sum % 10 === 0;
24
+ }
25
+ var IIN_W1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
26
+ var IIN_W2 = [3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2];
27
+ function iinBinChecksum(value) {
28
+ const digits = digitsOnly(value);
29
+ if (digits.length !== 12) {
30
+ return false;
31
+ }
32
+ const d = digits.split("").map((c) => c.charCodeAt(0) - 48);
33
+ const weighted = (w) => w.reduce((sum, wi, i) => sum + wi * d[i], 0) % 11;
34
+ let control = weighted(IIN_W1);
35
+ if (control === 10) {
36
+ control = weighted(IIN_W2);
37
+ if (control === 10) {
38
+ return false;
39
+ }
40
+ }
41
+ return control === d[11];
42
+ }
43
+ function isValidIin(value) {
44
+ return iinBinChecksum(value);
45
+ }
46
+ function isValidBin(value) {
47
+ return iinBinChecksum(value);
48
+ }
49
+ function isValidKzIban(value) {
50
+ const s = (value != null ? value : "").replace(/\s+/g, "").toUpperCase();
51
+ if (s.length !== 20 || !s.startsWith("KZ") || !/^[0-9A-Z]+$/.test(s)) {
52
+ return false;
53
+ }
54
+ const rearranged = s.slice(4) + s.slice(0, 4);
55
+ let remainder = 0;
56
+ for (let i = 0; i < rearranged.length; i++) {
57
+ const ch = rearranged[i];
58
+ const chunk = ch >= "A" && ch <= "Z" ? String(ch.charCodeAt(0) - 55) : ch;
59
+ for (let j = 0; j < chunk.length; j++) {
60
+ remainder = (remainder * 10 + (chunk.charCodeAt(j) - 48)) % 97;
61
+ }
62
+ }
63
+ return remainder === 1;
64
+ }
65
+ export {
66
+ isValidBin,
67
+ isValidIin,
68
+ isValidKzIban,
69
+ luhn
70
+ };
71
+ //# sourceMappingURL=validators.js.map