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/README.md CHANGED
@@ -4,10 +4,21 @@
4
4
  [![npm downloads](https://img.shields.io/npm/dm/react-input-mask-format.svg)](https://www.npmjs.com/package/react-input-mask-format)
5
5
  [![CI](https://github.com/Temirtator/react-input-mask-format/actions/workflows/ci.yml/badge.svg)](https://github.com/Temirtator/react-input-mask-format/actions/workflows/ci.yml)
6
6
 
7
- Input masking component for React. Made with attention to UX.
7
+ General-purpose input masking for React — dates, phone numbers, cards, custom
8
+ tokens, and a growing set of ready-made country packs (Kazakhstan ships first).
9
+ Made with attention to UX.
8
10
 
9
11
  A maintained fork of [react-input-mask](https://github.com/sanniassin/react-input-mask).
10
12
 
13
+ ## What's new in 2.1
14
+
15
+ - `transform` prop (`uppercase` / `lowercase` / custom) — see [transform](#transform)
16
+ - Custom tokens via RegExp `formatChars` + shipped `extendedFormatChars` (`A`, `Я`, `#`)
17
+ - `react-input-mask-format/presets` — `card` + Kazakhstan pack (phone, IIN, BIN, IBAN, plate, postal)
18
+ - `react-input-mask-format/validators` — `isValidIin`, `isValidBin`, `isValidKzIban`, `luhn`
19
+
20
+ All additive — no migration needed.
21
+
11
22
  ## Why this fork
12
23
 
13
24
  The original `react-input-mask` has been unmaintained since 2021. This fork is:
@@ -45,6 +56,8 @@ function DateInput(props) {
45
56
  | Name | Type | Default | Description |
46
57
  | :---------------------------------------------------------: | :--------------------------------: | :-----: | :--- |
47
58
  | **[`mask`](#mask)** | `{String\|Array<String, RegExp>}` | | Mask format |
59
+ | **[`transform`](#transform)** | `{"uppercase"\|"lowercase"\|Function}` | | Normalize each entered character before it's tested against the mask |
60
+ | **[`formatChars`](#custom-tokens-formatchars-and-extendedformatchars)** | `{Object<String, RegExp>}` | | Custom mask tokens beyond the default `9`, `a`, `*` |
48
61
  | **[`maskPlaceholder`](#maskplaceholder)** | `{String}` | `_` | Placeholder to cover unfilled parts of the mask |
49
62
  | **[`alwaysShowMask`](#alwaysshowmask)** | `{Boolean}` | `false` | Whether mask prefix and placeholder should be displayed when input is empty and has no focus |
50
63
  | **[`beforeMaskedStateChange`](#beforemaskedstatechange)** | `{Function}` | | Function to modify value and selection before applying mask |
@@ -79,6 +92,75 @@ const mask = [firstLetter, digit, letter, " ", digit, letter, digit];
79
92
  return <InputMask mask={mask} />;
80
93
  ```
81
94
 
95
+ ### `transform`
96
+
97
+ Normalize every entered character. Runs before the mask test, so an uppercase-only
98
+ class accepts lowercase typing; runs before `beforeMaskedStateChange`.
99
+
100
+ ```jsx
101
+ <InputMask mask="aaaaaa" transform="uppercase" /> // "abc" → "ABC"
102
+ <InputMask mask={[/[A-Z]/, /[A-Z]/]} transform="uppercase" />
103
+ <InputMask mask="9a9a" transform={(char, position) => char} />
104
+ ```
105
+
106
+ Values: `"uppercase"`, `"lowercase"`, or `(char, position) => char` (must be pure).
107
+
108
+ ### Custom tokens (`formatChars`) and `extendedFormatChars`
109
+
110
+ Define your own mask tokens by mapping a character to a `RegExp`:
111
+
112
+ ```jsx
113
+ import InputMask, { extendedFormatChars } from "react-input-mask-format";
114
+
115
+ // roll your own
116
+ <InputMask mask="ww-ww" formatChars={{ w: /[a-z]/ }} />
117
+
118
+ // or use the shipped extended set: A (uppercase), Я (Cyrillic incl. Kazakh), # (hex)
119
+ <InputMask mask="AAA-###" formatChars={extendedFormatChars} />
120
+ ```
121
+
122
+ The default tokens (`9`, `a`, `*`) are unchanged. Passing string values (`{ w: "[a-z]" }`)
123
+ still works but is deprecated — pass `RegExp` values.
124
+
125
+ ## Presets
126
+
127
+ Ready-made mask configs. Import what you need and spread it — tree-shakeable, and the
128
+ core bundle carries none of it.
129
+
130
+ ```jsx
131
+ import InputMask from "react-input-mask-format";
132
+ import { kzPhone, kzIban } from "react-input-mask-format/presets";
133
+
134
+ <InputMask {...kzPhone} value={phone} onChange={onChange} />
135
+ <InputMask {...kzIban} value={iban} onChange={onChange} />
136
+ ```
137
+
138
+ Presets are a country-agnostic system; Kazakhstan is the first (flagship) country pack —
139
+ PRs adding other countries are welcome.
140
+
141
+ | export | mask | example |
142
+ | --- | --- | --- |
143
+ | `card` | `9999 9999 9999 9999` | `4242 4242 4242 4242` |
144
+ | `kzPhone` | `+7 (799) 999-99-99` | `+7 (701) 234-56-78` |
145
+ | `kzIin` | `999999999999` | `901010123458` |
146
+ | `kzBin` | `999999999999` | `150340004984` |
147
+ | `kzIban` | `KZ99 999* **** **** ****` (uppercase) | `KZ86 125K ZT50 0410 0100` |
148
+ | `kzPlate` | `123 ABC 02` (letters `ABCEHKMNOPTXY`, uppercase) | `123 ABC 02` |
149
+ | `kzPostal` | `999999` | `050000` |
150
+
151
+ ## Validators
152
+
153
+ Optional checksum validators, separate entry point, zero-deps. Accept raw or formatted
154
+ input; return `false` on empty/invalid.
155
+
156
+ ```jsx
157
+ import { isValidIin, isValidBin, isValidKzIban, luhn } from "react-input-mask-format/validators";
158
+
159
+ isValidIin("901010123458"); // KZ IIN/BIN mod-11 checksum
160
+ isValidKzIban("KZ86 125K ZT50 0410 0100"); // ISO 7064 MOD-97
161
+ luhn("4242 4242 4242 4242"); // card Luhn
162
+ ```
163
+
82
164
  ### `maskPlaceholder`
83
165
 
84
166
  ```jsx
package/dist/index.cjs CHANGED
@@ -30,7 +30,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.tsx
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
- default: () => src_default
33
+ default: () => src_default,
34
+ defaultFormatChars: () => defaultFormatChars,
35
+ extendedFormatChars: () => extendedFormatChars
34
36
  });
35
37
  module.exports = __toCommonJS(src_exports);
36
38
  var import_react2 = __toESM(require("react"), 1);
@@ -265,6 +267,12 @@ var defaultFormatChars = {
265
267
  a: /[A-Za-z]/,
266
268
  "*": /[A-Za-z0-9]/
267
269
  };
270
+ var extendedFormatChars = {
271
+ ...defaultFormatChars,
272
+ A: /[A-Z]/,
273
+ "\u042F": /[А-Яа-яЁёӘәҒғҚқҢңӨөҰұҮүҺһІі]/,
274
+ "#": /[0-9A-Fa-f]/
275
+ };
268
276
 
269
277
  // src/validate-props.ts
270
278
  function warnDev(condition, message) {
@@ -491,13 +499,14 @@ var MaskUtils = class {
491
499
  if (position >= mask.length) {
492
500
  return value;
493
501
  }
494
- const isAllowed = this.isCharacterAllowedAtPosition(character, position);
502
+ const transformedCharacter = this.transform && this.isPositionEditable(position) ? this.transform(character, position) : character;
503
+ const isAllowed = this.isCharacterAllowedAtPosition(transformedCharacter, position);
495
504
  const isEditable = this.isPositionEditable(position);
496
505
  const nextEditablePosition = this.getRightEditablePosition(position);
497
- const isNextPlaceholder = maskPlaceholder && nextEditablePosition ? character === maskPlaceholder[nextEditablePosition] : null;
506
+ const isNextPlaceholder = maskPlaceholder && nextEditablePosition ? transformedCharacter === maskPlaceholder[nextEditablePosition] : null;
498
507
  const valueBefore = value.slice(0, position);
499
508
  if (isAllowed || !isEditable) {
500
- const insertedCharacter = isAllowed ? character : mask[position];
509
+ const insertedCharacter = isAllowed ? transformedCharacter : mask[position];
501
510
  value = valueBefore + insertedCharacter;
502
511
  }
503
512
  if (!isAllowed && !isEditable && !isNextPlaceholder) {
@@ -592,6 +601,7 @@ var MaskUtils = class {
592
601
  };
593
602
  };
594
603
  this.maskOptions = parseMask(options);
604
+ this.transform = options.transform;
595
605
  }
596
606
  };
597
607
 
@@ -609,15 +619,22 @@ function resolveMaskPlaceholder(maskPlaceholder, maskChar) {
609
619
  }
610
620
  return maskChar;
611
621
  }
612
- function toRegExpFormatChars(formatChars) {
622
+ function normalizeFormatChars(formatChars) {
613
623
  if (!formatChars) {
614
- return void 0;
624
+ return { formatChars: void 0, hasLegacyString: false };
615
625
  }
616
626
  const result = {};
627
+ let hasLegacyString = false;
617
628
  for (const key of Object.keys(formatChars)) {
618
- result[key] = new RegExp(formatChars[key]);
629
+ const value = formatChars[key];
630
+ if (typeof value === "string") {
631
+ hasLegacyString = true;
632
+ result[key] = new RegExp(value);
633
+ } else {
634
+ result[key] = value;
635
+ }
619
636
  }
620
- return result;
637
+ return { formatChars: result, hasLegacyString };
621
638
  }
622
639
  function createBeforeMaskedStateChangeAdapter(beforeMaskedValueChange, maskOptions) {
623
640
  return ({ previousState, currentState, nextState }) => {
@@ -631,6 +648,30 @@ function createBeforeMaskedStateChangeAdapter(beforeMaskedValueChange, maskOptio
631
648
  };
632
649
  }
633
650
 
651
+ // src/utils/transform.ts
652
+ function resolveTransform(transform) {
653
+ if (!transform) {
654
+ return void 0;
655
+ }
656
+ if (transform === "uppercase") {
657
+ return (char) => char.toUpperCase();
658
+ }
659
+ if (transform === "lowercase") {
660
+ return (char) => char.toLowerCase();
661
+ }
662
+ if (typeof transform === "function") {
663
+ return transform;
664
+ }
665
+ if (process.env.NODE_ENV !== "production") {
666
+ console.error(
667
+ `react-input-mask-format: invalid transform "${String(
668
+ transform
669
+ )}", expected "uppercase" | "lowercase" | (char, position) => char`
670
+ );
671
+ }
672
+ return void 0;
673
+ }
674
+
634
675
  // src/index.tsx
635
676
  var InputMask = (0, import_react2.forwardRef)(function InputMask2(props, forwardedRef) {
636
677
  const {
@@ -639,6 +680,7 @@ var InputMask = (0, import_react2.forwardRef)(function InputMask2(props, forward
639
680
  mask,
640
681
  maskPlaceholder: maskPlaceholderProp,
641
682
  beforeMaskedStateChange: beforeMaskedStateChangeProp,
683
+ transform,
642
684
  maskChar,
643
685
  formatChars,
644
686
  beforeMaskedValueChange,
@@ -647,9 +689,6 @@ var InputMask = (0, import_react2.forwardRef)(function InputMask2(props, forward
647
689
  if (maskChar !== void 0) {
648
690
  warnDeprecatedOnce("maskChar", "maskChar is deprecated, use maskPlaceholder instead. See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask");
649
691
  }
650
- if (formatChars !== void 0) {
651
- 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");
652
- }
653
692
  if (beforeMaskedValueChange !== void 0) {
654
693
  warnDeprecatedOnce("beforeMaskedValueChange", "beforeMaskedValueChange is deprecated, use beforeMaskedStateChange. See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask");
655
694
  }
@@ -657,10 +696,18 @@ var InputMask = (0, import_react2.forwardRef)(function InputMask2(props, forward
657
696
  const maskPlaceholder = resolvedPlaceholder === void 0 ? "_" : resolvedPlaceholder;
658
697
  validateMaxLength(props);
659
698
  validateMaskPlaceholder({ ...props, maskPlaceholder });
699
+ const { formatChars: normalizedFormatChars, hasLegacyString } = normalizeFormatChars(formatChars);
700
+ if (hasLegacyString) {
701
+ warnDeprecatedOnce(
702
+ "formatChars",
703
+ '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'
704
+ );
705
+ }
660
706
  const maskUtils = new MaskUtils({
661
707
  mask,
662
708
  maskPlaceholder,
663
- formatChars: toRegExpFormatChars(formatChars)
709
+ formatChars: normalizedFormatChars,
710
+ transform: resolveTransform(transform)
664
711
  });
665
712
  let beforeMaskedStateChange = beforeMaskedStateChangeProp;
666
713
  if (!beforeMaskedStateChange && beforeMaskedValueChange) {
@@ -880,4 +927,9 @@ var InputMask = (0, import_react2.forwardRef)(function InputMask2(props, forward
880
927
  });
881
928
  InputMask.displayName = "InputMask";
882
929
  var src_default = InputMask;
930
+ // Annotate the CommonJS export names for ESM import in node:
931
+ 0 && (module.exports = {
932
+ defaultFormatChars,
933
+ extendedFormatChars
934
+ });
883
935
  //# sourceMappingURL=index.cjs.map
@@ -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":["import_react","value","InputMask","React"]}
1
+ {"version":3,"sources":["../src/index.tsx","../src/hooks.ts","../src/utils/defer.ts","../src/utils/input.ts","../src/utils/helpers.ts","../src/constants.ts","../src/validate-props.ts","../src/utils/parse-mask.ts","../src/utils/mask.ts","../src/v2-compat.ts","../src/utils/transform.ts"],"sourcesContent":["import React, { useLayoutEffect, forwardRef } from \"react\";\n\nimport { useInputState, useInputElement, usePrevious } from \"./hooks\";\nimport { validateMaxLength, validateChildren, validateMaskPlaceholder } from \"./validate-props\";\nimport { defer } from \"./utils/defer\";\nimport { isInputFocused } from \"./utils/input\";\nimport { isFunction, toString, getElementDocument } from \"./utils/helpers\";\nimport MaskUtils from \"./utils/mask\";\nimport {\n resolveMaskPlaceholder,\n normalizeFormatChars,\n createBeforeMaskedStateChangeAdapter,\n warnDeprecatedOnce\n} from \"./v2-compat\";\nimport { resolveTransform } from \"./utils/transform\";\nimport type { InputMaskProps, InputState, V2MaskOptions } from \"./types\";\n\nconst InputMask = forwardRef<HTMLInputElement, InputMaskProps>(function InputMask(\n props,\n forwardedRef\n) {\n const {\n alwaysShowMask = false,\n children,\n mask,\n maskPlaceholder: maskPlaceholderProp,\n beforeMaskedStateChange: beforeMaskedStateChangeProp,\n transform,\n maskChar,\n formatChars,\n beforeMaskedValueChange,\n ...restProps\n } = props;\n\n if (maskChar !== undefined) {\n warnDeprecatedOnce(\"maskChar\", \"maskChar is deprecated, use maskPlaceholder instead. See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask\");\n }\n if (beforeMaskedValueChange !== undefined) {\n warnDeprecatedOnce(\"beforeMaskedValueChange\", \"beforeMaskedValueChange is deprecated, use beforeMaskedStateChange. See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask\");\n }\n\n const resolvedPlaceholder = resolveMaskPlaceholder(maskPlaceholderProp, maskChar);\n const maskPlaceholder = resolvedPlaceholder === undefined ? \"_\" : resolvedPlaceholder;\n\n validateMaxLength(props);\n validateMaskPlaceholder({ ...props, maskPlaceholder });\n\n const { formatChars: normalizedFormatChars, hasLegacyString } =\n normalizeFormatChars(formatChars);\n if (hasLegacyString) {\n warnDeprecatedOnce(\n \"formatChars\",\n \"string values in formatChars are deprecated, pass RegExp values instead (e.g. { \\\"#\\\": /[0-9]/ }). See migration guide: https://github.com/Temirtator/react-input-mask-format#migrating-from-react-input-mask\"\n );\n }\n\n const maskUtils = new MaskUtils({\n mask,\n maskPlaceholder,\n formatChars: normalizedFormatChars,\n transform: resolveTransform(transform)\n });\n\n let beforeMaskedStateChange = beforeMaskedStateChangeProp;\n if (!beforeMaskedStateChange && beforeMaskedValueChange) {\n const v2MaskOptions: V2MaskOptions = {\n mask,\n maskChar: maskPlaceholder,\n alwaysShowMask,\n formatChars: formatChars ?? { \"9\": \"[0-9]\", a: \"[A-Za-z]\", \"*\": \"[A-Za-z0-9]\" },\n permanents: maskUtils.maskOptions.permanents\n };\n beforeMaskedStateChange = createBeforeMaskedStateChangeAdapter(\n beforeMaskedValueChange,\n v2MaskOptions\n );\n }\n\n const isMasked = !!mask;\n const isEditable = !restProps.disabled && !restProps.readOnly;\n const isControlled = props.value !== null && props.value !== undefined;\n const previousIsMasked = usePrevious(isMasked);\n const initialValue = toString(\n (isControlled ? props.value : props.defaultValue) || \"\"\n );\n\n const {\n inputRef,\n getInputState,\n setInputState,\n getLastInputState\n } = useInputState(initialValue, isMasked);\n const getInputElement = useInputElement(inputRef);\n\n function onChange(event: React.ChangeEvent<HTMLInputElement>): void {\n const currentState = getInputState();\n const previousState = getLastInputState();\n let newInputState: InputState = maskUtils.processChange(currentState, previousState);\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState,\n previousState,\n nextState: newInputState\n });\n }\n\n setInputState(newInputState);\n\n if (props.onChange) {\n props.onChange(event);\n }\n }\n\n function onFocus(event: React.FocusEvent<HTMLInputElement>): void {\n // If autoFocus property is set, focus event fires before the ref handler gets called\n inputRef.current = event.target;\n\n const currentValue = getInputState().value;\n\n if (isMasked && !maskUtils.isValueFilled(currentValue)) {\n let newValue = maskUtils.formatValue(currentValue);\n let newSelection = maskUtils.getDefaultSelectionForValue(newValue);\n let newInputState: InputState = {\n value: newValue,\n selection: newSelection\n };\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState: getInputState(),\n nextState: newInputState\n });\n newValue = newInputState.value;\n newSelection = newInputState.selection;\n }\n\n setInputState(newInputState);\n\n if (newValue !== currentValue && props.onChange) {\n props.onChange(event as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n\n // Chrome resets selection after focus event,\n // so we want to restore it later\n defer(() => {\n setInputState(getLastInputState());\n });\n }\n\n if (props.onFocus) {\n props.onFocus(event);\n }\n }\n\n function onBlur(event: React.FocusEvent<HTMLInputElement>): void {\n const currentValue = getInputState().value;\n const lastValue = getLastInputState().value;\n\n if (isMasked && !alwaysShowMask && maskUtils.isValueEmpty(lastValue)) {\n let newValue = \"\";\n let newInputState: InputState = {\n value: newValue,\n selection: { start: null, end: null }\n };\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState: getInputState(),\n nextState: newInputState\n });\n newValue = newInputState.value;\n }\n\n setInputState(newInputState);\n\n if (newValue !== currentValue && props.onChange) {\n props.onChange(event as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n }\n\n if (props.onBlur) {\n props.onBlur(event);\n }\n }\n\n // Tiny unintentional mouse movements can break cursor\n // position on focus, so we have to restore it in that case\n //\n // https://github.com/sanniassin/react-input-mask/issues/108\n function onMouseDown(event: React.MouseEvent<HTMLInputElement>): void {\n const input = getInputElement();\n const { value } = getInputState();\n const inputDocument = getElementDocument(input);\n\n if (!isInputFocused(input as HTMLInputElement) && !maskUtils.isValueFilled(value)) {\n const mouseDownX = event.clientX;\n const mouseDownY = event.clientY;\n const mouseDownTime = new Date().getTime();\n\n const mouseUpHandler = (mouseUpEvent: MouseEvent): void => {\n inputDocument!.removeEventListener(\"mouseup\", mouseUpHandler);\n\n if (!isInputFocused(input as HTMLInputElement)) {\n return;\n }\n\n const deltaX = Math.abs(mouseUpEvent.clientX - mouseDownX);\n const deltaY = Math.abs(mouseUpEvent.clientY - mouseDownY);\n const axisDelta = Math.max(deltaX, deltaY);\n const timeDelta = new Date().getTime() - mouseDownTime;\n\n if (\n (axisDelta <= 10 && timeDelta <= 200) ||\n (axisDelta <= 5 && timeDelta <= 300)\n ) {\n const lastState = getLastInputState();\n const newSelection = maskUtils.getDefaultSelectionForValue(\n lastState.value\n );\n const newState = {\n ...lastState,\n selection: newSelection\n };\n setInputState(newState);\n }\n };\n\n inputDocument!.addEventListener(\"mouseup\", mouseUpHandler);\n }\n\n if (props.onMouseDown) {\n props.onMouseDown(event);\n }\n }\n\n // For controlled inputs we want to provide properly formatted value\n // prop. Computed purely during render; refs/DOM are synced in a layout\n // effect so render stays side-effect free (StrictMode / concurrent).\n let renderValue = props.value as string | undefined;\n if (isMasked && isControlled) {\n const input = getInputElement();\n const isFocused = !!input && isInputFocused(input);\n let newValue =\n isFocused || alwaysShowMask || props.value\n ? maskUtils.formatValue(props.value as string)\n : (props.value as string);\n\n if (beforeMaskedStateChange) {\n newValue = beforeMaskedStateChange({\n nextState: { value: newValue, selection: { start: null, end: null } }\n }).value;\n }\n\n renderValue = newValue;\n }\n\n const lastSelection = getLastInputState().selection;\n\n useLayoutEffect(() => {\n if (isMasked && isControlled) {\n setInputState({\n ...getLastInputState(),\n value: renderValue as string\n });\n }\n });\n\n useLayoutEffect(() => {\n if (!isMasked) {\n return;\n }\n\n const input = getInputElement();\n const isFocused = isInputFocused(input as HTMLInputElement);\n const previousSelection = lastSelection;\n const currentState = getInputState();\n let newInputState: InputState = { ...currentState };\n\n // Update value for uncontrolled inputs to make sure\n // it's always in sync with mask props\n if (!isControlled) {\n const currentValue = currentState.value;\n const formattedValue = maskUtils.formatValue(currentValue);\n const isValueEmpty = maskUtils.isValueEmpty(formattedValue);\n const shouldFormatValue = !isValueEmpty || isFocused || alwaysShowMask;\n if (shouldFormatValue) {\n newInputState.value = formattedValue;\n } else if (isValueEmpty && !isFocused) {\n newInputState.value = \"\";\n }\n }\n\n if (isFocused && !previousIsMasked) {\n // Adjust selection if input got masked while being focused\n newInputState.selection = maskUtils.getDefaultSelectionForValue(\n newInputState.value\n );\n } else if (isControlled && isFocused && previousSelection) {\n // Restore cursor position if value has changed outside change event\n if (previousSelection.start !== null && previousSelection.end !== null) {\n newInputState.selection = previousSelection;\n }\n }\n\n if (beforeMaskedStateChange) {\n newInputState = beforeMaskedStateChange({\n currentState,\n nextState: newInputState\n });\n }\n\n setInputState(newInputState);\n });\n\n const inputProps = {\n ...restProps,\n onFocus,\n onBlur,\n onChange: isMasked && isEditable ? onChange : props.onChange,\n onMouseDown: isMasked && isEditable ? onMouseDown : props.onMouseDown,\n // `ref` may target either the plain <input> DOM node or, when custom\n // children are used, whatever node the child's own ref forwards to.\n ref: (ref: unknown) => {\n inputRef.current = ref as HTMLInputElement | null;\n\n if (isFunction(forwardedRef)) {\n (forwardedRef as (instance: unknown) => void)(ref);\n } else if (forwardedRef !== null && typeof forwardedRef === \"object\") {\n (forwardedRef as React.MutableRefObject<unknown>).current = ref;\n }\n },\n value: isMasked && isControlled ? renderValue : props.value\n };\n\n if (children) {\n validateChildren(props, children);\n\n // Clone the child injecting our props and callback ref directly.\n // If the child forwards its ref to a non-input node, useInputElement\n // falls back to querySelector(\"input\") to find the real input.\n return React.cloneElement(children, inputProps);\n }\n\n return <input {...inputProps} />;\n});\n\nInputMask.displayName = \"InputMask\";\n\nexport { defaultFormatChars, extendedFormatChars } from \"./constants\";\nexport type {\n InputMaskProps,\n InputState,\n Selection,\n BeforeMaskedStateChangeFn,\n BeforeMaskedValueChangeFn,\n Mask,\n Transform,\n FormatChars\n} from \"./types\";\nexport default InputMask;\n","import { useCallback, useEffect, useLayoutEffect, useRef } from \"react\";\nimport type React from \"react\";\n\nimport { defer, cancelDefer } from \"./utils/defer\";\nimport { setInputSelection, getInputSelection, isInputFocused } from \"./utils/input\";\nimport { isDOMElement } from \"./utils/helpers\";\nimport type { InputState, Selection } from \"./types\";\n\nexport type InputElementGetter = () => HTMLInputElement | null;\n\nexport function useInputElement(\n inputRef: React.MutableRefObject<HTMLInputElement | null>\n): InputElementGetter {\n return useCallback(() => {\n let input: HTMLInputElement | Element | null = inputRef.current;\n const isDOMNode = typeof window !== \"undefined\" && isDOMElement(input);\n\n // workaround for react-test-renderer\n // https://github.com/sanniassin/react-input-mask/issues/147\n if (!input || !isDOMNode) {\n return null;\n }\n\n if (input.nodeName !== \"INPUT\") {\n input = input.querySelector(\"input\");\n }\n\n if (!input) {\n throw new Error(\"react-input-mask: inputComponent doesn't contain input node\");\n }\n\n return input as HTMLInputElement;\n }, [inputRef]);\n}\n\nfunction useDeferLoop(callback: () => void): [() => void, () => void] {\n const deferIdRef = useRef<number | null>(null);\n\n const runLoop = useCallback(() => {\n // If there are simulated focus events, runLoop could be\n // called multiple times without blur or re-render\n if (deferIdRef.current !== null) {\n return;\n }\n\n function loop() {\n callback();\n deferIdRef.current = defer(loop);\n }\n\n loop();\n }, [callback]);\n\n const stopLoop = useCallback(() => {\n cancelDefer(deferIdRef.current);\n deferIdRef.current = null;\n }, []);\n\n useEffect(() => {\n if (deferIdRef.current) {\n stopLoop();\n runLoop();\n }\n }, [runLoop, stopLoop]);\n\n useEffect(() => cancelDefer(deferIdRef.current), []);\n\n return [runLoop, stopLoop];\n}\n\nfunction useSelection(\n inputRef: React.MutableRefObject<HTMLInputElement | null>,\n isMasked: boolean\n) {\n const selectionRef = useRef<Selection>({ start: null, end: null });\n const getInputElement = useInputElement(inputRef);\n\n const getSelection = useCallback(() => {\n const input = getInputElement();\n return getInputSelection(input as HTMLInputElement);\n }, [getInputElement]);\n\n const getLastSelection = useCallback(() => {\n return selectionRef.current;\n }, []);\n\n const setSelection = useCallback(\n (selection: Selection) => {\n const input = getInputElement();\n\n // Don't change selection on unfocused input\n // because Safari sets focus on selection change (#154)\n if (!input || !isInputFocused(input)) {\n return;\n }\n\n setInputSelection(input, selection.start!, selection.end!);\n\n // Use actual selection in case the requested one was out of range\n selectionRef.current = getSelection();\n },\n [getInputElement, getSelection]\n );\n\n const selectionLoop = useCallback(() => {\n selectionRef.current = getSelection();\n }, [getSelection]);\n const [runSelectionLoop, stopSelectionLoop] = useDeferLoop(selectionLoop);\n\n useLayoutEffect(() => {\n if (!isMasked) {\n return;\n }\n\n const input = getInputElement();\n if (!input) return;\n input.addEventListener(\"focus\", runSelectionLoop);\n input.addEventListener(\"blur\", stopSelectionLoop);\n\n if (isInputFocused(input)) {\n runSelectionLoop();\n }\n\n return () => {\n input.removeEventListener(\"focus\", runSelectionLoop);\n input.removeEventListener(\"blur\", stopSelectionLoop);\n\n stopSelectionLoop();\n };\n });\n\n return { getSelection, getLastSelection, setSelection };\n}\n\nfunction useValue(\n inputRef: React.MutableRefObject<HTMLInputElement | null>,\n initialValue: string\n) {\n const getInputElement = useInputElement(inputRef);\n const valueRef = useRef(initialValue);\n\n const getValue = useCallback(() => {\n return getInputElement()!.value;\n }, [getInputElement]);\n\n const getLastValue = useCallback(() => {\n return valueRef.current;\n }, []);\n\n const setValue = useCallback(\n (newValue: string) => {\n valueRef.current = newValue;\n\n const input = getInputElement();\n if (input) {\n input.value = newValue;\n }\n },\n [getInputElement]\n );\n\n return {\n getValue,\n getLastValue,\n setValue\n };\n}\n\nexport function useInputState(\n initialValue: string,\n isMasked: boolean\n): {\n inputRef: React.MutableRefObject<HTMLInputElement | null>;\n getInputState: () => InputState;\n getLastInputState: () => InputState;\n setInputState: (state: InputState) => void;\n} {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const { getSelection, getLastSelection, setSelection } = useSelection(inputRef, isMasked);\n const { getValue, getLastValue, setValue } = useValue(inputRef, initialValue);\n\n function getLastInputState(): InputState {\n return {\n value: getLastValue(),\n selection: getLastSelection()\n };\n }\n\n function getInputState(): InputState {\n return {\n value: getValue(),\n selection: getSelection()\n };\n }\n\n function setInputState({ value, selection }: InputState): void {\n setValue(value);\n setSelection(selection);\n }\n\n return {\n inputRef,\n getInputState,\n getLastInputState,\n setInputState\n };\n}\n\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined);\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n","export function defer(fn: FrameRequestCallback): number {\n return requestAnimationFrame(fn);\n}\n\nexport function cancelDefer(deferId: number | null): void {\n if (deferId !== null) {\n cancelAnimationFrame(deferId);\n }\n}\n","import type { Selection } from \"../types\";\n\nexport function setInputSelection(\n input: HTMLInputElement,\n start: number,\n end?: number\n): void {\n if (end === undefined) {\n end = start;\n }\n input.setSelectionRange(start, end);\n}\n\nexport function getInputSelection(input: HTMLInputElement): Required<Selection> {\n const start = input.selectionStart;\n const end = input.selectionEnd;\n\n return {\n start,\n end,\n length: (end ?? 0) - (start ?? 0)\n };\n}\n\nexport function isInputFocused(input: HTMLInputElement): boolean {\n const inputDocument = input.ownerDocument;\n return inputDocument.hasFocus() && inputDocument.activeElement === input;\n}\n","// Element's window may differ from the one within React instance\n// if element rendered within iframe.\n// See https://github.com/sanniassin/react-input-mask/issues/182\nexport function getElementDocument(element: Element | null | undefined) {\n return element?.ownerDocument;\n}\n\nexport function getElementWindow(element: Element | null | undefined) {\n return getElementDocument(element)?.defaultView;\n}\n\nexport function isDOMElement(element: unknown): element is HTMLElement {\n const elementWindow = getElementWindow(element as Element | null);\n return (\n !!elementWindow && (element as Element) instanceof elementWindow.HTMLElement\n );\n}\n\nexport function isFunction(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n\nexport function findLastIndex<T>(\n array: readonly T[],\n predicate: (item: T, index: number) => boolean\n): number {\n for (let i = array.length - 1; i >= 0; i--) {\n const x = array[i];\n if (predicate(x, i)) {\n return i;\n }\n }\n return -1;\n}\n\nexport function repeat(string: string, n = 1): string {\n let result = \"\";\n for (let i = 0; i < n; i++) {\n result += string;\n }\n return result;\n}\n\nexport function toString(value: unknown): string {\n return `${value}`;\n}\n","import type { FormatChars } from \"./types\";\n\nexport const CONTROLLED_PROPS = [\n \"disabled\",\n \"onBlur\",\n \"onChange\",\n \"onFocus\",\n \"onMouseDown\",\n \"readOnly\",\n \"value\"\n] as const;\n\nexport const defaultFormatChars: FormatChars = {\n \"9\": /[0-9]/,\n a: /[A-Za-z]/,\n \"*\": /[A-Za-z0-9]/\n};\n\nexport const extendedFormatChars: FormatChars = {\n ...defaultFormatChars,\n A: /[A-Z]/,\n \"Я\": /[А-Яа-яЁёӘәҒғҚқҢңӨөҰұҮүҺһІі]/,\n \"#\": /[0-9A-Fa-f]/\n};\n","import type React from \"react\";\nimport { CONTROLLED_PROPS } from \"./constants\";\nimport type { InputMaskProps } from \"./types\";\n\nfunction warnDev(condition: boolean, message: string): void {\n if (process.env.NODE_ENV !== \"production\" && !condition) {\n console.error(`react-input-mask-format: ${message}`);\n }\n}\n\nfunction invariant(condition: boolean, message: string): void {\n if (!condition) {\n throw new Error(`react-input-mask-format: ${message}`);\n }\n}\n\nexport function validateMaxLength(props: InputMaskProps): void {\n warnDev(\n !props.maxLength || !props.mask,\n \"maxLength property shouldn't be passed to the masked input. It breaks masking and unnecessary because length is limited by the mask length.\"\n );\n}\n\nexport function validateMaskPlaceholder(props: InputMaskProps & { maskPlaceholder?: string | null }): void {\n const { mask, maskPlaceholder } = props;\n\n invariant(\n !mask ||\n !maskPlaceholder ||\n maskPlaceholder.length === 1 ||\n maskPlaceholder.length === mask.length,\n \"maskPlaceholder should either be a single character or have the same length as the mask:\\n\" +\n `mask: ${mask}\\n` +\n `maskPlaceholder: ${maskPlaceholder}`\n );\n}\n\nexport function validateChildren(\n props: InputMaskProps,\n inputElement: React.ReactElement\n): void {\n const conflictProps = CONTROLLED_PROPS.filter(\n propId =>\n (inputElement.props as Record<string, unknown>)[propId] != null &&\n (inputElement.props as Record<string, unknown>)[propId] !==\n (props as Record<string, unknown>)[propId]\n );\n\n invariant(\n !conflictProps.length,\n `the following props should be passed to the InputMask component, not to children: ${conflictProps.join(\",\")}`\n );\n}\n","import { defaultFormatChars } from \"../constants\";\nimport type { FormatChars, Mask } from \"../types\";\n\nexport interface ParsedMaskOptions {\n maskPlaceholder: string | null;\n mask: Array<string | RegExp> | null;\n prefix: string | null;\n lastEditablePosition: number | null;\n permanents: number[];\n}\n\nexport default function parseMask({\n mask,\n maskPlaceholder,\n formatChars = defaultFormatChars\n}: {\n mask?: Mask | null;\n maskPlaceholder?: string | null;\n formatChars?: FormatChars;\n}): ParsedMaskOptions {\n const permanents: number[] = [];\n\n if (!mask) {\n return {\n maskPlaceholder: null,\n mask: null,\n prefix: null,\n lastEditablePosition: null,\n permanents: []\n };\n }\n\n let parsedMask: Array<string | RegExp>;\n\n if (typeof mask === \"string\") {\n let isPermanent = false;\n let parsedMaskString = \"\";\n mask.split(\"\").forEach(character => {\n if (!isPermanent && character === \"\\\\\") {\n isPermanent = true;\n } else {\n if (isPermanent || !formatChars[character]) {\n permanents.push(parsedMaskString.length);\n }\n parsedMaskString += character;\n isPermanent = false;\n }\n });\n\n parsedMask = parsedMaskString.split(\"\").map((character, index) => {\n if (permanents.indexOf(index) === -1) {\n return formatChars[character];\n }\n return character;\n });\n } else {\n mask.forEach((character, index) => {\n if (typeof character === \"string\") {\n permanents.push(index);\n }\n });\n parsedMask = mask;\n }\n\n let parsedPlaceholder: string | null = maskPlaceholder ?? null;\n\n if (parsedPlaceholder) {\n let placeholderChars: Array<string | RegExp>;\n\n if (parsedPlaceholder.length === 1) {\n placeholderChars = parsedMask.map((character, index) => {\n if (permanents.indexOf(index) !== -1) {\n return character;\n }\n return parsedPlaceholder as string;\n });\n } else {\n placeholderChars = parsedPlaceholder.split(\"\");\n }\n\n permanents.forEach(position => {\n placeholderChars[position] = parsedMask[position];\n });\n\n parsedPlaceholder = placeholderChars.join(\"\");\n }\n\n const prefix = permanents\n .filter((position, index) => position === index)\n .map(position => parsedMask[position])\n .join(\"\");\n\n let lastEditablePosition = parsedMask.length - 1;\n while (permanents.indexOf(lastEditablePosition) !== -1) {\n lastEditablePosition--;\n }\n\n return {\n maskPlaceholder: parsedPlaceholder,\n prefix,\n mask: parsedMask,\n lastEditablePosition,\n permanents\n };\n}\n","import { findLastIndex, repeat } from \"./helpers\";\nimport parseMask, { ParsedMaskOptions } from \"./parse-mask\";\nimport type { FormatChars, InputState, Selection } from \"../types\";\n\nexport default class MaskUtils {\n maskOptions: ParsedMaskOptions;\n transform?: (char: string, position: number) => string;\n\n constructor(options: {\n mask?: string | Array<string | RegExp> | null;\n maskPlaceholder?: string | null;\n formatChars?: FormatChars;\n transform?: (char: string, position: number) => string;\n }) {\n this.maskOptions = parseMask(options);\n this.transform = options.transform;\n }\n\n isCharacterAllowedAtPosition = (character: string, position: number): boolean => {\n const { maskPlaceholder } = this.maskOptions;\n\n if (this.isCharacterFillingPosition(character, position)) {\n return true;\n }\n\n if (!maskPlaceholder) {\n return false;\n }\n\n return maskPlaceholder[position] === character;\n };\n\n isCharacterFillingPosition = (character: string, position: number): boolean => {\n const { mask } = this.maskOptions;\n\n if (!character || position >= mask!.length) {\n return false;\n }\n\n if (!this.isPositionEditable(position)) {\n return mask![position] === character;\n }\n\n const charRule = mask![position];\n return new RegExp(charRule).test(character);\n };\n\n isPositionEditable = (position: number): boolean => {\n const { mask, permanents } = this.maskOptions;\n return position < mask!.length && permanents.indexOf(position) === -1;\n };\n\n isValueEmpty = (value: string): boolean => {\n return value.split(\"\").every((character, position) => {\n return (\n !this.isPositionEditable(position) ||\n !this.isCharacterFillingPosition(character, position)\n );\n });\n };\n\n isValueFilled = (value: string): boolean => {\n return (\n this.getFilledLength(value) === this.maskOptions.lastEditablePosition! + 1\n );\n };\n\n getDefaultSelectionForValue = (value: string): Selection => {\n const filledLength = this.getFilledLength(value);\n const cursorPosition = this.getRightEditablePosition(filledLength);\n return { start: cursorPosition, end: cursorPosition };\n };\n\n getFilledLength = (value: string): number => {\n const characters = value.split(\"\");\n const lastFilledIndex = findLastIndex(characters, (character, position) => {\n return (\n this.isPositionEditable(position) &&\n this.isCharacterFillingPosition(character, position)\n );\n });\n return lastFilledIndex + 1;\n };\n\n getStringFillingLengthAtPosition = (string: string, position: number): number => {\n const characters = string.split(\"\");\n const insertedValue = characters.reduce((value, character) => {\n return this.insertCharacterAtPosition(value, character, value.length);\n }, repeat(\" \", position));\n\n return insertedValue.length - position;\n };\n\n getLeftEditablePosition = (position: number): number | null => {\n for (let i = position; i >= 0; i--) {\n if (this.isPositionEditable(i)) {\n return i;\n }\n }\n return null;\n };\n\n getRightEditablePosition = (position: number): number | null => {\n const { mask } = this.maskOptions;\n for (let i = position; i < mask!.length; i++) {\n if (this.isPositionEditable(i)) {\n return i;\n }\n }\n return null;\n };\n\n formatValue = (value: string): string => {\n const { maskPlaceholder, mask } = this.maskOptions;\n\n if (!maskPlaceholder) {\n value = this.insertStringAtPosition(\"\", value, 0);\n\n while (\n value.length < mask!.length &&\n !this.isPositionEditable(value.length)\n ) {\n value += mask![value.length];\n }\n\n return value;\n }\n\n return this.insertStringAtPosition(maskPlaceholder, value, 0);\n };\n\n clearRange = (value: string, start: number, len: number): string => {\n if (!len) {\n return value;\n }\n\n const end = start + len;\n const { maskPlaceholder, mask } = this.maskOptions;\n\n const clearedValue = value\n .split(\"\")\n .map((character, i) => {\n const isEditable = this.isPositionEditable(i);\n\n if (!maskPlaceholder && i >= end && !isEditable) {\n return \"\";\n }\n if (i < start || i >= end) {\n return character;\n }\n if (!isEditable) {\n return mask![i];\n }\n if (maskPlaceholder) {\n return maskPlaceholder[i];\n }\n return \"\";\n })\n .join(\"\");\n\n return this.formatValue(clearedValue);\n };\n\n insertCharacterAtPosition = (value: string, character: string, position: number): string => {\n const { mask, maskPlaceholder } = this.maskOptions;\n if (position >= mask!.length) {\n return value;\n }\n\n const transformedCharacter =\n this.transform && this.isPositionEditable(position)\n ? this.transform(character, position)\n : character;\n\n const isAllowed = this.isCharacterAllowedAtPosition(transformedCharacter, position);\n const isEditable = this.isPositionEditable(position);\n const nextEditablePosition = this.getRightEditablePosition(position);\n const isNextPlaceholder =\n maskPlaceholder && nextEditablePosition\n ? transformedCharacter === maskPlaceholder[nextEditablePosition]\n : null;\n const valueBefore = value.slice(0, position);\n\n if (isAllowed || !isEditable) {\n const insertedCharacter = isAllowed ? transformedCharacter : mask![position];\n value = valueBefore + insertedCharacter;\n }\n\n if (!isAllowed && !isEditable && !isNextPlaceholder) {\n value = this.insertCharacterAtPosition(value, character, position + 1);\n }\n\n return value;\n };\n\n insertStringAtPosition = (value: string, string: string, position: number): string => {\n const { mask, maskPlaceholder } = this.maskOptions;\n if (!string || position >= mask!.length) {\n return value;\n }\n\n const characters = string.split(\"\");\n const isFixedLength = this.isValueFilled(value) || !!maskPlaceholder;\n const valueAfter = value.slice(position);\n\n value = characters.reduce((value, character) => {\n return this.insertCharacterAtPosition(value, character, value.length);\n }, value.slice(0, position));\n\n if (isFixedLength) {\n value += valueAfter.slice(value.length - position);\n } else if (this.isValueFilled(value)) {\n value += mask!.slice(value.length).join(\"\");\n } else {\n const editableCharactersAfter = valueAfter\n .split(\"\")\n .filter((character, i) => {\n return this.isPositionEditable(position + i);\n });\n value = editableCharactersAfter.reduce((value, character) => {\n const nextEditablePosition = this.getRightEditablePosition(\n value.length\n );\n if (nextEditablePosition === null) {\n return value;\n }\n\n if (!this.isPositionEditable(value.length)) {\n value += mask!.slice(value.length, nextEditablePosition).join(\"\");\n }\n\n return this.insertCharacterAtPosition(value, character, value.length);\n }, value);\n }\n\n return value;\n };\n\n processChange = (currentState: InputState, previousState: InputState): InputState & { enteredString: string } => {\n const { mask, prefix, lastEditablePosition } = this.maskOptions;\n const { value, selection } = currentState;\n const previousValue = previousState.value;\n const previousSelection = previousState.selection;\n let newValue = value;\n let enteredString = \"\";\n let formattedEnteredStringLength = 0;\n let removedLength = 0;\n let cursorPosition = Math.min(previousSelection.start!, selection.start!);\n\n if (selection.end! > previousSelection.start!) {\n enteredString = newValue.slice(previousSelection.start!, selection.end!);\n formattedEnteredStringLength = this.getStringFillingLengthAtPosition(\n enteredString,\n cursorPosition\n );\n if (!formattedEnteredStringLength) {\n removedLength = 0;\n } else {\n removedLength = previousSelection.length!;\n }\n } else if (newValue.length < previousValue.length) {\n removedLength = previousValue.length - newValue.length;\n }\n\n newValue = previousValue;\n\n if (removedLength) {\n if (removedLength === 1 && !previousSelection.length) {\n const deleteFromRight = previousSelection.start === selection.start;\n cursorPosition = (deleteFromRight\n ? this.getRightEditablePosition(selection.start!)\n : this.getLeftEditablePosition(selection.start!))!;\n }\n newValue = this.clearRange(newValue, cursorPosition, removedLength);\n }\n\n newValue = this.insertStringAtPosition(\n newValue,\n enteredString,\n cursorPosition\n );\n\n cursorPosition += formattedEnteredStringLength;\n if (cursorPosition >= mask!.length) {\n cursorPosition = mask!.length;\n } else if (\n cursorPosition < prefix!.length &&\n !formattedEnteredStringLength\n ) {\n cursorPosition = prefix!.length;\n } else if (\n cursorPosition >= prefix!.length &&\n cursorPosition < lastEditablePosition! &&\n formattedEnteredStringLength\n ) {\n cursorPosition = this.getRightEditablePosition(cursorPosition)!;\n }\n\n newValue = this.formatValue(newValue);\n\n return {\n value: newValue,\n enteredString,\n selection: { start: cursorPosition, end: cursorPosition }\n };\n };\n}\n","import type {\n BeforeMaskedStateChangeFn,\n BeforeMaskedValueChangeFn,\n FormatChars,\n InputState,\n V2MaskOptions\n} from \"./types\";\n\nconst warned = new Set<string>();\n\nexport function __resetDeprecationWarnings(): void {\n warned.clear();\n}\n\nexport function warnDeprecatedOnce(prop: string, message: string): void {\n if (process.env.NODE_ENV !== \"production\" && !warned.has(prop)) {\n warned.add(prop);\n console.warn(`react-input-mask-format: ${message}`);\n }\n}\n\nexport function resolveMaskPlaceholder(\n maskPlaceholder: string | null | undefined,\n maskChar: string | null | undefined\n): string | null | undefined {\n if (maskPlaceholder !== undefined) {\n return maskPlaceholder;\n }\n return maskChar;\n}\n\nexport function normalizeFormatChars(\n formatChars: Record<string, RegExp | string> | undefined\n): { formatChars: FormatChars | undefined; hasLegacyString: boolean } {\n if (!formatChars) {\n return { formatChars: undefined, hasLegacyString: false };\n }\n const result: FormatChars = {};\n let hasLegacyString = false;\n for (const key of Object.keys(formatChars)) {\n const value = formatChars[key];\n if (typeof value === \"string\") {\n hasLegacyString = true;\n result[key] = new RegExp(value);\n } else {\n result[key] = value;\n }\n }\n return { formatChars: result, hasLegacyString };\n}\n\nexport function toRegExpFormatChars(\n formatChars: Record<string, RegExp | string> | undefined\n): FormatChars | undefined {\n return normalizeFormatChars(formatChars).formatChars;\n}\n\nexport function createBeforeMaskedStateChangeAdapter(\n beforeMaskedValueChange: BeforeMaskedValueChangeFn,\n maskOptions: V2MaskOptions\n): BeforeMaskedStateChangeFn {\n return ({ previousState, currentState, nextState }) =>\n beforeMaskedValueChange(\n nextState,\n previousState ?? currentState ?? null,\n (nextState as InputState & { enteredString?: string }).enteredString ?? null,\n maskOptions\n );\n}\n","import type { Transform } from \"../types\";\n\nexport function resolveTransform(\n transform: Transform | undefined\n): ((char: string, position: number) => string) | undefined {\n if (!transform) {\n return undefined;\n }\n if (transform === \"uppercase\") {\n return char => char.toUpperCase();\n }\n if (transform === \"lowercase\") {\n return char => char.toLowerCase();\n }\n if (typeof transform === \"function\") {\n return transform;\n }\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\n `react-input-mask-format: invalid transform \"${String(\n transform\n )}\", expected \"uppercase\" | \"lowercase\" | (char, position) => char`\n );\n }\n return undefined;\n}\n"],"mappings":"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","names":["import_react","value","InputMask","React"]}
package/dist/index.d.cts 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.cjs';
3
+ export { B as BeforeMaskedStateChangeFn, a as BeforeMaskedValueChangeFn, b as InputState, M as Mask, S as Selection, T as Transform } from './types-Bfu5Jmh0.cjs';
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 };