{"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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"}