react-input-mask-format 2.0.0 → 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.
package/dist/index.d.ts CHANGED
@@ -1,56 +1,10 @@
1
- import * as React from 'react';
2
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';
3
4
 
4
- type Mask = string | Array<string | RegExp>;
5
- interface Selection {
6
- start: number | null;
7
- end: number | null;
8
- length?: number;
9
- }
10
- interface InputState {
11
- value: string;
12
- selection: Selection;
13
- }
14
- type BeforeMaskedStateChangeFn = (states: {
15
- previousState?: InputState;
16
- currentState?: InputState;
17
- nextState: InputState;
18
- }) => InputState;
19
- /**
20
- * Legacy (react-input-mask v2) signature for the before-change hook.
21
- * @deprecated Use BeforeMaskedStateChangeFn with beforeMaskedStateChange.
22
- */
23
- type BeforeMaskedValueChangeFn = (newState: InputState, oldState: InputState | null, userInput: string | null, maskOptions: V2MaskOptions) => InputState;
24
- /** Mask options shape passed to the legacy beforeMaskedValueChange callback. */
25
- interface V2MaskOptions {
26
- mask?: Mask;
27
- maskChar: string | null;
28
- alwaysShowMask: boolean;
29
- formatChars: Record<string, string>;
30
- permanents: number[];
31
- }
32
- interface InputMaskProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "children"> {
33
- /**
34
- * Mask format. Either a string (9 = 0-9, a = A-Za-z, * = A-Za-z0-9,
35
- * backslash escapes) or an array of constant characters and RegExps.
36
- */
37
- mask?: Mask;
38
- /** Character(s) to cover unfilled parts. Default "_", null — empty. */
39
- maskPlaceholder?: string | null;
40
- /** Show mask even when input is empty and unfocused. */
41
- alwaysShowMask?: boolean;
42
- /** Modify masked value and cursor position before they are applied. */
43
- beforeMaskedStateChange?: BeforeMaskedStateChangeFn;
44
- /** Custom input component. */
45
- children?: React.ReactElement;
46
- /** @deprecated Use maskPlaceholder. */
47
- maskChar?: string | null;
48
- /** @deprecated Use an array mask or keep for legacy. */
49
- formatChars?: Record<string, string>;
50
- /** @deprecated Use beforeMaskedStateChange. */
51
- beforeMaskedValueChange?: BeforeMaskedValueChangeFn;
52
- }
5
+ declare const defaultFormatChars: FormatChars;
6
+ declare const extendedFormatChars: FormatChars;
53
7
 
54
8
  declare const InputMask: React__default.ForwardRefExoticComponent<InputMaskProps & React__default.RefAttributes<HTMLInputElement>>;
55
9
 
56
- export { type BeforeMaskedStateChangeFn, type InputMaskProps, type InputState, type Mask, type Selection, InputMask as default };
10
+ export { FormatChars, InputMaskProps, InputMask as default, defaultFormatChars, extendedFormatChars };
package/dist/index.js CHANGED
@@ -231,6 +231,12 @@ var defaultFormatChars = {
231
231
  a: /[A-Za-z]/,
232
232
  "*": /[A-Za-z0-9]/
233
233
  };
234
+ var extendedFormatChars = {
235
+ ...defaultFormatChars,
236
+ A: /[A-Z]/,
237
+ "\u042F": /[А-Яа-яЁёӘәҒғҚқҢңӨөҰұҮүҺһІі]/,
238
+ "#": /[0-9A-Fa-f]/
239
+ };
234
240
 
235
241
  // src/validate-props.ts
