use-mask-input 3.10.2 → 3.10.3

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,20 @@
1
+ ## 3.10.3
2
+
3
+ ### Patch Changes
4
+
5
+ - f20a510: Improve TypeScript types around TanStack Form and the masked element.
6
+
7
+ - `TanStackFormInputProps` now declares `value`, `onChange`, and `onBlur`
8
+ explicitly, so the inline `onChange: (event) => field.handleChange(event.target.value)`
9
+ handler infers `event` as a `ChangeEvent<HTMLInputElement>` instead of an
10
+ implicit `any` under `noImplicitAny` (fixes #183).
11
+ - Declare the `inputmask` instance property on `HTMLInputElement` and
12
+ `HTMLTextAreaElement` so `unmaskedValue()` reads are fully typed.
13
+
14
+ - 6b38852: Widen `TanStackFormInputProps.onChange`/`onBlur` to accept `HTMLTextAreaElement` in addition to `HTMLInputElement`.
15
+
16
+ `use-mask-input` supports masking `<textarea>` elements, but #184 pinned the TanStack Form `onChange`/`onBlur` event types to `ChangeEvent<HTMLInputElement>`/`FocusEvent<HTMLInputElement>` only. That broke consumers masking a `<textarea>` field who explicitly annotate their handler as `ChangeEvent<HTMLTextAreaElement>`, and mistyped the event for anyone relying on inline (unannotated) handlers rendering a `<textarea>`. The event types are now `ChangeEvent<HTMLInputElement | HTMLTextAreaElement>` / `FocusEvent<HTMLInputElement | HTMLTextAreaElement>`.
17
+
1
18
  ## 3.10.2
2
19
 
3
20
  ### Patch Changes
package/dist/antd.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./withMask-VWeBqi_u.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-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;
2
2
  //# sourceMappingURL=antd.cjs.map
package/dist/antd.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"antd.cjs","names":["makeMaskCacheKey","resolveInputRef","getUnmaskedValue","resolveInputRef","isServer","setUnmaskedValue"],"sources":["../src/antd/useHookFormMaskAntd.ts","../src/antd/useMaskInputAntd.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { applyMaskToElement, resolveInputRef } from '../core';\nimport { makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { InputRef } from 'antd';\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\nexport type UseHookFormMaskAntdReturn<T extends FieldValues> = Omit<\n UseHookFormMaskReturn<T>,\n 'ref'\n> & { ref: RefCallback<InputRef | null> };\n\n/**\n * Ant Design version of useHookFormMask.\n * Creates a masked register that works with Ant Design Input (ref receives InputRef).\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 for Ant Design Input\n */\nexport default function useHookFormMaskAntd<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskAntdReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<InputRef | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskAntdReturn<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 refWithMask: RefCallback<InputRef | null> = (inputRef) => {\n const element = inputRef ? resolveInputRef(inputRef.input) : null;\n if (element) applyMaskToElement(element, mask, options as Options);\n if (ref) ref(element);\n };\n refCache.set(cacheKey, refWithMask);\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskAntdReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","import { useCallback, useEffect, useRef } from 'react';\n\nimport withMask from '../api/withMask';\nimport { resolveInputRef } from '../core';\nimport isServer from '../utils/isServer';\nimport { getUnmaskedValue, setUnmaskedValue } from '../utils';\n\nimport type { InputRef } from 'antd';\n\nimport type { Mask, Options, UnmaskedValueApi } from '../types';\n\ntype UseMaskInputAntdReturn = ((input: InputRef | null) => void) & UnmaskedValueApi;\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 Ant Design form elements.\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 Ant Design Input element\n */\nexport default function useMaskInputAntd(props: UseMaskInputOptions): UseMaskInputAntdReturn {\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 maskedElementRef = useRef<HTMLInputElement | null>(null);\n const unmaskedValue = useCallback(() => getUnmaskedValue(ref.current), []);\n\n maskRef.current = mask;\n optionsRef.current = options;\n\n const refCallback = useCallback((input: InputRef | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input.input);\n\n if (ref.current && ref.current !== maskedElementRef.current) {\n withMask(maskRef.current, optionsRef.current)(ref.current);\n maskedElementRef.current = ref.current;\n }\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 UseMaskInputAntdReturn;\n\n return setUnmaskedValue(noop, () => '');\n }\n\n return setUnmaskedValue(refCallback as UseMaskInputAntdReturn, unmaskedValue);\n}\n"],"mappings":"qIA6BA,SAAwB,EAEtB,EAC6D,CAE7D,OAAA,EAAA,EAAA,aAAqB,CACnB,IAAM,EAAW,IAAI,IAErB,OAAQ,EAAoB,EAAY,IACuB,CAC7D,GAAI,CAAC,EAAY,MAAU,MAAM,wBAAwB,EAEzD,IAAM,EAAiB,EAAW,EAAW,CAAkB,EACzD,CAAE,OAAQ,EAEV,EAAWA,EAAAA,EAAiB,EAAW,CAAI,EAE5C,EAAS,IAAI,CAAQ,GAMxB,EAAS,IAAI,EALsC,GAAa,CAC9D,IAAM,EAAU,EAAWC,EAAAA,EAAgB,EAAS,KAAK,EAAI,KACzD,GAAS,EAAA,EAAmB,EAAS,EAAM,CAAkB,EAC7D,GAAK,EAAI,CAAO,CACtB,CACkC,EAGpC,IAAM,EAAS,CACb,GAAG,EACH,IAAK,EAAS,IAAI,CAAQ,CAC5B,EAIA,OAFA,EAAA,EAAW,EAAQ,CAAG,EAEf,CACT,CACF,EAAG,CAAC,CAAU,CAAC,CACjB,CCrCA,SAAwB,EAAiB,EAAoD,CAC3F,GAAM,CAAE,OAAM,WAAU,WAAY,EAC9B,GAAA,EAAA,EAAA,QAAsC,IAAI,EAC1C,GAAA,EAAA,EAAA,QAAiB,CAAI,EACrB,GAAA,EAAA,EAAA,QAAoB,CAAO,EAC3B,GAAA,EAAA,EAAA,QAAmD,IAAI,EACvD,GAAA,EAAA,EAAA,iBAAkCC,EAAAA,EAAiB,EAAI,OAAO,EAAG,CAAC,CAAC,EAEzE,EAAQ,QAAU,EAClB,EAAW,QAAU,EAErB,IAAM,GAAA,EAAA,EAAA,aAA2B,GAAiC,CAChE,GAAI,CAAC,EAAO,CACV,EAAI,QAAU,KACd,MACF,CAEA,EAAI,QAAUC,EAAAA,EAAgB,EAAM,KAAK,EAErC,EAAI,SAAW,EAAI,UAAY,EAAiB,UAClD,EAAA,EAAS,EAAQ,QAAS,EAAW,OAAO,EAAE,EAAI,OAAO,EACzD,EAAiB,QAAU,EAAI,QAEnC,EAAG,CAAC,CAAC,EAeL,OAbA,EAAA,EAAA,eAAgB,CACVC,EAAAA,GAAY,CAAC,EAAI,SAAW,CAAC,GACjC,EAAS,EAAI,OAAO,CACtB,EAAG,CAAC,CAAQ,CAAC,EAETA,EAAAA,EAKKC,EAAAA,OAJa,CAEpB,OAEoC,EAAE,EAGjCA,EAAAA,EAAiB,EAAuC,CAAa,CAC9E"}
1
+ {"version":3,"file":"antd.cjs","names":["makeMaskCacheKey","resolveInputRef","getUnmaskedValue","resolveInputRef","isServer","setUnmaskedValue"],"sources":["../src/antd/useHookFormMaskAntd.ts","../src/antd/useMaskInputAntd.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { applyMaskToElement, resolveInputRef } from '../core';\nimport { makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { InputRef } from 'antd';\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\nexport type UseHookFormMaskAntdReturn<T extends FieldValues> = Omit<\n UseHookFormMaskReturn<T>,\n 'ref'\n> & { ref: RefCallback<InputRef | null> };\n\n/**\n * Ant Design version of useHookFormMask.\n * Creates a masked register that works with Ant Design Input (ref receives InputRef).\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 for Ant Design Input\n */\nexport default function useHookFormMaskAntd<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskAntdReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<InputRef | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskAntdReturn<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 refWithMask: RefCallback<InputRef | null> = (inputRef) => {\n const element = inputRef ? resolveInputRef(inputRef.input) : null;\n if (element) applyMaskToElement(element, mask, options as Options);\n if (ref) ref(element);\n };\n refCache.set(cacheKey, refWithMask);\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskAntdReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","import { useCallback, useEffect, useRef } from 'react';\n\nimport withMask from '../api/withMask';\nimport { resolveInputRef } from '../core';\nimport isServer from '../utils/isServer';\nimport { getUnmaskedValue, setUnmaskedValue } from '../utils';\n\nimport type { InputRef } from 'antd';\n\nimport type { Mask, Options, UnmaskedValueApi } from '../types';\n\ntype UseMaskInputAntdReturn = ((input: InputRef | null) => void) & UnmaskedValueApi;\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 Ant Design form elements.\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 Ant Design Input element\n */\nexport default function useMaskInputAntd(props: UseMaskInputOptions): UseMaskInputAntdReturn {\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 maskedElementRef = useRef<HTMLInputElement | null>(null);\n const unmaskedValue = useCallback(() => getUnmaskedValue(ref.current), []);\n\n maskRef.current = mask;\n optionsRef.current = options;\n\n const refCallback = useCallback((input: InputRef | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input.input);\n\n if (ref.current && ref.current !== maskedElementRef.current) {\n withMask(maskRef.current, optionsRef.current)(ref.current);\n maskedElementRef.current = ref.current;\n }\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 UseMaskInputAntdReturn;\n\n return setUnmaskedValue(noop, () => '');\n }\n\n return setUnmaskedValue(refCallback as UseMaskInputAntdReturn, unmaskedValue);\n}\n"],"mappings":"qIA6BA,SAAwB,EAEtB,EAC6D,CAE7D,OAAA,EAAA,EAAA,QAAA,KAAqB,CACnB,IAAM,EAAW,IAAI,IAErB,OAAQ,EAAoB,EAAY,IACuB,CAC7D,GAAI,CAAC,EAAY,MAAU,MAAM,wBAAwB,EAEzD,IAAM,EAAiB,EAAW,EAAW,CAAkB,EACzD,CAAE,OAAQ,EAEV,EAAWA,EAAAA,EAAiB,EAAW,CAAI,EAE5C,EAAS,IAAI,CAAQ,GAMxB,EAAS,IAAI,EALsC,GAAa,CAC9D,IAAM,EAAU,EAAWC,EAAAA,EAAgB,EAAS,KAAK,EAAI,KACzD,GAAS,EAAA,EAAmB,EAAS,EAAM,CAAkB,EAC7D,GAAK,EAAI,CAAO,CACtB,CACkC,EAGpC,IAAM,EAAS,CACb,GAAG,EACH,IAAK,EAAS,IAAI,CAAQ,CAC5B,EAIA,OAFA,EAAA,EAAW,EAAQ,CAAG,EAEf,CACT,CACF,EAAG,CAAC,CAAU,CAAC,CACjB,CCrCA,SAAwB,EAAiB,EAAoD,CAC3F,GAAM,CAAE,OAAM,WAAU,WAAY,EAC9B,GAAA,EAAA,EAAA,OAAA,CAAsC,IAAI,EAC1C,GAAA,EAAA,EAAA,OAAA,CAAiB,CAAI,EACrB,GAAA,EAAA,EAAA,OAAA,CAAoB,CAAO,EAC3B,GAAA,EAAA,EAAA,OAAA,CAAmD,IAAI,EACvD,GAAA,EAAA,EAAA,YAAA,KAAkCC,EAAAA,EAAiB,EAAI,OAAO,EAAG,CAAC,CAAC,EAEzE,EAAQ,QAAU,EAClB,EAAW,QAAU,EAErB,IAAM,GAAA,EAAA,EAAA,YAAA,CAA2B,GAAiC,CAChE,GAAI,CAAC,EAAO,CACV,EAAI,QAAU,KACd,MACF,CAEA,EAAI,QAAUC,EAAAA,EAAgB,EAAM,KAAK,EAErC,EAAI,SAAW,EAAI,UAAY,EAAiB,UAClD,EAAA,EAAS,EAAQ,QAAS,EAAW,OAAO,CAAC,CAAC,EAAI,OAAO,EACzD,EAAiB,QAAU,EAAI,QAEnC,EAAG,CAAC,CAAC,EAeL,OAbA,EAAA,EAAA,UAAA,KAAgB,CACVC,EAAAA,GAAY,CAAC,EAAI,SAAW,CAAC,GACjC,EAAS,EAAI,OAAO,CACtB,EAAG,CAAC,CAAQ,CAAC,EAETA,EAAAA,EAKKC,EAAAA,OAJa,CAEpB,OAEoC,EAAE,EAGjCA,EAAAA,EAAiB,EAAuC,CAAa,CAC9E"}
package/dist/antd.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as UnmaskedValueApi, d as UseFormRegister, l as RegisterOptions, n as Mask, o as UseHookFormMaskReturn, p as Path, r as Options, u as FieldValues } from "./index-BmKzoe0X.cjs";
1
+ import { a as UnmaskedValueApi, d as UseFormRegister, l as RegisterOptions, n as Mask, o as UseHookFormMaskReturn, p as Path, r as Options, u as FieldValues } from "./index-Do9euvWK.cjs";
2
2
  import { InputRef } from "antd";
