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 +83 -1
- package/dist/index.cjs +64 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -51
- package/dist/index.d.ts +5 -51
- package/dist/index.js +59 -12
- package/dist/index.js.map +1 -1
- package/dist/presets.cjs +86 -0
- package/dist/presets.cjs.map +1 -0
- package/dist/presets.d.cts +18 -0
- package/dist/presets.d.ts +18 -0
- package/dist/presets.js +55 -0
- package/dist/presets.js.map +1 -0
- package/dist/types-Bfu5Jmh0.d.cts +61 -0
- package/dist/types-Bfu5Jmh0.d.ts +61 -0
- package/dist/validators.cjs +99 -0
- package/dist/validators.cjs.map +1 -0
- package/dist/validators.d.cts +6 -0
- package/dist/validators.d.ts +6 -0
- package/dist/validators.js +71 -0
- package/dist/validators.js.map +1 -0
- package/package.json +12 -2
package/README.md
CHANGED
|
@@ -4,10 +4,21 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/react-input-mask-format)
|
|
5
5
|
[](https://github.com/Temirtator/react-input-mask-format/actions/workflows/ci.yml)
|
|
6
6
|
|
|
7
|
-
|
|
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
|
|
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 ?
|
|
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 ?
|
|
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
|
|
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
|
-
|
|
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:
|
|
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
|
package/dist/index.cjs.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":["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
|
-
|
|
5
|
-
|
|
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 {
|
|
10
|
+
export { FormatChars, InputMaskProps, InputMask as default, defaultFormatChars, extendedFormatChars };
|