@reeverdev/ui 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ 'use strict';var reactHookForm=require('react-hook-form'),F=require('react'),jsxRuntime=require('react/jsx-runtime');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var F__namespace=/*#__PURE__*/_interopNamespace(F);function V(s={}){let{mode:o="onBlur",reValidateMode:e="onChange",criteriaMode:r="firstError",shouldFocusError:t=true,...l}=s;return reactHookForm.useForm({mode:o,reValidateMode:e,criteriaMode:r,shouldFocusError:t,...l})}function x(s){let o={};for(let e of s.issues){let r=e.path.join(".");o[r]||(o[r]={type:e.code,message:e.message});}return o}function C(s,o={}){let{mode:e="async",abortEarly:r=false,errorMap:t}=o;return async(l,n,E)=>{try{let a={errorMap:t,...r&&{abortEarly:!0}},d;return e==="sync"?d=s.parse(l,a):d=await s.parseAsync(l,a),{values:d,errors:{}}}catch(a){if(a instanceof Error&&"issues"in a)return {values:{},errors:x(a)};throw a}}}function i({render:s,...o}){return jsxRuntime.jsx(reactHookForm.Controller,{...o,render:({field:e,fieldState:r,formState:t})=>{let l=!!r.error,n=r.error?.message;return s({field:e,fieldState:r,formState:t,isInvalid:l,errorMessage:n})}})}i.displayName="Controller";function u({control:s,name:o,children:e,defaultValue:r,disabled:t}){return jsxRuntime.jsx(i,{control:s,name:o,defaultValue:r,disabled:t,render:l=>typeof e=="function"?e(l):F__namespace.cloneElement(e,{...l.field,isInvalid:l.isInvalid,errorMessage:l.errorMessage})})}u.displayName="FormField";Object.defineProperty(exports,"FormProvider",{enumerable:true,get:function(){return reactHookForm.FormProvider}});Object.defineProperty(exports,"useController",{enumerable:true,get:function(){return reactHookForm.useController}});Object.defineProperty(exports,"useFieldArray",{enumerable:true,get:function(){return reactHookForm.useFieldArray}});Object.defineProperty(exports,"useFormContext",{enumerable:true,get:function(){return reactHookForm.useFormContext}});Object.defineProperty(exports,"useFormState",{enumerable:true,get:function(){return reactHookForm.useFormState}});Object.defineProperty(exports,"useWatch",{enumerable:true,get:function(){return reactHookForm.useWatch}});exports.Controller=i;exports.FormField=u;exports.useForm=V;exports.zodResolver=C;//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/adapters/react-hook-form/use-form.ts","../../../src/adapters/react-hook-form/zod-resolver.ts","../../../src/adapters/react-hook-form/controller.tsx"],"names":["useForm","options","mode","reValidateMode","criteriaMode","shouldFocusError","rest","useReactHookForm","parseZodErrors","zodError","errors","issue","path","zodResolver","schema","abortEarly","errorMap","values","_context","_resolverOptions","parseOptions","result","error","Controller","render","props","jsx","RHFController","field","fieldState","formState","isInvalid","errorMessage","FormField","control","name","children","defaultValue","disabled","F"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport {\n useForm as useReactHookForm,\n type UseFormProps,\n type UseFormReturn,\n type FieldValues,\n type DefaultValues,\n} from \"react-hook-form\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseFormOptions<TFieldValues extends FieldValues = FieldValues>\n extends Omit<UseFormProps<TFieldValues>, \"resolver\"> {\n /**\n * Schema resolver for validation (e.g., zodResolver, yupResolver)\n */\n resolver?: UseFormProps<TFieldValues>[\"resolver\"];\n /**\n * Default values for form fields\n */\n defaultValues?: DefaultValues<TFieldValues>;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Enhanced useForm hook that wraps react-hook-form with Reever UI defaults\n *\n * @example\n * ```tsx\n * import { useForm, zodResolver } from \"@reeverdev/ui/adapters/react-hook-form\";\n * import { z } from \"zod\";\n *\n * const schema = z.object({\n * email: z.string().email(),\n * password: z.string().min(8),\n * });\n *\n * function LoginForm() {\n * const { control, handleSubmit, formState } = useForm({\n * resolver: zodResolver(schema),\n * defaultValues: {\n * email: \"\",\n * password: \"\",\n * },\n * });\n *\n * return (\n * <form onSubmit={handleSubmit(onSubmit)}>\n * ...\n * </form>\n * );\n * }\n * ```\n */\nexport function useForm<TFieldValues extends FieldValues = FieldValues>(\n options: UseFormOptions<TFieldValues> = {}\n): UseFormReturn<TFieldValues> {\n const {\n mode = \"onBlur\",\n reValidateMode = \"onChange\",\n criteriaMode = \"firstError\",\n shouldFocusError = true,\n ...rest\n } = options;\n\n return useReactHookForm<TFieldValues>({\n mode,\n reValidateMode,\n criteriaMode,\n shouldFocusError,\n ...rest,\n });\n}\n\n// ============================================================================\n// Re-exports from react-hook-form\n// ============================================================================\n\nexport {\n useFormContext,\n useController,\n useFieldArray,\n useWatch,\n useFormState,\n FormProvider,\n} from \"react-hook-form\";\n\nexport type {\n UseFormReturn,\n UseFormProps,\n FieldValues,\n FieldPath,\n FieldErrors,\n FieldError,\n Control,\n ControllerProps,\n ControllerRenderProps,\n ControllerFieldState,\n UseControllerProps,\n UseControllerReturn,\n UseFieldArrayProps,\n UseFieldArrayReturn,\n UseFormStateProps,\n UseFormStateReturn,\n UseWatchProps,\n SubmitHandler,\n SubmitErrorHandler,\n DefaultValues,\n RegisterOptions,\n Resolver,\n ResolverResult,\n ResolverOptions,\n} from \"react-hook-form\";\n","\"use client\";\n\nimport type { FieldErrors, FieldValues, Resolver } from \"react-hook-form\";\nimport type { ZodType, ZodError } from \"zod\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ZodResolverOptions {\n /**\n * Parse mode for Zod schema\n * - \"async\": Uses parseAsync (default)\n * - \"sync\": Uses parse (blocks the thread)\n */\n mode?: \"async\" | \"sync\";\n /**\n * Whether to abort early on first error\n * @default false\n */\n abortEarly?: boolean;\n /**\n * Custom error map for Zod\n */\n errorMap?: Parameters<ZodType[\"parse\"]>[1] extends { errorMap?: infer E }\n ? E\n : never;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction parseZodErrors<TFieldValues extends FieldValues>(\n zodError: ZodError\n): FieldErrors<TFieldValues> {\n const errors: Record<string, { type: string; message: string }> = {};\n\n for (const issue of zodError.issues) {\n const path = issue.path.join(\".\");\n if (!errors[path]) {\n errors[path] = {\n type: issue.code,\n message: issue.message,\n };\n }\n }\n\n return errors as FieldErrors<TFieldValues>;\n}\n\n// ============================================================================\n// Resolver\n// ============================================================================\n\n/**\n * Zod schema resolver for react-hook-form\n *\n * @example\n * ```tsx\n * import { useForm, zodResolver } from \"@reeverdev/ui/adapters/react-hook-form\";\n * import { z } from \"zod\";\n *\n * const schema = z.object({\n * email: z.string().email(\"Invalid email address\"),\n * password: z.string().min(8, \"Password must be at least 8 characters\"),\n * confirmPassword: z.string(),\n * }).refine((data) => data.password === data.confirmPassword, {\n * message: \"Passwords don't match\",\n * path: [\"confirmPassword\"],\n * });\n *\n * function SignUpForm() {\n * const { control, handleSubmit } = useForm({\n * resolver: zodResolver(schema),\n * });\n * // ...\n * }\n * ```\n */\nexport function zodResolver<TFieldValues extends FieldValues>(\n schema: ZodType<TFieldValues>,\n options: ZodResolverOptions = {}\n): Resolver<TFieldValues> {\n const { mode = \"async\", abortEarly = false, errorMap } = options;\n\n return async (values, _context, _resolverOptions) => {\n try {\n const parseOptions = {\n errorMap,\n ...(abortEarly && { abortEarly: true }),\n };\n\n let result: TFieldValues;\n\n if (mode === \"sync\") {\n result = schema.parse(values, parseOptions);\n } else {\n result = await schema.parseAsync(values, parseOptions);\n }\n\n return {\n values: result,\n errors: {},\n };\n } catch (error) {\n if (error instanceof Error && \"issues\" in error) {\n const zodError = error as ZodError;\n return {\n values: {},\n errors: parseZodErrors<TFieldValues>(zodError),\n };\n }\n\n // Re-throw non-Zod errors\n throw error;\n }\n };\n}\n\n/**\n * Type-safe schema inference helper\n *\n * @example\n * ```tsx\n * const schema = z.object({\n * email: z.string().email(),\n * password: z.string().min(8),\n * });\n *\n * type FormData = InferSchema<typeof schema>;\n * // { email: string; password: string }\n * ```\n */\nexport type InferSchema<T extends ZodType> = T extends ZodType<infer U>\n ? U\n : never;\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n Controller as RHFController,\n type Control,\n type ControllerProps as RHFControllerProps,\n type FieldPath,\n type FieldValues,\n type ControllerRenderProps,\n type ControllerFieldState,\n type UseFormStateReturn,\n} from \"react-hook-form\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FieldRenderProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n /**\n * Field props to spread on the input component\n * Includes: name, value, onChange, onBlur, ref\n */\n field: ControllerRenderProps<TFieldValues, TName>;\n /**\n * Field state including error, isDirty, isTouched, isValidating\n */\n fieldState: ControllerFieldState;\n /**\n * Form state including isSubmitting, isValid, errors, etc.\n */\n formState: UseFormStateReturn<TFieldValues>;\n /**\n * Whether the field has an error (convenience prop)\n */\n isInvalid: boolean;\n /**\n * Error message if the field has an error (convenience prop)\n */\n errorMessage?: string;\n}\n\nexport interface ControllerProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> extends Omit<RHFControllerProps<TFieldValues, TName>, \"render\"> {\n /**\n * Render function with enhanced props for Reever UI components\n */\n render: (props: FieldRenderProps<TFieldValues, TName>) => React.ReactElement;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Enhanced Controller component for react-hook-form integration\n *\n * Provides additional convenience props like `isInvalid` and `errorMessage`\n * that work seamlessly with Reever UI form components.\n *\n * @example\n * ```tsx\n * import { useForm, Controller, zodResolver } from \"@reeverdev/ui/adapters/react-hook-form\";\n * import { TextField } from \"@reeverdev/ui\";\n * import { z } from \"zod\";\n *\n * const schema = z.object({\n * email: z.string().email(\"Invalid email\"),\n * });\n *\n * function EmailForm() {\n * const { control, handleSubmit } = useForm({\n * resolver: zodResolver(schema),\n * });\n *\n * return (\n * <form onSubmit={handleSubmit(onSubmit)}>\n * <Controller\n * name=\"email\"\n * control={control}\n * render={({ field, isInvalid, errorMessage }) => (\n * <TextField\n * label=\"Email\"\n * placeholder=\"Enter your email\"\n * isInvalid={isInvalid}\n * errorMessage={errorMessage}\n * {...field}\n * />\n * )}\n * />\n * </form>\n * );\n * }\n * ```\n */\nfunction Controller<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({ render, ...props }: ControllerProps<TFieldValues, TName>) {\n return (\n <RHFController\n {...props}\n render={({ field, fieldState, formState }) => {\n const isInvalid = !!fieldState.error;\n const errorMessage = fieldState.error?.message;\n\n return render({\n field,\n fieldState,\n formState,\n isInvalid,\n errorMessage,\n });\n }}\n />\n );\n}\n\nController.displayName = \"Controller\";\n\nexport { Controller };\n\n// ============================================================================\n// FormField Component (Alternative API)\n// ============================================================================\n\nexport interface FormFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n /**\n * Control object from useForm\n */\n control: Control<TFieldValues>;\n /**\n * Field name (must match schema)\n */\n name: TName;\n /**\n * Children render function or React element\n */\n children:\n | React.ReactElement\n | ((props: FieldRenderProps<TFieldValues, TName>) => React.ReactElement);\n /**\n * Default value for the field\n */\n defaultValue?: TFieldValues[TName];\n /**\n * Whether the field is disabled\n */\n disabled?: boolean;\n}\n\n/**\n * FormField component for simpler form field rendering\n *\n * @example\n * ```tsx\n * <FormField control={control} name=\"email\">\n * {({ field, isInvalid, errorMessage }) => (\n * <TextField\n * label=\"Email\"\n * isInvalid={isInvalid}\n * errorMessage={errorMessage}\n * {...field}\n * />\n * )}\n * </FormField>\n * ```\n */\nfunction FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n children,\n defaultValue,\n disabled,\n}: FormFieldProps<TFieldValues, TName>) {\n return (\n <Controller\n control={control}\n name={name}\n defaultValue={defaultValue}\n disabled={disabled}\n render={(props) => {\n if (typeof children === \"function\") {\n return children(props);\n }\n\n // Clone element and inject props\n return React.cloneElement(\n children as React.ReactElement<Record<string, unknown>>,\n {\n ...props.field,\n isInvalid: props.isInvalid,\n errorMessage: props.errorMessage,\n }\n );\n }}\n />\n );\n}\n\nFormField.displayName = \"FormField\";\n\nexport { FormField };\n"]}
@@ -0,0 +1,229 @@
1
+ import { FieldValues, UseFormProps, DefaultValues, UseFormReturn, Resolver, FieldPath, ControllerProps as ControllerProps$1, ControllerRenderProps, ControllerFieldState, UseFormStateReturn, Control } from 'react-hook-form';
2
+ export { Control, ControllerFieldState, ControllerRenderProps, DefaultValues, FieldError, FieldErrors, FieldPath, FieldValues, FormProvider, ControllerProps as RHFControllerProps, RegisterOptions, Resolver, ResolverOptions, ResolverResult, SubmitErrorHandler, SubmitHandler, UseControllerProps, UseControllerReturn, UseFieldArrayProps, UseFieldArrayReturn, UseFormProps, UseFormReturn, UseFormStateProps, UseFormStateReturn, UseWatchProps, useController, useFieldArray, useFormContext, useFormState, useWatch } from 'react-hook-form';
3
+ import { ZodType } from 'zod';
4
+ import * as react_jsx_runtime from 'react/jsx-runtime';
5
+ import * as React from 'react';
6
+
7
+ interface UseFormOptions<TFieldValues extends FieldValues = FieldValues> extends Omit<UseFormProps<TFieldValues>, "resolver"> {
8
+ /**
9
+ * Schema resolver for validation (e.g., zodResolver, yupResolver)
10
+ */
11
+ resolver?: UseFormProps<TFieldValues>["resolver"];
12
+ /**
13
+ * Default values for form fields
14
+ */
15
+ defaultValues?: DefaultValues<TFieldValues>;
16
+ }
17
+ /**
18
+ * Enhanced useForm hook that wraps react-hook-form with Reever UI defaults
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * import { useForm, zodResolver } from "@reeverdev/ui/adapters/react-hook-form";
23
+ * import { z } from "zod";
24
+ *
25
+ * const schema = z.object({
26
+ * email: z.string().email(),
27
+ * password: z.string().min(8),
28
+ * });
29
+ *
30
+ * function LoginForm() {
31
+ * const { control, handleSubmit, formState } = useForm({
32
+ * resolver: zodResolver(schema),
33
+ * defaultValues: {
34
+ * email: "",
35
+ * password: "",
36
+ * },
37
+ * });
38
+ *
39
+ * return (
40
+ * <form onSubmit={handleSubmit(onSubmit)}>
41
+ * ...
42
+ * </form>
43
+ * );
44
+ * }
45
+ * ```
46
+ */
47
+ declare function useForm<TFieldValues extends FieldValues = FieldValues>(options?: UseFormOptions<TFieldValues>): UseFormReturn<TFieldValues>;
48
+
49
+ interface ZodResolverOptions {
50
+ /**
51
+ * Parse mode for Zod schema
52
+ * - "async": Uses parseAsync (default)
53
+ * - "sync": Uses parse (blocks the thread)
54
+ */
55
+ mode?: "async" | "sync";
56
+ /**
57
+ * Whether to abort early on first error
58
+ * @default false
59
+ */
60
+ abortEarly?: boolean;
61
+ /**
62
+ * Custom error map for Zod
63
+ */
64
+ errorMap?: Parameters<ZodType["parse"]>[1] extends {
65
+ errorMap?: infer E;
66
+ } ? E : never;
67
+ }
68
+ /**
69
+ * Zod schema resolver for react-hook-form
70
+ *
71
+ * @example
72
+ * ```tsx
73
+ * import { useForm, zodResolver } from "@reeverdev/ui/adapters/react-hook-form";
74
+ * import { z } from "zod";
75
+ *
76
+ * const schema = z.object({
77
+ * email: z.string().email("Invalid email address"),
78
+ * password: z.string().min(8, "Password must be at least 8 characters"),
79
+ * confirmPassword: z.string(),
80
+ * }).refine((data) => data.password === data.confirmPassword, {
81
+ * message: "Passwords don't match",
82
+ * path: ["confirmPassword"],
83
+ * });
84
+ *
85
+ * function SignUpForm() {
86
+ * const { control, handleSubmit } = useForm({
87
+ * resolver: zodResolver(schema),
88
+ * });
89
+ * // ...
90
+ * }
91
+ * ```
92
+ */
93
+ declare function zodResolver<TFieldValues extends FieldValues>(schema: ZodType<TFieldValues>, options?: ZodResolverOptions): Resolver<TFieldValues>;
94
+ /**
95
+ * Type-safe schema inference helper
96
+ *
97
+ * @example
98
+ * ```tsx
99
+ * const schema = z.object({
100
+ * email: z.string().email(),
101
+ * password: z.string().min(8),
102
+ * });
103
+ *
104
+ * type FormData = InferSchema<typeof schema>;
105
+ * // { email: string; password: string }
106
+ * ```
107
+ */
108
+ type InferSchema<T extends ZodType> = T extends ZodType<infer U> ? U : never;
109
+
110
+ interface FieldRenderProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> {
111
+ /**
112
+ * Field props to spread on the input component
113
+ * Includes: name, value, onChange, onBlur, ref
114
+ */
115
+ field: ControllerRenderProps<TFieldValues, TName>;
116
+ /**
117
+ * Field state including error, isDirty, isTouched, isValidating
118
+ */
119
+ fieldState: ControllerFieldState;
120
+ /**
121
+ * Form state including isSubmitting, isValid, errors, etc.
122
+ */
123
+ formState: UseFormStateReturn<TFieldValues>;
124
+ /**
125
+ * Whether the field has an error (convenience prop)
126
+ */
127
+ isInvalid: boolean;
128
+ /**
129
+ * Error message if the field has an error (convenience prop)
130
+ */
131
+ errorMessage?: string;
132
+ }
133
+ interface ControllerProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> extends Omit<ControllerProps$1<TFieldValues, TName>, "render"> {
134
+ /**
135
+ * Render function with enhanced props for Reever UI components
136
+ */
137
+ render: (props: FieldRenderProps<TFieldValues, TName>) => React.ReactElement;
138
+ }
139
+ /**
140
+ * Enhanced Controller component for react-hook-form integration
141
+ *
142
+ * Provides additional convenience props like `isInvalid` and `errorMessage`
143
+ * that work seamlessly with Reever UI form components.
144
+ *
145
+ * @example
146
+ * ```tsx
147
+ * import { useForm, Controller, zodResolver } from "@reeverdev/ui/adapters/react-hook-form";
148
+ * import { TextField } from "@reeverdev/ui";
149
+ * import { z } from "zod";
150
+ *
151
+ * const schema = z.object({
152
+ * email: z.string().email("Invalid email"),
153
+ * });
154
+ *
155
+ * function EmailForm() {
156
+ * const { control, handleSubmit } = useForm({
157
+ * resolver: zodResolver(schema),
158
+ * });
159
+ *
160
+ * return (
161
+ * <form onSubmit={handleSubmit(onSubmit)}>
162
+ * <Controller
163
+ * name="email"
164
+ * control={control}
165
+ * render={({ field, isInvalid, errorMessage }) => (
166
+ * <TextField
167
+ * label="Email"
168
+ * placeholder="Enter your email"
169
+ * isInvalid={isInvalid}
170
+ * errorMessage={errorMessage}
171
+ * {...field}
172
+ * />
173
+ * )}
174
+ * />
175
+ * </form>
176
+ * );
177
+ * }
178
+ * ```
179
+ */
180
+ declare function Controller<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ render, ...props }: ControllerProps<TFieldValues, TName>): react_jsx_runtime.JSX.Element;
181
+ declare namespace Controller {
182
+ var displayName: string;
183
+ }
184
+
185
+ interface FormFieldProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> {
186
+ /**
187
+ * Control object from useForm
188
+ */
189
+ control: Control<TFieldValues>;
190
+ /**
191
+ * Field name (must match schema)
192
+ */
193
+ name: TName;
194
+ /**
195
+ * Children render function or React element
196
+ */
197
+ children: React.ReactElement | ((props: FieldRenderProps<TFieldValues, TName>) => React.ReactElement);
198
+ /**
199
+ * Default value for the field
200
+ */
201
+ defaultValue?: TFieldValues[TName];
202
+ /**
203
+ * Whether the field is disabled
204
+ */
205
+ disabled?: boolean;
206
+ }
207
+ /**
208
+ * FormField component for simpler form field rendering
209
+ *
210
+ * @example
211
+ * ```tsx
212
+ * <FormField control={control} name="email">
213
+ * {({ field, isInvalid, errorMessage }) => (
214
+ * <TextField
215
+ * label="Email"
216
+ * isInvalid={isInvalid}
217
+ * errorMessage={errorMessage}
218
+ * {...field}
219
+ * />
220
+ * )}
221
+ * </FormField>
222
+ * ```
223
+ */
224
+ declare function FormField<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ control, name, children, defaultValue, disabled, }: FormFieldProps<TFieldValues, TName>): react_jsx_runtime.JSX.Element;
225
+ declare namespace FormField {
226
+ var displayName: string;
227
+ }
228
+
229
+ export { Controller, type ControllerProps, type FieldRenderProps, FormField, type FormFieldProps, type InferSchema, type UseFormOptions, type ZodResolverOptions, useForm, zodResolver };
@@ -0,0 +1,229 @@
1
+ import { FieldValues, UseFormProps, DefaultValues, UseFormReturn, Resolver, FieldPath, ControllerProps as ControllerProps$1, ControllerRenderProps, ControllerFieldState, UseFormStateReturn, Control } from 'react-hook-form';
2
+ export { Control, ControllerFieldState, ControllerRenderProps, DefaultValues, FieldError, FieldErrors, FieldPath, FieldValues, FormProvider, ControllerProps as RHFControllerProps, RegisterOptions, Resolver, ResolverOptions, ResolverResult, SubmitErrorHandler, SubmitHandler, UseControllerProps, UseControllerReturn, UseFieldArrayProps, UseFieldArrayReturn, UseFormProps, UseFormReturn, UseFormStateProps, UseFormStateReturn, UseWatchProps, useController, useFieldArray, useFormContext, useFormState, useWatch } from 'react-hook-form';
3
+ import { ZodType } from 'zod';
4
+ import * as react_jsx_runtime from 'react/jsx-runtime';
5
+ import * as React from 'react';
6
+
7
+ interface UseFormOptions<TFieldValues extends FieldValues = FieldValues> extends Omit<UseFormProps<TFieldValues>, "resolver"> {
8
+ /**
9
+ * Schema resolver for validation (e.g., zodResolver, yupResolver)
10
+ */
11
+ resolver?: UseFormProps<TFieldValues>["resolver"];
12
+ /**
13
+ * Default values for form fields
14
+ */
15
+ defaultValues?: DefaultValues<TFieldValues>;
16
+ }
17
+ /**
18
+ * Enhanced useForm hook that wraps react-hook-form with Reever UI defaults
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * import { useForm, zodResolver } from "@reeverdev/ui/adapters/react-hook-form";
23
+ * import { z } from "zod";
24
+ *
25
+ * const schema = z.object({
26
+ * email: z.string().email(),
27
+ * password: z.string().min(8),
28
+ * });
29
+ *
30
+ * function LoginForm() {
31
+ * const { control, handleSubmit, formState } = useForm({
32
+ * resolver: zodResolver(schema),
33
+ * defaultValues: {
34
+ * email: "",
35
+ * password: "",
36
+ * },
37
+ * });
38
+ *
39
+ * return (
40
+ * <form onSubmit={handleSubmit(onSubmit)}>
41
+ * ...
42
+ * </form>
43
+ * );
44
+ * }
45
+ * ```
46
+ */
47
+ declare function useForm<TFieldValues extends FieldValues = FieldValues>(options?: UseFormOptions<TFieldValues>): UseFormReturn<TFieldValues>;
48
+
49
+ interface ZodResolverOptions {
50
+ /**
51
+ * Parse mode for Zod schema
52
+ * - "async": Uses parseAsync (default)
53
+ * - "sync": Uses parse (blocks the thread)
54
+ */
55
+ mode?: "async" | "sync";
56
+ /**
57
+ * Whether to abort early on first error
58
+ * @default false
59
+ */
60
+ abortEarly?: boolean;
61
+ /**
62
+ * Custom error map for Zod
63
+ */
64
+ errorMap?: Parameters<ZodType["parse"]>[1] extends {
65
+ errorMap?: infer E;
66
+ } ? E : never;
67
+ }
68
+ /**
69
+ * Zod schema resolver for react-hook-form
70
+ *
71
+ * @example
72
+ * ```tsx
73
+ * import { useForm, zodResolver } from "@reeverdev/ui/adapters/react-hook-form";
74
+ * import { z } from "zod";
75
+ *
76
+ * const schema = z.object({
77
+ * email: z.string().email("Invalid email address"),
78
+ * password: z.string().min(8, "Password must be at least 8 characters"),
79
+ * confirmPassword: z.string(),
80
+ * }).refine((data) => data.password === data.confirmPassword, {
81
+ * message: "Passwords don't match",
82
+ * path: ["confirmPassword"],
83
+ * });
84
+ *
85
+ * function SignUpForm() {
86
+ * const { control, handleSubmit } = useForm({
87
+ * resolver: zodResolver(schema),
88
+ * });
89
+ * // ...
90
+ * }
91
+ * ```
92
+ */
93
+ declare function zodResolver<TFieldValues extends FieldValues>(schema: ZodType<TFieldValues>, options?: ZodResolverOptions): Resolver<TFieldValues>;
94
+ /**
95
+ * Type-safe schema inference helper
96
+ *
97
+ * @example
98
+ * ```tsx
99
+ * const schema = z.object({
100
+ * email: z.string().email(),
101
+ * password: z.string().min(8),
102
+ * });
103
+ *
104
+ * type FormData = InferSchema<typeof schema>;
105
+ * // { email: string; password: string }
106
+ * ```
107
+ */
108
+ type InferSchema<T extends ZodType> = T extends ZodType<infer U> ? U : never;
109
+
110
+ interface FieldRenderProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> {
111
+ /**
112
+ * Field props to spread on the input component
113
+ * Includes: name, value, onChange, onBlur, ref
114
+ */
115
+ field: ControllerRenderProps<TFieldValues, TName>;
116
+ /**
117
+ * Field state including error, isDirty, isTouched, isValidating
118
+ */
119
+ fieldState: ControllerFieldState;
120
+ /**
121
+ * Form state including isSubmitting, isValid, errors, etc.
122
+ */
123
+ formState: UseFormStateReturn<TFieldValues>;
124
+ /**
125
+ * Whether the field has an error (convenience prop)
126
+ */
127
+ isInvalid: boolean;
128
+ /**
129
+ * Error message if the field has an error (convenience prop)
130
+ */
131
+ errorMessage?: string;
132
+ }
133
+ interface ControllerProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> extends Omit<ControllerProps$1<TFieldValues, TName>, "render"> {
134
+ /**
135
+ * Render function with enhanced props for Reever UI components
136
+ */
137
+ render: (props: FieldRenderProps<TFieldValues, TName>) => React.ReactElement;
138
+ }
139
+ /**
140
+ * Enhanced Controller component for react-hook-form integration
141
+ *
142
+ * Provides additional convenience props like `isInvalid` and `errorMessage`
143
+ * that work seamlessly with Reever UI form components.
144
+ *
145
+ * @example
146
+ * ```tsx
147
+ * import { useForm, Controller, zodResolver } from "@reeverdev/ui/adapters/react-hook-form";
148
+ * import { TextField } from "@reeverdev/ui";
149
+ * import { z } from "zod";
150
+ *
151
+ * const schema = z.object({
152
+ * email: z.string().email("Invalid email"),
153
+ * });
154
+ *
155
+ * function EmailForm() {
156
+ * const { control, handleSubmit } = useForm({
157
+ * resolver: zodResolver(schema),
158
+ * });
159
+ *
160
+ * return (
161
+ * <form onSubmit={handleSubmit(onSubmit)}>
162
+ * <Controller
163
+ * name="email"
164
+ * control={control}
165
+ * render={({ field, isInvalid, errorMessage }) => (
166
+ * <TextField
167
+ * label="Email"
168
+ * placeholder="Enter your email"
169
+ * isInvalid={isInvalid}
170
+ * errorMessage={errorMessage}
171
+ * {...field}
172
+ * />
173
+ * )}
174
+ * />
175
+ * </form>
176
+ * );
177
+ * }
178
+ * ```
179
+ */
180
+ declare function Controller<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ render, ...props }: ControllerProps<TFieldValues, TName>): react_jsx_runtime.JSX.Element;
181
+ declare namespace Controller {
182
+ var displayName: string;
183
+ }
184
+
185
+ interface FormFieldProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> {
186
+ /**
187
+ * Control object from useForm
188
+ */
189
+ control: Control<TFieldValues>;
190
+ /**
191
+ * Field name (must match schema)
192
+ */
193
+ name: TName;
194
+ /**
195
+ * Children render function or React element
196
+ */
197
+ children: React.ReactElement | ((props: FieldRenderProps<TFieldValues, TName>) => React.ReactElement);
198
+ /**
199
+ * Default value for the field
200
+ */
201
+ defaultValue?: TFieldValues[TName];
202
+ /**
203
+ * Whether the field is disabled
204
+ */
205
+ disabled?: boolean;
206
+ }
207
+ /**
208
+ * FormField component for simpler form field rendering
209
+ *
210
+ * @example
211
+ * ```tsx
212
+ * <FormField control={control} name="email">
213
+ * {({ field, isInvalid, errorMessage }) => (
214
+ * <TextField
215
+ * label="Email"
216
+ * isInvalid={isInvalid}
217
+ * errorMessage={errorMessage}
218
+ * {...field}
219
+ * />
220
+ * )}
221
+ * </FormField>
222
+ * ```
223
+ */
224
+ declare function FormField<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ control, name, children, defaultValue, disabled, }: FormFieldProps<TFieldValues, TName>): react_jsx_runtime.JSX.Element;
225
+ declare namespace FormField {
226
+ var displayName: string;
227
+ }
228
+
229
+ export { Controller, type ControllerProps, type FieldRenderProps, FormField, type FormFieldProps, type InferSchema, type UseFormOptions, type ZodResolverOptions, useForm, zodResolver };
@@ -0,0 +1,2 @@
1
+ import {useForm,Controller}from'react-hook-form';export{FormProvider,useController,useFieldArray,useFormContext,useFormState,useWatch}from'react-hook-form';import*as F from'react';import {jsx}from'react/jsx-runtime';function V(s={}){let{mode:o="onBlur",reValidateMode:e="onChange",criteriaMode:r="firstError",shouldFocusError:t=true,...l}=s;return useForm({mode:o,reValidateMode:e,criteriaMode:r,shouldFocusError:t,...l})}function x(s){let o={};for(let e of s.issues){let r=e.path.join(".");o[r]||(o[r]={type:e.code,message:e.message});}return o}function C(s,o={}){let{mode:e="async",abortEarly:r=false,errorMap:t}=o;return async(l,n,E)=>{try{let a={errorMap:t,...r&&{abortEarly:!0}},d;return e==="sync"?d=s.parse(l,a):d=await s.parseAsync(l,a),{values:d,errors:{}}}catch(a){if(a instanceof Error&&"issues"in a)return {values:{},errors:x(a)};throw a}}}function i({render:s,...o}){return jsx(Controller,{...o,render:({field:e,fieldState:r,formState:t})=>{let l=!!r.error,n=r.error?.message;return s({field:e,fieldState:r,formState:t,isInvalid:l,errorMessage:n})}})}i.displayName="Controller";function u({control:s,name:o,children:e,defaultValue:r,disabled:t}){return jsx(i,{control:s,name:o,defaultValue:r,disabled:t,render:l=>typeof e=="function"?e(l):F.cloneElement(e,{...l.field,isInvalid:l.isInvalid,errorMessage:l.errorMessage})})}u.displayName="FormField";export{i as Controller,u as FormField,V as useForm,C as zodResolver};//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/adapters/react-hook-form/use-form.ts","../../../src/adapters/react-hook-form/zod-resolver.ts","../../../src/adapters/react-hook-form/controller.tsx"],"names":["useForm","options","mode","reValidateMode","criteriaMode","shouldFocusError","rest","useReactHookForm","parseZodErrors","zodError","errors","issue","path","zodResolver","schema","abortEarly","errorMap","values","_context","_resolverOptions","parseOptions","result","error","Controller","render","props","jsx","RHFController","field","fieldState","formState","isInvalid","errorMessage","FormField","control","name","children","defaultValue","disabled"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport {\n useForm as useReactHookForm,\n type UseFormProps,\n type UseFormReturn,\n type FieldValues,\n type DefaultValues,\n} from \"react-hook-form\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseFormOptions<TFieldValues extends FieldValues = FieldValues>\n extends Omit<UseFormProps<TFieldValues>, \"resolver\"> {\n /**\n * Schema resolver for validation (e.g., zodResolver, yupResolver)\n */\n resolver?: UseFormProps<TFieldValues>[\"resolver\"];\n /**\n * Default values for form fields\n */\n defaultValues?: DefaultValues<TFieldValues>;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Enhanced useForm hook that wraps react-hook-form with Reever UI defaults\n *\n * @example\n * ```tsx\n * import { useForm, zodResolver } from \"@reeverdev/ui/adapters/react-hook-form\";\n * import { z } from \"zod\";\n *\n * const schema = z.object({\n * email: z.string().email(),\n * password: z.string().min(8),\n * });\n *\n * function LoginForm() {\n * const { control, handleSubmit, formState } = useForm({\n * resolver: zodResolver(schema),\n * defaultValues: {\n * email: \"\",\n * password: \"\",\n * },\n * });\n *\n * return (\n * <form onSubmit={handleSubmit(onSubmit)}>\n * ...\n * </form>\n * );\n * }\n * ```\n */\nexport function useForm<TFieldValues extends FieldValues = FieldValues>(\n options: UseFormOptions<TFieldValues> = {}\n): UseFormReturn<TFieldValues> {\n const {\n mode = \"onBlur\",\n reValidateMode = \"onChange\",\n criteriaMode = \"firstError\",\n shouldFocusError = true,\n ...rest\n } = options;\n\n return useReactHookForm<TFieldValues>({\n mode,\n reValidateMode,\n criteriaMode,\n shouldFocusError,\n ...rest,\n });\n}\n\n// ============================================================================\n// Re-exports from react-hook-form\n// ============================================================================\n\nexport {\n useFormContext,\n useController,\n useFieldArray,\n useWatch,\n useFormState,\n FormProvider,\n} from \"react-hook-form\";\n\nexport type {\n UseFormReturn,\n UseFormProps,\n FieldValues,\n FieldPath,\n FieldErrors,\n FieldError,\n Control,\n ControllerProps,\n ControllerRenderProps,\n ControllerFieldState,\n UseControllerProps,\n UseControllerReturn,\n UseFieldArrayProps,\n UseFieldArrayReturn,\n UseFormStateProps,\n UseFormStateReturn,\n UseWatchProps,\n SubmitHandler,\n SubmitErrorHandler,\n DefaultValues,\n RegisterOptions,\n Resolver,\n ResolverResult,\n ResolverOptions,\n} from \"react-hook-form\";\n","\"use client\";\n\nimport type { FieldErrors, FieldValues, Resolver } from \"react-hook-form\";\nimport type { ZodType, ZodError } from \"zod\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ZodResolverOptions {\n /**\n * Parse mode for Zod schema\n * - \"async\": Uses parseAsync (default)\n * - \"sync\": Uses parse (blocks the thread)\n */\n mode?: \"async\" | \"sync\";\n /**\n * Whether to abort early on first error\n * @default false\n */\n abortEarly?: boolean;\n /**\n * Custom error map for Zod\n */\n errorMap?: Parameters<ZodType[\"parse\"]>[1] extends { errorMap?: infer E }\n ? E\n : never;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction parseZodErrors<TFieldValues extends FieldValues>(\n zodError: ZodError\n): FieldErrors<TFieldValues> {\n const errors: Record<string, { type: string; message: string }> = {};\n\n for (const issue of zodError.issues) {\n const path = issue.path.join(\".\");\n if (!errors[path]) {\n errors[path] = {\n type: issue.code,\n message: issue.message,\n };\n }\n }\n\n return errors as FieldErrors<TFieldValues>;\n}\n\n// ============================================================================\n// Resolver\n// ============================================================================\n\n/**\n * Zod schema resolver for react-hook-form\n *\n * @example\n * ```tsx\n * import { useForm, zodResolver } from \"@reeverdev/ui/adapters/react-hook-form\";\n * import { z } from \"zod\";\n *\n * const schema = z.object({\n * email: z.string().email(\"Invalid email address\"),\n * password: z.string().min(8, \"Password must be at least 8 characters\"),\n * confirmPassword: z.string(),\n * }).refine((data) => data.password === data.confirmPassword, {\n * message: \"Passwords don't match\",\n * path: [\"confirmPassword\"],\n * });\n *\n * function SignUpForm() {\n * const { control, handleSubmit } = useForm({\n * resolver: zodResolver(schema),\n * });\n * // ...\n * }\n * ```\n */\nexport function zodResolver<TFieldValues extends FieldValues>(\n schema: ZodType<TFieldValues>,\n options: ZodResolverOptions = {}\n): Resolver<TFieldValues> {\n const { mode = \"async\", abortEarly = false, errorMap } = options;\n\n return async (values, _context, _resolverOptions) => {\n try {\n const parseOptions = {\n errorMap,\n ...(abortEarly && { abortEarly: true }),\n };\n\n let result: TFieldValues;\n\n if (mode === \"sync\") {\n result = schema.parse(values, parseOptions);\n } else {\n result = await schema.parseAsync(values, parseOptions);\n }\n\n return {\n values: result,\n errors: {},\n };\n } catch (error) {\n if (error instanceof Error && \"issues\" in error) {\n const zodError = error as ZodError;\n return {\n values: {},\n errors: parseZodErrors<TFieldValues>(zodError),\n };\n }\n\n // Re-throw non-Zod errors\n throw error;\n }\n };\n}\n\n/**\n * Type-safe schema inference helper\n *\n * @example\n * ```tsx\n * const schema = z.object({\n * email: z.string().email(),\n * password: z.string().min(8),\n * });\n *\n * type FormData = InferSchema<typeof schema>;\n * // { email: string; password: string }\n * ```\n */\nexport type InferSchema<T extends ZodType> = T extends ZodType<infer U>\n ? U\n : never;\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n Controller as RHFController,\n type Control,\n type ControllerProps as RHFControllerProps,\n type FieldPath,\n type FieldValues,\n type ControllerRenderProps,\n type ControllerFieldState,\n type UseFormStateReturn,\n} from \"react-hook-form\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FieldRenderProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n /**\n * Field props to spread on the input component\n * Includes: name, value, onChange, onBlur, ref\n */\n field: ControllerRenderProps<TFieldValues, TName>;\n /**\n * Field state including error, isDirty, isTouched, isValidating\n */\n fieldState: ControllerFieldState;\n /**\n * Form state including isSubmitting, isValid, errors, etc.\n */\n formState: UseFormStateReturn<TFieldValues>;\n /**\n * Whether the field has an error (convenience prop)\n */\n isInvalid: boolean;\n /**\n * Error message if the field has an error (convenience prop)\n */\n errorMessage?: string;\n}\n\nexport interface ControllerProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> extends Omit<RHFControllerProps<TFieldValues, TName>, \"render\"> {\n /**\n * Render function with enhanced props for Reever UI components\n */\n render: (props: FieldRenderProps<TFieldValues, TName>) => React.ReactElement;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Enhanced Controller component for react-hook-form integration\n *\n * Provides additional convenience props like `isInvalid` and `errorMessage`\n * that work seamlessly with Reever UI form components.\n *\n * @example\n * ```tsx\n * import { useForm, Controller, zodResolver } from \"@reeverdev/ui/adapters/react-hook-form\";\n * import { TextField } from \"@reeverdev/ui\";\n * import { z } from \"zod\";\n *\n * const schema = z.object({\n * email: z.string().email(\"Invalid email\"),\n * });\n *\n * function EmailForm() {\n * const { control, handleSubmit } = useForm({\n * resolver: zodResolver(schema),\n * });\n *\n * return (\n * <form onSubmit={handleSubmit(onSubmit)}>\n * <Controller\n * name=\"email\"\n * control={control}\n * render={({ field, isInvalid, errorMessage }) => (\n * <TextField\n * label=\"Email\"\n * placeholder=\"Enter your email\"\n * isInvalid={isInvalid}\n * errorMessage={errorMessage}\n * {...field}\n * />\n * )}\n * />\n * </form>\n * );\n * }\n * ```\n */\nfunction Controller<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({ render, ...props }: ControllerProps<TFieldValues, TName>) {\n return (\n <RHFController\n {...props}\n render={({ field, fieldState, formState }) => {\n const isInvalid = !!fieldState.error;\n const errorMessage = fieldState.error?.message;\n\n return render({\n field,\n fieldState,\n formState,\n isInvalid,\n errorMessage,\n });\n }}\n />\n );\n}\n\nController.displayName = \"Controller\";\n\nexport { Controller };\n\n// ============================================================================\n// FormField Component (Alternative API)\n// ============================================================================\n\nexport interface FormFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n /**\n * Control object from useForm\n */\n control: Control<TFieldValues>;\n /**\n * Field name (must match schema)\n */\n name: TName;\n /**\n * Children render function or React element\n */\n children:\n | React.ReactElement\n | ((props: FieldRenderProps<TFieldValues, TName>) => React.ReactElement);\n /**\n * Default value for the field\n */\n defaultValue?: TFieldValues[TName];\n /**\n * Whether the field is disabled\n */\n disabled?: boolean;\n}\n\n/**\n * FormField component for simpler form field rendering\n *\n * @example\n * ```tsx\n * <FormField control={control} name=\"email\">\n * {({ field, isInvalid, errorMessage }) => (\n * <TextField\n * label=\"Email\"\n * isInvalid={isInvalid}\n * errorMessage={errorMessage}\n * {...field}\n * />\n * )}\n * </FormField>\n * ```\n */\nfunction FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n children,\n defaultValue,\n disabled,\n}: FormFieldProps<TFieldValues, TName>) {\n return (\n <Controller\n control={control}\n name={name}\n defaultValue={defaultValue}\n disabled={disabled}\n render={(props) => {\n if (typeof children === \"function\") {\n return children(props);\n }\n\n // Clone element and inject props\n return React.cloneElement(\n children as React.ReactElement<Record<string, unknown>>,\n {\n ...props.field,\n isInvalid: props.isInvalid,\n errorMessage: props.errorMessage,\n }\n );\n }}\n />\n );\n}\n\nFormField.displayName = \"FormField\";\n\nexport { FormField };\n"]}