236
242
  function warnDev(condition, message) {
@@ -457,13 +463,14 @@ var MaskUtils = class {
457
463
  if (position >= mask.length) {
458
464
  return value;
459
465
  }
460
- const isAllowed = this.isCharacterAllowedAtPosition(character, position);
466
+ const transformedCharacter = this.transform && this.isPositionEditable(position) ? this.transform(character, position) : character;
467
+ const isAllowed = this.isCharacterAllowedAtPosition(transformedCharacter, position);
461
468
  const isEditable = this.isPositionEditable(position);
462
469
  const nextEditablePosition = this.getRightEditablePosition(position);
463
- const isNextPlaceholder = maskPlaceholder && nextEditablePosition ? character === maskPlaceholder[nextEditablePosition] : null;
470
+ const isNextPlaceholder = maskPlaceholder && nextEditablePosition ? transformedCharacter === maskPlaceholder[nextEditablePosition] : null;
464
471
  const valueBefore = value.slice(0, position);
465
472
  if (isAllowed || !isEditable) {
466
- const insertedCharacter = isAllowed ? character : mask[position];
473
+ const insertedCharacter = isAllowed ? transformedCharacter : mask[position];
467
474
  value = valueBefore + insertedCharacter;
468
475
  }
469
476
  if (!isAllowed && !isEditable && !isNextPlaceholder) {
@@ -558,6 +565,7 @@ var MaskUtils = class {
558
565
  };
559
566
  };
560
567
  this.maskOptions = parseMask(options);
568
+ this.transform = options.transform;
561
569
  }
562
570
  };
563
571
 
@@ -575,15 +583,22 @@ function resolveMaskPlaceholder(maskPlaceholder, maskChar) {
575
583
  }
576
584
  return maskChar;
577
585
  }
