use-mask-input 3.7.2 → 3.7.4
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/CHANGELOG.md +12 -0
- package/README.md +4 -1
- package/dist/antd.cjs +19 -23
- package/dist/antd.cjs.map +1 -1
- package/dist/antd.d.cts +2 -3
- package/dist/antd.d.ts +2 -3
- package/dist/antd.js +13 -17
- package/dist/antd.js.map +1 -1
- package/dist/{chunk-FDD3PKBM.js → chunk-QCWLMMDI.js} +50 -47
- package/dist/chunk-QCWLMMDI.js.map +1 -0
- package/dist/{chunk-NIHSNNRR.cjs → chunk-VK6LQ75W.cjs} +50 -53
- package/dist/chunk-VK6LQ75W.cjs.map +1 -0
- package/dist/index.cjs +22 -51
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -41
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/antd/useMaskInputAntd.ts +22 -35
- package/src/api/useMaskInput.ts +9 -27
- package/dist/chunk-FDD3PKBM.js.map +0 -1
- package/dist/chunk-NIHSNNRR.cjs.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,36 +1,26 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkVK6LQ75W_cjs = require('./chunk-VK6LQ75W.cjs');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
|
|
6
6
|
function useMaskInput(props) {
|
|
7
7
|
const { mask, register, options } = props;
|
|
8
8
|
const ref = react.useRef(null);
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
[mask, options]
|
|
12
|
-
);
|
|
9
|
+
const maskRef = react.useRef(mask);
|
|
10
|
+
const optionsRef = react.useRef(options);
|
|
13
11
|
const refCallback = react.useCallback((input) => {
|
|
14
12
|
if (!input) {
|
|
15
13
|
ref.current = null;
|
|
16
14
|
return;
|
|
17
15
|
}
|
|
18
|
-
ref.current =
|
|
16
|
+
ref.current = chunkVK6LQ75W_cjs.resolveInputRef(input);
|
|
17
|
+
chunkVK6LQ75W_cjs.withMask(maskRef.current, optionsRef.current)(ref.current);
|
|
19
18
|
}, []);
|
|
20
19
|
react.useEffect(() => {
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const inputElement = chunkNIHSNNRR_cjs.findInputElement(ref.current);
|
|
26
|
-
if (maskInput && inputElement && chunkNIHSNNRR_cjs.isHTMLElement(inputElement)) {
|
|
27
|
-
maskInput.mask(inputElement);
|
|
28
|
-
}
|
|
29
|
-
if (register && chunkNIHSNNRR_cjs.isHTMLElement(ref.current)) {
|
|
30
|
-
register(ref.current);
|
|
31
|
-
}
|
|
32
|
-
}, [mask, register, options, maskInput]);
|
|
33
|
-
if (chunkNIHSNNRR_cjs.isServer_default) {
|
|
20
|
+
if (chunkVK6LQ75W_cjs.isServer_default || !ref.current || !register) return;
|
|
21
|
+
register(ref.current);
|
|
22
|
+
}, [register]);
|
|
23
|
+
if (chunkVK6LQ75W_cjs.isServer_default) {
|
|
34
24
|
return () => {
|
|
35
25
|
};
|
|
36
26
|
}
|
|
@@ -43,49 +33,27 @@ function useHookFormMask(registerFn) {
|
|
|
43
33
|
if (!registerFn) throw new Error("registerFn is required");
|
|
44
34
|
const registerReturn = registerFn(fieldName, options);
|
|
45
35
|
const { ref } = registerReturn;
|
|
46
|
-
const cacheKey =
|
|
36
|
+
const cacheKey = chunkVK6LQ75W_cjs.makeMaskCacheKey(fieldName, mask);
|
|
47
37
|
if (!refCache2.has(cacheKey)) {
|
|
48
38
|
const applyMaskToRef = (_ref) => {
|
|
49
|
-
if (_ref)
|
|
39
|
+
if (_ref) chunkVK6LQ75W_cjs.applyMaskToElement(_ref, mask, options);
|
|
50
40
|
return _ref;
|
|
51
41
|
};
|
|
52
42
|
refCache2.set(
|
|
53
43
|
cacheKey,
|
|
54
|
-
ref ?
|
|
44
|
+
ref ? chunkVK6LQ75W_cjs.flow(applyMaskToRef, ref) : applyMaskToRef
|
|
55
45
|
);
|
|
56
46
|
}
|
|
57
47
|
const result = {
|
|
58
48
|
...registerReturn,
|
|
59
49
|
ref: refCache2.get(cacheKey)
|
|
60
50
|
};
|
|
61
|
-
|
|
51
|
+
chunkVK6LQ75W_cjs.setPrevRef(result, ref);
|
|
62
52
|
return result;
|
|
63
53
|
};
|
|
64
54
|
}, [registerFn]);
|
|
65
55
|
}
|
|
66
56
|
|
|
67
|
-
// src/api/withMask.ts
|
|
68
|
-
var import_inputmask = chunkNIHSNNRR_cjs.__toESM(chunkNIHSNNRR_cjs.require_inputmask(), 1);
|
|
69
|
-
var callbackCache = /* @__PURE__ */ new Map();
|
|
70
|
-
function withMask(mask, options) {
|
|
71
|
-
if (!options) {
|
|
72
|
-
const cacheKey = chunkNIHSNNRR_cjs.makeMaskCacheKey("", mask);
|
|
73
|
-
if (callbackCache.has(cacheKey)) {
|
|
74
|
-
return callbackCache.get(cacheKey);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
const callback = (input) => {
|
|
78
|
-
if (chunkNIHSNNRR_cjs.isServer_default || mask === null || !input) return;
|
|
79
|
-
const maskInput = chunkNIHSNNRR_cjs.interopDefaultSync(import_inputmask.default)(chunkNIHSNNRR_cjs.getMaskOptions(mask, options));
|
|
80
|
-
maskInput.mask(input);
|
|
81
|
-
};
|
|
82
|
-
if (!options) {
|
|
83
|
-
const cacheKey = chunkNIHSNNRR_cjs.makeMaskCacheKey("", mask);
|
|
84
|
-
callbackCache.set(cacheKey, callback);
|
|
85
|
-
}
|
|
86
|
-
return callback;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
57
|
// src/api/withHookFormMask.ts
|
|
90
58
|
var refCache = /* @__PURE__ */ new WeakMap();
|
|
91
59
|
function withHookFormMask(register, mask, options) {
|
|
@@ -95,35 +63,38 @@ function withHookFormMask(register, mask, options) {
|
|
|
95
63
|
...register,
|
|
96
64
|
ref: null
|
|
97
65
|
};
|
|
98
|
-
|
|
66
|
+
chunkVK6LQ75W_cjs.setPrevRef(result2, ref);
|
|
99
67
|
return result2;
|
|
100
68
|
}
|
|
101
69
|
if (!refCache.has(ref)) {
|
|
102
70
|
refCache.set(ref, /* @__PURE__ */ new Map());
|
|
103
71
|
}
|
|
104
72
|
const maskCache = refCache.get(ref);
|
|
105
|
-
const cacheKey =
|
|
73
|
+
const cacheKey = chunkVK6LQ75W_cjs.makeMaskCacheKey(register.name, mask);
|
|
106
74
|
if (!maskCache?.has(cacheKey)) {
|
|
107
75
|
const applyMaskToRef = (_ref) => {
|
|
108
|
-
if (_ref)
|
|
76
|
+
if (_ref) chunkVK6LQ75W_cjs.applyMaskToElement(_ref, mask, options);
|
|
109
77
|
return _ref;
|
|
110
78
|
};
|
|
111
79
|
maskCache?.set(
|
|
112
80
|
cacheKey,
|
|
113
|
-
|
|
81
|
+
chunkVK6LQ75W_cjs.flow(applyMaskToRef, ref)
|
|
114
82
|
);
|
|
115
83
|
}
|
|
116
84
|
const result = {
|
|
117
85
|
...register,
|
|
118
86
|
ref: maskCache?.get(cacheKey)
|
|
119
87
|
};
|
|
120
|
-
|
|
88
|
+
chunkVK6LQ75W_cjs.setPrevRef(result, ref);
|
|
121
89
|
return result;
|
|
122
90
|
}
|
|
123
91
|
|
|
92
|
+
Object.defineProperty(exports, "withMask", {
|
|
93
|
+
enumerable: true,
|
|
94
|
+
get: function () { return chunkVK6LQ75W_cjs.withMask; }
|
|
95
|
+
});
|
|
124
96
|
exports.useHookFormMask = useHookFormMask;
|
|
125
97
|
exports.useMaskInput = useMaskInput;
|
|
126
98
|
exports.withHookFormMask = withHookFormMask;
|
|
127
|
-
exports.withMask = withMask;
|
|
128
99
|
//# sourceMappingURL=index.cjs.map
|
|
129
100
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/useMaskInput.ts","../src/api/useHookFormMask.ts","../src/api/withMask.ts","../src/api/withHookFormMask.ts"],"names":["useRef","useMemo","isServer_default","createMaskInstance","useCallback","resolveInputRef","useEffect","isHTMLElement","findInputElement","refCache","makeMaskCacheKey","applyMaskToElement","flow","setPrevRef","__toESM","require_inputmask","interopDefaultSync","inputmask","getMaskOptions","result"],"mappings":";;;;;AA8Be,SAAR,aAA8B,KAAA,EAA6D;AAChG,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAQ,GAAI,KAAA;AACpC,EAAA,MAAM,GAAA,GAAMA,aAAgC,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYC,aAAA;AAAA,IAChB,MAAOC,kCAAA,GAAW,IAAA,GAAOC,oCAAA,CAAmB,MAAM,OAAO,CAAA;AAAA,IACzD,CAAC,MAAM,OAAO;AAAA,GAChB;AAEA,EAAA,MAAM,WAAA,GAAcC,iBAAA,CAAY,CAAC,KAAA,KAA8B;AAC7D,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,OAAA,GAAUC,kCAAgB,KAAK,CAAA;AAAA,EACrC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAIJ,kCAAA,IAAY,CAAC,GAAA,CAAI,OAAA,EAAS;AAE9B,IAAA,IAAI,CAACK,+BAAA,CAAc,GAAA,CAAI,OAAO,CAAA,EAAG;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAeC,kCAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AAEjD,IAAA,IAAI,SAAA,IAAa,YAAA,IAAgBD,+BAAA,CAAc,YAAY,CAAA,EAAG;AAC5D,MAAA,SAAA,CAAU,KAAK,YAAY,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,QAAA,IAAYA,+BAAA,CAAc,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1C,MAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvC,EAAA,IAAIL,kCAAA,EAAU;AACZ,IAAA,OAAO,MAAY;AAAA,IAEnB,CAAA;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;ACjDe,SAAR,gBAEL,UAAA,EACyD;AAEzD,EAAA,OAAOD,cAAQ,MAAM;AACnB,IAAA,MAAMQ,SAAAA,uBAAe,GAAA,EAA6C;AAElE,IAAA,OAAO,CAAC,SAAA,EAAoB,IAAA,EAAY,OAAA,KACmB;AACzD,MAAA,IAAI,CAAC,UAAA,EAAY,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAEzD,MAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,SAAA,EAAW,OAAkB,CAAA;AAC/D,MAAA,MAAM,EAAE,KAAI,GAAI,cAAA;AAEhB,MAAA,MAAM,QAAA,GAAWC,kCAAA,CAAiB,SAAA,EAAW,IAAI,CAAA;AAEjD,MAAA,IAAI,CAACD,SAAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3B,QAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KAA6B;AACnD,UAAA,IAAI,IAAA,EAAME,oCAAA,CAAmB,IAAA,EAAM,IAAA,EAAM,OAAkB,CAAA;AAC3D,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AACA,QAAAF,SAAAA,CAAS,GAAA;AAAA,UACP,QAAA;AAAA,UACC,GAAA,GAAMG,sBAAA,CAAK,cAAA,EAAgB,GAAG,CAAA,GAAI;AAAA,SACrC;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,GAAG,cAAA;AAAA,QACH,GAAA,EAAKH,SAAAA,CAAS,GAAA,CAAI,QAAQ;AAAA,OAC5B;AAEA,MAAAI,4BAAA,CAAW,QAAQ,GAAG,CAAA;AAEtB,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AACjB;;;AC5DA,IAAA,gBAAA,GAAsBC,yBAAA,CAAAC,mCAAA,EAAA,EAAA,CAAA,CAAA;AAStB,IAAM,aAAA,uBAAoB,GAAA,EAA2C;AAUtD,SAAR,QAAA,CAA0B,MAAY,OAAA,EAAoD;AAE/F,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,QAAA,GAAWL,kCAAA,CAAiB,EAAA,EAAI,IAAI,CAAA;AAC1C,IAAA,IAAI,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC/B,MAAA,OAAO,aAAA,CAAc,IAAI,QAAQ,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAA8B;AAC9C,IAAA,IAAIR,kCAAA,IAAY,IAAA,KAAS,IAAA,IAAQ,CAAC,KAAA,EAAO;AAEzC,IAAA,MAAM,SAAA,GAAYc,qCAAmB,gBAAA,CAAAC,OAAS,EAAEC,gCAAA,CAAe,IAAA,EAAM,OAAO,CAAC,CAAA;AAC7E,IAAA,SAAA,CAAU,KAAK,KAAoB,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,QAAA,GAAWR,kCAAA,CAAiB,EAAA,EAAI,IAAI,CAAA;AAC1C,IAAA,aAAA,CAAc,GAAA,CAAI,UAAU,QAAQ,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO,QAAA;AACT;;;AChCA,IAAM,QAAA,uBAAe,OAAA,EAGnB;AAYa,SAAR,gBAAA,CACL,QAAA,EACA,IAAA,EACA,OAAA,EACoC;AACpC,EAAA,MAAM,EAAE,KAAI,GAAI,QAAA;AAGhB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAMS,OAAAA,GAAS;AAAA,MACb,GAAG,QAAA;AAAA,MACH,GAAA,EAAK;AAAA,KACP;AACA,IAAAN,4BAAA,CAAWM,SAAQ,GAAG,CAAA;AACtB,IAAA,OAAOA,OAAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACtB,IAAA,QAAA,CAAS,GAAA,CAAI,GAAA,kBAAK,IAAI,GAAA,EAAK,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAClC,EAAA,MAAM,QAAA,GAAWT,kCAAA,CAAiB,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AAErD,EAAA,IAAI,CAAC,SAAA,EAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7B,IAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KAA6B;AACnD,MAAA,IAAI,IAAA,EAAMC,oCAAA,CAAmB,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AAChD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AACA,IAAA,SAAA,EAAW,GAAA;AAAA,MACT,QAAA;AAAA,MACAC,sBAAA,CAAK,gBAAgB,GAAG;AAAA,KAC1B;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAG,QAAA;AAAA,IACH,GAAA,EAAK,SAAA,EAAW,GAAA,CAAI,QAAQ;AAAA,GAC9B;AAEA,EAAAC,4BAAA,CAAW,QAAQ,GAAG,CAAA;AAEtB,EAAA,OAAO,MAAA;AACT","file":"index.cjs","sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\n\nimport {\n createMaskInstance, findInputElement, isHTMLElement, resolveInputRef,\n} from '../core';\nimport isServer from '../utils/isServer';\n\nimport type { Input, Mask, Options } from '../types';\n\ninterface UseMaskInputOptions {\n mask: Mask;\n register?: (element: HTMLElement) => void;\n options?: Options;\n}\n\n/**\n * React hook for applying input masks to form elements.\n * Works with Ant Design and other wrapped components too.\n *\n * @param props - Configuration object\n * @param props.mask - The mask pattern to apply\n * @param props.register - Optional callback that receives the element\n * @param props.options - Optional mask configuration options\n * @returns A ref callback function to attach to the input element\n */\nexport default function useMaskInput(props: UseMaskInputOptions): ((input: Input | null) => void) {\n const { mask, register, options } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n const maskInput = useMemo(\n () => (isServer ? null : createMaskInstance(mask, options)),\n [mask, options],\n );\n\n const refCallback = useCallback((input: Input | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input);\n }, []);\n\n useEffect(() => {\n if (isServer || !ref.current) return;\n\n if (!isHTMLElement(ref.current)) {\n return;\n }\n\n const inputElement = findInputElement(ref.current);\n\n if (maskInput && inputElement && isHTMLElement(inputElement)) {\n maskInput.mask(inputElement);\n }\n\n if (register && isHTMLElement(ref.current)) {\n register(ref.current);\n }\n }, [mask, register, options, maskInput]);\n\n if (isServer) {\n return (): void => {\n // server doesn't have dom, so just do nothing\n };\n }\n\n return refCallback;\n}\n","import { useMemo } from 'react';\n\nimport { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type {\n FieldValues, Path,\n RegisterOptions,\n UseFormRegister,\n} from 'react-hook-form';\n\nimport type { Mask, Options, UseHookFormMaskReturn } from '../types';\n\n/**\n * Creates a masked version of React Hook Form's register function.\n * Takes react-hook-form's register and adds automatic masking. Like an upgrade.\n *\n * @template T - The form data type\n * @template D - The register options type\n * @param registerFn - The register function from useForm hook\n * @returns A function that registers a field with mask support\n */\nexport default function useHookFormMask<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<HTMLElement | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskReturn<T> => {\n if (!registerFn) throw new Error('registerFn is required');\n\n const registerReturn = registerFn(fieldName, options as Options);\n const { ref } = registerReturn as UseHookFormMaskReturn<T>;\n\n const cacheKey = makeMaskCacheKey(fieldName, mask);\n\n if (!refCache.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options as Options);\n return _ref;\n };\n refCache.set(\n cacheKey,\n (ref ? flow(applyMaskToRef, ref) : applyMaskToRef) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","/* eslint-disable import-x/no-extraneous-dependencies */\nimport inputmask from 'inputmask';\n\nimport { getMaskOptions } from '../core/maskConfig';\nimport { makeMaskCacheKey } from '../utils';\nimport isServer from '../utils/isServer';\nimport interopDefaultSync from '../utils/moduleInterop';\n\nimport type { Input, Mask, Options } from '../types';\n\nconst callbackCache = new Map<string, (input: Input | null) => void>();\n\n/**\n * Higher-order function that creates a ref callback for applying input masks.\n * Simple function to apply mask via ref. No hooks, no drama.\n *\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A ref callback function that applies the mask\n */\nexport default function withMask(mask: Mask, options?: Options): ((input: Input | null) => void) {\n // without options, we cant cache, so we always return a fresh callback. :P\n if (!options) {\n const cacheKey = makeMaskCacheKey('', mask);\n if (callbackCache.has(cacheKey)) {\n return callbackCache.get(cacheKey) as (input: Input | null) => void;\n }\n }\n\n const callback = (input: Input | null): void => {\n if (isServer || mask === null || !input) return;\n\n const maskInput = interopDefaultSync(inputmask)(getMaskOptions(mask, options));\n maskInput.mask(input as HTMLElement);\n };\n\n if (!options) {\n const cacheKey = makeMaskCacheKey('', mask);\n callbackCache.set(cacheKey, callback);\n }\n\n return callback;\n}\n","import { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type { FieldValues } from 'react-hook-form';\n\nimport type {\n Mask, Options, UseFormRegisterReturn, UseHookFormMaskReturn,\n} from '../types';\n\nconst refCache = new WeakMap<\n RefCallback<HTMLElement | null>,\n Map<string, RefCallback<HTMLElement | null>>\n>();\n\n/**\n * Enhances a React Hook Form register return object with mask support.\n * Takes an already registered field and adds mask to it.\n * Useful when you registered the field before.\n *\n * @param register - The register return object from React Hook Form\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A new register return object with mask applied\n */\nexport default function withHookFormMask(\n register: UseFormRegisterReturn,\n mask: Mask,\n options?: Options,\n): UseHookFormMaskReturn<FieldValues> {\n const { ref } = register as UseHookFormMaskReturn<FieldValues>;\n\n // null ref — nothing to cache, return as-is.\n if (!ref) {\n const result = {\n ...register,\n ref: null as unknown as RefCallback<HTMLElement | null>,\n } as UseHookFormMaskReturn<FieldValues>;\n setPrevRef(result, ref);\n return result;\n }\n\n if (!refCache.has(ref)) {\n refCache.set(ref, new Map());\n }\n const maskCache = refCache.get(ref);\n const cacheKey = makeMaskCacheKey(register.name, mask);\n\n if (!maskCache?.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options);\n return _ref;\n };\n maskCache?.set(\n cacheKey,\n flow(applyMaskToRef, ref) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...register,\n ref: maskCache?.get(cacheKey),\n } as UseHookFormMaskReturn<FieldValues>;\n\n setPrevRef(result, ref);\n\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/useMaskInput.ts","../src/api/useHookFormMask.ts","../src/api/withHookFormMask.ts"],"names":["useRef","useCallback","resolveInputRef","withMask","useEffect","isServer_default","useMemo","refCache","makeMaskCacheKey","applyMaskToElement","flow","setPrevRef","result"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n useCallback, useEffect, useRef,\n} from 'react';\n\nimport { resolveInputRef } from '../core';\nimport withMask from './withMask';\nimport isServer from '../utils/isServer';\n\nimport type { Input, Mask, Options } from '../types';\n\ninterface UseMaskInputOptions {\n mask: Mask;\n register?: (element: HTMLElement) => void;\n options?: Options;\n}\n\n/**\n * React hook for applying input masks to form elements.\n * Works with Ant Design and other wrapped components too.\n *\n * @param props - Configuration object\n * @param props.mask - The mask pattern to apply\n * @param props.register - Optional callback that receives the element\n * @param props.options - Optional mask configuration options\n * @returns A ref callback function to attach to the input element\n */\nexport default function useMaskInput(props: UseMaskInputOptions): ((input: Input | null) => void) {\n const { mask, register, options } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n const maskRef = useRef(mask);\n const optionsRef = useRef(options);\n\n const refCallback = useCallback((input: Input | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input);\n withMask(maskRef.current, optionsRef.current)(ref.current);\n }, []);\n\n useEffect(() => {\n if (isServer || !ref.current || !register) return;\n register(ref.current);\n }, [register]);\n\n if (isServer) {\n return (): void => {\n // server doesn't have dom, so just do nothing\n };\n }\n\n return refCallback;\n}\n","import { useMemo } from 'react';\n\nimport { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type {\n FieldValues, Path,\n RegisterOptions,\n UseFormRegister,\n} from 'react-hook-form';\n\nimport type { Mask, Options, UseHookFormMaskReturn } from '../types';\n\n/**\n * Creates a masked version of React Hook Form's register function.\n * Takes react-hook-form's register and adds automatic masking. Like an upgrade.\n *\n * @template T - The form data type\n * @template D - The register options type\n * @param registerFn - The register function from useForm hook\n * @returns A function that registers a field with mask support\n */\nexport default function useHookFormMask<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<HTMLElement | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskReturn<T> => {\n if (!registerFn) throw new Error('registerFn is required');\n\n const registerReturn = registerFn(fieldName, options as Options);\n const { ref } = registerReturn as UseHookFormMaskReturn<T>;\n\n const cacheKey = makeMaskCacheKey(fieldName, mask);\n\n if (!refCache.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options as Options);\n return _ref;\n };\n refCache.set(\n cacheKey,\n (ref ? flow(applyMaskToRef, ref) : applyMaskToRef) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","import { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type { FieldValues } from 'react-hook-form';\n\nimport type {\n Mask, Options, UseFormRegisterReturn, UseHookFormMaskReturn,\n} from '../types';\n\nconst refCache = new WeakMap<\n RefCallback<HTMLElement | null>,\n Map<string, RefCallback<HTMLElement | null>>\n>();\n\n/**\n * Enhances a React Hook Form register return object with mask support.\n * Takes an already registered field and adds mask to it.\n * Useful when you registered the field before.\n *\n * @param register - The register return object from React Hook Form\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A new register return object with mask applied\n */\nexport default function withHookFormMask(\n register: UseFormRegisterReturn,\n mask: Mask,\n options?: Options,\n): UseHookFormMaskReturn<FieldValues> {\n const { ref } = register as UseHookFormMaskReturn<FieldValues>;\n\n // null ref — nothing to cache, return as-is.\n if (!ref) {\n const result = {\n ...register,\n ref: null as unknown as RefCallback<HTMLElement | null>,\n } as UseHookFormMaskReturn<FieldValues>;\n setPrevRef(result, ref);\n return result;\n }\n\n if (!refCache.has(ref)) {\n refCache.set(ref, new Map());\n }\n const maskCache = refCache.get(ref);\n const cacheKey = makeMaskCacheKey(register.name, mask);\n\n if (!maskCache?.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options);\n return _ref;\n };\n maskCache?.set(\n cacheKey,\n flow(applyMaskToRef, ref) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...register,\n ref: maskCache?.get(cacheKey),\n } as UseHookFormMaskReturn<FieldValues>;\n\n setPrevRef(result, ref);\n\n return result;\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,33 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { resolveInputRef, withMask, isServer_default, makeMaskCacheKey, flow, setPrevRef, applyMaskToElement } from './chunk-QCWLMMDI.js';
|
|
2
|
+
export { withMask } from './chunk-QCWLMMDI.js';
|
|
3
|
+
import { useRef, useCallback, useEffect, useMemo } from 'react';
|
|
3
4
|
|
|
4
5
|
function useMaskInput(props) {
|
|
5
6
|
const { mask, register, options } = props;
|
|
6
7
|
const ref = useRef(null);
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
[mask, options]
|
|
10
|
-
);
|
|
8
|
+
const maskRef = useRef(mask);
|
|
9
|
+
const optionsRef = useRef(options);
|
|
11
10
|
const refCallback = useCallback((input) => {
|
|
12
11
|
if (!input) {
|
|
13
12
|
ref.current = null;
|
|
14
13
|
return;
|
|
15
14
|
}
|
|
16
15
|
ref.current = resolveInputRef(input);
|
|
16
|
+
withMask(maskRef.current, optionsRef.current)(ref.current);
|
|
17
17
|
}, []);
|
|
18
18
|
useEffect(() => {
|
|
19
|
-
if (isServer_default || !ref.current) return;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
const inputElement = findInputElement(ref.current);
|
|
24
|
-
if (maskInput && inputElement && isHTMLElement(inputElement)) {
|
|
25
|
-
maskInput.mask(inputElement);
|
|
26
|
-
}
|
|
27
|
-
if (register && isHTMLElement(ref.current)) {
|
|
28
|
-
register(ref.current);
|
|
29
|
-
}
|
|
30
|
-
}, [mask, register, options, maskInput]);
|
|
19
|
+
if (isServer_default || !ref.current || !register) return;
|
|
20
|
+
register(ref.current);
|
|
21
|
+
}, [register]);
|
|
31
22
|
if (isServer_default) {
|
|
32
23
|
return () => {
|
|
33
24
|
};
|
|
@@ -62,28 +53,6 @@ function useHookFormMask(registerFn) {
|
|
|
62
53
|
}, [registerFn]);
|
|
63
54
|
}
|
|
64
55
|
|
|
65
|
-
// src/api/withMask.ts
|
|
66
|
-
var import_inputmask = __toESM(require_inputmask(), 1);
|
|
67
|
-
var callbackCache = /* @__PURE__ */ new Map();
|
|
68
|
-
function withMask(mask, options) {
|
|
69
|
-
if (!options) {
|
|
70
|
-
const cacheKey = makeMaskCacheKey("", mask);
|
|
71
|
-
if (callbackCache.has(cacheKey)) {
|
|
72
|
-
return callbackCache.get(cacheKey);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
const callback = (input) => {
|
|
76
|
-
if (isServer_default || mask === null || !input) return;
|
|
77
|
-
const maskInput = interopDefaultSync(import_inputmask.default)(getMaskOptions(mask, options));
|
|
78
|
-
maskInput.mask(input);
|
|
79
|
-
};
|
|
80
|
-
if (!options) {
|
|
81
|
-
const cacheKey = makeMaskCacheKey("", mask);
|
|
82
|
-
callbackCache.set(cacheKey, callback);
|
|
83
|
-
}
|
|
84
|
-
return callback;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
56
|
// src/api/withHookFormMask.ts
|
|
88
57
|
var refCache = /* @__PURE__ */ new WeakMap();
|
|
89
58
|
function withHookFormMask(register, mask, options) {
|
|
@@ -119,6 +88,6 @@ function withHookFormMask(register, mask, options) {
|
|
|
119
88
|
return result;
|
|
120
89
|
}
|
|
121
90
|
|
|
122
|
-
export { useHookFormMask, useMaskInput, withHookFormMask
|
|
91
|
+
export { useHookFormMask, useMaskInput, withHookFormMask };
|
|
123
92
|
//# sourceMappingURL=index.js.map
|
|
124
93
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/useMaskInput.ts","../src/api/useHookFormMask.ts","../src/api/withMask.ts","../src/api/withHookFormMask.ts"],"names":["useMemo","refCache","inputmask","result"],"mappings":";;;AA8Be,SAAR,aAA8B,KAAA,EAA6D;AAChG,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAQ,GAAI,KAAA;AACpC,EAAA,MAAM,GAAA,GAAM,OAAgC,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,OAAA;AAAA,IAChB,MAAO,gBAAA,GAAW,IAAA,GAAO,kBAAA,CAAmB,MAAM,OAAO,CAAA;AAAA,IACzD,CAAC,MAAM,OAAO;AAAA,GAChB;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,KAAA,KAA8B;AAC7D,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,OAAA,GAAU,gBAAgB,KAAK,CAAA;AAAA,EACrC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,gBAAA,IAAY,CAAC,GAAA,CAAI,OAAA,EAAS;AAE9B,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA,EAAG;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AAEjD,IAAA,IAAI,SAAA,IAAa,YAAA,IAAgB,aAAA,CAAc,YAAY,CAAA,EAAG;AAC5D,MAAA,SAAA,CAAU,KAAK,YAAY,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,QAAA,IAAY,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1C,MAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvC,EAAA,IAAI,gBAAA,EAAU;AACZ,IAAA,OAAO,MAAY;AAAA,IAEnB,CAAA;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;ACjDe,SAAR,gBAEL,UAAA,EACyD;AAEzD,EAAA,OAAOA,QAAQ,MAAM;AACnB,IAAA,MAAMC,SAAAA,uBAAe,GAAA,EAA6C;AAElE,IAAA,OAAO,CAAC,SAAA,EAAoB,IAAA,EAAY,OAAA,KACmB;AACzD,MAAA,IAAI,CAAC,UAAA,EAAY,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAEzD,MAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,SAAA,EAAW,OAAkB,CAAA;AAC/D,MAAA,MAAM,EAAE,KAAI,GAAI,cAAA;AAEhB,MAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,SAAA,EAAW,IAAI,CAAA;AAEjD,MAAA,IAAI,CAACA,SAAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3B,QAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KAA6B;AACnD,UAAA,IAAI,IAAA,EAAM,kBAAA,CAAmB,IAAA,EAAM,IAAA,EAAM,OAAkB,CAAA;AAC3D,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AACA,QAAAA,SAAAA,CAAS,GAAA;AAAA,UACP,QAAA;AAAA,UACC,GAAA,GAAM,IAAA,CAAK,cAAA,EAAgB,GAAG,CAAA,GAAI;AAAA,SACrC;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,GAAG,cAAA;AAAA,QACH,GAAA,EAAKA,SAAAA,CAAS,GAAA,CAAI,QAAQ;AAAA,OAC5B;AAEA,MAAA,UAAA,CAAW,QAAQ,GAAG,CAAA;AAEtB,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AACjB;;;AC5DA,IAAA,gBAAA,GAAsB,OAAA,CAAA,iBAAA,EAAA,EAAA,CAAA,CAAA;AAStB,IAAM,aAAA,uBAAoB,GAAA,EAA2C;AAUtD,SAAR,QAAA,CAA0B,MAAY,OAAA,EAAoD;AAE/F,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,EAAA,EAAI,IAAI,CAAA;AAC1C,IAAA,IAAI,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC/B,MAAA,OAAO,aAAA,CAAc,IAAI,QAAQ,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAA8B;AAC9C,IAAA,IAAI,gBAAA,IAAY,IAAA,KAAS,IAAA,IAAQ,CAAC,KAAA,EAAO;AAEzC,IAAA,MAAM,SAAA,GAAY,mBAAmB,gBAAA,CAAAC,OAAS,EAAE,cAAA,CAAe,IAAA,EAAM,OAAO,CAAC,CAAA;AAC7E,IAAA,SAAA,CAAU,KAAK,KAAoB,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,EAAA,EAAI,IAAI,CAAA;AAC1C,IAAA,aAAA,CAAc,GAAA,CAAI,UAAU,QAAQ,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO,QAAA;AACT;;;AChCA,IAAM,QAAA,uBAAe,OAAA,EAGnB;AAYa,SAAR,gBAAA,CACL,QAAA,EACA,IAAA,EACA,OAAA,EACoC;AACpC,EAAA,MAAM,EAAE,KAAI,GAAI,QAAA;AAGhB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAMC,OAAAA,GAAS;AAAA,MACb,GAAG,QAAA;AAAA,MACH,GAAA,EAAK;AAAA,KACP;AACA,IAAA,UAAA,CAAWA,SAAQ,GAAG,CAAA;AACtB,IAAA,OAAOA,OAAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACtB,IAAA,QAAA,CAAS,GAAA,CAAI,GAAA,kBAAK,IAAI,GAAA,EAAK,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AAErD,EAAA,IAAI,CAAC,SAAA,EAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7B,IAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KAA6B;AACnD,MAAA,IAAI,IAAA,EAAM,kBAAA,CAAmB,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AAChD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AACA,IAAA,SAAA,EAAW,GAAA;AAAA,MACT,QAAA;AAAA,MACA,IAAA,CAAK,gBAAgB,GAAG;AAAA,KAC1B;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAG,QAAA;AAAA,IACH,GAAA,EAAK,SAAA,EAAW,GAAA,CAAI,QAAQ;AAAA,GAC9B;AAEA,EAAA,UAAA,CAAW,QAAQ,GAAG,CAAA;AAEtB,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\n\nimport {\n createMaskInstance, findInputElement, isHTMLElement, resolveInputRef,\n} from '../core';\nimport isServer from '../utils/isServer';\n\nimport type { Input, Mask, Options } from '../types';\n\ninterface UseMaskInputOptions {\n mask: Mask;\n register?: (element: HTMLElement) => void;\n options?: Options;\n}\n\n/**\n * React hook for applying input masks to form elements.\n * Works with Ant Design and other wrapped components too.\n *\n * @param props - Configuration object\n * @param props.mask - The mask pattern to apply\n * @param props.register - Optional callback that receives the element\n * @param props.options - Optional mask configuration options\n * @returns A ref callback function to attach to the input element\n */\nexport default function useMaskInput(props: UseMaskInputOptions): ((input: Input | null) => void) {\n const { mask, register, options } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n const maskInput = useMemo(\n () => (isServer ? null : createMaskInstance(mask, options)),\n [mask, options],\n );\n\n const refCallback = useCallback((input: Input | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input);\n }, []);\n\n useEffect(() => {\n if (isServer || !ref.current) return;\n\n if (!isHTMLElement(ref.current)) {\n return;\n }\n\n const inputElement = findInputElement(ref.current);\n\n if (maskInput && inputElement && isHTMLElement(inputElement)) {\n maskInput.mask(inputElement);\n }\n\n if (register && isHTMLElement(ref.current)) {\n register(ref.current);\n }\n }, [mask, register, options, maskInput]);\n\n if (isServer) {\n return (): void => {\n // server doesn't have dom, so just do nothing\n };\n }\n\n return refCallback;\n}\n","import { useMemo } from 'react';\n\nimport { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type {\n FieldValues, Path,\n RegisterOptions,\n UseFormRegister,\n} from 'react-hook-form';\n\nimport type { Mask, Options, UseHookFormMaskReturn } from '../types';\n\n/**\n * Creates a masked version of React Hook Form's register function.\n * Takes react-hook-form's register and adds automatic masking. Like an upgrade.\n *\n * @template T - The form data type\n * @template D - The register options type\n * @param registerFn - The register function from useForm hook\n * @returns A function that registers a field with mask support\n */\nexport default function useHookFormMask<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<HTMLElement | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskReturn<T> => {\n if (!registerFn) throw new Error('registerFn is required');\n\n const registerReturn = registerFn(fieldName, options as Options);\n const { ref } = registerReturn as UseHookFormMaskReturn<T>;\n\n const cacheKey = makeMaskCacheKey(fieldName, mask);\n\n if (!refCache.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options as Options);\n return _ref;\n };\n refCache.set(\n cacheKey,\n (ref ? flow(applyMaskToRef, ref) : applyMaskToRef) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","/* eslint-disable import-x/no-extraneous-dependencies */\nimport inputmask from 'inputmask';\n\nimport { getMaskOptions } from '../core/maskConfig';\nimport { makeMaskCacheKey } from '../utils';\nimport isServer from '../utils/isServer';\nimport interopDefaultSync from '../utils/moduleInterop';\n\nimport type { Input, Mask, Options } from '../types';\n\nconst callbackCache = new Map<string, (input: Input | null) => void>();\n\n/**\n * Higher-order function that creates a ref callback for applying input masks.\n * Simple function to apply mask via ref. No hooks, no drama.\n *\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A ref callback function that applies the mask\n */\nexport default function withMask(mask: Mask, options?: Options): ((input: Input | null) => void) {\n // without options, we cant cache, so we always return a fresh callback. :P\n if (!options) {\n const cacheKey = makeMaskCacheKey('', mask);\n if (callbackCache.has(cacheKey)) {\n return callbackCache.get(cacheKey) as (input: Input | null) => void;\n }\n }\n\n const callback = (input: Input | null): void => {\n if (isServer || mask === null || !input) return;\n\n const maskInput = interopDefaultSync(inputmask)(getMaskOptions(mask, options));\n maskInput.mask(input as HTMLElement);\n };\n\n if (!options) {\n const cacheKey = makeMaskCacheKey('', mask);\n callbackCache.set(cacheKey, callback);\n }\n\n return callback;\n}\n","import { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type { FieldValues } from 'react-hook-form';\n\nimport type {\n Mask, Options, UseFormRegisterReturn, UseHookFormMaskReturn,\n} from '../types';\n\nconst refCache = new WeakMap<\n RefCallback<HTMLElement | null>,\n Map<string, RefCallback<HTMLElement | null>>\n>();\n\n/**\n * Enhances a React Hook Form register return object with mask support.\n * Takes an already registered field and adds mask to it.\n * Useful when you registered the field before.\n *\n * @param register - The register return object from React Hook Form\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A new register return object with mask applied\n */\nexport default function withHookFormMask(\n register: UseFormRegisterReturn,\n mask: Mask,\n options?: Options,\n): UseHookFormMaskReturn<FieldValues> {\n const { ref } = register as UseHookFormMaskReturn<FieldValues>;\n\n // null ref — nothing to cache, return as-is.\n if (!ref) {\n const result = {\n ...register,\n ref: null as unknown as RefCallback<HTMLElement | null>,\n } as UseHookFormMaskReturn<FieldValues>;\n setPrevRef(result, ref);\n return result;\n }\n\n if (!refCache.has(ref)) {\n refCache.set(ref, new Map());\n }\n const maskCache = refCache.get(ref);\n const cacheKey = makeMaskCacheKey(register.name, mask);\n\n if (!maskCache?.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options);\n return _ref;\n };\n maskCache?.set(\n cacheKey,\n flow(applyMaskToRef, ref) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...register,\n ref: maskCache?.get(cacheKey),\n } as UseHookFormMaskReturn<FieldValues>;\n\n setPrevRef(result, ref);\n\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/useMaskInput.ts","../src/api/useHookFormMask.ts","../src/api/withHookFormMask.ts"],"names":["refCache","result"],"mappings":"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","file":"index.js","sourcesContent":["import {\n useCallback, useEffect, useRef,\n} from 'react';\n\nimport { resolveInputRef } from '../core';\nimport withMask from './withMask';\nimport isServer from '../utils/isServer';\n\nimport type { Input, Mask, Options } from '../types';\n\ninterface UseMaskInputOptions {\n mask: Mask;\n register?: (element: HTMLElement) => void;\n options?: Options;\n}\n\n/**\n * React hook for applying input masks to form elements.\n * Works with Ant Design and other wrapped components too.\n *\n * @param props - Configuration object\n * @param props.mask - The mask pattern to apply\n * @param props.register - Optional callback that receives the element\n * @param props.options - Optional mask configuration options\n * @returns A ref callback function to attach to the input element\n */\nexport default function useMaskInput(props: UseMaskInputOptions): ((input: Input | null) => void) {\n const { mask, register, options } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n const maskRef = useRef(mask);\n const optionsRef = useRef(options);\n\n const refCallback = useCallback((input: Input | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input);\n withMask(maskRef.current, optionsRef.current)(ref.current);\n }, []);\n\n useEffect(() => {\n if (isServer || !ref.current || !register) return;\n register(ref.current);\n }, [register]);\n\n if (isServer) {\n return (): void => {\n // server doesn't have dom, so just do nothing\n };\n }\n\n return refCallback;\n}\n","import { useMemo } from 'react';\n\nimport { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type {\n FieldValues, Path,\n RegisterOptions,\n UseFormRegister,\n} from 'react-hook-form';\n\nimport type { Mask, Options, UseHookFormMaskReturn } from '../types';\n\n/**\n * Creates a masked version of React Hook Form's register function.\n * Takes react-hook-form's register and adds automatic masking. Like an upgrade.\n *\n * @template T - The form data type\n * @template D - The register options type\n * @param registerFn - The register function from useForm hook\n * @returns A function that registers a field with mask support\n */\nexport default function useHookFormMask<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<HTMLElement | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskReturn<T> => {\n if (!registerFn) throw new Error('registerFn is required');\n\n const registerReturn = registerFn(fieldName, options as Options);\n const { ref } = registerReturn as UseHookFormMaskReturn<T>;\n\n const cacheKey = makeMaskCacheKey(fieldName, mask);\n\n if (!refCache.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options as Options);\n return _ref;\n };\n refCache.set(\n cacheKey,\n (ref ? flow(applyMaskToRef, ref) : applyMaskToRef) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","import { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type { FieldValues } from 'react-hook-form';\n\nimport type {\n Mask, Options, UseFormRegisterReturn, UseHookFormMaskReturn,\n} from '../types';\n\nconst refCache = new WeakMap<\n RefCallback<HTMLElement | null>,\n Map<string, RefCallback<HTMLElement | null>>\n>();\n\n/**\n * Enhances a React Hook Form register return object with mask support.\n * Takes an already registered field and adds mask to it.\n * Useful when you registered the field before.\n *\n * @param register - The register return object from React Hook Form\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A new register return object with mask applied\n */\nexport default function withHookFormMask(\n register: UseFormRegisterReturn,\n mask: Mask,\n options?: Options,\n): UseHookFormMaskReturn<FieldValues> {\n const { ref } = register as UseHookFormMaskReturn<FieldValues>;\n\n // null ref — nothing to cache, return as-is.\n if (!ref) {\n const result = {\n ...register,\n ref: null as unknown as RefCallback<HTMLElement | null>,\n } as UseHookFormMaskReturn<FieldValues>;\n setPrevRef(result, ref);\n return result;\n }\n\n if (!refCache.has(ref)) {\n refCache.set(ref, new Map());\n }\n const maskCache = refCache.get(ref);\n const cacheKey = makeMaskCacheKey(register.name, mask);\n\n if (!maskCache?.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options);\n return _ref;\n };\n maskCache?.set(\n cacheKey,\n flow(applyMaskToRef, ref) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...register,\n ref: maskCache?.get(cacheKey),\n } as UseHookFormMaskReturn<FieldValues>;\n\n setPrevRef(result, ref);\n\n return result;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
useCallback,
|
|
3
|
-
useEffect,
|
|
4
|
-
useMemo,
|
|
5
|
-
useRef,
|
|
6
|
-
} from 'react';
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
7
2
|
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
-
} from '../core';
|
|
3
|
+
import withMask from '../api/withMask';
|
|
4
|
+
import { resolveInputRef } from '../core';
|
|
11
5
|
import isServer from '../utils/isServer';
|
|
12
6
|
|
|
13
7
|
import type { InputRef } from 'antd';
|
|
@@ -21,51 +15,44 @@ interface UseMaskInputOptions {
|
|
|
21
15
|
}
|
|
22
16
|
|
|
23
17
|
/**
|
|
24
|
-
* React hook for applying input masks to form elements.
|
|
25
|
-
* Works with Ant Design and other wrapped components too.
|
|
18
|
+
* React hook for applying input masks to Ant Design form elements.
|
|
26
19
|
*
|
|
27
20
|
* @param props - Configuration object
|
|
28
21
|
* @param props.mask - The mask pattern to apply
|
|
29
22
|
* @param props.register - Optional callback that receives the element
|
|
30
23
|
* @param props.options - Optional mask configuration options
|
|
31
|
-
* @returns A ref callback function to attach to the
|
|
24
|
+
* @returns A ref callback function to attach to the Ant Design Input element
|
|
32
25
|
*/
|
|
33
26
|
export default function useMaskInputAntd(props: UseMaskInputOptions): (
|
|
34
27
|
input: InputRef | null
|
|
35
28
|
) => void {
|
|
36
29
|
const { mask, register, options } = props;
|
|
37
|
-
const ref = useRef<
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
);
|
|
30
|
+
const ref = useRef<HTMLInputElement | null>(null);
|
|
31
|
+
const maskRef = useRef(mask);
|
|
32
|
+
const optionsRef = useRef(options);
|
|
33
|
+
const maskedElementRef = useRef<HTMLInputElement | null>(null);
|
|
42
34
|
|
|
43
|
-
|
|
35
|
+
maskRef.current = mask;
|
|
36
|
+
optionsRef.current = options;
|
|
37
|
+
|
|
38
|
+
const refCallback = useCallback((input: InputRef | null): void => {
|
|
44
39
|
if (!input) {
|
|
45
40
|
ref.current = null;
|
|
46
41
|
return;
|
|
47
42
|
}
|
|
48
43
|
|
|
49
|
-
ref.current = resolveInputRef(input.input)
|
|
50
|
-
}, []);
|
|
51
|
-
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
if (isServer || !ref.current) return;
|
|
44
|
+
ref.current = resolveInputRef(input.input);
|
|
54
45
|
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const inputElement = findInputElement(ref.current);
|
|
60
|
-
|
|
61
|
-
if (maskInput && inputElement && isHTMLElement(inputElement)) {
|
|
62
|
-
maskInput.mask(inputElement);
|
|
46
|
+
if (ref.current && ref.current !== maskedElementRef.current) {
|
|
47
|
+
withMask(maskRef.current, optionsRef.current)(ref.current);
|
|
48
|
+
maskedElementRef.current = ref.current;
|
|
63
49
|
}
|
|
50
|
+
}, []);
|
|
64
51
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}, [
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
if (isServer || !ref.current || !register) return;
|
|
54
|
+
register(ref.current);
|
|
55
|
+
}, [register]);
|
|
69
56
|
|
|
70
57
|
if (isServer) {
|
|
71
58
|
return (): void => {
|
package/src/api/useMaskInput.ts
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
|
-
useCallback,
|
|
3
|
-
useEffect,
|
|
4
|
-
useMemo,
|
|
5
|
-
useRef,
|
|
2
|
+
useCallback, useEffect, useRef,
|
|
6
3
|
} from 'react';
|
|
7
4
|
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
} from '../core';
|
|
5
|
+
import { resolveInputRef } from '../core';
|
|
6
|
+
import withMask from './withMask';
|
|
11
7
|
import isServer from '../utils/isServer';
|
|
12
8
|
|
|
13
9
|
import type { Input, Mask, Options } from '../types';
|
|
@@ -31,10 +27,8 @@ interface UseMaskInputOptions {
|
|
|
31
27
|
export default function useMaskInput(props: UseMaskInputOptions): ((input: Input | null) => void) {
|
|
32
28
|
const { mask, register, options } = props;
|
|
33
29
|
const ref = useRef<HTMLInputElement | null>(null);
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
[mask, options],
|
|
37
|
-
);
|
|
30
|
+
const maskRef = useRef(mask);
|
|
31
|
+
const optionsRef = useRef(options);
|
|
38
32
|
|
|
39
33
|
const refCallback = useCallback((input: Input | null): void => {
|
|
40
34
|
if (!input) {
|
|
@@ -43,25 +37,13 @@ export default function useMaskInput(props: UseMaskInputOptions): ((input: Input
|
|
|
43
37
|
}
|
|
44
38
|
|
|
45
39
|
ref.current = resolveInputRef(input);
|
|
40
|
+
withMask(maskRef.current, optionsRef.current)(ref.current);
|
|
46
41
|
}, []);
|
|
47
42
|
|
|
48
43
|
useEffect(() => {
|
|
49
|
-
if (isServer || !ref.current) return;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const inputElement = findInputElement(ref.current);
|
|
56
|
-
|
|
57
|
-
if (maskInput && inputElement && isHTMLElement(inputElement)) {
|
|
58
|
-
maskInput.mask(inputElement);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (register && isHTMLElement(ref.current)) {
|
|
62
|
-
register(ref.current);
|
|
63
|
-
}
|
|
64
|
-
}, [mask, register, options, maskInput]);
|
|
44
|
+
if (isServer || !ref.current || !register) return;
|
|
45
|
+
register(ref.current);
|
|
46
|
+
}, [register]);
|
|
65
47
|
|
|
66
48
|
if (isServer) {
|
|
67
49
|
return (): void => {
|