3
3
  import { RefCallback } from "react";
4
4
 
package/dist/antd.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as UnmaskedValueApi, d as UseFormRegister, l as RegisterOptions, n as Mask, o as UseHookFormMaskReturn, p as Path, r as Options, u as FieldValues } from "./index-BmKzoe0X.mjs";
1
+ import { a as UnmaskedValueApi, d as UseFormRegister, l as RegisterOptions, n as Mask, o as UseHookFormMaskReturn, p as Path, r as Options, u as FieldValues } from "./index-Do9euvWK.mjs";
2
2
  import { RefCallback } from "react";
3
3
  import { InputRef } from "antd";
4
4
 
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-jrErtLYS.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,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};
2
2
  //# sourceMappingURL=antd.mjs.map
package/dist/antd.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"antd.mjs","names":[],"sources":["../src/antd/useHookFormMaskAntd.ts","../src/antd/useMaskInputAntd.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { applyMaskToElement, resolveInputRef } from '../core';\nimport { makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { InputRef } from 'antd';\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\nexport type UseHookFormMaskAntdReturn<T extends FieldValues> = Omit<\n UseHookFormMaskReturn<T>,\n 'ref'\n> & { ref: RefCallback<InputRef | null> };\n\n/**\n * Ant Design version of useHookFormMask.\n * Creates a masked register that works with Ant Design Input (ref receives InputRef).\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 for Ant Design Input\n */\nexport default function useHookFormMaskAntd<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskAntdReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<InputRef | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskAntdReturn<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 refWithMask: RefCallback<InputRef | null> = (inputRef) => {\n const element = inputRef ? resolveInputRef(inputRef.input) : null;\n if (element) applyMaskToElement(element, mask, options as Options);\n if (ref) ref(element);\n };\n refCache.set(cacheKey, refWithMask);\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskAntdReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","import { useCallback, useEffect, useRef } from 'react';\n\nimport withMask from '../api/withMask';\nimport { resolveInputRef } from '../core';\nimport isServer from '../utils/isServer';\nimport { getUnmaskedValue, setUnmaskedValue } from '../utils';\n\nimport type { InputRef } from 'antd';\n\nimport type { Mask, Options, UnmaskedValueApi } from '../types';\n\ntype UseMaskInputAntdReturn = ((input: InputRef | null) => void) & UnmaskedValueApi;\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 Ant Design form elements.\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 Ant Design Input element\n */\nexport default function useMaskInputAntd(props: UseMaskInputOptions): UseMaskInputAntdReturn {\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 maskedElementRef = useRef<HTMLInputElement | null>(null);\n const unmaskedValue = useCallback(() => getUnmaskedValue(ref.current), []);\n\n maskRef.current = mask;\n optionsRef.current = options;\n\n const refCallback = useCallback((input: InputRef | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input.input);\n\n if (ref.current && ref.current !== maskedElementRef.current) {\n withMask(maskRef.current, optionsRef.current)(ref.current);\n maskedElementRef.current = ref.current;\n }\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 UseMaskInputAntdReturn;\n\n return setUnmaskedValue(noop, () => '');\n }\n\n return setUnmaskedValue(refCallback as UseMaskInputAntdReturn, unmaskedValue);\n}\n"],"mappings":"yKA6BA,SAAwB,EAEtB,EAC6D,CAE7D,OAAO,MAAc,CACnB,IAAM,EAAW,IAAI,IAErB,OAAQ,EAAoB,EAAY,IACuB,CAC7D,GAAI,CAAC,EAAY,MAAU,MAAM,wBAAwB,EAEzD,IAAM,EAAiB,EAAW,EAAW,CAAkB,EACzD,CAAE,OAAQ,EAEV,EAAW,EAAiB,EAAW,CAAI,EAE5C,EAAS,IAAI,CAAQ,GAMxB,EAAS,IAAI,EALsC,GAAa,CAC9D,IAAM,EAAU,EAAW,EAAgB,EAAS,KAAK,EAAI,KACzD,GAAS,EAAmB,EAAS,EAAM,CAAkB,EAC7D,GAAK,EAAI,CAAO,CACtB,CACkC,EAGpC,IAAM,EAAS,CACb,GAAG,EACH,IAAK,EAAS,IAAI,CAAQ,CAC5B,EAIA,OAFA,EAAW,EAAQ,CAAG,EAEf,CACT,CACF,EAAG,CAAC,CAAU,CAAC,CACjB,CCrCA,SAAwB,EAAiB,EAAoD,CAC3F,GAAM,CAAE,OAAM,WAAU,WAAY,EAC9B,EAAM,EAAgC,IAAI,EAC1C,EAAU,EAAO,CAAI,EACrB,EAAa,EAAO,CAAO,EAC3B,EAAmB,EAAgC,IAAI,EACvD,EAAgB,MAAkB,EAAiB,EAAI,OAAO,EAAG,CAAC,CAAC,EAEzE,EAAQ,QAAU,EAClB,EAAW,QAAU,EAErB,IAAM,EAAc,EAAa,GAAiC,CAChE,GAAI,CAAC,EAAO,CACV,EAAI,QAAU,KACd,MACF,CAEA,EAAI,QAAU,EAAgB,EAAM,KAAK,EAErC,EAAI,SAAW,EAAI,UAAY,EAAiB,UAClD,EAAS,EAAQ,QAAS,EAAW,OAAO,EAAE,EAAI,OAAO,EACzD,EAAiB,QAAU,EAAI,QAEnC,EAAG,CAAC,CAAC,EAeL,OAbA,MAAgB,CACV,GAAY,CAAC,EAAI,SAAW,CAAC,GACjC,EAAS,EAAI,OAAO,CACtB,EAAG,CAAC,CAAQ,CAAC,EAET,EAKK,OAJa,CAEpB,OAEoC,EAAE,EAGjC,EAAiB,EAAuC,CAAa,CAC9E"}
1
+ {"version":3,"file":"antd.mjs","names":[],"sources":["../src/antd/useHookFormMaskAntd.ts","../src/antd/useMaskInputAntd.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { applyMaskToElement, resolveInputRef } from '../core';\nimport { makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { InputRef } from 'antd';\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\nexport type UseHookFormMaskAntdReturn<T extends FieldValues> = Omit<\n UseHookFormMaskReturn<T>,\n 'ref'\n> & { ref: RefCallback<InputRef | null> };\n\n/**\n * Ant Design version of useHookFormMask.\n * Creates a masked register that works with Ant Design Input (ref receives InputRef).\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 for Ant Design Input\n */\nexport default function useHookFormMaskAntd<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskAntdReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<InputRef | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskAntdReturn<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 refWithMask: RefCallback<InputRef | null> = (inputRef) => {\n const element = inputRef ? resolveInputRef(inputRef.input) : null;\n if (element) applyMaskToElement(element, mask, options as Options);\n if (ref) ref(element);\n };\n refCache.set(cacheKey, refWithMask);\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskAntdReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","import { useCallback, useEffect, useRef } from 'react';\n\nimport withMask from '../api/withMask';\nimport { resolveInputRef } from '../core';\nimport isServer from '../utils/isServer';\nimport { getUnmaskedValue, setUnmaskedValue } from '../utils';\n\nimport type { InputRef } from 'antd';\n\nimport type { Mask, Options, UnmaskedValueApi } from '../types';\n\ntype UseMaskInputAntdReturn = ((input: InputRef | null) => void) & UnmaskedValueApi;\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 Ant Design form elements.\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 Ant Design Input element\n */\nexport default function useMaskInputAntd(props: UseMaskInputOptions): UseMaskInputAntdReturn {\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 maskedElementRef = useRef<HTMLInputElement | null>(null);\n const unmaskedValue = useCallback(() => getUnmaskedValue(ref.current), []);\n\n maskRef.current = mask;\n optionsRef.current = options;\n\n const refCallback = useCallback((input: InputRef | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input.input);\n\n if (ref.current && ref.current !== maskedElementRef.current) {\n withMask(maskRef.current, optionsRef.current)(ref.current);\n maskedElementRef.current = ref.current;\n }\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 UseMaskInputAntdReturn;\n\n return setUnmaskedValue(noop, () => '');\n }\n\n return setUnmaskedValue(refCallback as UseMaskInputAntdReturn, unmaskedValue);\n}\n"],"mappings":"yKA6BA,SAAwB,EAEtB,EAC6D,CAE7D,OAAO,MAAc,CACnB,IAAM,EAAW,IAAI,IAErB,OAAQ,EAAoB,EAAY,IACuB,CAC7D,GAAI,CAAC,EAAY,MAAU,MAAM,wBAAwB,EAEzD,IAAM,EAAiB,EAAW,EAAW,CAAkB,EACzD,CAAE,OAAQ,EAEV,EAAW,EAAiB,EAAW,CAAI,EAE5C,EAAS,IAAI,CAAQ,GAMxB,EAAS,IAAI,EALsC,GAAa,CAC9D,IAAM,EAAU,EAAW,EAAgB,EAAS,KAAK,EAAI,KACzD,GAAS,EAAmB,EAAS,EAAM,CAAkB,EAC7D,GAAK,EAAI,CAAO,CACtB,CACkC,EAGpC,IAAM,EAAS,CACb,GAAG,EACH,IAAK,EAAS,IAAI,CAAQ,CAC5B,EAIA,OAFA,EAAW,EAAQ,CAAG,EAEf,CACT,CACF,EAAG,CAAC,CAAU,CAAC,CACjB,CCrCA,SAAwB,EAAiB,EAAoD,CAC3F,GAAM,CAAE,OAAM,WAAU,WAAY,EAC9B,EAAM,EAAgC,IAAI,EAC1C,EAAU,EAAO,CAAI,EACrB,EAAa,EAAO,CAAO,EAC3B,EAAmB,EAAgC,IAAI,EACvD,EAAgB,MAAkB,EAAiB,EAAI,OAAO,EAAG,CAAC,CAAC,EAEzE,EAAQ,QAAU,EAClB,EAAW,QAAU,EAErB,IAAM,EAAc,EAAa,GAAiC,CAChE,GAAI,CAAC,EAAO,CACV,EAAI,QAAU,KACd,MACF,CAEA,EAAI,QAAU,EAAgB,EAAM,KAAK,EAErC,EAAI,SAAW,EAAI,UAAY,EAAiB,UAClD,EAAS,EAAQ,QAAS,EAAW,OAAO,CAAC,CAAC,EAAI,OAAO,EACzD,EAAiB,QAAU,EAAI,QAEnC,EAAG,CAAC,CAAC,EAeL,OAbA,MAAgB,CACV,GAAY,CAAC,EAAI,SAAW,CAAC,GACjC,EAAS,EAAI,OAAO,CACtB,EAAG,CAAC,CAAQ,CAAC,EAET,EAKK,OAJa,CAEpB,OAEoC,EAAE,EAGjC,EAAiB,EAAuC,CAAa,CAC9E"}
@@ -1,6 +1,6 @@
1
- import { RefCallback } from "react";
1
+ import { ChangeEvent, FocusEvent, RefCallback } from "react";
2
2
 
