use-mask-input 3.10.3 → 3.11.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/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 3.11.0
2
+
3
+ ### Minor Changes
4
+
5
+ - 8e20241: Expose `formatWithMask` and `unformatWithMask` utility functions for formatting and sanitizing values outside of a mounted element, useful for preparing data for the backend or displaying already-persisted values in the UI.
6
+
1
7
  ## 3.10.3
2
8
 
3
9
  ### Patch Changes
package/README.md CHANGED
@@ -120,6 +120,8 @@ function EmailInput() {
120
120
  | `withTanStackFormMask` | Function. Mask for TanStack input props. Requires `React.memo`. |
121
121
  | `useMaskInputAntd` | Hook. `useMaskInput` for Ant Design. |
122
122
  | `useHookFormMaskAntd` | Hook. `useHookFormMask` for Ant Design. |
123
+ | `formatWithMask` | Function. Formats a raw value using a mask, without a mounted element. |
124
+ | `unformatWithMask` | Function. Removes the mask from a formatted value, without a mounted element. |
123
125
 
124
126
  ## Built-in Aliases
125
127
 
package/dist/antd.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./withMask-B4sSnU9K.cjs");let t=require("react");function n(n){return(0,t.useMemo)(()=>{let t=new Map;return(r,i,a)=>{if(!n)throw Error(`registerFn is required`);let o=n(r,a),{ref:s}=o,c=e.i(r,i);t.has(c)||t.set(c,t=>{let n=t?e.l(t.input):null;n&&e.n(n,i,a),s&&s(n)});let l={...o,ref:t.get(c)};return e.a(l,s),l}},[n])}function r(n){let{mask:r,register:i,options:a}=n,o=(0,t.useRef)(null),s=(0,t.useRef)(r),c=(0,t.useRef)(a),l=(0,t.useRef)(null),u=(0,t.useCallback)(()=>e.r(o.current),[]);s.current=r,c.current=a;let d=(0,t.useCallback)(t=>{if(!t){o.current=null;return}o.current=e.l(t.input),o.current&&o.current!==l.current&&(e.t(s.current,c.current)(o.current),l.current=o.current)},[]);return(0,t.useEffect)(()=>{e.s||!o.current||!i||i(o.current)},[i]),e.s?e.o((()=>{}),()=>``):e.o(d,u)}exports.useHookFormMaskAntd=n,exports.useMaskInputAntd=r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./withMask-BkTzstzt.cjs");let t=require("react");function n(n){return(0,t.useMemo)(()=>{let t=new Map;return(r,i,a)=>{if(!n)throw Error(`registerFn is required`);let o=n(r,a),{ref:s}=o,c=e.o(r,i);t.has(c)||t.set(c,t=>{let n=t?e.d(t.input):null;n&&e.n(n,i,a),s&&s(n)});let l={...o,ref:t.get(c)};return e.s(l,s),l}},[n])}function r(n){let{mask:r,register:i,options:a}=n,o=(0,t.useRef)(null),s=(0,t.useRef)(r),c=(0,t.useRef)(a),l=(0,t.useRef)(null),u=(0,t.useCallback)(()=>e.a(o.current),[]);s.current=r,c.current=a;let d=(0,t.useCallback)(t=>{if(!t){o.current=null;return}o.current=e.d(t.input),o.current&&o.current!==l.current&&(e.t(s.current,c.current)(o.current),l.current=o.current)},[]);return(0,t.useEffect)(()=>{e.l||!o.current||!i||i(o.current)},[i]),e.l?e.c((()=>{}),()=>``):e.c(d,u)}exports.useHookFormMaskAntd=n,exports.useMaskInputAntd=r;
2
2
  //# sourceMappingURL=antd.cjs.map