578
- function toRegExpFormatChars(formatChars) {
586
+ function normalizeFormatChars(formatChars) {
579
587
  if (!formatChars) {
580
- return void 0;
588
+ return { formatChars: void 0, hasLegacyString: false };
581
589
  }
582
590
  const result = {};
591
+ let hasLegacyString = false;
583
592
  for (const key of Object.keys(formatChars)) {
584
- result[key] = new RegExp(formatChars[key]);
593
+ const value = formatChars[key];
594
+ if (typeof value === "string") {
595
+ hasLegacyString = true;
596
+ result[key] = new RegExp(value);
597
+ } else {
598
+ result[key] = value;
599
+ }
585
600
  }
586
- return result;
601
+ return { formatChars: result, hasLegacyString };
587
602
  }
588
603
  function createBeforeMaskedStateChangeAdapter(beforeMaskedValueChange, maskOptions) {
589
604
  return ({ previousState, currentState, nextState }) => {
@@ -597,6 +612,30 @@ function createBeforeMaskedStateChangeAdapter(beforeMaskedValueChange, maskOptio
597
612
  };
598
613
  }
599
614
 
615
+ // src/utils/transform.ts
616
+ function resolveTransform(transform) {
617
+ if (!transform) {
618
+ return void 0;
619
+ }
620
+ if (transform === "uppercase") {
621
+ return (char) => char.toUpperCase();
622
+ }
623
+ if (transform === "lowercase") {
624
+ return (char) => char.toLowerCase();
625
+ }
626
+ if (typeof transform === "function") {
627
+ return transform;
628
+ }
629
+ if (process.env.NODE_ENV !== "production") {
630
+ console.error(
631
+ `react-input-mask-format: invalid transform "${String(
632
+ transform
633
+ )}", expected "uppercase" | "lowercase" | (char, position) => char`
634
+ );
635
+ }
636
+ return void 0;
637
+ }
638
+
600
639
  // src/index.tsx
601
640
  var InputMask = forwardRef(function InputMask2(props, forwardedRef) {
602
641
  const {
@@ -605,6 +644,7 @@ var InputMask = forwardRef(function InputMask2(props, forwardedRef) {
605
644
  mask,
606
645
  maskPlaceholder: maskPlaceholderProp,
607
646
  beforeMaskedStateChange: beforeMaskedStateChangeProp,
647
+ transform,
608
648
  maskChar,
609
649
  formatChars,
610
650
  beforeMaskedValueChange,
@@ -613,9 +653,6 @@ var InputMask = forwardRef(function InputMask2(props, forwardedRef) {
613
653
  if (maskChar !== void 0) {
614
654
  warnDeprecatedOnce("maskChar", "maskChar is deprecated, use maskPlaceholder instead. See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask");
615
655
  }
616
- if (formatChars !== void 0) {
617
- warnDeprecatedOnce("formatChars", "formatChars is deprecated, prefer an array mask with RegExps. See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask");
618
- }
619
656
  if (beforeMaskedValueChange !== void 0) {
620
657
  warnDeprecatedOnce("beforeMaskedValueChange", "beforeMaskedValueChange is deprecated, use beforeMaskedStateChange. See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask");
621
658
  }
@@ -623,10 +660,18 @@ var InputMask = forwardRef(function InputMask2(props, forwardedRef) {
623
660
  const maskPlaceholder = resolvedPlaceholder === void 0 ? "_" : resolvedPlaceholder;
624
661
  validateMaxLength(props);
625
662
  validateMaskPlaceholder({ ...props, maskPlaceholder });
663
+ const { formatChars: normalizedFormatChars, hasLegacyString } = normalizeFormatChars(formatChars);
664
+ if (hasLegacyString) {
665
+ warnDeprecatedOnce(
666
+ "formatChars",
667
+ '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'
668
+ );
669
+ }
626
670
  const maskUtils = new MaskUtils({
627
671
  mask,
628
672
  maskPlaceholder,
629
- formatChars: toRegExpFormatChars(formatChars)
673
+ formatChars: normalizedFormatChars,
674
+ transform: resolveTransform(transform)
630
675
  });
631
676
  let beforeMaskedStateChange = beforeMaskedStateChangeProp;
632
677
  if (!beforeMaskedStateChange && beforeMaskedValueChange) {
@@ -847,6 +892,8 @@ var InputMask = forwardRef(function InputMask2(props, forwardedRef) {
847
892
  InputMask.displayName = "InputMask";
848
893
  var src_default = InputMask;
849
894
  export {
850
- src_default as default
895
+ src_default as default,
896
+ defaultFormatChars,
897
+ extendedFormatChars
851
898
  };
852
899
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -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"],"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 toRegExpFormatChars,\n createBeforeMaskedStateChangeAdapter,\n warnDeprecatedOnce\n} from \"./v2-compat\";\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 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 (formatChars !== undefined) {\n warnDeprecatedOnce(\"formatChars\", \"formatChars is deprecated, prefer an array mask with RegExps. 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 maskUtils = new MaskUtils({\n mask,\n maskPlaceholder,\n formatChars: toRegExpFormatChars(formatChars)\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 type { InputMaskProps, InputState, Selection, BeforeMaskedStateChangeFn, Mask } 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","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\n constructor(options: {\n mask?: string | Array<string | RegExp> | null;\n maskPlaceholder?: string | null;\n formatChars?: FormatChars;\n }) {\n this.maskOptions = parseMask(options);\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 isAllowed = this.isCharacterAllowedAtPosition(character, position);\n const isEditable = this.isPositionEditable(position);\n const nextEditablePosition = this.getRightEditablePosition(position);\n const isNextPlaceholder =\n maskPlaceholder && nextEditablePosition\n ? character === maskPlaceholder[nextEditablePosition]\n : null;\n const valueBefore = value.slice(0, position);\n\n if (isAllowed || !isEditable) {\n const insertedCharacter = isAllowed ? character : 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 toRegExpFormatChars(\n formatChars: Record<string, string> | undefined\n): FormatChars | undefined {\n if (!formatChars) {\n return undefined;\n }\n const result: FormatChars = {};\n for (const key of Object.keys(formatChars)) {\n result[key] = new RegExp(formatChars[key]);\n }\n return result;\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"],"mappings":"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","names":["useLayoutEffect","value","InputMask","useLayoutEffect"]}
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 };