3
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/path/common.d.ts
3
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/path/common.d.ts
4
4
  /**
5
5
  * Type to query whether an array type T is a tuple type.
6
6
  * @typeParam T - type which may be an array or tuple
@@ -25,7 +25,7 @@ type ArrayKey = number;
25
25
  */
26
26
  type TupleKeys<T extends ReadonlyArray<any>> = Exclude<keyof T, keyof any[]>;
27
27
  //#endregion
28
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/path/eager.d.ts
28
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/path/eager.d.ts
29
29
  /**
30
30
  * Helper function to break apart T1 and check if any are equal to T2
31
31
  *
@@ -102,7 +102,7 @@ type PathValueImpl<T, P extends string> = T extends any ? P extends `${infer K}.
102
102
  */
103
103
  type FieldPathValue<TFieldValues extends FieldValues, TFieldPath extends FieldPath<TFieldValues>> = PathValue<TFieldValues, TFieldPath>;
104
104
  //#endregion
105
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/form.d.ts
105
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/form.d.ts
106
106
  type ChangeHandler = (event: {
107
107
  target: any;
108
108
  type?: any;
@@ -156,7 +156,7 @@ type UseFormRegisterReturn<TFieldName extends InternalFieldName = InternalFieldN
156
156
  */
157
157
  type UseFormRegister<TFieldValues extends FieldValues> = <TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>(name: TFieldName, options?: RegisterOptions<TFieldValues, TFieldName>) => UseFormRegisterReturn<TFieldName>;
158
158
  //#endregion
159
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/utils.d.ts
159
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/utils.d.ts
160
160
  interface File extends Blob {
161
161
  readonly lastModified: number;
162
162
  readonly name: string;
@@ -194,14 +194,14 @@ type IsAny<T> = 0 extends 1 & T ? true : false;
194
194
  */
195
195
  type IsEqual<T1, T2> = T1 extends T2 ? (<G>() => G extends T1 ? 1 : 2) extends (<G>() => G extends T2 ? 1 : 2) ? true : false : false;
196
196
  //#endregion
197
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/fields.d.ts
197
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/fields.d.ts
198
198
  type InternalFieldName = string;
199
199
  type FieldValues = Record<string, any>;
200
200
  //#endregion
201
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/errors.d.ts
201
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/errors.d.ts
202
202
  type Message = string;
203
203
  //#endregion
204
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/validator.d.ts
204
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/validator.d.ts
205
205
  type ValidationValue = boolean | number | string | RegExp;
206
206
  type ValidationRule<TValidationValue extends ValidationValue = ValidationValue> = TValidationValue | ValidationValueMessage<TValidationValue>;
207
207
  type ValidationValueMessage<TValidationValue extends ValidationValue = ValidationValue> = {
@@ -824,7 +824,10 @@ interface UseHookFormMaskReturn<T extends FieldValues> extends UseFormRegisterRe
824
824
  }
825
825
  interface TanStackFormInputProps {
826
826
  name?: string;
827
+ value?: string | number | readonly string[];
827
828
  ref?: RefCallback<HTMLElement | null>;
829
+ onChange?(event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>): void;
830
+ onBlur?(event: FocusEvent<HTMLInputElement | HTMLTextAreaElement>): void;
828
831
  [key: string]: unknown;
829
832
  }
830
833
  type UseTanStackFormMaskReturn<T extends TanStackFormInputProps = TanStackFormInputProps> = Omit<T, 'ref'> & {
@@ -833,4 +836,4 @@ type UseTanStackFormMaskReturn<T extends TanStackFormInputProps = TanStackFormIn
833
836
  } & UnmaskedValueApi;
834
837
  //#endregion
835
838
  export { UnmaskedValueApi as a, UseTanStackFormMaskReturn as c, UseFormRegister as d, UseFormRegisterReturn as f, TanStackFormInputProps as i, RegisterOptions as l, Mask as n, UseHookFormMaskReturn as o, Path as p, Options as r, UseMaskInputReturn as s, Input as t, FieldValues as u };
836
- //# sourceMappingURL=index-BmKzoe0X.d.cts.map
839
+ //# sourceMappingURL=index-Do9euvWK.d.cts.map
@@ -1,6 +1,6 @@
1
- import { RefCallback } from "react";
1
+ import { ChangeEvent, FocusEvent, RefCallback } from "react";
2
2
 
3
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/path/common.d.ts
3
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/path/common.d.ts
4
4
  /**
5
5
  * Type to query whether an array type T is a tuple type.
6
6
  * @typeParam T - type which may be an array or tuple
@@ -25,7 +25,7 @@ type ArrayKey = number;
25
25
  */
26
26
  type TupleKeys<T extends ReadonlyArray<any>> = Exclude<keyof T, keyof any[]>;
27
27
  //#endregion
28
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/path/eager.d.ts
28
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/path/eager.d.ts
29
29
  /**
30
30
  * Helper function to break apart T1 and check if any are equal to T2
31
31
  *
@@ -102,7 +102,7 @@ type PathValueImpl<T, P extends string> = T extends any ? P extends `${infer K}.
102
102
  */
103
103
  type FieldPathValue<TFieldValues extends FieldValues, TFieldPath extends FieldPath<TFieldValues>> = PathValue<TFieldValues, TFieldPath>;
104
104
  //#endregion
105
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/form.d.ts
105
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/form.d.ts
106
106
  type ChangeHandler = (event: {
107
107
  target: any;
108
108
  type?: any;
@@ -156,7 +156,7 @@ type UseFormRegisterReturn<TFieldName extends InternalFieldName = InternalFieldN
156
156
  */
157
157
  type UseFormRegister<TFieldValues extends FieldValues> = <TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>(name: TFieldName, options?: RegisterOptions<TFieldValues, TFieldName>) => UseFormRegisterReturn<TFieldName>;
158
158
  //#endregion
159
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/utils.d.ts
159
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/utils.d.ts
160
160
  interface File extends Blob {
161
161
  readonly lastModified: number;
162
162
  readonly name: string;
@@ -194,14 +194,14 @@ type IsAny<T> = 0 extends 1 & T ? true : false;
194
194
  */
195
195
  type IsEqual<T1, T2> = T1 extends T2 ? (<G>() => G extends T1 ? 1 : 2) extends (<G>() => G extends T2 ? 1 : 2) ? true : false : false;
196
196
  //#endregion
197
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/fields.d.ts
197
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/fields.d.ts
198
198
  type InternalFieldName = string;
199
199
  type FieldValues = Record<string, any>;
200
200
  //#endregion
201
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/errors.d.ts
201
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/errors.d.ts
202
202
  type Message = string;
203
203
  //#endregion
204
- //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.6/node_modules/react-hook-form/dist/types/validator.d.ts
204
+ //#region ../../node_modules/.pnpm/react-hook-form@7.75.0_react@19.2.7/node_modules/react-hook-form/dist/types/validator.d.ts
205
205
  type ValidationValue = boolean | number | string | RegExp;
206
206
  type ValidationRule<TValidationValue extends ValidationValue = ValidationValue> = TValidationValue | ValidationValueMessage<TValidationValue>;
207
207
  type ValidationValueMessage<TValidationValue extends ValidationValue = ValidationValue> = {
@@ -824,7 +824,10 @@ interface UseHookFormMaskReturn<T extends FieldValues> extends UseFormRegisterRe
824
824
  }
825
825
  interface TanStackFormInputProps {
826
826
  name?: string;
827
+ value?: string | number | readonly string[];
827
828
  ref?: RefCallback<HTMLElement | null>;
829
+ onChange?(event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>): void;
830
+ onBlur?(event: FocusEvent<HTMLInputElement | HTMLTextAreaElement>): void;
828
831
  [key: string]: unknown;
829
832
  }
830
833
  type UseTanStackFormMaskReturn<T extends TanStackFormInputProps = TanStackFormInputProps> = Omit<T, 'ref'> & {
@@ -833,4 +836,4 @@ type UseTanStackFormMaskReturn<T extends TanStackFormInputProps = TanStackFormIn
833
836
  } & UnmaskedValueApi;
834
837
  //#endregion
835
838
  export { UnmaskedValueApi as a, UseTanStackFormMaskReturn as c, UseFormRegister as d, UseFormRegisterReturn as f, TanStackFormInputProps as i, RegisterOptions as l, Mask as n, UseHookFormMaskReturn as o, Path as p, Options as r, UseMaskInputReturn as s, Input as t, FieldValues as u };
836
- //# sourceMappingURL=index-BmKzoe0X.d.mts.map
839
+ //# sourceMappingURL=index-Do9euvWK.d.mts.map
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./withMask-VWeBqi_u.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-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;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["getUnmaskedValue","resolveInputRef","isServer","setUnmaskedValue","makeMaskCacheKey","flow","getUnmaskedValue","refCache","getUnmaskedValue","makeMaskCacheKey","makeMaskCacheKey","getUnmaskedValue"],"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.cjs","names":["getUnmaskedValue","resolveInputRef","isServer","setUnmaskedValue","makeMaskCacheKey","flow","getUnmaskedValue","refCache","getUnmaskedValue","makeMaskCacheKey","makeMaskCacheKey","getUnmaskedValue"],"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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"}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as UnmaskedValueApi, c as UseTanStackFormMaskReturn, d as UseFormRegister, f as UseFormRegisterReturn, i as TanStackFormInputProps, l as RegisterOptions, n as Mask, o as UseHookFormMaskReturn, p as Path, r as Options, s as UseMaskInputReturn, t as Input, u as FieldValues } from "./index-BmKzoe0X.cjs";
1
+ import { a as UnmaskedValueApi, c as UseTanStackFormMaskReturn, d as UseFormRegister, f as UseFormRegisterReturn, i as TanStackFormInputProps, l as RegisterOptions, n as Mask, o as UseHookFormMaskReturn, p as Path, r as Options, s as UseMaskInputReturn, t as Input, u as FieldValues } from "./index-Do9euvWK.cjs";
2
2
 
3
3
  //#region src/api/useMaskInput.d.ts
4
4
  interface UseMaskInputOptions {
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as UnmaskedValueApi, c as UseTanStackFormMaskReturn, d as UseFormRegister, f as UseFormRegisterReturn, i as TanStackFormInputProps, l as RegisterOptions, n as Mask, o as UseHookFormMaskReturn, p as Path, r as Options, s as UseMaskInputReturn, t as Input, u as FieldValues } from "./index-BmKzoe0X.mjs";
1
+ import { a as UnmaskedValueApi, c as UseTanStackFormMaskReturn, d as UseFormRegister, f as UseFormRegisterReturn, i as TanStackFormInputProps, l as RegisterOptions, n as Mask, o as UseHookFormMaskReturn, p as Path, r as Options, s as UseMaskInputReturn, t as Input, u as FieldValues } from "./index-Do9euvWK.mjs";
2
2
 
3
3
  //#region src/api/useMaskInput.d.ts
4
4
  interface UseMaskInputOptions {
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-jrErtLYS.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,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};
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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"}