@buildnbuzz/buzzform 0.1.4 → 0.1.6
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/dist/{adapter-u4raoNx9.d.mts → adapter-CpEUN0gt.d.mts} +4 -4
- package/dist/{adapter-u4raoNx9.d.ts → adapter-CpEUN0gt.d.ts} +4 -4
- package/dist/{chunk-ATZ2HTUS.mjs → chunk-HF6HN7X5.mjs} +5 -5
- package/dist/chunk-HF6HN7X5.mjs.map +1 -0
- package/dist/{chunk-IMJ5FRK5.mjs → chunk-VXG7KGOZ.mjs} +20 -14
- package/dist/chunk-VXG7KGOZ.mjs.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +23 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/rhf.d.mts +1 -1
- package/dist/rhf.d.ts +1 -1
- package/dist/rhf.js +19 -13
- package/dist/rhf.js.map +1 -1
- package/dist/rhf.mjs +1 -1
- package/dist/schema.d.mts +3 -3
- package/dist/schema.d.ts +3 -3
- package/dist/schema.js +23 -17
- package/dist/schema.js.map +1 -1
- package/dist/schema.mjs +2 -2
- package/dist/{utils-D7pdJb3-.d.ts → utils-DTtDPnVV.d.mts} +2 -2
- package/dist/{utils-C1Y-xfSp.d.mts → utils-YM0cIt68.d.ts} +2 -2
- package/dist/zod.d.mts +1 -1
- package/dist/zod.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunk-ATZ2HTUS.mjs.map +0 -1
- package/dist/chunk-IMJ5FRK5.mjs.map +0 -1
package/dist/rhf.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/rhf.ts","../src/utils/array.ts","../src/lib/utils.ts"],"sourcesContent":["'use client';\n\nimport { useRef, useEffect } from 'react';\nimport { useForm, useWatch } from 'react-hook-form';\nimport type {\n Control,\n FieldValues,\n Path,\n PathValue,\n DefaultValues,\n FieldErrors,\n Resolver as RhfResolver\n} from 'react-hook-form';\nimport type {\n FormAdapter,\n AdapterOptions,\n FormState,\n FieldError,\n SetValueOptions,\n} from '../types';\nimport { createArrayHelpers } from '../utils';\nimport { getNestedValue, flattenNestedObject } from '../lib';\n\n// =============================================================================\n// RHF ADAPTER OPTIONS\n// =============================================================================\n\n/**\n * Options specific to the React Hook Form adapter.\n * Extends base AdapterOptions with RHF-specific features.\n */\nexport interface RhfAdapterOptions<TData extends FieldValues = FieldValues>\n extends AdapterOptions<TData> {\n /**\n * React Hook Form's reValidateMode.\n * When to re-validate after initial validation.\n * @default 'onChange'\n */\n reValidateMode?: 'onChange' | 'onBlur' | 'onSubmit';\n\n /**\n * Validation strategy before submit.\n * - 'firstError': Return first error only (faster)\n * - 'all': Return all errors (better UX for complex forms)\n * @default 'firstError'\n */\n criteriaMode?: 'firstError' | 'all';\n\n /**\n * Delay validation by specified ms (debounce).\n * Useful for expensive async validation.\n */\n delayError?: number;\n\n /**\n * Focus on the first field with an error after submit.\n * @default true\n */\n shouldFocusError?: boolean;\n}\n\n// =============================================================================\n// RHF ADAPTER\n// =============================================================================\n\n/**\n * React Hook Form adapter implementing the FormAdapter interface.\n * \n * This is the default adapter for BuzzForm. It provides full implementation\n * of all required and optional FormAdapter methods using React Hook Form.\n * \n * @example\n * // In FormProvider\n * import { useRhf } from '@buildnbuzz/buzzform/rhf';\n * \n * <FormProvider adapter={useRhf}>\n * <App />\n * </FormProvider>\n * \n * @example\n * // Direct usage\n * const form = useRhf({\n * defaultValues: { email: '', password: '' },\n * resolver: zodResolver(schema),\n * onSubmit: async (data) => {\n * await loginUser(data);\n * },\n * });\n */\nexport function useRhf<TData extends FieldValues = FieldValues>(\n options: RhfAdapterOptions<TData>\n): FormAdapter<TData> {\n const {\n defaultValues,\n values,\n resolver,\n mode = 'onChange',\n reValidateMode = 'onChange',\n criteriaMode,\n delayError,\n shouldFocusError = true,\n onSubmit,\n } = options;\n\n // -------------------------------------------------------------------------\n // Initialize React Hook Form\n // -------------------------------------------------------------------------\n\n const form = useForm<TData>({\n defaultValues: defaultValues as DefaultValues<TData>,\n values: values,\n resolver: resolver as unknown as RhfResolver<TData>,\n mode,\n reValidateMode,\n criteriaMode,\n delayError,\n shouldFocusError,\n });\n\n // -------------------------------------------------------------------------\n // Handle controlled values updates\n // -------------------------------------------------------------------------\n\n const prevValuesRef = useRef(values);\n\n useEffect(() => {\n if (values && JSON.stringify(values) !== JSON.stringify(prevValuesRef.current)) {\n prevValuesRef.current = values;\n }\n }, [values]);\n\n // -------------------------------------------------------------------------\n // Build submit handler\n // -------------------------------------------------------------------------\n\n const handleSubmit = form.handleSubmit(async (data) => {\n if (onSubmit) {\n await onSubmit(data as TData);\n }\n });\n\n // -------------------------------------------------------------------------\n // Build the adapter API\n // -------------------------------------------------------------------------\n\n const api: FormAdapter<TData> = {\n // ---------------------------------------------------------------------\n // CORE PROPERTIES\n // ---------------------------------------------------------------------\n\n control: form.control,\n\n get formState(): FormState {\n const state = form.formState;\n return {\n isSubmitting: state.isSubmitting,\n isValidating: state.isValidating,\n isDirty: state.isDirty,\n isValid: state.isValid,\n isLoading: state.isLoading,\n errors: normalizeErrors(state.errors),\n dirtyFields: flattenNestedObject(state.dirtyFields),\n touchedFields: flattenNestedObject(state.touchedFields),\n submitCount: state.submitCount,\n };\n },\n\n handleSubmit,\n\n // ---------------------------------------------------------------------\n // VALUE MANAGEMENT\n // ---------------------------------------------------------------------\n\n getValues: () => form.getValues(),\n\n setValue: (name: string, value: unknown, opts?: SetValueOptions) => {\n form.setValue(name as Path<TData>, value as PathValue<TData, Path<TData>>, {\n shouldValidate: opts?.shouldValidate,\n shouldDirty: opts?.shouldDirty ?? true,\n shouldTouch: opts?.shouldTouch,\n });\n },\n\n reset: (vals) => form.reset(vals as DefaultValues<TData>),\n\n watch: <T = unknown>(name?: string): T => {\n return form.watch(name as Path<TData>) as T;\n },\n\n // ---------------------------------------------------------------------\n // VALIDATION\n // ---------------------------------------------------------------------\n\n validate: async (name) => {\n if (name) {\n const names = Array.isArray(name) ? name : [name];\n return form.trigger(names as Path<TData>[]);\n }\n return form.trigger();\n },\n\n setError: (name: string, error: FieldError) => {\n form.setError(name as Path<TData>, {\n type: error.type || 'manual',\n message: error.message,\n });\n },\n\n clearErrors: (name) => {\n if (name) {\n const names = Array.isArray(name) ? name : [name];\n names.forEach(n => form.clearErrors(n as Path<TData>));\n } else {\n form.clearErrors();\n }\n },\n\n // ---------------------------------------------------------------------\n // ARRAYS\n // ---------------------------------------------------------------------\n\n array: createArrayHelpers(\n (path) => form.getValues(path as Path<TData>) as unknown[],\n (path, value) => form.setValue(\n path as Path<TData>,\n value as PathValue<TData, Path<TData>>,\n { shouldDirty: true }\n )\n ),\n\n // ---------------------------------------------------------------------\n // OPTIONAL ENHANCED FEATURES\n // ---------------------------------------------------------------------\n\n onBlur: (name: string) => {\n // Mark field as touched\n const hasError = !!getNestedValue(form.formState.errors, name);\n\n // Trigger validation based on mode\n if (mode === 'onBlur' || mode === 'all') {\n form.trigger(name as Path<TData>);\n } else if (hasError && reValidateMode === 'onBlur') {\n // Re-validate if field has error and reValidateMode is onBlur\n form.trigger(name as Path<TData>);\n }\n },\n\n getFieldState: (name: string) => {\n const state = form.getFieldState(name as Path<TData>, form.formState);\n return {\n isDirty: state.isDirty,\n isTouched: state.isTouched,\n invalid: state.invalid,\n error: state.error?.message,\n };\n },\n\n setFocus: (name: string, options?: { shouldSelect?: boolean }) => {\n form.setFocus(name as Path<TData>, options);\n },\n\n unregister: (name: string | string[]) => {\n const names = Array.isArray(name) ? name : [name];\n names.forEach(n => form.unregister(n as Path<TData>));\n },\n };\n\n return api;\n}\n\n// =============================================================================\n// HELPER: Watch hook for external use\n// =============================================================================\n\n/**\n * Hook to watch specific field values reactively.\n * Use this when you need to react to field changes outside of components.\n * \n * @param control - The control object from useRhf (form.control)\n * @param name - Field path(s) to watch\n */\nexport function useRhfWatch<TData extends FieldValues, TValue = unknown>(\n control: Control<TData>,\n name: string | string[]\n): TValue {\n if (Array.isArray(name)) {\n return useWatch({ control, name: name as unknown as Path<TData>[] }) as TValue;\n }\n return useWatch({ control, name: name as Path<TData> }) as TValue;\n}\n\n// =============================================================================\n// UTILITIES\n// =============================================================================\n\n/**\n * Normalize RHF's nested error structure to flat string map.\n */\nfunction normalizeErrors<TData extends FieldValues>(\n errors: FieldErrors<TData>\n): Record<string, string | string[] | undefined> {\n const result: Record<string, string | string[] | undefined> = {};\n\n function traverse(obj: Record<string, unknown>, prefix = '') {\n for (const key in obj) {\n const path = prefix ? `${prefix}.${key}` : key;\n const value = obj[key];\n\n if (isRecord(value) && 'message' in value && typeof value.message === 'string') {\n // Leaf error\n result[path] = value.message;\n } else if (\n isRecord(value) &&\n 'root' in value &&\n isRecord(value.root) &&\n 'message' in value.root &&\n typeof value.root.message === 'string'\n ) {\n // Array root error\n result[path] = value.root.message;\n } else if (isRecord(value)) {\n // Nested object, traverse deeper\n traverse(value, path);\n }\n }\n }\n\n traverse(errors as unknown as Record<string, unknown>);\n return result;\n}\n\n\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\n// =============================================================================\n// RE-EXPORTS FOR CONVENIENCE\n// =============================================================================\n\nexport type { UseFormReturn as RhfForm } from 'react-hook-form';","import { nanoid } from 'nanoid';\nimport type { ArrayHelpers } from '../types';\n\n/**\n * Creates a standardized set of array field manipulation methods.\n * Abstracts the difference between getting/setting values in different form libraries.\n * \n * @param getArray - Function to get current array value at a path\n * @param setArray - Function to set array value at a path\n */\nexport function createArrayHelpers(\n getArray: (path: string) => unknown[],\n setArray: (path: string, value: unknown[]) => void\n): ArrayHelpers {\n return {\n fields: <T = unknown>(path: string): Array<T & { id: string }> => {\n const arr = getArray(path);\n if (!Array.isArray(arr)) return [];\n return arr.map((item, index) => ({\n id: (item as Record<string, unknown>)?.id as string || `${path}-${index}`,\n ...item as T,\n }));\n },\n\n append: (path: string, value: unknown) => {\n const current = getArray(path) || [];\n const itemWithId = ensureId(value);\n setArray(path, [...current, itemWithId]);\n },\n\n prepend: (path: string, value: unknown) => {\n const current = getArray(path) || [];\n const itemWithId = ensureId(value);\n setArray(path, [itemWithId, ...current]);\n },\n\n insert: (path: string, index: number, value: unknown) => {\n const current = [...(getArray(path) || [])];\n const itemWithId = ensureId(value);\n current.splice(index, 0, itemWithId);\n setArray(path, current);\n },\n\n remove: (path: string, index: number) => {\n const current = [...(getArray(path) || [])];\n current.splice(index, 1);\n setArray(path, current);\n },\n\n move: (path: string, from: number, to: number) => {\n const current = [...(getArray(path) || [])];\n const [item] = current.splice(from, 1);\n current.splice(to, 0, item);\n setArray(path, current);\n },\n\n swap: (path: string, indexA: number, indexB: number) => {\n const current = [...(getArray(path) || [])];\n const temp = current[indexA];\n current[indexA] = current[indexB];\n current[indexB] = temp;\n setArray(path, current);\n },\n\n replace: (path: string, values: unknown[]) => {\n const itemsWithIds = values.map(ensureId);\n setArray(path, itemsWithIds);\n },\n\n update: (path: string, index: number, value: unknown) => {\n const current = [...(getArray(path) || [])];\n // Preserve existing ID if present\n const existingId = (current[index] as Record<string, unknown>)?.id;\n current[index] = {\n ...(typeof value === 'object' && value !== null ? value : {}),\n id: existingId || nanoid(),\n };\n setArray(path, current);\n },\n };\n}\n\n/**\n * Ensures an item has a unique ID for React keys.\n */\nfunction ensureId(value: unknown): unknown {\n if (typeof value === 'object' && value !== null) {\n const obj = value as Record<string, unknown>;\n if (!obj.id) {\n return { ...obj, id: nanoid() };\n }\n return obj;\n }\n return { value, id: nanoid() };\n}\n","// =============================================================================\n// COMMON UTILITIES\n// These are used by both the core package and registry field components.\n// =============================================================================\n\n/**\n * Generate a unique field ID from the field path.\n * Converts dot notation to dashes and prefixes with 'field-'.\n * Used for accessibility (htmlFor, id attributes).\n * \n * @example\n * generateFieldId('user.profile.email') => 'field-user-profile-email'\n * generateFieldId('items[0].name') => 'field-items-0-name'\n */\nexport function generateFieldId(path: string): string {\n return `field-${path.replace(/\\./g, \"-\").replace(/\\[/g, \"-\").replace(/\\]/g, \"\")}`;\n}\n\n/**\n * Safely retrieve a nested value from an object using a dot-notation path.\n * \n * @example\n * getNestedValue({ user: { name: 'John' } }, 'user.name') => 'John'\n * getNestedValue({ items: [{ id: 1 }] }, 'items.0.id') => 1\n */\nexport function getNestedValue(obj: unknown, path: string): unknown {\n if (!obj || !path) return undefined;\n return path.split(\".\").reduce<unknown>((acc: unknown, key: string) => {\n if (acc && typeof acc === \"object\" && acc !== null) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * Set a nested value in an object using a dot-notation path.\n * Creates intermediate objects/arrays as needed.\n * \n * @example\n * setNestedValue({}, 'user.name', 'John') => { user: { name: 'John' } }\n */\nexport function setNestedValue<T extends Record<string, unknown>>(\n obj: T,\n path: string,\n value: unknown\n): T {\n const keys = path.split(\".\");\n const result = { ...obj } as Record<string, unknown>;\n let current = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== \"object\") {\n // Check if next key is numeric (array index)\n const nextKey = keys[i + 1];\n current[key] = /^\\d+$/.test(nextKey) ? [] : {};\n } else {\n current[key] = Array.isArray(current[key])\n ? [...(current[key] as unknown[])]\n : { ...(current[key] as Record<string, unknown>) };\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result as T;\n}\n\n/**\n * Format bytes into a human-readable string.\n * \n * @example\n * formatBytes(1024) => '1 KB'\n * formatBytes(1234567) => '1.18 MB'\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n}\n\n/**\n * Flatten a nested object to dot-notation paths.\n * Useful for converting form library state (like dirtyFields, touchedFields)\n * to the flat format expected by FormState.\n * \n * @example\n * flattenNestedObject({ user: { name: true, email: true } })\n * // => { 'user.name': true, 'user.email': true }\n * \n * flattenNestedObject({ items: { 0: { title: true } } })\n * // => { 'items.0.title': true }\n */\nexport function flattenNestedObject(\n obj: Record<string, unknown>,\n prefix = ''\n): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n\n for (const key in obj) {\n const path = prefix ? `${prefix}.${key}` : key;\n const value = obj[key];\n\n if (typeof value === 'boolean') {\n result[path] = value;\n } else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n Object.assign(result, flattenNestedObject(value as Record<string, unknown>, path));\n }\n }\n\n return result;\n}\n\n"],"mappings":"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","names":["options"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/rhf.ts","../src/utils/array.ts","../src/lib/utils.ts"],"sourcesContent":["'use client';\n\nimport { useRef, useEffect } from 'react';\nimport { useForm, useWatch } from 'react-hook-form';\nimport type {\n Control,\n FieldValues,\n Path,\n PathValue,\n DefaultValues,\n FieldErrors,\n Resolver as RhfResolver\n} from 'react-hook-form';\nimport type {\n FormAdapter,\n AdapterOptions,\n FormState,\n FieldError,\n SetValueOptions,\n} from '../types';\nimport { createArrayHelpers } from '../utils';\nimport { getNestedValue, flattenNestedObject } from '../lib';\n\n// =============================================================================\n// RHF ADAPTER OPTIONS\n// =============================================================================\n\n/**\n * Options specific to the React Hook Form adapter.\n * Extends base AdapterOptions with RHF-specific features.\n */\nexport interface RhfAdapterOptions<TData extends FieldValues = FieldValues>\n extends AdapterOptions<TData> {\n /**\n * React Hook Form's reValidateMode.\n * When to re-validate after initial validation.\n * @default 'onChange'\n */\n reValidateMode?: 'onChange' | 'onBlur' | 'onSubmit';\n\n /**\n * Validation strategy before submit.\n * - 'firstError': Return first error only (faster)\n * - 'all': Return all errors (better UX for complex forms)\n * @default 'firstError'\n */\n criteriaMode?: 'firstError' | 'all';\n\n /**\n * Delay validation by specified ms (debounce).\n * Useful for expensive async validation.\n */\n delayError?: number;\n\n /**\n * Focus on the first field with an error after submit.\n * @default true\n */\n shouldFocusError?: boolean;\n}\n\n// =============================================================================\n// RHF ADAPTER\n// =============================================================================\n\n/**\n * React Hook Form adapter implementing the FormAdapter interface.\n * \n * This is the default adapter for BuzzForm. It provides full implementation\n * of all required and optional FormAdapter methods using React Hook Form.\n * \n * @example\n * // In FormProvider\n * import { useRhf } from '@buildnbuzz/buzzform/rhf';\n * \n * <FormProvider adapter={useRhf}>\n * <App />\n * </FormProvider>\n * \n * @example\n * // Direct usage\n * const form = useRhf({\n * defaultValues: { email: '', password: '' },\n * resolver: zodResolver(schema),\n * onSubmit: async (data) => {\n * await loginUser(data);\n * },\n * });\n */\nexport function useRhf<TData extends FieldValues = FieldValues>(\n options: RhfAdapterOptions<TData>\n): FormAdapter<TData> {\n const {\n defaultValues,\n values,\n resolver,\n mode = 'onChange',\n reValidateMode = 'onChange',\n criteriaMode,\n delayError,\n shouldFocusError = true,\n onSubmit,\n } = options;\n\n // -------------------------------------------------------------------------\n // Initialize React Hook Form\n // -------------------------------------------------------------------------\n\n const form = useForm<TData>({\n defaultValues: defaultValues as DefaultValues<TData>,\n values: values,\n resolver: resolver as unknown as RhfResolver<TData>,\n mode,\n reValidateMode,\n criteriaMode,\n delayError,\n shouldFocusError,\n });\n\n // -------------------------------------------------------------------------\n // Handle controlled values updates\n // -------------------------------------------------------------------------\n\n const prevValuesRef = useRef(values);\n\n useEffect(() => {\n if (values && JSON.stringify(values) !== JSON.stringify(prevValuesRef.current)) {\n prevValuesRef.current = values;\n }\n }, [values]);\n\n // -------------------------------------------------------------------------\n // Build submit handler\n // -------------------------------------------------------------------------\n\n const handleSubmit = form.handleSubmit(async (data) => {\n if (onSubmit) {\n await onSubmit(data as TData);\n }\n });\n\n // -------------------------------------------------------------------------\n // Build the adapter API\n // -------------------------------------------------------------------------\n\n const api: FormAdapter<TData> = {\n // ---------------------------------------------------------------------\n // CORE PROPERTIES\n // ---------------------------------------------------------------------\n\n control: form.control,\n\n get formState(): FormState {\n const state = form.formState;\n return {\n isSubmitting: state.isSubmitting,\n isValidating: state.isValidating,\n isDirty: state.isDirty,\n isValid: state.isValid,\n isLoading: state.isLoading,\n errors: normalizeErrors(state.errors),\n dirtyFields: flattenNestedObject(state.dirtyFields),\n touchedFields: flattenNestedObject(state.touchedFields),\n submitCount: state.submitCount,\n };\n },\n\n handleSubmit,\n\n // ---------------------------------------------------------------------\n // VALUE MANAGEMENT\n // ---------------------------------------------------------------------\n\n getValues: () => form.getValues(),\n\n setValue: (name: string, value: unknown, opts?: SetValueOptions) => {\n form.setValue(name as Path<TData>, value as PathValue<TData, Path<TData>>, {\n shouldValidate: opts?.shouldValidate,\n shouldDirty: opts?.shouldDirty ?? true,\n shouldTouch: opts?.shouldTouch,\n });\n },\n\n reset: (vals) => form.reset(vals as DefaultValues<TData>),\n\n watch: <T = unknown>(name?: string): T => {\n return form.watch(name as Path<TData>) as T;\n },\n\n // ---------------------------------------------------------------------\n // VALIDATION\n // ---------------------------------------------------------------------\n\n validate: async (name) => {\n if (name) {\n const names = Array.isArray(name) ? name : [name];\n return form.trigger(names as Path<TData>[]);\n }\n return form.trigger();\n },\n\n setError: (name: string, error: FieldError) => {\n form.setError(name as Path<TData>, {\n type: error.type || 'manual',\n message: error.message,\n });\n },\n\n clearErrors: (name) => {\n if (name) {\n const names = Array.isArray(name) ? name : [name];\n names.forEach(n => form.clearErrors(n as Path<TData>));\n } else {\n form.clearErrors();\n }\n },\n\n // ---------------------------------------------------------------------\n // ARRAYS\n // ---------------------------------------------------------------------\n\n array: createArrayHelpers(\n (path) => form.getValues(path as Path<TData>) as unknown[],\n (path, value) => form.setValue(\n path as Path<TData>,\n value as PathValue<TData, Path<TData>>,\n { shouldDirty: true }\n )\n ),\n\n // ---------------------------------------------------------------------\n // OPTIONAL ENHANCED FEATURES\n // ---------------------------------------------------------------------\n\n onBlur: (name: string) => {\n // Mark field as touched\n const hasError = !!getNestedValue(form.formState.errors, name);\n\n // Trigger validation based on mode\n if (mode === 'onBlur' || mode === 'all') {\n form.trigger(name as Path<TData>);\n } else if (hasError && reValidateMode === 'onBlur') {\n // Re-validate if field has error and reValidateMode is onBlur\n form.trigger(name as Path<TData>);\n }\n },\n\n getFieldState: (name: string) => {\n const state = form.getFieldState(name as Path<TData>, form.formState);\n return {\n isDirty: state.isDirty,\n isTouched: state.isTouched,\n invalid: state.invalid,\n error: state.error?.message,\n };\n },\n\n setFocus: (name: string, options?: { shouldSelect?: boolean }) => {\n form.setFocus(name as Path<TData>, options);\n },\n\n unregister: (name: string | string[]) => {\n const names = Array.isArray(name) ? name : [name];\n names.forEach(n => form.unregister(n as Path<TData>));\n },\n };\n\n return api;\n}\n\n// =============================================================================\n// HELPER: Watch hook for external use\n// =============================================================================\n\n/**\n * Hook to watch specific field values reactively.\n * Use this when you need to react to field changes outside of components.\n * \n * @param control - The control object from useRhf (form.control)\n * @param name - Field path(s) to watch\n */\nexport function useRhfWatch<TData extends FieldValues, TValue = unknown>(\n control: Control<TData>,\n name: string | string[]\n): TValue {\n if (Array.isArray(name)) {\n return useWatch({ control, name: name as unknown as Path<TData>[] }) as TValue;\n }\n return useWatch({ control, name: name as Path<TData> }) as TValue;\n}\n\n// =============================================================================\n// UTILITIES\n// =============================================================================\n\n/**\n * Normalize RHF's nested error structure to flat string map.\n */\nfunction normalizeErrors<TData extends FieldValues>(\n errors: FieldErrors<TData>\n): Record<string, string | string[] | undefined> {\n const result: Record<string, string | string[] | undefined> = {};\n\n function traverse(obj: Record<string, unknown>, prefix = '') {\n for (const key in obj) {\n const path = prefix ? `${prefix}.${key}` : key;\n const value = obj[key];\n\n if (isRecord(value) && 'message' in value && typeof value.message === 'string') {\n // Leaf error\n result[path] = value.message;\n } else if (\n isRecord(value) &&\n 'root' in value &&\n isRecord(value.root) &&\n 'message' in value.root &&\n typeof value.root.message === 'string'\n ) {\n // Array root error\n result[path] = value.root.message;\n } else if (isRecord(value)) {\n // Nested object, traverse deeper\n traverse(value, path);\n }\n }\n }\n\n traverse(errors as unknown as Record<string, unknown>);\n return result;\n}\n\n\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\n// =============================================================================\n// RE-EXPORTS FOR CONVENIENCE\n// =============================================================================\n\nexport type { UseFormReturn as RhfForm } from 'react-hook-form';","import { nanoid } from 'nanoid';\nimport type { ArrayHelpers } from '../types';\n\n/**\n * Creates a standardized set of array field manipulation methods.\n * Abstracts the difference between getting/setting values in different form libraries.\n * \n * @param getArray - Function to get current array value at a path\n * @param setArray - Function to set array value at a path\n */\nexport function createArrayHelpers(\n getArray: (path: string) => unknown,\n setArray: (path: string, value: unknown[]) => void\n): ArrayHelpers {\n const readArray = (path: string): unknown[] => {\n const value = getArray(path);\n return Array.isArray(value) ? value : [];\n };\n\n return {\n fields: <T = unknown>(path: string): Array<T & { id: string }> => {\n const arr = readArray(path);\n return arr.map((item, index) => {\n const itemObject =\n typeof item === 'object' && item !== null\n ? (item as Record<string, unknown>)\n : ({ value: item } as Record<string, unknown>);\n\n return {\n id: (itemObject.id as string) || `${path}-${index}`,\n ...(itemObject as T),\n };\n });\n },\n\n append: (path: string, value: unknown) => {\n const current = readArray(path);\n const itemWithId = ensureId(value);\n setArray(path, [...current, itemWithId]);\n },\n\n prepend: (path: string, value: unknown) => {\n const current = readArray(path);\n const itemWithId = ensureId(value);\n setArray(path, [itemWithId, ...current]);\n },\n\n insert: (path: string, index: number, value: unknown) => {\n const current = [...readArray(path)];\n const itemWithId = ensureId(value);\n current.splice(index, 0, itemWithId);\n setArray(path, current);\n },\n\n remove: (path: string, index: number) => {\n const current = [...readArray(path)];\n current.splice(index, 1);\n setArray(path, current);\n },\n\n move: (path: string, from: number, to: number) => {\n const current = [...readArray(path)];\n const [item] = current.splice(from, 1);\n current.splice(to, 0, item);\n setArray(path, current);\n },\n\n swap: (path: string, indexA: number, indexB: number) => {\n const current = [...readArray(path)];\n const temp = current[indexA];\n current[indexA] = current[indexB];\n current[indexB] = temp;\n setArray(path, current);\n },\n\n replace: (path: string, values: unknown[]) => {\n const itemsWithIds = values.map(ensureId);\n setArray(path, itemsWithIds);\n },\n\n update: (path: string, index: number, value: unknown) => {\n const current = [...readArray(path)];\n // Preserve existing ID if present\n const existingId = (current[index] as Record<string, unknown>)?.id;\n current[index] = {\n ...(typeof value === 'object' && value !== null ? value : {}),\n id: existingId || nanoid(),\n };\n setArray(path, current);\n },\n };\n}\n\n/**\n * Ensures an item has a unique ID for React keys.\n */\nfunction ensureId(value: unknown): unknown {\n if (typeof value === 'object' && value !== null) {\n const obj = value as Record<string, unknown>;\n if (!obj.id) {\n return { ...obj, id: nanoid() };\n }\n return obj;\n }\n return { value, id: nanoid() };\n}\n","// =============================================================================\n// COMMON UTILITIES\n// These are used by both the core package and registry field components.\n// =============================================================================\n\n/**\n * Generate a unique field ID from the field path.\n * Converts dot notation to dashes and prefixes with 'field-'.\n * Used for accessibility (htmlFor, id attributes).\n * \n * @example\n * generateFieldId('user.profile.email') => 'field-user-profile-email'\n * generateFieldId('items[0].name') => 'field-items-0-name'\n */\nexport function generateFieldId(path: string): string {\n return `field-${path.replace(/\\./g, \"-\").replace(/\\[/g, \"-\").replace(/\\]/g, \"\")}`;\n}\n\n/**\n * Safely retrieve a nested value from an object using a dot-notation path.\n * \n * @example\n * getNestedValue({ user: { name: 'John' } }, 'user.name') => 'John'\n * getNestedValue({ items: [{ id: 1 }] }, 'items.0.id') => 1\n */\nexport function getNestedValue(obj: unknown, path: string): unknown {\n if (!obj || !path) return undefined;\n return path.split(\".\").reduce<unknown>((acc: unknown, key: string) => {\n if (acc && typeof acc === \"object\" && acc !== null) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * Set a nested value in an object using a dot-notation path.\n * Creates intermediate objects/arrays as needed.\n * \n * @example\n * setNestedValue({}, 'user.name', 'John') => { user: { name: 'John' } }\n */\nexport function setNestedValue<T extends Record<string, unknown>>(\n obj: T,\n path: string,\n value: unknown\n): T {\n const keys = path.split(\".\");\n const result = { ...obj } as Record<string, unknown>;\n let current = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== \"object\") {\n // Check if next key is numeric (array index)\n const nextKey = keys[i + 1];\n current[key] = /^\\d+$/.test(nextKey) ? [] : {};\n } else {\n current[key] = Array.isArray(current[key])\n ? [...(current[key] as unknown[])]\n : { ...(current[key] as Record<string, unknown>) };\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result as T;\n}\n\n/**\n * Format bytes into a human-readable string.\n * \n * @example\n * formatBytes(1024) => '1 KB'\n * formatBytes(1234567) => '1.18 MB'\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n}\n\n/**\n * Flatten a nested object to dot-notation paths.\n * Useful for converting form library state (like dirtyFields, touchedFields)\n * to the flat format expected by FormState.\n * \n * @example\n * flattenNestedObject({ user: { name: true, email: true } })\n * // => { 'user.name': true, 'user.email': true }\n * \n * flattenNestedObject({ items: { 0: { title: true } } })\n * // => { 'items.0.title': true }\n */\nexport function flattenNestedObject(\n obj: Record<string, unknown>,\n prefix = ''\n): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n\n for (const key in obj) {\n const path = prefix ? `${prefix}.${key}` : key;\n const value = obj[key];\n\n if (typeof value === 'boolean') {\n result[path] = value;\n } else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n Object.assign(result, flattenNestedObject(value as Record<string, unknown>, path));\n }\n }\n\n return result;\n}\n\n"],"mappings":"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","names":["options"]}
|
package/dist/rhf.mjs
CHANGED
package/dist/schema.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { T as TextField, o as TextareaField, E as EmailField, P as PasswordField, N as NumberField, D as DateField, p as DatetimeField, r as SelectField, w as RadioField, s as CheckboxGroupField, t as CheckboxField, u as SwitchField, y as UploadField, x as TagsField, z as ArrayField, F as Field, G as GroupField } from './adapter-
|
|
2
|
-
export { g as AdapterFactory, f as AdapterOptions, A as ArrayHelpers, B as BaseField, Q as BuzzFormSchema, K as CollapsibleField, C as ConditionContext, M as DataField, k as FieldComponentProps, j as FieldCondition, d as FieldError, l as FieldInputProps, m as FieldInputRenderFn, n as FieldStyle, L as FieldType, b as FormAdapter, a as FormConfig, W as FormSettings, c as FormState, O as LayoutField, e as Resolver, R as ResolverResult, H as RowField, q as SelectOption, S as SetValueOptions, I as Tab, J as TabsField, U as UseFormOptions, V as ValidationContext, i as ValidationFn, h as ValidationResult } from './adapter-
|
|
3
|
-
export { F as FieldToZod, u as FieldValidator, a as FieldsToShape, c as InferSchema, I as InferType, S as SchemaBuilder, b as SchemaBuilderMap, h as coerceToDate, g as coerceToNumber, q as collectFieldValidators, l as createArrayHelpers, d as createSchema, e as extractValidationConfig, f as fieldsToZodSchema, p as formatBytes, n as generateFieldId, o as getNestedValue, i as getPatternErrorMessage, r as getSiblingData, t as getValueByPath, j as isFileLike, k as isFileTypeAccepted, m as makeOptional, s as setNestedValue } from './utils-
|
|
1
|
+
import { T as TextField, o as TextareaField, E as EmailField, P as PasswordField, N as NumberField, D as DateField, p as DatetimeField, r as SelectField, w as RadioField, s as CheckboxGroupField, t as CheckboxField, u as SwitchField, y as UploadField, x as TagsField, z as ArrayField, F as Field, G as GroupField } from './adapter-CpEUN0gt.mjs';
|
|
2
|
+
export { g as AdapterFactory, f as AdapterOptions, A as ArrayHelpers, B as BaseField, Q as BuzzFormSchema, K as CollapsibleField, C as ConditionContext, M as DataField, k as FieldComponentProps, j as FieldCondition, d as FieldError, l as FieldInputProps, m as FieldInputRenderFn, n as FieldStyle, L as FieldType, b as FormAdapter, a as FormConfig, W as FormSettings, c as FormState, O as LayoutField, e as Resolver, R as ResolverResult, H as RowField, q as SelectOption, S as SetValueOptions, I as Tab, J as TabsField, U as UseFormOptions, V as ValidationContext, i as ValidationFn, h as ValidationResult } from './adapter-CpEUN0gt.mjs';
|
|
3
|
+
export { F as FieldToZod, u as FieldValidator, a as FieldsToShape, c as InferSchema, I as InferType, S as SchemaBuilder, b as SchemaBuilderMap, h as coerceToDate, g as coerceToNumber, q as collectFieldValidators, l as createArrayHelpers, d as createSchema, e as extractValidationConfig, f as fieldsToZodSchema, p as formatBytes, n as generateFieldId, o as getNestedValue, i as getPatternErrorMessage, r as getSiblingData, t as getValueByPath, j as isFileLike, k as isFileTypeAccepted, m as makeOptional, s as setNestedValue } from './utils-DTtDPnVV.mjs';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import 'react';
|
|
6
6
|
|
package/dist/schema.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { T as TextField, o as TextareaField, E as EmailField, P as PasswordField, N as NumberField, D as DateField, p as DatetimeField, r as SelectField, w as RadioField, s as CheckboxGroupField, t as CheckboxField, u as SwitchField, y as UploadField, x as TagsField, z as ArrayField, F as Field, G as GroupField } from './adapter-
|
|
2
|
-
export { g as AdapterFactory, f as AdapterOptions, A as ArrayHelpers, B as BaseField, Q as BuzzFormSchema, K as CollapsibleField, C as ConditionContext, M as DataField, k as FieldComponentProps, j as FieldCondition, d as FieldError, l as FieldInputProps, m as FieldInputRenderFn, n as FieldStyle, L as FieldType, b as FormAdapter, a as FormConfig, W as FormSettings, c as FormState, O as LayoutField, e as Resolver, R as ResolverResult, H as RowField, q as SelectOption, S as SetValueOptions, I as Tab, J as TabsField, U as UseFormOptions, V as ValidationContext, i as ValidationFn, h as ValidationResult } from './adapter-
|
|
3
|
-
export { F as FieldToZod, u as FieldValidator, a as FieldsToShape, c as InferSchema, I as InferType, S as SchemaBuilder, b as SchemaBuilderMap, h as coerceToDate, g as coerceToNumber, q as collectFieldValidators, l as createArrayHelpers, d as createSchema, e as extractValidationConfig, f as fieldsToZodSchema, p as formatBytes, n as generateFieldId, o as getNestedValue, i as getPatternErrorMessage, r as getSiblingData, t as getValueByPath, j as isFileLike, k as isFileTypeAccepted, m as makeOptional, s as setNestedValue } from './utils-
|
|
1
|
+
import { T as TextField, o as TextareaField, E as EmailField, P as PasswordField, N as NumberField, D as DateField, p as DatetimeField, r as SelectField, w as RadioField, s as CheckboxGroupField, t as CheckboxField, u as SwitchField, y as UploadField, x as TagsField, z as ArrayField, F as Field, G as GroupField } from './adapter-CpEUN0gt.js';
|
|
2
|
+
export { g as AdapterFactory, f as AdapterOptions, A as ArrayHelpers, B as BaseField, Q as BuzzFormSchema, K as CollapsibleField, C as ConditionContext, M as DataField, k as FieldComponentProps, j as FieldCondition, d as FieldError, l as FieldInputProps, m as FieldInputRenderFn, n as FieldStyle, L as FieldType, b as FormAdapter, a as FormConfig, W as FormSettings, c as FormState, O as LayoutField, e as Resolver, R as ResolverResult, H as RowField, q as SelectOption, S as SetValueOptions, I as Tab, J as TabsField, U as UseFormOptions, V as ValidationContext, i as ValidationFn, h as ValidationResult } from './adapter-CpEUN0gt.js';
|
|
3
|
+
export { F as FieldToZod, u as FieldValidator, a as FieldsToShape, c as InferSchema, I as InferType, S as SchemaBuilder, b as SchemaBuilderMap, h as coerceToDate, g as coerceToNumber, q as collectFieldValidators, l as createArrayHelpers, d as createSchema, e as extractValidationConfig, f as fieldsToZodSchema, p as formatBytes, n as generateFieldId, o as getNestedValue, i as getPatternErrorMessage, r as getSiblingData, t as getValueByPath, j as isFileLike, k as isFileTypeAccepted, m as makeOptional, s as setNestedValue } from './utils-YM0cIt68.js';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import 'react';
|
|
6
6
|
|
package/dist/schema.js
CHANGED
|
@@ -439,18 +439,18 @@ function createCheckboxGroupFieldSchema(field) {
|
|
|
439
439
|
// src/schema/builders/boolean.ts
|
|
440
440
|
var import_zod6 = require("zod");
|
|
441
441
|
function createCheckboxFieldSchema(field) {
|
|
442
|
-
let schema = import_zod6.z.boolean({ error: "Invalid value" });
|
|
442
|
+
let schema = import_zod6.z.boolean({ error: "Invalid value" }).default(false);
|
|
443
443
|
if (field.required) {
|
|
444
|
-
schema = import_zod6.z.boolean({ error: "
|
|
444
|
+
schema = import_zod6.z.boolean({ error: "Invalid value" }).default(false).refine((val) => val === true, {
|
|
445
445
|
error: "This field is required"
|
|
446
446
|
});
|
|
447
447
|
}
|
|
448
448
|
return schema;
|
|
449
449
|
}
|
|
450
450
|
function createSwitchFieldSchema(field) {
|
|
451
|
-
let schema = import_zod6.z.boolean({ error: "Invalid value" });
|
|
451
|
+
let schema = import_zod6.z.boolean({ error: "Invalid value" }).default(false);
|
|
452
452
|
if (field.required) {
|
|
453
|
-
schema = import_zod6.z.boolean({ error: "
|
|
453
|
+
schema = import_zod6.z.boolean({ error: "Invalid value" }).default(false).refine((val) => val === true, {
|
|
454
454
|
error: "This field is required"
|
|
455
455
|
});
|
|
456
456
|
}
|
|
@@ -665,44 +665,50 @@ function createSchema(fields) {
|
|
|
665
665
|
// src/utils/array.ts
|
|
666
666
|
var import_nanoid = require("nanoid");
|
|
667
667
|
function createArrayHelpers(getArray, setArray) {
|
|
668
|
+
const readArray = (path) => {
|
|
669
|
+
const value = getArray(path);
|
|
670
|
+
return Array.isArray(value) ? value : [];
|
|
671
|
+
};
|
|
668
672
|
return {
|
|
669
673
|
fields: (path) => {
|
|
670
|
-
const arr =
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
674
|
+
const arr = readArray(path);
|
|
675
|
+
return arr.map((item, index) => {
|
|
676
|
+
const itemObject = typeof item === "object" && item !== null ? item : { value: item };
|
|
677
|
+
return {
|
|
678
|
+
id: itemObject.id || `${path}-${index}`,
|
|
679
|
+
...itemObject
|
|
680
|
+
};
|
|
681
|
+
});
|
|
676
682
|
},
|
|
677
683
|
append: (path, value) => {
|
|
678
|
-
const current =
|
|
684
|
+
const current = readArray(path);
|
|
679
685
|
const itemWithId = ensureId(value);
|
|
680
686
|
setArray(path, [...current, itemWithId]);
|
|
681
687
|
},
|
|
682
688
|
prepend: (path, value) => {
|
|
683
|
-
const current =
|
|
689
|
+
const current = readArray(path);
|
|
684
690
|
const itemWithId = ensureId(value);
|
|
685
691
|
setArray(path, [itemWithId, ...current]);
|
|
686
692
|
},
|
|
687
693
|
insert: (path, index, value) => {
|
|
688
|
-
const current = [...
|
|
694
|
+
const current = [...readArray(path)];
|
|
689
695
|
const itemWithId = ensureId(value);
|
|
690
696
|
current.splice(index, 0, itemWithId);
|
|
691
697
|
setArray(path, current);
|
|
692
698
|
},
|
|
693
699
|
remove: (path, index) => {
|
|
694
|
-
const current = [...
|
|
700
|
+
const current = [...readArray(path)];
|
|
695
701
|
current.splice(index, 1);
|
|
696
702
|
setArray(path, current);
|
|
697
703
|
},
|
|
698
704
|
move: (path, from, to) => {
|
|
699
|
-
const current = [...
|
|
705
|
+
const current = [...readArray(path)];
|
|
700
706
|
const [item] = current.splice(from, 1);
|
|
701
707
|
current.splice(to, 0, item);
|
|
702
708
|
setArray(path, current);
|
|
703
709
|
},
|
|
704
710
|
swap: (path, indexA, indexB) => {
|
|
705
|
-
const current = [...
|
|
711
|
+
const current = [...readArray(path)];
|
|
706
712
|
const temp = current[indexA];
|
|
707
713
|
current[indexA] = current[indexB];
|
|
708
714
|
current[indexB] = temp;
|
|
@@ -713,7 +719,7 @@ function createArrayHelpers(getArray, setArray) {
|
|
|
713
719
|
setArray(path, itemsWithIds);
|
|
714
720
|
},
|
|
715
721
|
update: (path, index, value) => {
|
|
716
|
-
const current = [...
|
|
722
|
+
const current = [...readArray(path)];
|
|
717
723
|
const existingId = current[index]?.id;
|
|
718
724
|
current[index] = {
|
|
719
725
|
...typeof value === "object" && value !== null ? value : {},
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema/index.ts","../src/schema/fields-to-schema.ts","../src/schema/builders/text.ts","../src/schema/helpers.ts","../src/schema/builders/number.ts","../src/schema/builders/date.ts","../src/schema/builders/select.ts","../src/schema/builders/boolean.ts","../src/schema/builders/upload.ts","../src/schema/builders/tags.ts","../src/schema/builders/composite.ts","../src/schema/create-schema.ts","../src/utils/array.ts","../src/lib/utils.ts"],"sourcesContent":["/**\n * Schema utilities for BuzzForm.\n *\n * @example\n * import { createSchema } from '@buildnbuzz/buzzform';\n *\n * const loginSchema = createSchema([\n * { type: 'email', name: 'email', required: true },\n * { type: 'password', name: 'password', minLength: 8 },\n * ]);\n *\n * type LoginData = z.infer<typeof loginSchema>;\n */\n\n// =============================================================================\n// TYPES - Adapter Interface (no runtime code, just types)\n// =============================================================================\nexport type {\n FormState,\n SetValueOptions,\n FieldError,\n ResolverResult,\n Resolver,\n ArrayHelpers,\n AdapterOptions,\n FormAdapter,\n AdapterFactory,\n} from '../types';\n\n// =============================================================================\n// TYPES - Field Definitions\n// =============================================================================\nexport type {\n // Validation\n ValidationContext,\n ValidationResult,\n ValidationFn,\n\n // Conditional\n ConditionContext,\n FieldCondition,\n\n // Custom rendering\n FieldComponentProps,\n FieldInputProps,\n FieldInputRenderFn,\n\n // Styling\n FieldStyle,\n\n // Base\n BaseField,\n\n // Data fields\n TextField,\n EmailField,\n PasswordField,\n TextareaField,\n NumberField,\n DateField,\n DatetimeField,\n SelectOption,\n SelectField,\n CheckboxField,\n SwitchField,\n RadioField,\n TagsField,\n UploadField,\n\n // Layout fields\n GroupField,\n ArrayField,\n RowField,\n Tab,\n TabsField,\n CollapsibleField,\n\n // Union types\n Field,\n FieldType,\n DataField,\n LayoutField,\n} from '../types';\n\n// =============================================================================\n// TYPES - Form Configuration\n// =============================================================================\nexport type {\n BuzzFormSchema,\n FormSettings,\n FormConfig,\n UseFormOptions,\n} from '../types';\n\n// =============================================================================\n// TYPES - Schema Utilities\n// =============================================================================\nexport type {\n FieldToZod,\n FieldsToShape,\n SchemaBuilder,\n SchemaBuilderMap,\n InferType,\n InferSchema,\n} from '../types';\n\n// =============================================================================\n// SCHEMA\n// =============================================================================\nexport { createSchema } from './create-schema';\nexport { fieldsToZodSchema } from './fields-to-schema';\n\n// Re-export schema helpers for advanced usage (custom field builders)\nexport {\n extractValidationConfig,\n makeOptional,\n coerceToNumber,\n coerceToDate,\n getPatternErrorMessage,\n isFileLike,\n isFileTypeAccepted,\n // Helpers for cross-field validation (used by zodResolver)\n collectFieldValidators,\n getSiblingData,\n getValueByPath,\n type FieldValidator,\n} from './helpers';\n\n// Individual builders for registry integration\nexport * from './builders';\n\n// =============================================================================\n// UTILITIES (Server-safe - no React imports)\n// =============================================================================\nexport { createArrayHelpers } from '../utils';\n\n// Add common utilities that registry components will need\nexport { generateFieldId, getNestedValue, setNestedValue, formatBytes } from '../lib';","import { z } from \"zod\";\nimport type {\n Field,\n TabsField,\n TextField,\n EmailField,\n PasswordField,\n TextareaField,\n NumberField,\n DateField,\n DatetimeField,\n SelectField,\n CheckboxGroupField,\n RadioField,\n CheckboxField,\n SwitchField,\n UploadField,\n TagsField,\n ArrayField,\n GroupField,\n FieldsToShape,\n} from \"../types\";\nimport {\n createTextFieldSchema,\n createEmailFieldSchema,\n createPasswordFieldSchema,\n createNumberFieldSchema,\n createDateFieldSchema,\n createSelectFieldSchema,\n createCheckboxGroupFieldSchema,\n createRadioFieldSchema,\n createCheckboxFieldSchema,\n createSwitchFieldSchema,\n createUploadFieldSchema,\n createTagsFieldSchema,\n createArrayFieldSchema,\n createGroupFieldSchema,\n} from \"./builders\";\n\nfunction fieldToZod(field: Field): z.ZodTypeAny {\n if (\"schema\" in field && field.schema) {\n return field.schema as z.ZodTypeAny;\n }\n\n switch (field.type) {\n case \"text\":\n return createTextFieldSchema(field as TextField);\n case \"email\":\n return createEmailFieldSchema(field as EmailField);\n case \"password\":\n return createPasswordFieldSchema(field as PasswordField);\n case \"textarea\":\n return createTextFieldSchema(field as TextareaField);\n case \"number\":\n return createNumberFieldSchema(field as NumberField);\n case \"date\":\n case \"datetime\":\n return createDateFieldSchema(field as DateField | DatetimeField);\n case \"select\":\n return createSelectFieldSchema(field as SelectField);\n case \"checkbox-group\":\n return createCheckboxGroupFieldSchema(field as CheckboxGroupField);\n case \"radio\":\n return createRadioFieldSchema(field as RadioField);\n case \"checkbox\":\n return createCheckboxFieldSchema(field as CheckboxField);\n case \"switch\":\n return createSwitchFieldSchema(field as SwitchField);\n case \"upload\":\n return createUploadFieldSchema(field as UploadField);\n case \"tags\":\n return createTagsFieldSchema(field as TagsField);\n case \"array\":\n return createArrayFieldSchema(field as ArrayField, fieldsToZodSchema);\n case \"group\":\n return createGroupFieldSchema(field as GroupField, fieldsToZodSchema);\n case \"row\":\n case \"collapsible\":\n case \"tabs\":\n return z.any();\n default:\n return z.any();\n }\n}\n\nfunction processTabsField(field: TabsField): Record<string, z.ZodTypeAny> {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const tab of field.tabs) {\n if (tab.name) {\n const tabSchema = fieldsToZodSchema(tab.fields);\n shape[tab.name] = tabSchema;\n } else {\n const tabFieldsSchema = fieldsToZodSchema(tab.fields);\n if (tabFieldsSchema instanceof z.ZodObject) {\n Object.assign(shape, tabFieldsSchema.shape);\n }\n }\n }\n\n return shape;\n}\n\n/**\n * Converts field definitions to a Zod schema.\n *\n * Note: Custom validation (field.validate) is handled by the zodResolver,\n * not at the schema level. This ensures custom validators run even when\n * other fields have errors.\n */\nexport function fieldsToZodSchema<T extends readonly Field[]>(\n fields: T,\n): z.ZodObject<FieldsToShape<T>> {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const field of fields) {\n if (\"name\" in field && field.name) {\n shape[field.name] = fieldToZod(field);\n } else if (field.type === \"tabs\") {\n const tabsShape = processTabsField(field);\n Object.assign(shape, tabsShape);\n } else if (field.type === \"row\" || field.type === \"collapsible\") {\n const nestedSchema = fieldsToZodSchema(field.fields);\n if (nestedSchema instanceof z.ZodObject) {\n Object.assign(shape, nestedSchema.shape);\n }\n }\n }\n\n return z.object(shape) as z.ZodObject<FieldsToShape<T>>;\n}\n","import { z } from 'zod';\nimport type { TextField, EmailField, TextareaField, PasswordField } from '../../types';\nimport { makeOptional, getPatternErrorMessage } from '../helpers';\n\nexport function createTextFieldSchema(field: TextField | TextareaField): z.ZodTypeAny {\n let schema = z.string({ error: 'This field is required' });\n\n if ('pattern' in field && field.pattern) {\n const pattern = typeof field.pattern === 'string'\n ? new RegExp(field.pattern)\n : field.pattern;\n\n schema = schema.regex(pattern, {\n error: getPatternErrorMessage(field.pattern),\n });\n }\n\n if (field.minLength) {\n schema = schema.min(field.minLength, {\n error: `Must be at least ${field.minLength} characters`,\n });\n }\n if (field.maxLength) {\n schema = schema.max(field.maxLength, {\n error: `Must be no more than ${field.maxLength} characters`,\n });\n }\n\n if (field.required) {\n schema = schema.min(1, { error: 'This field is required' });\n }\n\n let finalSchema: z.ZodTypeAny = schema;\n if ('trim' in field && field.trim) {\n finalSchema = z.preprocess((val) => {\n return typeof val === 'string' ? val.trim() : val;\n }, schema);\n }\n\n if (!field.required) {\n return makeOptional(finalSchema, field.type);\n }\n\n return finalSchema;\n}\n\nexport function createEmailFieldSchema(field: EmailField): z.ZodTypeAny {\n // Zod v4: z.email() for email validation with custom error\n let schema = z.email({ error: 'Invalid email address' });\n\n if (field.minLength) {\n schema = schema.min(field.minLength, {\n error: `Must be at least ${field.minLength} characters`,\n });\n }\n if (field.maxLength) {\n schema = schema.max(field.maxLength, {\n error: `Must be no more than ${field.maxLength} characters`,\n });\n }\n\n if (field.required) {\n schema = schema.min(1, { error: 'Email is required' });\n }\n\n if (!field.required) {\n return makeOptional(schema, 'email');\n }\n\n return schema;\n}\n\nexport function createPasswordFieldSchema(field: PasswordField): z.ZodTypeAny {\n // Zod v4: provide error message for invalid_type\n let schema = z.string({ error: 'Password is required' });\n\n if (field.minLength) {\n schema = schema.min(field.minLength, {\n error: `Password must be at least ${field.minLength} characters`,\n });\n }\n if (field.maxLength) {\n schema = schema.max(field.maxLength, {\n error: `Password must be no more than ${field.maxLength} characters`,\n });\n }\n if (field.required) {\n schema = schema.min(1, { error: 'Password is required' });\n }\n\n if (!field.required) {\n return makeOptional(schema, 'password');\n }\n\n return schema;\n}\n","import { z } from \"zod\";\nimport type {\n Field,\n FieldType,\n ValidationContext,\n ValidationFn,\n} from \"../types\";\n\n// =============================================================================\n// VALIDATION CONFIG EXTRACTION\n// =============================================================================\n\ntype ExtractableValidationFn = (\n value: unknown,\n context: ValidationContext,\n) => true | string | Promise<true | string>;\n\nexport interface ExtractedValidationConfig {\n fn?: ExtractableValidationFn;\n isLive: boolean;\n debounceMs?: number;\n}\n\nexport function extractValidationConfig(\n validate?: unknown,\n): ExtractedValidationConfig {\n if (!validate) {\n return { fn: undefined, isLive: false };\n }\n\n if (typeof validate === \"function\") {\n return { fn: validate as ExtractableValidationFn, isLive: false };\n }\n\n if (typeof validate === \"object\" && \"fn\" in validate) {\n const obj = validate as {\n fn?: unknown;\n live?: boolean | { debounceMs?: number };\n };\n const fn =\n typeof obj.fn === \"function\"\n ? (obj.fn as ExtractableValidationFn)\n : undefined;\n\n if (!obj.live) {\n return { fn, isLive: false };\n }\n\n const debounceMs =\n typeof obj.live === \"object\" ? obj.live.debounceMs : undefined;\n return { fn, isLive: true, debounceMs };\n }\n\n return { fn: undefined, isLive: false };\n}\n\n// =============================================================================\n// FIELD VALIDATOR COLLECTION\n// =============================================================================\n\nexport interface FieldValidator {\n path: string;\n fn: ValidationFn;\n}\n\n/**\n * Recursively collects all field validators from a field array.\n */\nexport function collectFieldValidators(\n fields: readonly Field[],\n basePath: string = \"\",\n): FieldValidator[] {\n const validators: FieldValidator[] = [];\n\n for (const field of fields) {\n if (\"name\" in field && field.name) {\n const fieldPath = basePath ? `${basePath}.${field.name}` : field.name;\n\n if (\"validate\" in field && field.validate) {\n const config = extractValidationConfig(field.validate);\n if (config.fn) {\n validators.push({\n path: fieldPath,\n fn: config.fn as ValidationFn,\n });\n }\n }\n\n if (field.type === \"group\" && \"fields\" in field) {\n validators.push(...collectFieldValidators(field.fields, fieldPath));\n }\n }\n\n // Layout fields pass through without adding to path\n if (field.type === \"row\" && \"fields\" in field) {\n validators.push(...collectFieldValidators(field.fields, basePath));\n }\n if (field.type === \"collapsible\" && \"fields\" in field) {\n validators.push(...collectFieldValidators(field.fields, basePath));\n }\n if (field.type === \"tabs\" && \"tabs\" in field) {\n for (const tab of field.tabs) {\n const tabPath = tab.name\n ? basePath\n ? `${basePath}.${tab.name}`\n : tab.name\n : basePath;\n validators.push(...collectFieldValidators(tab.fields, tabPath));\n }\n }\n }\n\n return validators;\n}\n\n// =============================================================================\n// SIBLING DATA EXTRACTION\n// =============================================================================\n\n/**\n * Gets the parent object containing the field at the given path.\n */\nexport function getSiblingData(\n data: Record<string, unknown>,\n path: string,\n): Record<string, unknown> {\n const parts = path.split(\".\");\n\n if (parts.length <= 1) {\n return data;\n }\n\n const parentParts = parts.slice(0, -1);\n let current: unknown = data;\n\n for (const part of parentParts) {\n if (current && typeof current === \"object\" && current !== null) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return {};\n }\n }\n\n if (current && typeof current === \"object\" && current !== null) {\n return current as Record<string, unknown>;\n }\n\n return {};\n}\n\n/**\n * Gets a value at a dot-notation path.\n */\nexport function getValueByPath(\n data: Record<string, unknown>,\n path: string,\n): unknown {\n const parts = path.split(\".\");\n let current: unknown = data;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && current !== null) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n/**\n * Creates a superRefine that runs all field validators with full form context.\n */\nexport function createRootValidationRefinement(\n validators: FieldValidator[],\n): (data: Record<string, unknown>, ctx: z.RefinementCtx) => Promise<void> {\n return async (data, ctx) => {\n const validationPromises = validators.map(async ({ path, fn }) => {\n const value = getValueByPath(data, path);\n const siblingData = getSiblingData(data, path);\n\n try {\n const result = await fn(value, {\n data,\n siblingData,\n path: path.split(\".\"),\n });\n\n if (result !== true) {\n ctx.addIssue({\n code: \"custom\",\n path: path.split(\".\"),\n message: typeof result === \"string\" ? result : \"Validation failed\",\n });\n }\n } catch (error) {\n ctx.addIssue({\n code: \"custom\",\n path: path.split(\".\"),\n message: error instanceof Error ? error.message : \"Validation error\",\n });\n }\n });\n\n await Promise.all(validationPromises);\n };\n}\n\n// =============================================================================\n// OPTIONAL HANDLING\n// =============================================================================\n\nexport function makeOptional(\n schema: z.ZodTypeAny,\n fieldType: FieldType,\n): z.ZodTypeAny {\n switch (fieldType) {\n case \"text\":\n case \"textarea\":\n case \"email\":\n case \"password\":\n return schema.optional().or(z.literal(\"\"));\n\n case \"number\":\n case \"date\":\n case \"select\":\n case \"radio\":\n return schema.optional().nullable();\n\n case \"checkbox\":\n case \"switch\":\n return schema;\n\n case \"checkbox-group\":\n return schema.optional().default([]);\n\n case \"tags\":\n case \"array\":\n return schema.optional().default([]);\n\n case \"upload\":\n return schema.optional().nullable();\n\n default:\n return schema.optional();\n }\n}\n\n// =============================================================================\n// COERCION HELPERS\n// =============================================================================\n\nexport function coerceToNumber(val: unknown): number | undefined {\n if (val === \"\" || val === null || val === undefined) {\n return undefined;\n }\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n}\n\nexport function coerceToDate(val: unknown): Date | undefined {\n if (val === \"\" || val === null || val === undefined) {\n return undefined;\n }\n if (val instanceof Date) {\n return isNaN(val.getTime()) ? undefined : val;\n }\n if (typeof val === \"string\" || typeof val === \"number\") {\n const d = new Date(val);\n return isNaN(d.getTime()) ? undefined : d;\n }\n return undefined;\n}\n\n// =============================================================================\n// PATTERN VALIDATION\n// =============================================================================\n\nconst PATTERN_MESSAGES: Record<string, string> = {\n \"^[a-zA-Z0-9_]+$\": \"Only letters, numbers, and underscores allowed\",\n \"^[a-z0-9-]+$\": \"Only lowercase letters, numbers, and hyphens allowed\",\n \"^\\\\S+@\\\\S+\\\\.\\\\S+$\": \"Invalid email format\",\n \"^https?://\": \"Must start with http:// or https://\",\n};\n\nexport function getPatternErrorMessage(pattern: string | RegExp): string {\n const patternStr = typeof pattern === \"string\" ? pattern : pattern.source;\n return PATTERN_MESSAGES[patternStr] || `Must match pattern: ${patternStr}`;\n}\n\n// =============================================================================\n// FILE VALIDATION HELPERS\n// =============================================================================\n\nexport function isFileLike(value: unknown): value is File {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"name\" in value &&\n \"size\" in value &&\n \"type\" in value\n );\n}\n\nexport function isFileTypeAccepted(file: File, accept: string): boolean {\n if (accept === \"*\" || !accept) return true;\n\n const acceptTypes = accept.split(\",\").map((t) => t.trim().toLowerCase());\n const fileType = file.type.toLowerCase();\n const fileName = file.name.toLowerCase();\n\n return acceptTypes.some((acceptType) => {\n if (acceptType.endsWith(\"/*\")) {\n const category = acceptType.replace(\"/*\", \"\");\n return fileType.startsWith(category + \"/\");\n }\n if (acceptType.startsWith(\".\")) {\n return fileName.endsWith(acceptType);\n }\n return fileType === acceptType;\n });\n}\n","import { z } from 'zod';\nimport type { NumberField } from '../../types';\nimport { coerceToNumber, makeOptional } from '../helpers';\n\n/**\n * Creates Zod schema for number fields.\n * Note: Custom validation (field.validate) is handled at root schema level.\n */\nexport function createNumberFieldSchema(field: NumberField): z.ZodTypeAny {\n let numSchema = z.number({ error: 'Must be a number' });\n\n // Min/max constraints\n if (field.min !== undefined) {\n numSchema = numSchema.min(field.min, `Must be at least ${field.min}`);\n }\n if (field.max !== undefined) {\n numSchema = numSchema.max(field.max, `Must be at most ${field.max}`);\n }\n\n // Coercion: empty/null/undefined → undefined, otherwise Number()\n const schema: z.ZodTypeAny = z.preprocess(coerceToNumber, numSchema);\n\n if (field.required) {\n return schema;\n }\n\n return makeOptional(schema, 'number');\n}\n","import { z } from 'zod';\nimport type { DateField, DatetimeField } from '../../types';\nimport { coerceToDate, makeOptional } from '../helpers';\n\n/**\n * Parse a value to a Date object for constraint checking.\n */\nfunction toDate(value?: string | Date): Date | undefined {\n if (!value) return undefined;\n if (value instanceof Date) return isNaN(value.getTime()) ? undefined : value;\n const parsed = new Date(value);\n return isNaN(parsed.getTime()) ? undefined : parsed;\n}\n\n/**\n * Creates Zod schema for date and datetime fields.\n * Note: Custom validation (field.validate) is handled at root schema level.\n */\nexport function createDateFieldSchema(field: DateField | DatetimeField): z.ZodTypeAny {\n const isDatetime = field.type === 'datetime';\n\n // Parse min/max dates from field config\n const minDate = toDate(field.minDate);\n const maxDate = toDate(field.maxDate);\n\n // Build base date schema\n let dateSchema = z.date({ error: 'Please enter a valid date' });\n\n // Add min date constraint\n if (minDate) {\n const formattedDate = isDatetime ? minDate.toLocaleString() : minDate.toDateString();\n dateSchema = dateSchema.min(minDate, {\n error: `Date must be on or after ${formattedDate}`,\n });\n }\n\n // Add max date constraint\n if (maxDate) {\n const formattedDate = isDatetime ? maxDate.toLocaleString() : maxDate.toDateString();\n dateSchema = dateSchema.max(maxDate, {\n error: `Date must be on or before ${formattedDate}`,\n });\n }\n\n // Coercion from various input types\n const schema: z.ZodTypeAny = z.preprocess(coerceToDate, dateSchema);\n\n if (field.required) {\n return schema.refine(\n (val) => val instanceof Date && !isNaN(val.getTime()),\n 'Date is required'\n );\n }\n\n return makeOptional(schema, 'date');\n}\n","import { z } from \"zod\";\nimport type { SelectField, RadioField, CheckboxGroupField } from \"../../types\";\nimport { makeOptional } from \"../helpers\";\n\n// Base schema for select/radio values with user-friendly error messages\nconst selectValueSchema = z.union(\n [\n z.string({ error: \"Please select an option\" }),\n z.number({ error: \"Please select an option\" }),\n z.boolean({ error: \"Please select an option\" }),\n ],\n { error: \"Please select an option\" },\n);\n\ntype MultiSelectConfig = {\n minSelected?: number;\n maxSelected?: number;\n required?: boolean;\n};\n\nfunction applyMultiSelectConstraints(\n schema: z.ZodArray<typeof selectValueSchema>,\n config: MultiSelectConfig,\n): z.ZodArray<typeof selectValueSchema> {\n const { minSelected, maxSelected, required } = config;\n let next = schema;\n\n if (minSelected !== undefined && minSelected > 0) {\n const minMsg = `Select at least ${minSelected} option${minSelected !== 1 ? \"s\" : \"\"}`;\n if (required) {\n next = next.min(minSelected, minMsg);\n } else {\n // Optional multi-selects should allow no selection, but enforce min once user starts selecting.\n next = next.refine(\n (val) => val.length === 0 || val.length >= minSelected,\n {\n message: minMsg,\n },\n );\n }\n }\n\n if (required && (minSelected === undefined || minSelected === 0)) {\n next = next.min(1, \"Select at least one option\");\n }\n\n if (maxSelected !== undefined) {\n next = next.max(\n maxSelected,\n `Select at most ${maxSelected} option${maxSelected !== 1 ? \"s\" : \"\"}`,\n );\n }\n\n return next;\n}\n\nexport function createSelectFieldSchema(field: SelectField): z.ZodTypeAny {\n if (field.hasMany) {\n let arraySchema = z.array(selectValueSchema, {\n error: \"Invalid selection\",\n });\n arraySchema = applyMultiSelectConstraints(arraySchema, {\n minSelected: field.minSelected,\n maxSelected: field.maxSelected,\n required: field.required,\n });\n\n if (!field.required) {\n return arraySchema.optional().default([]);\n }\n return arraySchema;\n }\n\n let schema: z.ZodTypeAny = selectValueSchema;\n\n if (field.required) {\n schema = selectValueSchema.refine(\n (val) => val !== \"\" && val !== null && val !== undefined,\n \"Please select an option\",\n );\n }\n\n if (!field.required) {\n return makeOptional(schema, \"select\");\n }\n\n return schema;\n}\n\nexport function createRadioFieldSchema(field: RadioField): z.ZodTypeAny {\n let schema: z.ZodTypeAny = selectValueSchema;\n\n if (field.required) {\n schema = selectValueSchema.refine(\n (val) => val !== \"\" && val !== null && val !== undefined,\n \"Please select an option\",\n );\n }\n\n if (!field.required) {\n return makeOptional(schema, \"radio\");\n }\n\n return schema;\n}\n\nexport function createCheckboxGroupFieldSchema(\n field: CheckboxGroupField,\n): z.ZodTypeAny {\n let schema = z.array(selectValueSchema, { error: \"Invalid selection\" });\n schema = applyMultiSelectConstraints(schema, {\n minSelected: field.minSelected,\n maxSelected: field.maxSelected,\n required: field.required,\n });\n\n if (!field.required) {\n return makeOptional(schema, \"checkbox-group\");\n }\n\n return schema;\n}\n","import { z } from 'zod';\nimport type { CheckboxField, SwitchField } from '../../types';\n\nexport function createCheckboxFieldSchema(field: CheckboxField): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.boolean({ error: 'Invalid value' });\n\n if (field.required) {\n schema = z.boolean({ error: 'This field is required' }).refine(val => val === true, {\n error: 'This field is required',\n });\n }\n\n return schema;\n}\n\nexport function createSwitchFieldSchema(field: SwitchField): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.boolean({ error: 'Invalid value' });\n\n if (field.required) {\n schema = z.boolean({ error: 'This field is required' }).refine(val => val === true, {\n error: 'This field is required',\n });\n }\n\n return schema;\n}\n","import { z } from 'zod';\nimport type { UploadField } from '../../types';\n\nfunction matchesMimePattern(fileType: string, pattern: string): boolean {\n const normalizedPattern = pattern.toLowerCase().trim();\n const normalizedType = fileType.toLowerCase();\n\n if (normalizedPattern.endsWith('/*')) {\n const category = normalizedPattern.replace('/*', '');\n return normalizedType.startsWith(category + '/');\n }\n\n if (normalizedPattern.startsWith('.')) {\n return true;\n }\n\n return normalizedType === normalizedPattern;\n}\n\nfunction isFileTypeAccepted(file: File, acceptPatterns: string[]): boolean {\n if (!file.type) return true;\n return acceptPatterns.some(pattern => matchesMimePattern(file.type, pattern));\n}\n\nexport function createUploadFieldSchema(field: UploadField): z.ZodTypeAny {\n let fileSchema: z.ZodTypeAny = z.file({ error: 'Please select a file' });\n\n if (field.maxSize) {\n const sizeMB = (field.maxSize / 1024 / 1024).toFixed(1);\n fileSchema = (fileSchema as z.ZodFile).max(field.maxSize, {\n error: `File must be smaller than ${sizeMB}MB`,\n });\n }\n\n const accept = field.ui?.accept;\n if (accept && accept !== '*') {\n const acceptPatterns = accept.split(',').map(t => t.trim());\n const hasWildcard = acceptPatterns.some(p => p.includes('*') || p.startsWith('.'));\n\n if (hasWildcard) {\n fileSchema = fileSchema.refine(\n (file) => isFileTypeAccepted(file as File, acceptPatterns),\n `File type not allowed. Accepted: ${accept}`\n );\n } else {\n fileSchema = (fileSchema as z.ZodFile).mime(acceptPatterns, {\n error: `File type not allowed. Accepted: ${accept}`,\n });\n }\n }\n\n const fileOrUrl = z.union([\n fileSchema,\n z.string({ error: 'Invalid file' }),\n ], { error: 'Please select a file' });\n\n if (field.hasMany) {\n let arraySchema = z.array(fileOrUrl, { error: 'Invalid files' });\n\n if (field.minFiles !== undefined && field.minFiles > 0) {\n arraySchema = arraySchema.min(field.minFiles, {\n error: `At least ${field.minFiles} file(s) required`,\n });\n }\n\n if (field.maxFiles !== undefined) {\n arraySchema = arraySchema.max(field.maxFiles, {\n error: `Maximum ${field.maxFiles} file(s) allowed`,\n });\n }\n\n if (field.required) {\n arraySchema = arraySchema.min(1, {\n error: 'At least one file is required',\n });\n return arraySchema;\n }\n\n return arraySchema.optional().default([]);\n }\n\n if (field.required) {\n return fileOrUrl;\n }\n\n return fileOrUrl.optional().nullable();\n}\n","import { z } from 'zod';\nimport type { TagsField } from '../../types';\n\nexport function createTagsFieldSchema(field: TagsField): z.ZodTypeAny {\n const tagSchema = z.string({ error: 'Invalid tag' });\n let schema = z.array(tagSchema, { error: 'Invalid tags' });\n\n if (field.minTags !== undefined) {\n schema = schema.min(field.minTags, `At least ${field.minTags} tag(s) required`);\n }\n if (field.maxTags !== undefined) {\n schema = schema.max(field.maxTags, `Maximum ${field.maxTags} tag(s) allowed`);\n }\n\n if (field.required) {\n return schema.refine(\n (arr) => Array.isArray(arr) && arr.length > 0,\n 'At least one tag is required'\n );\n }\n\n return schema.optional().default([]);\n}\n","import { z } from 'zod';\nimport type { ArrayField, GroupField, Field } from '../../types';\n\n// Note: These import from the parent module to avoid circular deps\n// The fieldsToZodSchema function is passed as a parameter\n\ntype SchemaGenerator = (fields: readonly Field[]) => z.ZodObject<z.ZodRawShape>;\n\n/**\n * Creates Zod schema for array fields.\n * Uses passed-in schema generator to handle nested fields.\n */\nexport function createArrayFieldSchema(\n field: ArrayField,\n fieldsToZodSchema: SchemaGenerator\n): z.ZodTypeAny {\n const itemSchema = fieldsToZodSchema(field.fields);\n let schema = z.array(itemSchema);\n\n if (field.minRows !== undefined) {\n schema = schema.min(\n field.minRows,\n `At least ${field.minRows} row${field.minRows !== 1 ? 's' : ''} required`\n );\n }\n if (field.maxRows !== undefined) {\n schema = schema.max(\n field.maxRows,\n `Maximum ${field.maxRows} row${field.maxRows !== 1 ? 's' : ''} allowed`\n );\n }\n\n if (field.required) {\n return schema;\n }\n\n return schema.optional().default([]);\n}\n\n/**\n * Creates Zod schema for group fields.\n * Uses passed-in schema generator to handle nested fields.\n */\nexport function createGroupFieldSchema(\n field: GroupField,\n fieldsToZodSchema: SchemaGenerator\n): z.ZodTypeAny {\n const schema = fieldsToZodSchema(field.fields);\n\n if (!field.required) {\n return schema.optional();\n }\n\n return schema;\n}","import { type z } from 'zod';\nimport type { Field, FieldsToShape } from '../types';\nimport type { StrictFieldArray } from '../types/strict-fields';\nimport { fieldsToZodSchema } from './fields-to-schema';\n\n/**\n * Creates a Zod schema from field definitions with strict type validation.\n *\n * @example\n * const schema = createSchema([\n * { type: 'email', name: 'email', required: true },\n * { type: 'password', name: 'password', minLength: 8 },\n * ]);\n *\n * type FormData = z.infer<typeof schema>;\n */\nexport function createSchema<const T extends readonly Field[]>(\n fields: StrictFieldArray<T> & T\n): z.ZodObject<FieldsToShape<T>> & { fields: T } {\n const schema = fieldsToZodSchema(fields as unknown as T);\n return Object.assign(schema, { fields }) as z.ZodObject<FieldsToShape<T>> & { fields: T };\n}\n","import { nanoid } from 'nanoid';\nimport type { ArrayHelpers } from '../types';\n\n/**\n * Creates a standardized set of array field manipulation methods.\n * Abstracts the difference between getting/setting values in different form libraries.\n * \n * @param getArray - Function to get current array value at a path\n * @param setArray - Function to set array value at a path\n */\nexport function createArrayHelpers(\n getArray: (path: string) => unknown[],\n setArray: (path: string, value: unknown[]) => void\n): ArrayHelpers {\n return {\n fields: <T = unknown>(path: string): Array<T & { id: string }> => {\n const arr = getArray(path);\n if (!Array.isArray(arr)) return [];\n return arr.map((item, index) => ({\n id: (item as Record<string, unknown>)?.id as string || `${path}-${index}`,\n ...item as T,\n }));\n },\n\n append: (path: string, value: unknown) => {\n const current = getArray(path) || [];\n const itemWithId = ensureId(value);\n setArray(path, [...current, itemWithId]);\n },\n\n prepend: (path: string, value: unknown) => {\n const current = getArray(path) || [];\n const itemWithId = ensureId(value);\n setArray(path, [itemWithId, ...current]);\n },\n\n insert: (path: string, index: number, value: unknown) => {\n const current = [...(getArray(path) || [])];\n const itemWithId = ensureId(value);\n current.splice(index, 0, itemWithId);\n setArray(path, current);\n },\n\n remove: (path: string, index: number) => {\n const current = [...(getArray(path) || [])];\n current.splice(index, 1);\n setArray(path, current);\n },\n\n move: (path: string, from: number, to: number) => {\n const current = [...(getArray(path) || [])];\n const [item] = current.splice(from, 1);\n current.splice(to, 0, item);\n setArray(path, current);\n },\n\n swap: (path: string, indexA: number, indexB: number) => {\n const current = [...(getArray(path) || [])];\n const temp = current[indexA];\n current[indexA] = current[indexB];\n current[indexB] = temp;\n setArray(path, current);\n },\n\n replace: (path: string, values: unknown[]) => {\n const itemsWithIds = values.map(ensureId);\n setArray(path, itemsWithIds);\n },\n\n update: (path: string, index: number, value: unknown) => {\n const current = [...(getArray(path) || [])];\n // Preserve existing ID if present\n const existingId = (current[index] as Record<string, unknown>)?.id;\n current[index] = {\n ...(typeof value === 'object' && value !== null ? value : {}),\n id: existingId || nanoid(),\n };\n setArray(path, current);\n },\n };\n}\n\n/**\n * Ensures an item has a unique ID for React keys.\n */\nfunction ensureId(value: unknown): unknown {\n if (typeof value === 'object' && value !== null) {\n const obj = value as Record<string, unknown>;\n if (!obj.id) {\n return { ...obj, id: nanoid() };\n }\n return obj;\n }\n return { value, id: nanoid() };\n}\n","// =============================================================================\n// COMMON UTILITIES\n// These are used by both the core package and registry field components.\n// =============================================================================\n\n/**\n * Generate a unique field ID from the field path.\n * Converts dot notation to dashes and prefixes with 'field-'.\n * Used for accessibility (htmlFor, id attributes).\n * \n * @example\n * generateFieldId('user.profile.email') => 'field-user-profile-email'\n * generateFieldId('items[0].name') => 'field-items-0-name'\n */\nexport function generateFieldId(path: string): string {\n return `field-${path.replace(/\\./g, \"-\").replace(/\\[/g, \"-\").replace(/\\]/g, \"\")}`;\n}\n\n/**\n * Safely retrieve a nested value from an object using a dot-notation path.\n * \n * @example\n * getNestedValue({ user: { name: 'John' } }, 'user.name') => 'John'\n * getNestedValue({ items: [{ id: 1 }] }, 'items.0.id') => 1\n */\nexport function getNestedValue(obj: unknown, path: string): unknown {\n if (!obj || !path) return undefined;\n return path.split(\".\").reduce<unknown>((acc: unknown, key: string) => {\n if (acc && typeof acc === \"object\" && acc !== null) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * Set a nested value in an object using a dot-notation path.\n * Creates intermediate objects/arrays as needed.\n * \n * @example\n * setNestedValue({}, 'user.name', 'John') => { user: { name: 'John' } }\n */\nexport function setNestedValue<T extends Record<string, unknown>>(\n obj: T,\n path: string,\n value: unknown\n): T {\n const keys = path.split(\".\");\n const result = { ...obj } as Record<string, unknown>;\n let current = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== \"object\") {\n // Check if next key is numeric (array index)\n const nextKey = keys[i + 1];\n current[key] = /^\\d+$/.test(nextKey) ? [] : {};\n } else {\n current[key] = Array.isArray(current[key])\n ? [...(current[key] as unknown[])]\n : { ...(current[key] as Record<string, unknown>) };\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result as T;\n}\n\n/**\n * Format bytes into a human-readable string.\n * \n * @example\n * formatBytes(1024) => '1 KB'\n * formatBytes(1234567) => '1.18 MB'\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n}\n\n/**\n * Flatten a nested object to dot-notation paths.\n * Useful for converting form library state (like dirtyFields, touchedFields)\n * to the flat format expected by FormState.\n * \n * @example\n * flattenNestedObject({ user: { name: true, email: true } })\n * // => { 'user.name': true, 'user.email': true }\n * \n * flattenNestedObject({ items: { 0: { title: true } } })\n * // => { 'items.0.title': true }\n */\nexport function flattenNestedObject(\n obj: Record<string, unknown>,\n prefix = ''\n): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n\n for (const key in obj) {\n const path = prefix ? `${prefix}.${key}` : key;\n const value = obj[key];\n\n if (typeof value === 'boolean') {\n result[path] = value;\n } else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n Object.assign(result, flattenNestedObject(value as Record<string, unknown>, path));\n }\n }\n\n return result;\n}\n\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","isFileTypeAccepted","import_zod","import_zod","fieldsToZodSchema"]}
|
|
1
|
+
{"version":3,"sources":["../src/schema/index.ts","../src/schema/fields-to-schema.ts","../src/schema/builders/text.ts","../src/schema/helpers.ts","../src/schema/builders/number.ts","../src/schema/builders/date.ts","../src/schema/builders/select.ts","../src/schema/builders/boolean.ts","../src/schema/builders/upload.ts","../src/schema/builders/tags.ts","../src/schema/builders/composite.ts","../src/schema/create-schema.ts","../src/utils/array.ts","../src/lib/utils.ts"],"sourcesContent":["/**\n * Schema utilities for BuzzForm.\n *\n * @example\n * import { createSchema } from '@buildnbuzz/buzzform';\n *\n * const loginSchema = createSchema([\n * { type: 'email', name: 'email', required: true },\n * { type: 'password', name: 'password', minLength: 8 },\n * ]);\n *\n * type LoginData = z.infer<typeof loginSchema>;\n */\n\n// =============================================================================\n// TYPES - Adapter Interface (no runtime code, just types)\n// =============================================================================\nexport type {\n FormState,\n SetValueOptions,\n FieldError,\n ResolverResult,\n Resolver,\n ArrayHelpers,\n AdapterOptions,\n FormAdapter,\n AdapterFactory,\n} from '../types';\n\n// =============================================================================\n// TYPES - Field Definitions\n// =============================================================================\nexport type {\n // Validation\n ValidationContext,\n ValidationResult,\n ValidationFn,\n\n // Conditional\n ConditionContext,\n FieldCondition,\n\n // Custom rendering\n FieldComponentProps,\n FieldInputProps,\n FieldInputRenderFn,\n\n // Styling\n FieldStyle,\n\n // Base\n BaseField,\n\n // Data fields\n TextField,\n EmailField,\n PasswordField,\n TextareaField,\n NumberField,\n DateField,\n DatetimeField,\n SelectOption,\n SelectField,\n CheckboxField,\n SwitchField,\n RadioField,\n TagsField,\n UploadField,\n\n // Layout fields\n GroupField,\n ArrayField,\n RowField,\n Tab,\n TabsField,\n CollapsibleField,\n\n // Union types\n Field,\n FieldType,\n DataField,\n LayoutField,\n} from '../types';\n\n// =============================================================================\n// TYPES - Form Configuration\n// =============================================================================\nexport type {\n BuzzFormSchema,\n FormSettings,\n FormConfig,\n UseFormOptions,\n} from '../types';\n\n// =============================================================================\n// TYPES - Schema Utilities\n// =============================================================================\nexport type {\n FieldToZod,\n FieldsToShape,\n SchemaBuilder,\n SchemaBuilderMap,\n InferType,\n InferSchema,\n} from '../types';\n\n// =============================================================================\n// SCHEMA\n// =============================================================================\nexport { createSchema } from './create-schema';\nexport { fieldsToZodSchema } from './fields-to-schema';\n\n// Re-export schema helpers for advanced usage (custom field builders)\nexport {\n extractValidationConfig,\n makeOptional,\n coerceToNumber,\n coerceToDate,\n getPatternErrorMessage,\n isFileLike,\n isFileTypeAccepted,\n // Helpers for cross-field validation (used by zodResolver)\n collectFieldValidators,\n getSiblingData,\n getValueByPath,\n type FieldValidator,\n} from './helpers';\n\n// Individual builders for registry integration\nexport * from './builders';\n\n// =============================================================================\n// UTILITIES (Server-safe - no React imports)\n// =============================================================================\nexport { createArrayHelpers } from '../utils';\n\n// Add common utilities that registry components will need\nexport { generateFieldId, getNestedValue, setNestedValue, formatBytes } from '../lib';","import { z } from \"zod\";\nimport type {\n Field,\n TabsField,\n TextField,\n EmailField,\n PasswordField,\n TextareaField,\n NumberField,\n DateField,\n DatetimeField,\n SelectField,\n CheckboxGroupField,\n RadioField,\n CheckboxField,\n SwitchField,\n UploadField,\n TagsField,\n ArrayField,\n GroupField,\n FieldsToShape,\n} from \"../types\";\nimport {\n createTextFieldSchema,\n createEmailFieldSchema,\n createPasswordFieldSchema,\n createNumberFieldSchema,\n createDateFieldSchema,\n createSelectFieldSchema,\n createCheckboxGroupFieldSchema,\n createRadioFieldSchema,\n createCheckboxFieldSchema,\n createSwitchFieldSchema,\n createUploadFieldSchema,\n createTagsFieldSchema,\n createArrayFieldSchema,\n createGroupFieldSchema,\n} from \"./builders\";\n\nfunction fieldToZod(field: Field): z.ZodTypeAny {\n if (\"schema\" in field && field.schema) {\n return field.schema as z.ZodTypeAny;\n }\n\n switch (field.type) {\n case \"text\":\n return createTextFieldSchema(field as TextField);\n case \"email\":\n return createEmailFieldSchema(field as EmailField);\n case \"password\":\n return createPasswordFieldSchema(field as PasswordField);\n case \"textarea\":\n return createTextFieldSchema(field as TextareaField);\n case \"number\":\n return createNumberFieldSchema(field as NumberField);\n case \"date\":\n case \"datetime\":\n return createDateFieldSchema(field as DateField | DatetimeField);\n case \"select\":\n return createSelectFieldSchema(field as SelectField);\n case \"checkbox-group\":\n return createCheckboxGroupFieldSchema(field as CheckboxGroupField);\n case \"radio\":\n return createRadioFieldSchema(field as RadioField);\n case \"checkbox\":\n return createCheckboxFieldSchema(field as CheckboxField);\n case \"switch\":\n return createSwitchFieldSchema(field as SwitchField);\n case \"upload\":\n return createUploadFieldSchema(field as UploadField);\n case \"tags\":\n return createTagsFieldSchema(field as TagsField);\n case \"array\":\n return createArrayFieldSchema(field as ArrayField, fieldsToZodSchema);\n case \"group\":\n return createGroupFieldSchema(field as GroupField, fieldsToZodSchema);\n case \"row\":\n case \"collapsible\":\n case \"tabs\":\n return z.any();\n default:\n return z.any();\n }\n}\n\nfunction processTabsField(field: TabsField): Record<string, z.ZodTypeAny> {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const tab of field.tabs) {\n if (tab.name) {\n const tabSchema = fieldsToZodSchema(tab.fields);\n shape[tab.name] = tabSchema;\n } else {\n const tabFieldsSchema = fieldsToZodSchema(tab.fields);\n if (tabFieldsSchema instanceof z.ZodObject) {\n Object.assign(shape, tabFieldsSchema.shape);\n }\n }\n }\n\n return shape;\n}\n\n/**\n * Converts field definitions to a Zod schema.\n *\n * Note: Custom validation (field.validate) is handled by the zodResolver,\n * not at the schema level. This ensures custom validators run even when\n * other fields have errors.\n */\nexport function fieldsToZodSchema<T extends readonly Field[]>(\n fields: T,\n): z.ZodObject<FieldsToShape<T>> {\n const shape: Record<string, z.ZodTypeAny> = {};\n\n for (const field of fields) {\n if (\"name\" in field && field.name) {\n shape[field.name] = fieldToZod(field);\n } else if (field.type === \"tabs\") {\n const tabsShape = processTabsField(field);\n Object.assign(shape, tabsShape);\n } else if (field.type === \"row\" || field.type === \"collapsible\") {\n const nestedSchema = fieldsToZodSchema(field.fields);\n if (nestedSchema instanceof z.ZodObject) {\n Object.assign(shape, nestedSchema.shape);\n }\n }\n }\n\n return z.object(shape) as z.ZodObject<FieldsToShape<T>>;\n}\n","import { z } from 'zod';\nimport type { TextField, EmailField, TextareaField, PasswordField } from '../../types';\nimport { makeOptional, getPatternErrorMessage } from '../helpers';\n\nexport function createTextFieldSchema(field: TextField | TextareaField): z.ZodTypeAny {\n let schema = z.string({ error: 'This field is required' });\n\n if ('pattern' in field && field.pattern) {\n const pattern = typeof field.pattern === 'string'\n ? new RegExp(field.pattern)\n : field.pattern;\n\n schema = schema.regex(pattern, {\n error: getPatternErrorMessage(field.pattern),\n });\n }\n\n if (field.minLength) {\n schema = schema.min(field.minLength, {\n error: `Must be at least ${field.minLength} characters`,\n });\n }\n if (field.maxLength) {\n schema = schema.max(field.maxLength, {\n error: `Must be no more than ${field.maxLength} characters`,\n });\n }\n\n if (field.required) {\n schema = schema.min(1, { error: 'This field is required' });\n }\n\n let finalSchema: z.ZodTypeAny = schema;\n if ('trim' in field && field.trim) {\n finalSchema = z.preprocess((val) => {\n return typeof val === 'string' ? val.trim() : val;\n }, schema);\n }\n\n if (!field.required) {\n return makeOptional(finalSchema, field.type);\n }\n\n return finalSchema;\n}\n\nexport function createEmailFieldSchema(field: EmailField): z.ZodTypeAny {\n // Zod v4: z.email() for email validation with custom error\n let schema = z.email({ error: 'Invalid email address' });\n\n if (field.minLength) {\n schema = schema.min(field.minLength, {\n error: `Must be at least ${field.minLength} characters`,\n });\n }\n if (field.maxLength) {\n schema = schema.max(field.maxLength, {\n error: `Must be no more than ${field.maxLength} characters`,\n });\n }\n\n if (field.required) {\n schema = schema.min(1, { error: 'Email is required' });\n }\n\n if (!field.required) {\n return makeOptional(schema, 'email');\n }\n\n return schema;\n}\n\nexport function createPasswordFieldSchema(field: PasswordField): z.ZodTypeAny {\n // Zod v4: provide error message for invalid_type\n let schema = z.string({ error: 'Password is required' });\n\n if (field.minLength) {\n schema = schema.min(field.minLength, {\n error: `Password must be at least ${field.minLength} characters`,\n });\n }\n if (field.maxLength) {\n schema = schema.max(field.maxLength, {\n error: `Password must be no more than ${field.maxLength} characters`,\n });\n }\n if (field.required) {\n schema = schema.min(1, { error: 'Password is required' });\n }\n\n if (!field.required) {\n return makeOptional(schema, 'password');\n }\n\n return schema;\n}\n","import { z } from \"zod\";\nimport type {\n Field,\n FieldType,\n ValidationContext,\n ValidationFn,\n} from \"../types\";\n\n// =============================================================================\n// VALIDATION CONFIG EXTRACTION\n// =============================================================================\n\ntype ExtractableValidationFn = (\n value: unknown,\n context: ValidationContext,\n) => true | string | Promise<true | string>;\n\nexport interface ExtractedValidationConfig {\n fn?: ExtractableValidationFn;\n isLive: boolean;\n debounceMs?: number;\n}\n\nexport function extractValidationConfig(\n validate?: unknown,\n): ExtractedValidationConfig {\n if (!validate) {\n return { fn: undefined, isLive: false };\n }\n\n if (typeof validate === \"function\") {\n return { fn: validate as ExtractableValidationFn, isLive: false };\n }\n\n if (typeof validate === \"object\" && \"fn\" in validate) {\n const obj = validate as {\n fn?: unknown;\n live?: boolean | { debounceMs?: number };\n };\n const fn =\n typeof obj.fn === \"function\"\n ? (obj.fn as ExtractableValidationFn)\n : undefined;\n\n if (!obj.live) {\n return { fn, isLive: false };\n }\n\n const debounceMs =\n typeof obj.live === \"object\" ? obj.live.debounceMs : undefined;\n return { fn, isLive: true, debounceMs };\n }\n\n return { fn: undefined, isLive: false };\n}\n\n// =============================================================================\n// FIELD VALIDATOR COLLECTION\n// =============================================================================\n\nexport interface FieldValidator {\n path: string;\n fn: ValidationFn;\n}\n\n/**\n * Recursively collects all field validators from a field array.\n */\nexport function collectFieldValidators(\n fields: readonly Field[],\n basePath: string = \"\",\n): FieldValidator[] {\n const validators: FieldValidator[] = [];\n\n for (const field of fields) {\n if (\"name\" in field && field.name) {\n const fieldPath = basePath ? `${basePath}.${field.name}` : field.name;\n\n if (\"validate\" in field && field.validate) {\n const config = extractValidationConfig(field.validate);\n if (config.fn) {\n validators.push({\n path: fieldPath,\n fn: config.fn as ValidationFn,\n });\n }\n }\n\n if (field.type === \"group\" && \"fields\" in field) {\n validators.push(...collectFieldValidators(field.fields, fieldPath));\n }\n }\n\n // Layout fields pass through without adding to path\n if (field.type === \"row\" && \"fields\" in field) {\n validators.push(...collectFieldValidators(field.fields, basePath));\n }\n if (field.type === \"collapsible\" && \"fields\" in field) {\n validators.push(...collectFieldValidators(field.fields, basePath));\n }\n if (field.type === \"tabs\" && \"tabs\" in field) {\n for (const tab of field.tabs) {\n const tabPath = tab.name\n ? basePath\n ? `${basePath}.${tab.name}`\n : tab.name\n : basePath;\n validators.push(...collectFieldValidators(tab.fields, tabPath));\n }\n }\n }\n\n return validators;\n}\n\n// =============================================================================\n// SIBLING DATA EXTRACTION\n// =============================================================================\n\n/**\n * Gets the parent object containing the field at the given path.\n */\nexport function getSiblingData(\n data: Record<string, unknown>,\n path: string,\n): Record<string, unknown> {\n const parts = path.split(\".\");\n\n if (parts.length <= 1) {\n return data;\n }\n\n const parentParts = parts.slice(0, -1);\n let current: unknown = data;\n\n for (const part of parentParts) {\n if (current && typeof current === \"object\" && current !== null) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return {};\n }\n }\n\n if (current && typeof current === \"object\" && current !== null) {\n return current as Record<string, unknown>;\n }\n\n return {};\n}\n\n/**\n * Gets a value at a dot-notation path.\n */\nexport function getValueByPath(\n data: Record<string, unknown>,\n path: string,\n): unknown {\n const parts = path.split(\".\");\n let current: unknown = data;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && current !== null) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n/**\n * Creates a superRefine that runs all field validators with full form context.\n */\nexport function createRootValidationRefinement(\n validators: FieldValidator[],\n): (data: Record<string, unknown>, ctx: z.RefinementCtx) => Promise<void> {\n return async (data, ctx) => {\n const validationPromises = validators.map(async ({ path, fn }) => {\n const value = getValueByPath(data, path);\n const siblingData = getSiblingData(data, path);\n\n try {\n const result = await fn(value, {\n data,\n siblingData,\n path: path.split(\".\"),\n });\n\n if (result !== true) {\n ctx.addIssue({\n code: \"custom\",\n path: path.split(\".\"),\n message: typeof result === \"string\" ? result : \"Validation failed\",\n });\n }\n } catch (error) {\n ctx.addIssue({\n code: \"custom\",\n path: path.split(\".\"),\n message: error instanceof Error ? error.message : \"Validation error\",\n });\n }\n });\n\n await Promise.all(validationPromises);\n };\n}\n\n// =============================================================================\n// OPTIONAL HANDLING\n// =============================================================================\n\nexport function makeOptional(\n schema: z.ZodTypeAny,\n fieldType: FieldType,\n): z.ZodTypeAny {\n switch (fieldType) {\n case \"text\":\n case \"textarea\":\n case \"email\":\n case \"password\":\n return schema.optional().or(z.literal(\"\"));\n\n case \"number\":\n case \"date\":\n case \"select\":\n case \"radio\":\n return schema.optional().nullable();\n\n case \"checkbox\":\n case \"switch\":\n return schema;\n\n case \"checkbox-group\":\n return schema.optional().default([]);\n\n case \"tags\":\n case \"array\":\n return schema.optional().default([]);\n\n case \"upload\":\n return schema.optional().nullable();\n\n default:\n return schema.optional();\n }\n}\n\n// =============================================================================\n// COERCION HELPERS\n// =============================================================================\n\nexport function coerceToNumber(val: unknown): number | undefined {\n if (val === \"\" || val === null || val === undefined) {\n return undefined;\n }\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n}\n\nexport function coerceToDate(val: unknown): Date | undefined {\n if (val === \"\" || val === null || val === undefined) {\n return undefined;\n }\n if (val instanceof Date) {\n return isNaN(val.getTime()) ? undefined : val;\n }\n if (typeof val === \"string\" || typeof val === \"number\") {\n const d = new Date(val);\n return isNaN(d.getTime()) ? undefined : d;\n }\n return undefined;\n}\n\n// =============================================================================\n// PATTERN VALIDATION\n// =============================================================================\n\nconst PATTERN_MESSAGES: Record<string, string> = {\n \"^[a-zA-Z0-9_]+$\": \"Only letters, numbers, and underscores allowed\",\n \"^[a-z0-9-]+$\": \"Only lowercase letters, numbers, and hyphens allowed\",\n \"^\\\\S+@\\\\S+\\\\.\\\\S+$\": \"Invalid email format\",\n \"^https?://\": \"Must start with http:// or https://\",\n};\n\nexport function getPatternErrorMessage(pattern: string | RegExp): string {\n const patternStr = typeof pattern === \"string\" ? pattern : pattern.source;\n return PATTERN_MESSAGES[patternStr] || `Must match pattern: ${patternStr}`;\n}\n\n// =============================================================================\n// FILE VALIDATION HELPERS\n// =============================================================================\n\nexport function isFileLike(value: unknown): value is File {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"name\" in value &&\n \"size\" in value &&\n \"type\" in value\n );\n}\n\nexport function isFileTypeAccepted(file: File, accept: string): boolean {\n if (accept === \"*\" || !accept) return true;\n\n const acceptTypes = accept.split(\",\").map((t) => t.trim().toLowerCase());\n const fileType = file.type.toLowerCase();\n const fileName = file.name.toLowerCase();\n\n return acceptTypes.some((acceptType) => {\n if (acceptType.endsWith(\"/*\")) {\n const category = acceptType.replace(\"/*\", \"\");\n return fileType.startsWith(category + \"/\");\n }\n if (acceptType.startsWith(\".\")) {\n return fileName.endsWith(acceptType);\n }\n return fileType === acceptType;\n });\n}\n","import { z } from 'zod';\nimport type { NumberField } from '../../types';\nimport { coerceToNumber, makeOptional } from '../helpers';\n\n/**\n * Creates Zod schema for number fields.\n * Note: Custom validation (field.validate) is handled at root schema level.\n */\nexport function createNumberFieldSchema(field: NumberField): z.ZodTypeAny {\n let numSchema = z.number({ error: 'Must be a number' });\n\n // Min/max constraints\n if (field.min !== undefined) {\n numSchema = numSchema.min(field.min, `Must be at least ${field.min}`);\n }\n if (field.max !== undefined) {\n numSchema = numSchema.max(field.max, `Must be at most ${field.max}`);\n }\n\n // Coercion: empty/null/undefined → undefined, otherwise Number()\n const schema: z.ZodTypeAny = z.preprocess(coerceToNumber, numSchema);\n\n if (field.required) {\n return schema;\n }\n\n return makeOptional(schema, 'number');\n}\n","import { z } from 'zod';\nimport type { DateField, DatetimeField } from '../../types';\nimport { coerceToDate, makeOptional } from '../helpers';\n\n/**\n * Parse a value to a Date object for constraint checking.\n */\nfunction toDate(value?: string | Date): Date | undefined {\n if (!value) return undefined;\n if (value instanceof Date) return isNaN(value.getTime()) ? undefined : value;\n const parsed = new Date(value);\n return isNaN(parsed.getTime()) ? undefined : parsed;\n}\n\n/**\n * Creates Zod schema for date and datetime fields.\n * Note: Custom validation (field.validate) is handled at root schema level.\n */\nexport function createDateFieldSchema(field: DateField | DatetimeField): z.ZodTypeAny {\n const isDatetime = field.type === 'datetime';\n\n // Parse min/max dates from field config\n const minDate = toDate(field.minDate);\n const maxDate = toDate(field.maxDate);\n\n // Build base date schema\n let dateSchema = z.date({ error: 'Please enter a valid date' });\n\n // Add min date constraint\n if (minDate) {\n const formattedDate = isDatetime ? minDate.toLocaleString() : minDate.toDateString();\n dateSchema = dateSchema.min(minDate, {\n error: `Date must be on or after ${formattedDate}`,\n });\n }\n\n // Add max date constraint\n if (maxDate) {\n const formattedDate = isDatetime ? maxDate.toLocaleString() : maxDate.toDateString();\n dateSchema = dateSchema.max(maxDate, {\n error: `Date must be on or before ${formattedDate}`,\n });\n }\n\n // Coercion from various input types\n const schema: z.ZodTypeAny = z.preprocess(coerceToDate, dateSchema);\n\n if (field.required) {\n return schema.refine(\n (val) => val instanceof Date && !isNaN(val.getTime()),\n 'Date is required'\n );\n }\n\n return makeOptional(schema, 'date');\n}\n","import { z } from \"zod\";\nimport type { SelectField, RadioField, CheckboxGroupField } from \"../../types\";\nimport { makeOptional } from \"../helpers\";\n\n// Base schema for select/radio values with user-friendly error messages\nconst selectValueSchema = z.union(\n [\n z.string({ error: \"Please select an option\" }),\n z.number({ error: \"Please select an option\" }),\n z.boolean({ error: \"Please select an option\" }),\n ],\n { error: \"Please select an option\" },\n);\n\ntype MultiSelectConfig = {\n minSelected?: number;\n maxSelected?: number;\n required?: boolean;\n};\n\nfunction applyMultiSelectConstraints(\n schema: z.ZodArray<typeof selectValueSchema>,\n config: MultiSelectConfig,\n): z.ZodArray<typeof selectValueSchema> {\n const { minSelected, maxSelected, required } = config;\n let next = schema;\n\n if (minSelected !== undefined && minSelected > 0) {\n const minMsg = `Select at least ${minSelected} option${minSelected !== 1 ? \"s\" : \"\"}`;\n if (required) {\n next = next.min(minSelected, minMsg);\n } else {\n // Optional multi-selects should allow no selection, but enforce min once user starts selecting.\n next = next.refine(\n (val) => val.length === 0 || val.length >= minSelected,\n {\n message: minMsg,\n },\n );\n }\n }\n\n if (required && (minSelected === undefined || minSelected === 0)) {\n next = next.min(1, \"Select at least one option\");\n }\n\n if (maxSelected !== undefined) {\n next = next.max(\n maxSelected,\n `Select at most ${maxSelected} option${maxSelected !== 1 ? \"s\" : \"\"}`,\n );\n }\n\n return next;\n}\n\nexport function createSelectFieldSchema(field: SelectField): z.ZodTypeAny {\n if (field.hasMany) {\n let arraySchema = z.array(selectValueSchema, {\n error: \"Invalid selection\",\n });\n arraySchema = applyMultiSelectConstraints(arraySchema, {\n minSelected: field.minSelected,\n maxSelected: field.maxSelected,\n required: field.required,\n });\n\n if (!field.required) {\n return arraySchema.optional().default([]);\n }\n return arraySchema;\n }\n\n let schema: z.ZodTypeAny = selectValueSchema;\n\n if (field.required) {\n schema = selectValueSchema.refine(\n (val) => val !== \"\" && val !== null && val !== undefined,\n \"Please select an option\",\n );\n }\n\n if (!field.required) {\n return makeOptional(schema, \"select\");\n }\n\n return schema;\n}\n\nexport function createRadioFieldSchema(field: RadioField): z.ZodTypeAny {\n let schema: z.ZodTypeAny = selectValueSchema;\n\n if (field.required) {\n schema = selectValueSchema.refine(\n (val) => val !== \"\" && val !== null && val !== undefined,\n \"Please select an option\",\n );\n }\n\n if (!field.required) {\n return makeOptional(schema, \"radio\");\n }\n\n return schema;\n}\n\nexport function createCheckboxGroupFieldSchema(\n field: CheckboxGroupField,\n): z.ZodTypeAny {\n let schema = z.array(selectValueSchema, { error: \"Invalid selection\" });\n schema = applyMultiSelectConstraints(schema, {\n minSelected: field.minSelected,\n maxSelected: field.maxSelected,\n required: field.required,\n });\n\n if (!field.required) {\n return makeOptional(schema, \"checkbox-group\");\n }\n\n return schema;\n}\n","import { z } from 'zod';\nimport type { CheckboxField, SwitchField } from '../../types';\n\nexport function createCheckboxFieldSchema(field: CheckboxField): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.boolean({ error: 'Invalid value' }).default(false);\n\n if (field.required) {\n schema = z.boolean({ error: 'Invalid value' }).default(false).refine(val => val === true, {\n error: 'This field is required',\n });\n }\n\n return schema;\n}\n\nexport function createSwitchFieldSchema(field: SwitchField): z.ZodTypeAny {\n let schema: z.ZodTypeAny = z.boolean({ error: 'Invalid value' }).default(false);\n\n if (field.required) {\n schema = z.boolean({ error: 'Invalid value' }).default(false).refine(val => val === true, {\n error: 'This field is required',\n });\n }\n\n return schema;\n}\n","import { z } from 'zod';\nimport type { UploadField } from '../../types';\n\nfunction matchesMimePattern(fileType: string, pattern: string): boolean {\n const normalizedPattern = pattern.toLowerCase().trim();\n const normalizedType = fileType.toLowerCase();\n\n if (normalizedPattern.endsWith('/*')) {\n const category = normalizedPattern.replace('/*', '');\n return normalizedType.startsWith(category + '/');\n }\n\n if (normalizedPattern.startsWith('.')) {\n return true;\n }\n\n return normalizedType === normalizedPattern;\n}\n\nfunction isFileTypeAccepted(file: File, acceptPatterns: string[]): boolean {\n if (!file.type) return true;\n return acceptPatterns.some(pattern => matchesMimePattern(file.type, pattern));\n}\n\nexport function createUploadFieldSchema(field: UploadField): z.ZodTypeAny {\n let fileSchema: z.ZodTypeAny = z.file({ error: 'Please select a file' });\n\n if (field.maxSize) {\n const sizeMB = (field.maxSize / 1024 / 1024).toFixed(1);\n fileSchema = (fileSchema as z.ZodFile).max(field.maxSize, {\n error: `File must be smaller than ${sizeMB}MB`,\n });\n }\n\n const accept = field.ui?.accept;\n if (accept && accept !== '*') {\n const acceptPatterns = accept.split(',').map(t => t.trim());\n const hasWildcard = acceptPatterns.some(p => p.includes('*') || p.startsWith('.'));\n\n if (hasWildcard) {\n fileSchema = fileSchema.refine(\n (file) => isFileTypeAccepted(file as File, acceptPatterns),\n `File type not allowed. Accepted: ${accept}`\n );\n } else {\n fileSchema = (fileSchema as z.ZodFile).mime(acceptPatterns, {\n error: `File type not allowed. Accepted: ${accept}`,\n });\n }\n }\n\n const fileOrUrl = z.union([\n fileSchema,\n z.string({ error: 'Invalid file' }),\n ], { error: 'Please select a file' });\n\n if (field.hasMany) {\n let arraySchema = z.array(fileOrUrl, { error: 'Invalid files' });\n\n if (field.minFiles !== undefined && field.minFiles > 0) {\n arraySchema = arraySchema.min(field.minFiles, {\n error: `At least ${field.minFiles} file(s) required`,\n });\n }\n\n if (field.maxFiles !== undefined) {\n arraySchema = arraySchema.max(field.maxFiles, {\n error: `Maximum ${field.maxFiles} file(s) allowed`,\n });\n }\n\n if (field.required) {\n arraySchema = arraySchema.min(1, {\n error: 'At least one file is required',\n });\n return arraySchema;\n }\n\n return arraySchema.optional().default([]);\n }\n\n if (field.required) {\n return fileOrUrl;\n }\n\n return fileOrUrl.optional().nullable();\n}\n","import { z } from 'zod';\nimport type { TagsField } from '../../types';\n\nexport function createTagsFieldSchema(field: TagsField): z.ZodTypeAny {\n const tagSchema = z.string({ error: 'Invalid tag' });\n let schema = z.array(tagSchema, { error: 'Invalid tags' });\n\n if (field.minTags !== undefined) {\n schema = schema.min(field.minTags, `At least ${field.minTags} tag(s) required`);\n }\n if (field.maxTags !== undefined) {\n schema = schema.max(field.maxTags, `Maximum ${field.maxTags} tag(s) allowed`);\n }\n\n if (field.required) {\n return schema.refine(\n (arr) => Array.isArray(arr) && arr.length > 0,\n 'At least one tag is required'\n );\n }\n\n return schema.optional().default([]);\n}\n","import { z } from 'zod';\nimport type { ArrayField, GroupField, Field } from '../../types';\n\n// Note: These import from the parent module to avoid circular deps\n// The fieldsToZodSchema function is passed as a parameter\n\ntype SchemaGenerator = (fields: readonly Field[]) => z.ZodObject<z.ZodRawShape>;\n\n/**\n * Creates Zod schema for array fields.\n * Uses passed-in schema generator to handle nested fields.\n */\nexport function createArrayFieldSchema(\n field: ArrayField,\n fieldsToZodSchema: SchemaGenerator\n): z.ZodTypeAny {\n const itemSchema = fieldsToZodSchema(field.fields);\n let schema = z.array(itemSchema);\n\n if (field.minRows !== undefined) {\n schema = schema.min(\n field.minRows,\n `At least ${field.minRows} row${field.minRows !== 1 ? 's' : ''} required`\n );\n }\n if (field.maxRows !== undefined) {\n schema = schema.max(\n field.maxRows,\n `Maximum ${field.maxRows} row${field.maxRows !== 1 ? 's' : ''} allowed`\n );\n }\n\n if (field.required) {\n return schema;\n }\n\n return schema.optional().default([]);\n}\n\n/**\n * Creates Zod schema for group fields.\n * Uses passed-in schema generator to handle nested fields.\n */\nexport function createGroupFieldSchema(\n field: GroupField,\n fieldsToZodSchema: SchemaGenerator\n): z.ZodTypeAny {\n const schema = fieldsToZodSchema(field.fields);\n\n if (!field.required) {\n return schema.optional();\n }\n\n return schema;\n}","import { type z } from 'zod';\nimport type { Field, FieldsToShape } from '../types';\nimport type { StrictFieldArray } from '../types/strict-fields';\nimport { fieldsToZodSchema } from './fields-to-schema';\n\n/**\n * Creates a Zod schema from field definitions with strict type validation.\n *\n * @example\n * const schema = createSchema([\n * { type: 'email', name: 'email', required: true },\n * { type: 'password', name: 'password', minLength: 8 },\n * ]);\n *\n * type FormData = z.infer<typeof schema>;\n */\nexport function createSchema<const T extends readonly Field[]>(\n fields: StrictFieldArray<T> & T\n): z.ZodObject<FieldsToShape<T>> & { fields: T } {\n const schema = fieldsToZodSchema(fields as unknown as T);\n return Object.assign(schema, { fields }) as z.ZodObject<FieldsToShape<T>> & { fields: T };\n}\n","import { nanoid } from 'nanoid';\nimport type { ArrayHelpers } from '../types';\n\n/**\n * Creates a standardized set of array field manipulation methods.\n * Abstracts the difference between getting/setting values in different form libraries.\n * \n * @param getArray - Function to get current array value at a path\n * @param setArray - Function to set array value at a path\n */\nexport function createArrayHelpers(\n getArray: (path: string) => unknown,\n setArray: (path: string, value: unknown[]) => void\n): ArrayHelpers {\n const readArray = (path: string): unknown[] => {\n const value = getArray(path);\n return Array.isArray(value) ? value : [];\n };\n\n return {\n fields: <T = unknown>(path: string): Array<T & { id: string }> => {\n const arr = readArray(path);\n return arr.map((item, index) => {\n const itemObject =\n typeof item === 'object' && item !== null\n ? (item as Record<string, unknown>)\n : ({ value: item } as Record<string, unknown>);\n\n return {\n id: (itemObject.id as string) || `${path}-${index}`,\n ...(itemObject as T),\n };\n });\n },\n\n append: (path: string, value: unknown) => {\n const current = readArray(path);\n const itemWithId = ensureId(value);\n setArray(path, [...current, itemWithId]);\n },\n\n prepend: (path: string, value: unknown) => {\n const current = readArray(path);\n const itemWithId = ensureId(value);\n setArray(path, [itemWithId, ...current]);\n },\n\n insert: (path: string, index: number, value: unknown) => {\n const current = [...readArray(path)];\n const itemWithId = ensureId(value);\n current.splice(index, 0, itemWithId);\n setArray(path, current);\n },\n\n remove: (path: string, index: number) => {\n const current = [...readArray(path)];\n current.splice(index, 1);\n setArray(path, current);\n },\n\n move: (path: string, from: number, to: number) => {\n const current = [...readArray(path)];\n const [item] = current.splice(from, 1);\n current.splice(to, 0, item);\n setArray(path, current);\n },\n\n swap: (path: string, indexA: number, indexB: number) => {\n const current = [...readArray(path)];\n const temp = current[indexA];\n current[indexA] = current[indexB];\n current[indexB] = temp;\n setArray(path, current);\n },\n\n replace: (path: string, values: unknown[]) => {\n const itemsWithIds = values.map(ensureId);\n setArray(path, itemsWithIds);\n },\n\n update: (path: string, index: number, value: unknown) => {\n const current = [...readArray(path)];\n // Preserve existing ID if present\n const existingId = (current[index] as Record<string, unknown>)?.id;\n current[index] = {\n ...(typeof value === 'object' && value !== null ? value : {}),\n id: existingId || nanoid(),\n };\n setArray(path, current);\n },\n };\n}\n\n/**\n * Ensures an item has a unique ID for React keys.\n */\nfunction ensureId(value: unknown): unknown {\n if (typeof value === 'object' && value !== null) {\n const obj = value as Record<string, unknown>;\n if (!obj.id) {\n return { ...obj, id: nanoid() };\n }\n return obj;\n }\n return { value, id: nanoid() };\n}\n","// =============================================================================\n// COMMON UTILITIES\n// These are used by both the core package and registry field components.\n// =============================================================================\n\n/**\n * Generate a unique field ID from the field path.\n * Converts dot notation to dashes and prefixes with 'field-'.\n * Used for accessibility (htmlFor, id attributes).\n * \n * @example\n * generateFieldId('user.profile.email') => 'field-user-profile-email'\n * generateFieldId('items[0].name') => 'field-items-0-name'\n */\nexport function generateFieldId(path: string): string {\n return `field-${path.replace(/\\./g, \"-\").replace(/\\[/g, \"-\").replace(/\\]/g, \"\")}`;\n}\n\n/**\n * Safely retrieve a nested value from an object using a dot-notation path.\n * \n * @example\n * getNestedValue({ user: { name: 'John' } }, 'user.name') => 'John'\n * getNestedValue({ items: [{ id: 1 }] }, 'items.0.id') => 1\n */\nexport function getNestedValue(obj: unknown, path: string): unknown {\n if (!obj || !path) return undefined;\n return path.split(\".\").reduce<unknown>((acc: unknown, key: string) => {\n if (acc && typeof acc === \"object\" && acc !== null) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * Set a nested value in an object using a dot-notation path.\n * Creates intermediate objects/arrays as needed.\n * \n * @example\n * setNestedValue({}, 'user.name', 'John') => { user: { name: 'John' } }\n */\nexport function setNestedValue<T extends Record<string, unknown>>(\n obj: T,\n path: string,\n value: unknown\n): T {\n const keys = path.split(\".\");\n const result = { ...obj } as Record<string, unknown>;\n let current = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== \"object\") {\n // Check if next key is numeric (array index)\n const nextKey = keys[i + 1];\n current[key] = /^\\d+$/.test(nextKey) ? [] : {};\n } else {\n current[key] = Array.isArray(current[key])\n ? [...(current[key] as unknown[])]\n : { ...(current[key] as Record<string, unknown>) };\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result as T;\n}\n\n/**\n * Format bytes into a human-readable string.\n * \n * @example\n * formatBytes(1024) => '1 KB'\n * formatBytes(1234567) => '1.18 MB'\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n}\n\n/**\n * Flatten a nested object to dot-notation paths.\n * Useful for converting form library state (like dirtyFields, touchedFields)\n * to the flat format expected by FormState.\n * \n * @example\n * flattenNestedObject({ user: { name: true, email: true } })\n * // => { 'user.name': true, 'user.email': true }\n * \n * flattenNestedObject({ items: { 0: { title: true } } })\n * // => { 'items.0.title': true }\n */\nexport function flattenNestedObject(\n obj: Record<string, unknown>,\n prefix = ''\n): Record<string, boolean> {\n const result: Record<string, boolean> = {};\n\n for (const key in obj) {\n const path = prefix ? `${prefix}.${key}` : key;\n const value = obj[key];\n\n if (typeof value === 'boolean') {\n result[path] = value;\n } else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n Object.assign(result, flattenNestedObject(value as Record<string, unknown>, path));\n }\n }\n\n return result;\n}\n\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","isFileTypeAccepted","import_zod","import_zod","fieldsToZodSchema"]}
|
package/dist/schema.mjs
CHANGED
|
@@ -15,14 +15,14 @@ import {
|
|
|
15
15
|
createTextFieldSchema,
|
|
16
16
|
createUploadFieldSchema,
|
|
17
17
|
fieldsToZodSchema
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-HF6HN7X5.mjs";
|
|
19
19
|
import {
|
|
20
20
|
createArrayHelpers,
|
|
21
21
|
formatBytes,
|
|
22
22
|
generateFieldId,
|
|
23
23
|
getNestedValue,
|
|
24
24
|
setNestedValue
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-VXG7KGOZ.mjs";
|
|
26
26
|
import {
|
|
27
27
|
coerceToDate,
|
|
28
28
|
coerceToNumber,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { F as Field, T as TextField, E as EmailField, P as PasswordField, o as TextareaField, N as NumberField, D as DateField, p as DatetimeField, r as SelectField, s as CheckboxGroupField, t as CheckboxField, u as SwitchField, w as RadioField, x as TagsField, y as UploadField, G as GroupField, z as ArrayField, H as RowField, J as TabsField, K as CollapsibleField, V as ValidationContext, L as FieldType, i as ValidationFn, A as ArrayHelpers } from './adapter-
|
|
2
|
+
import { F as Field, T as TextField, E as EmailField, P as PasswordField, o as TextareaField, N as NumberField, D as DateField, p as DatetimeField, r as SelectField, s as CheckboxGroupField, t as CheckboxField, u as SwitchField, w as RadioField, x as TagsField, y as UploadField, G as GroupField, z as ArrayField, H as RowField, J as TabsField, K as CollapsibleField, V as ValidationContext, L as FieldType, i as ValidationFn, A as ArrayHelpers } from './adapter-CpEUN0gt.mjs';
|
|
3
3
|
|
|
4
4
|
type ExtractL1<F> = F extends {
|
|
5
5
|
type: "row" | "collapsible";
|
|
@@ -190,7 +190,7 @@ declare function isFileTypeAccepted(file: File, accept: string): boolean;
|
|
|
190
190
|
* @param getArray - Function to get current array value at a path
|
|
191
191
|
* @param setArray - Function to set array value at a path
|
|
192
192
|
*/
|
|
193
|
-
declare function createArrayHelpers(getArray: (path: string) => unknown
|
|
193
|
+
declare function createArrayHelpers(getArray: (path: string) => unknown, setArray: (path: string, value: unknown[]) => void): ArrayHelpers;
|
|
194
194
|
|
|
195
195
|
/**
|
|
196
196
|
* Generate a unique field ID from the field path.
|