package/dist/antd.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,l as n,n as r,o as i,r as a,s as o,t as s}from"./withMask-CKM8Ug6z.mjs";import{useCallback as c,useEffect as l,useMemo as u,useRef as d}from"react";function f(i){return u(()=>{let a=new Map;return(o,s,c)=>{if(!i)throw Error(`registerFn is required`);let l=i(o,c),{ref:u}=l,d=t(o,s);a.has(d)||a.set(d,e=>{let t=e?n(e.input):null;t&&r(t,s,c),u&&u(t)});let f={...l,ref:a.get(d)};return e(f,u),f}},[i])}function p(e){let{mask:t,register:r,options:u}=e,f=d(null),p=d(t),m=d(u),h=d(null),g=c(()=>a(f.current),[]);p.current=t,m.current=u;let _=c(e=>{if(!e){f.current=null;return}f.current=n(e.input),f.current&&f.current!==h.current&&(s(p.current,m.current)(f.current),h.current=f.current)},[]);return l(()=>{o||!f.current||!r||r(f.current)},[r]),o?i((()=>{}),()=>``):i(_,g)}export{f as useHookFormMaskAntd,p as useMaskInputAntd};
1
+ import{a as e,c as t,d as n,l as r,n as i,o as a,s as o,t as s}from"./withMask-C-wAMt0W.mjs";import{useCallback as c,useEffect as l,useMemo as u,useRef as d}from"react";function f(e){return u(()=>{let t=new Map;return(r,s,c)=>{if(!e)throw Error(`registerFn is required`);let l=e(r,c),{ref:u}=l,d=a(r,s);t.has(d)||t.set(d,e=>{let t=e?n(e.input):null;t&&i(t,s,c),u&&u(t)});let f={...l,ref:t.get(d)};return o(f,u),f}},[e])}function p(i){let{mask:a,register:o,options:u}=i,f=d(null),p=d(a),m=d(u),h=d(null),g=c(()=>e(f.current),[]);p.current=a,m.current=u;let _=c(e=>{if(!e){f.current=null;return}f.current=n(e.input),f.current&&f.current!==h.current&&(s(p.current,m.current)(f.current),h.current=f.current)},[]);return l(()=>{r||!f.current||!o||o(f.current)},[o]),r?t((()=>{}),()=>``):t(_,g)}export{f as useHookFormMaskAntd,p as useMaskInputAntd};
2
2
  //# sourceMappingURL=antd.mjs.map
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./withMask-B4sSnU9K.cjs");let t=require("react");function n(n){let{mask:r,register:i,options:a}=n,o=(0,t.useRef)(null),s=(0,t.useRef)(r),c=(0,t.useRef)(a),l=(0,t.useCallback)(()=>e.r(o.current),[]),u=(0,t.useCallback)(t=>{if(!t){o.current=null;return}o.current=e.l(t),e.t(s.current,c.current)(o.current)},[]);return(0,t.useEffect)(()=>{e.s||!o.current||!i||i(o.current)},[i]),e.s?e.o((()=>{}),()=>``):e.o(u,l)}function r(n){let r=(0,t.useRef)(new Map);return(0,t.useLayoutEffect)(()=>{r.current.forEach(e=>{let t=e;!t.element||!t.latestRHFRef||t.latestRHFRef!==t.syncedRHFRef&&(t.latestRHFRef(t.element),t.syncedRHFRef=t.latestRHFRef)})}),(0,t.useMemo)(()=>(r.current=new Map,(t,i,a)=>{if(!n)throw Error(`registerFn is required`);let o=n(t,a),{ref:s}=o,c=e.i(t,i),l=r.current.get(c);if(l)l.latestRHFRef=s;else{let t={element:null,latestRHFRef:s,syncedRHFRef:void 0,stableRef:null},n=n=>(t.element=n,n&&e.n(n,i,a),n);t.stableRef=t.latestRHFRef?e.c(n,e=>t.latestRHFRef?.(e)):n,l=t,r.current.set(c,t)}let u={...o,ref:l.stableRef};return e.o(u,()=>e.r(l?.element??null)),e.a(u,s),u}),[n])}const i=new WeakMap;function a(t,n,r){let{ref:a}=t;if(!a){let i=null,o={...t,ref:(t=>{i=t,t&&e.n(t,n,r)})};return e.o(o,()=>e.r(i)),e.a(o,a),o}i.has(a)||i.set(a,new Map);let o=i.get(a),s=e.i(t.name??``,n);if(!o?.has(s)){let t=(i=>{t.currentElement=i,i&&e.n(i,n,r),a(i)});o?.set(s,t)}let c=o?.get(s),l={...t,ref:c};return e.o(l,()=>e.r(c?.currentElement??null)),e.a(l,a),l}function o(){return(0,t.useMemo)(()=>(e,t,n)=>a(t,e,n),[])}const s=new WeakMap;function c(t,n,r){let{ref:i}=t;if(!i){let n={...t,ref:null};return e.o(n,()=>``),e.a(n,i),n}s.has(i)||s.set(i,new Map);let a=s.get(i),o=e.i(t.name,n);if(!a?.has(o)){let t=(a=>(t.currentElement=a,a&&e.n(a,n,r),i(a)));a?.set(o,t)}let c=a?.get(o),l={...t,ref:c};return e.o(l,()=>e.r(c?.currentElement??null)),e.a(l,i),l}exports.useHookFormMask=r,exports.useMaskInput=n,exports.useTanStackFormMask=o,exports.withHookFormMask=c,exports.withMask=e.t,exports.withTanStackFormMask=a;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./withMask-BkTzstzt.cjs");let t=require("react");function n(n){let{mask:r,register:i,options:a}=n,o=(0,t.useRef)(null),s=(0,t.useRef)(r),c=(0,t.useRef)(a),l=(0,t.useCallback)(()=>e.a(o.current),[]),u=(0,t.useCallback)(t=>{if(!t){o.current=null;return}o.current=e.d(t),e.t(s.current,c.current)(o.current)},[]);return(0,t.useEffect)(()=>{e.l||!o.current||!i||i(o.current)},[i]),e.l?e.c((()=>{}),()=>``):e.c(u,l)}function r(n){let r=(0,t.useRef)(new Map);return(0,t.useLayoutEffect)(()=>{r.current.forEach(e=>{let t=e;!t.element||!t.latestRHFRef||t.latestRHFRef!==t.syncedRHFRef&&(t.latestRHFRef(t.element),t.syncedRHFRef=t.latestRHFRef)})}),(0,t.useMemo)(()=>(r.current=new Map,(t,i,a)=>{if(!n)throw Error(`registerFn is required`);let o=n(t,a),{ref:s}=o,c=e.o(t,i),l=r.current.get(c);if(l)l.latestRHFRef=s;else{let t={element:null,latestRHFRef:s,syncedRHFRef:void 0,stableRef:null},n=n=>(t.element=n,n&&e.n(n,i,a),n);t.stableRef=t.latestRHFRef?e.u(n,e=>t.latestRHFRef?.(e)):n,l=t,r.current.set(c,t)}let u={...o,ref:l.stableRef};return e.c(u,()=>e.a(l?.element??null)),e.s(u,s),u}),[n])}const i=new WeakMap;function a(t,n,r){let{ref:a}=t;if(!a){let i=null,o={...t,ref:(t=>{i=t,t&&e.n(t,n,r)})};return e.c(o,()=>e.a(i)),e.s(o,a),o}i.has(a)||i.set(a,new Map);let o=i.get(a),s=e.o(t.name??``,n);if(!o?.has(s)){let t=(i=>{t.currentElement=i,i&&e.n(i,n,r),a(i)});o?.set(s,t)}let c=o?.get(s),l={...t,ref:c};return e.c(l,()=>e.a(c?.currentElement??null)),e.s(l,a),l}function o(){return(0,t.useMemo)(()=>(e,t,n)=>a(t,e,n),[])}const s=new WeakMap;function c(t,n,r){let{ref:i}=t;if(!i){let n={...t,ref:null};return e.c(n,()=>``),e.s(n,i),n}s.has(i)||s.set(i,new Map);let a=s.get(i),o=e.o(t.name,n);if(!a?.has(o)){let t=(a=>(t.currentElement=a,a&&e.n(a,n,r),i(a)));a?.set(o,t)}let c=a?.get(o),l={...t,ref:c};return e.c(l,()=>e.a(c?.currentElement??null)),e.s(l,i),l}exports.formatWithMask=e.r,exports.unformatWithMask=e.i,exports.useHookFormMask=r,exports.useMaskInput=n,exports.useTanStackFormMask=o,exports.withHookFormMask=c,exports.withMask=e.t,exports.withTanStackFormMask=a;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.cts CHANGED
@@ -68,5 +68,27 @@ declare function withHookFormMask(register: UseFormRegisterReturn, mask: Mask, o
68
68
  */
69
69
  declare function withTanStackFormMask<T extends TanStackFormInputProps>(inputProps: T, mask: Mask, options?: Options): UseTanStackFormMaskReturn<T>;
70
70
  //#endregion
71
- export { type Input, type Mask, type Options, type TanStackFormInputProps, type UnmaskedValueApi, type UseFormRegister, type UseFormRegisterReturn, type UseMaskInputReturn, type UseTanStackFormMaskReturn, useHookFormMask, useMaskInput, useTanStackFormMask, withHookFormMask, withMask, withTanStackFormMask };
71
+ //#region src/core/maskEngine.d.ts
72
+ /**
73
+ * Formats a raw value using the given mask, without needing a mounted element.
74
+ * Useful for displaying already-persisted (unmasked) values in the UI.
75
+ *
76
+ * @param value - The raw value to format
77
+ * @param mask - The mask pattern
78
+ * @param options - Optional configuration options
79
+ * @returns The masked value
80
+ */
81
+ declare function formatWithMask(value: string, mask: Mask, options?: Options): string;
82
+ /**
83
+ * Removes the mask from a formatted value, without needing a mounted element.
84
+ * Useful for sanitizing input before sending it to the backend.
85
+ *
86
+ * @param value - The masked value to unformat
87
+ * @param mask - The mask pattern
88
+ * @param options - Optional configuration options
89
+ * @returns The raw, unmasked value
90
+ */
91
+ declare function unformatWithMask(value: string, mask: Mask, options?: Options): string;
92
+ //#endregion
93
+ export { type Input, type Mask, type Options, type TanStackFormInputProps, type UnmaskedValueApi, type UseFormRegister, type UseFormRegisterReturn, type UseMaskInputReturn, type UseTanStackFormMaskReturn, formatWithMask, unformatWithMask, useHookFormMask, useMaskInput, useTanStackFormMask, withHookFormMask, withMask, withTanStackFormMask };
72
94
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.mts CHANGED
@@ -68,5 +68,27 @@ declare function withHookFormMask(register: UseFormRegisterReturn, mask: Mask, o
68
68
  */
69
69
  declare function withTanStackFormMask<T extends TanStackFormInputProps>(inputProps: T, mask: Mask, options?: Options): UseTanStackFormMaskReturn<T>;
70
70
  //#endregion
71
- export { type Input, type Mask, type Options, type TanStackFormInputProps, type UnmaskedValueApi, type UseFormRegister, type UseFormRegisterReturn, type UseMaskInputReturn, type UseTanStackFormMaskReturn, useHookFormMask, useMaskInput, useTanStackFormMask, withHookFormMask, withMask, withTanStackFormMask };
71
+ //#region src/core/maskEngine.d.ts
72
+ /**
73
+ * Formats a raw value using the given mask, without needing a mounted element.
74
+ * Useful for displaying already-persisted (unmasked) values in the UI.
75
+ *
76
+ * @param value - The raw value to format
77
+ * @param mask - The mask pattern
78
+ * @param options - Optional configuration options
79
+ * @returns The masked value
80
+ */
81
+ declare function formatWithMask(value: string, mask: Mask, options?: Options): string;
82
+ /**
83
+ * Removes the mask from a formatted value, without needing a mounted element.
84
+ * Useful for sanitizing input before sending it to the backend.
85
+ *
86
+ * @param value - The masked value to unformat
87
+ * @param mask - The mask pattern
88
+ * @param options - Optional configuration options
89
+ * @returns The raw, unmasked value
90
+ */
91
+ declare function unformatWithMask(value: string, mask: Mask, options?: Options): string;
92
+ //#endregion
93
+ export { type Input, type Mask, type Options, type TanStackFormInputProps, type UnmaskedValueApi, type UseFormRegister, type UseFormRegisterReturn, type UseMaskInputReturn, type UseTanStackFormMaskReturn, formatWithMask, unformatWithMask, useHookFormMask, useMaskInput, useTanStackFormMask, withHookFormMask, withMask, withTanStackFormMask };
72
94
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"./withMask-CKM8Ug6z.mjs";import{useCallback as l,useEffect as u,useLayoutEffect as d,useMemo as f,useRef as p}from"react";function m(e){let{mask:t,register:n,options:i}=e,d=p(null),f=p(t),m=p(i),h=l(()=>o(d.current),[]),g=l(e=>{if(!e){d.current=null;return}d.current=r(e),c(f.current,m.current)(d.current)},[]);return u(()=>{s||!d.current||!n||n(d.current)},[n]),s?a((()=>{}),()=>``):a(g,h)}function h(r){let s=p(new Map);return d(()=>{s.current.forEach(e=>{let t=e;!t.element||!t.latestRHFRef||t.latestRHFRef!==t.syncedRHFRef&&(t.latestRHFRef(t.element),t.syncedRHFRef=t.latestRHFRef)})}),f(()=>(s.current=new Map,(c,l,u)=>{if(!r)throw Error(`registerFn is required`);let d=r(c,u),{ref:f}=d,p=n(c,l),m=s.current.get(p);if(m)m.latestRHFRef=f;else{let e={element:null,latestRHFRef:f,syncedRHFRef:void 0,stableRef:null},n=t=>(e.element=t,t&&i(t,l,u),t);e.stableRef=e.latestRHFRef?t(n,t=>e.latestRHFRef?.(t)):n,m=e,s.current.set(p,e)}let h={...d,ref:m.stableRef};return a(h,()=>o(m?.element??null)),e(h,f),h}),[r])}const g=new WeakMap;function _(t,r,s){let{ref:c}=t;if(!c){let n=null,l={...t,ref:(e=>{n=e,e&&i(e,r,s)})};return a(l,()=>o(n)),e(l,c),l}g.has(c)||g.set(c,new Map);let l=g.get(c),u=n(t.name??``,r);if(!l?.has(u)){let e=(t=>{e.currentElement=t,t&&i(t,r,s),c(t)});l?.set(u,e)}let d=l?.get(u),f={...t,ref:d};return a(f,()=>o(d?.currentElement??null)),e(f,c),f}function v(){return f(()=>(e,t,n)=>_(t,e,n),[])}const y=new WeakMap;function b(t,r,s){let{ref:c}=t;if(!c){let n={...t,ref:null};return a(n,()=>``),e(n,c),n}y.has(c)||y.set(c,new Map);let l=y.get(c),u=n(t.name,r);if(!l?.has(u)){let e=(t=>(e.currentElement=t,t&&i(t,r,s),c(t)));l?.set(u,e)}let d=l?.get(u),f={...t,ref:d};return a(f,()=>o(d?.currentElement??null)),e(f,c),f}export{h as useHookFormMask,m as useMaskInput,v as useTanStackFormMask,b as withHookFormMask,c as withMask,_ as withTanStackFormMask};
1
+ import{a as e,c as t,d as n,i as r,l as i,n as a,o,r as s,s as c,t as l,u}from"./withMask-C-wAMt0W.mjs";import{useCallback as d,useEffect as f,useLayoutEffect as p,useMemo as m,useRef as h}from"react";function g(r){let{mask:a,register:o,options:s}=r,c=h(null),u=h(a),p=h(s),m=d(()=>e(c.current),[]),g=d(e=>{if(!e){c.current=null;return}c.current=n(e),l(u.current,p.current)(c.current)},[]);return f(()=>{i||!c.current||!o||o(c.current)},[o]),i?t((()=>{}),()=>``):t(g,m)}function _(n){let r=h(new Map);return p(()=>{r.current.forEach(e=>{let t=e;!t.element||!t.latestRHFRef||t.latestRHFRef!==t.syncedRHFRef&&(t.latestRHFRef(t.element),t.syncedRHFRef=t.latestRHFRef)})}),m(()=>(r.current=new Map,(i,s,l)=>{if(!n)throw Error(`registerFn is required`);let d=n(i,l),{ref:f}=d,p=o(i,s),m=r.current.get(p);if(m)m.latestRHFRef=f;else{let e={element:null,latestRHFRef:f,syncedRHFRef:void 0,stableRef:null},t=t=>(e.element=t,t&&a(t,s,l),t);e.stableRef=e.latestRHFRef?u(t,t=>e.latestRHFRef?.(t)):t,m=e,r.current.set(p,e)}let h={...d,ref:m.stableRef};return t(h,()=>e(m?.element??null)),c(h,f),h}),[n])}const v=new WeakMap;function y(n,r,i){let{ref:s}=n;if(!s){let o=null,l={...n,ref:(e=>{o=e,e&&a(e,r,i)})};return t(l,()=>e(o)),c(l,s),l}v.has(s)||v.set(s,new Map);let l=v.get(s),u=o(n.name??``,r);if(!l?.has(u)){let e=(t=>{e.currentElement=t,t&&a(t,r,i),s(t)});l?.set(u,e)}let d=l?.get(u),f={...n,ref:d};return t(f,()=>e(d?.currentElement??null)),c(f,s),f}function b(){return m(()=>(e,t,n)=>y(t,e,n),[])}const x=new WeakMap;function S(n,r,i){let{ref:s}=n;if(!s){let e={...n,ref:null};return t(e,()=>``),c(e,s),e}x.has(s)||x.set(s,new Map);let l=x.get(s),u=o(n.name,r);if(!l?.has(u)){let e=(t=>(e.currentElement=t,t&&a(t,r,i),s(t)));l?.set(u,e)}let d=l?.get(u),f={...n,ref:d};return t(f,()=>e(d?.currentElement??null)),c(f,s),f}export{s as formatWithMask,r as unformatWithMask,_ as useHookFormMask,g as useMaskInput,b as useTanStackFormMask,S as withHookFormMask,l as withMask,y as withTanStackFormMask};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["refCache"],"sources":["../src/api/useMaskInput.ts","../src/api/useHookFormMask.ts","../src/api/withTanStackFormMask.ts","../src/api/useTanStackFormMask.ts","../src/api/withHookFormMask.ts"],"sourcesContent":["import {\n useCallback, useEffect, useRef,\n} from 'react';\n\nimport { resolveInputRef } from '../core';\nimport withMask from './withMask';\nimport isServer from '../utils/isServer';\nimport { getUnmaskedValue, setUnmaskedValue } from '../utils';\n\nimport type {\n Input, Mask, Options, UseMaskInputReturn,\n} 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): UseMaskInputReturn {\n const { mask, register, options } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n const maskRef = useRef(mask);\n const optionsRef = useRef(options);\n const unmaskedValue = useCallback(() => getUnmaskedValue(ref.current), []);\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 const noop = (() => {\n // server doesn't have dom, so just do nothing\n }) as unknown as UseMaskInputReturn;\n\n return setUnmaskedValue(noop, () => '');\n }\n\n return setUnmaskedValue(refCallback, unmaskedValue);\n}\n","import { useLayoutEffect, useMemo, useRef } from 'react';\n\nimport { applyMaskToElement } from '../core';\nimport {\n flow, getUnmaskedValue, makeMaskCacheKey, setPrevRef, setUnmaskedValue,\n} 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\ninterface CacheEntry {\n stableRef: RefCallback<HTMLElement | null>;\n element: HTMLElement | null;\n latestRHFRef?: RefCallback<HTMLElement | null>;\n syncedRHFRef?: RefCallback<HTMLElement | null>;\n}\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 const entryCacheRef = useRef(new Map<string, CacheEntry>());\n\n useLayoutEffect(() => {\n entryCacheRef.current.forEach((entry) => {\n const currentEntry = entry;\n if (!currentEntry.element || !currentEntry.latestRHFRef) return;\n\n // After reset(), RHF gives us a new ref callback. React won't call it\n // because our outward ref identity stays stable, so we replay it here.\n if (currentEntry.latestRHFRef !== currentEntry.syncedRHFRef) {\n currentEntry.latestRHFRef(currentEntry.element);\n currentEntry.syncedRHFRef = currentEntry.latestRHFRef;\n }\n });\n });\n\n return useMemo(() => {\n // registerFn identity changed, so drop cached refs bound to the previous\n // register lifecycle.\n entryCacheRef.current = new Map<string, CacheEntry>();\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 let entry = entryCacheRef.current.get(cacheKey);\n if (!entry) {\n const nextEntry: CacheEntry = {\n element: null,\n latestRHFRef: ref,\n syncedRHFRef: undefined,\n stableRef: null as unknown as RefCallback<HTMLElement | null>,\n };\n\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n nextEntry.element = _ref;\n if (_ref) applyMaskToElement(_ref, mask, options as Options);\n return _ref;\n };\n\n nextEntry.stableRef = (\n nextEntry.latestRHFRef\n ? flow(applyMaskToRef, (_ref: HTMLElement | null) => nextEntry.latestRHFRef?.(_ref))\n : applyMaskToRef\n ) as RefCallback<HTMLElement | null>;\n\n entry = nextEntry;\n entryCacheRef.current.set(cacheKey, nextEntry);\n } else {\n entry.latestRHFRef = ref;\n }\n\n const result = {\n ...registerReturn,\n ref: entry.stableRef,\n } as UseHookFormMaskReturn<T>;\n setUnmaskedValue(result, () => getUnmaskedValue(entry?.element ?? null));\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","import { applyMaskToElement } from '../core';\nimport {\n getUnmaskedValue, makeMaskCacheKey, setPrevRef, setUnmaskedValue,\n} from '../utils';\n\nimport type { RefCallback } from 'react';\n\nimport type {\n Mask, Options, TanStackFormInputProps, UseTanStackFormMaskReturn,\n} from '../types';\n\ntype MaskedRefCallback = RefCallback<HTMLElement | null> & {\n currentElement?: HTMLElement | null;\n};\n\nconst refCache = new WeakMap<\n RefCallback<HTMLElement | null>,\n Map<string, RefCallback<HTMLElement | null>>\n>();\n\n/**\n * Enhances TanStack Form-compatible input props with mask support.\n * Works with objects returned by field.getInputProps().\n */\nexport default function withTanStackFormMask<T extends TanStackFormInputProps>(\n inputProps: T,\n mask: Mask,\n options?: Options,\n): UseTanStackFormMaskReturn<T> {\n const { ref } = inputProps;\n\n if (!ref) {\n let currentElement: HTMLElement | null = null;\n const result = {\n ...inputProps,\n ref: ((input: HTMLElement | null) => {\n currentElement = input;\n if (input) applyMaskToElement(input, mask, options);\n }) as RefCallback<HTMLElement | null>,\n } as unknown as UseTanStackFormMaskReturn<T>;\n setUnmaskedValue(result, () => getUnmaskedValue(currentElement));\n\n setPrevRef(result, ref);\n return result;\n }\n\n if (!refCache.has(ref)) {\n refCache.set(ref, new Map());\n }\n\n const maskCache = refCache.get(ref);\n const cacheKey = makeMaskCacheKey(inputProps.name ?? '', mask);\n\n if (!maskCache?.has(cacheKey)) {\n const maskedRef = ((input: HTMLElement | null) => {\n maskedRef.currentElement = input;\n if (input) applyMaskToElement(input, mask, options);\n ref(input);\n }) as MaskedRefCallback;\n\n maskCache?.set(cacheKey, maskedRef);\n }\n\n const maskedRef = maskCache?.get(cacheKey) as MaskedRefCallback | undefined;\n const result = {\n ...inputProps,\n ref: maskedRef,\n } as unknown as UseTanStackFormMaskReturn<T>;\n setUnmaskedValue(result, () => getUnmaskedValue(maskedRef?.currentElement ?? null));\n\n setPrevRef(result, ref);\n return result;\n}\n","import { useMemo } from 'react';\n\nimport withTanStackFormMask from './withTanStackFormMask';\n\nimport type { Mask, Options, TanStackFormInputProps, UseTanStackFormMaskReturn } from '../types';\n\n/**\n * Creates a helper to mask TanStack Form-compatible input props.\n * Designed for objects returned by field.getInputProps().\n */\nexport default function useTanStackFormMask(): <T extends TanStackFormInputProps>(\n mask: Mask,\n inputProps: T,\n options?: Options,\n) => UseTanStackFormMaskReturn<T> {\n return useMemo(\n () => <T extends TanStackFormInputProps>(\n mask: Mask,\n inputProps: T,\n options?: Options,\n ): UseTanStackFormMaskReturn<T> => withTanStackFormMask(inputProps, mask, options),\n [],\n );\n}\n","import { applyMaskToElement } from '../core';\nimport {\n getUnmaskedValue, makeMaskCacheKey, setPrevRef, setUnmaskedValue,\n} 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\ntype MaskedRefCallback = RefCallback<HTMLElement | null> & {\n currentElement?: HTMLElement | null;\n};\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 setUnmaskedValue(result, () => '');\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 maskedRef = ((input: HTMLElement | null) => {\n maskedRef.currentElement = input;\n if (input) applyMaskToElement(input, mask, options);\n return ref(input);\n }) as MaskedRefCallback;\n\n maskCache?.set(cacheKey, maskedRef);\n }\n\n const maskedRef = maskCache?.get(cacheKey) as MaskedRefCallback | undefined;\n const result = {\n ...register,\n ref: maskedRef,\n } as UseHookFormMaskReturn<FieldValues>;\n setUnmaskedValue(result, () => getUnmaskedValue(maskedRef?.currentElement ?? null));\n\n setPrevRef(result, ref);\n\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["refCache"],"sources":["../src/api/useMaskInput.ts","../src/api/useHookFormMask.ts","../src/api/withTanStackFormMask.ts","../src/api/useTanStackFormMask.ts","../src/api/withHookFormMask.ts"],"sourcesContent":["import {\n useCallback, useEffect, useRef,\n} from 'react';\n\nimport { resolveInputRef } from '../core';\nimport withMask from './withMask';\nimport isServer from '../utils/isServer';\nimport { getUnmaskedValue, setUnmaskedValue } from '../utils';\n\nimport type {\n Input, Mask, Options, UseMaskInputReturn,\n} 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): UseMaskInputReturn {\n const { mask, register, options } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n const maskRef = useRef(mask);\n const optionsRef = useRef(options);\n const unmaskedValue = useCallback(() => getUnmaskedValue(ref.current), []);\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 const noop = (() => {\n // server doesn't have dom, so just do nothing\n }) as unknown as UseMaskInputReturn;\n\n return setUnmaskedValue(noop, () => '');\n }\n\n return setUnmaskedValue(refCallback, unmaskedValue);\n}\n","import { useLayoutEffect, useMemo, useRef } from 'react';\n\nimport { applyMaskToElement } from '../core';\nimport {\n flow, getUnmaskedValue, makeMaskCacheKey, setPrevRef, setUnmaskedValue,\n} 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\ninterface CacheEntry {\n stableRef: RefCallback<HTMLElement | null>;\n element: HTMLElement | null;\n latestRHFRef?: RefCallback<HTMLElement | null>;\n syncedRHFRef?: RefCallback<HTMLElement | null>;\n}\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 const entryCacheRef = useRef(new Map<string, CacheEntry>());\n\n useLayoutEffect(() => {\n entryCacheRef.current.forEach((entry) => {\n const currentEntry = entry;\n if (!currentEntry.element || !currentEntry.latestRHFRef) return;\n\n // After reset(), RHF gives us a new ref callback. React won't call it\n // because our outward ref identity stays stable, so we replay it here.\n if (currentEntry.latestRHFRef !== currentEntry.syncedRHFRef) {\n currentEntry.latestRHFRef(currentEntry.element);\n currentEntry.syncedRHFRef = currentEntry.latestRHFRef;\n }\n });\n });\n\n return useMemo(() => {\n // registerFn identity changed, so drop cached refs bound to the previous\n // register lifecycle.\n entryCacheRef.current = new Map<string, CacheEntry>();\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 let entry = entryCacheRef.current.get(cacheKey);\n if (!entry) {\n const nextEntry: CacheEntry = {\n element: null,\n latestRHFRef: ref,\n syncedRHFRef: undefined,\n stableRef: null as unknown as RefCallback<HTMLElement | null>,\n };\n\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n nextEntry.element = _ref;\n if (_ref) applyMaskToElement(_ref, mask, options as Options);\n return _ref;\n };\n\n nextEntry.stableRef = (\n nextEntry.latestRHFRef\n ? flow(applyMaskToRef, (_ref: HTMLElement | null) => nextEntry.latestRHFRef?.(_ref))\n : applyMaskToRef\n ) as RefCallback<HTMLElement | null>;\n\n entry = nextEntry;\n entryCacheRef.current.set(cacheKey, nextEntry);\n } else {\n entry.latestRHFRef = ref;\n }\n\n const result = {\n ...registerReturn,\n ref: entry.stableRef,\n } as UseHookFormMaskReturn<T>;\n setUnmaskedValue(result, () => getUnmaskedValue(entry?.element ?? null));\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","import { applyMaskToElement } from '../core';\nimport {\n getUnmaskedValue, makeMaskCacheKey, setPrevRef, setUnmaskedValue,\n} from '../utils';\n\nimport type { RefCallback } from 'react';\n\nimport type {\n Mask, Options, TanStackFormInputProps, UseTanStackFormMaskReturn,\n} from '../types';\n\ntype MaskedRefCallback = RefCallback<HTMLElement | null> & {\n currentElement?: HTMLElement | null;\n};\n\nconst refCache = new WeakMap<\n RefCallback<HTMLElement | null>,\n Map<string, RefCallback<HTMLElement | null>>\n>();\n\n/**\n * Enhances TanStack Form-compatible input props with mask support.\n * Works with objects returned by field.getInputProps().\n */\nexport default function withTanStackFormMask<T extends TanStackFormInputProps>(\n inputProps: T,\n mask: Mask,\n options?: Options,\n): UseTanStackFormMaskReturn<T> {\n const { ref } = inputProps;\n\n if (!ref) {\n let currentElement: HTMLElement | null = null;\n const result = {\n ...inputProps,\n ref: ((input: HTMLElement | null) => {\n currentElement = input;\n if (input) applyMaskToElement(input, mask, options);\n }) as RefCallback<HTMLElement | null>,\n } as unknown as UseTanStackFormMaskReturn<T>;\n setUnmaskedValue(result, () => getUnmaskedValue(currentElement));\n\n setPrevRef(result, ref);\n return result;\n }\n\n if (!refCache.has(ref)) {\n refCache.set(ref, new Map());\n }\n\n const maskCache = refCache.get(ref);\n const cacheKey = makeMaskCacheKey(inputProps.name ?? '', mask);\n\n if (!maskCache?.has(cacheKey)) {\n const maskedRef = ((input: HTMLElement | null) => {\n maskedRef.currentElement = input;\n if (input) applyMaskToElement(input, mask, options);\n ref(input);\n }) as MaskedRefCallback;\n\n maskCache?.set(cacheKey, maskedRef);\n }\n\n const maskedRef = maskCache?.get(cacheKey) as MaskedRefCallback | undefined;\n const result = {\n ...inputProps,\n ref: maskedRef,\n } as unknown as UseTanStackFormMaskReturn<T>;\n setUnmaskedValue(result, () => getUnmaskedValue(maskedRef?.currentElement ?? null));\n\n setPrevRef(result, ref);\n return result;\n}\n","import { useMemo } from 'react';\n\nimport withTanStackFormMask from './withTanStackFormMask';\n\nimport type { Mask, Options, TanStackFormInputProps, UseTanStackFormMaskReturn } from '../types';\n\n/**\n * Creates a helper to mask TanStack Form-compatible input props.\n * Designed for objects returned by field.getInputProps().\n */\nexport default function useTanStackFormMask(): <T extends TanStackFormInputProps>(\n mask: Mask,\n inputProps: T,\n options?: Options,\n) => UseTanStackFormMaskReturn<T> {\n return useMemo(\n () => <T extends TanStackFormInputProps>(\n mask: Mask,\n inputProps: T,\n options?: Options,\n ): UseTanStackFormMaskReturn<T> => withTanStackFormMask(inputProps, mask, options),\n [],\n );\n}\n","import { applyMaskToElement } from '../core';\nimport {\n getUnmaskedValue, makeMaskCacheKey, setPrevRef, setUnmaskedValue,\n} 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\ntype MaskedRefCallback = RefCallback<HTMLElement | null> & {\n currentElement?: HTMLElement | null;\n};\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 setUnmaskedValue(result, () => '');\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 maskedRef = ((input: HTMLElement | null) => {\n maskedRef.currentElement = input;\n if (input) applyMaskToElement(input, mask, options);\n return ref(input);\n }) as MaskedRefCallback;\n\n maskCache?.set(cacheKey, maskedRef);\n }\n\n const maskedRef = maskCache?.get(cacheKey) as MaskedRefCallback | undefined;\n const result = {\n ...register,\n ref: maskedRef,\n } as UseHookFormMaskReturn<FieldValues>;\n setUnmaskedValue(result, () => getUnmaskedValue(maskedRef?.currentElement ?? null));\n\n setPrevRef(result, ref);\n\n return result;\n}\n"],"mappings":"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"}