@valfuse-node/form 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,554 @@
1
+ type ValfuseRuleError = {
2
+ message: string;
3
+ code?: string;
4
+ type?: string;
5
+ metadata?: Record<string, unknown>;
6
+ };
7
+ type ValfuseErrorType = "validation" | "server" | "manual" | "custom";
8
+ type ValfuseError = {
9
+ message: string;
10
+ type?: ValfuseErrorType | string;
11
+ code?: string;
12
+ metadata?: Record<string, unknown>;
13
+ };
14
+ type ValfuseFieldErrors<TFieldName extends string = string> = Partial<Record<TFieldName, string | ValfuseError>>;
15
+
16
+ type ValfuseRegexValue = RegExp | {
17
+ pattern: string;
18
+ flags?: string;
19
+ };
20
+ type ValfuseStringRequiredRule = {
21
+ name: "required";
22
+ error: ValfuseRuleError;
23
+ };
24
+ type ValfuseStringMinRule = {
25
+ name: "min";
26
+ value: number;
27
+ error: ValfuseRuleError;
28
+ };
29
+ type ValfuseStringMaxRule = {
30
+ name: "max";
31
+ value: number;
32
+ error: ValfuseRuleError;
33
+ };
34
+ type ValfuseStringLengthRule = {
35
+ name: "length";
36
+ value: number;
37
+ error: ValfuseRuleError;
38
+ };
39
+ type ValfuseStringEmailRule = {
40
+ name: "email";
41
+ error: ValfuseRuleError;
42
+ };
43
+ type ValfuseStringUrlRule = {
44
+ name: "url";
45
+ error: ValfuseRuleError;
46
+ };
47
+ type ValfuseStringUuidRule = {
48
+ name: "uuid";
49
+ error: ValfuseRuleError;
50
+ };
51
+ type ValfuseStringRegexRule = {
52
+ name: "regex";
53
+ value: ValfuseRegexValue;
54
+ error: ValfuseRuleError;
55
+ };
56
+ type ValfuseStringIncludesRule = {
57
+ name: "includes";
58
+ value: string;
59
+ error: ValfuseRuleError;
60
+ };
61
+ type ValfuseStringStartsWithRule = {
62
+ name: "startsWith";
63
+ value: string;
64
+ error: ValfuseRuleError;
65
+ };
66
+ type ValfuseStringEndsWithRule = {
67
+ name: "endsWith";
68
+ value: string;
69
+ error: ValfuseRuleError;
70
+ };
71
+ type ValfuseStringRule = ValfuseStringRequiredRule | ValfuseStringMinRule | ValfuseStringMaxRule | ValfuseStringLengthRule | ValfuseStringEmailRule | ValfuseStringUrlRule | ValfuseStringUuidRule | ValfuseStringRegexRule | ValfuseStringIncludesRule | ValfuseStringStartsWithRule | ValfuseStringEndsWithRule;
72
+ type ValfuseNumberRequiredRule = {
73
+ name: "required";
74
+ error: ValfuseRuleError;
75
+ };
76
+ type ValfuseNumberMinRule = {
77
+ name: "min";
78
+ value: number;
79
+ error: ValfuseRuleError;
80
+ };
81
+ type ValfuseNumberMaxRule = {
82
+ name: "max";
83
+ value: number;
84
+ error: ValfuseRuleError;
85
+ };
86
+ type ValfuseNumberGtRule = {
87
+ name: "gt";
88
+ value: number;
89
+ error: ValfuseRuleError;
90
+ };
91
+ type ValfuseNumberGteRule = {
92
+ name: "gte";
93
+ value: number;
94
+ error: ValfuseRuleError;
95
+ };
96
+ type ValfuseNumberLtRule = {
97
+ name: "lt";
98
+ value: number;
99
+ error: ValfuseRuleError;
100
+ };
101
+ type ValfuseNumberLteRule = {
102
+ name: "lte";
103
+ value: number;
104
+ error: ValfuseRuleError;
105
+ };
106
+ type ValfuseNumberIntRule = {
107
+ name: "int";
108
+ error: ValfuseRuleError;
109
+ };
110
+ type ValfuseNumberPositiveRule = {
111
+ name: "positive";
112
+ error: ValfuseRuleError;
113
+ };
114
+ type ValfuseNumberNonnegativeRule = {
115
+ name: "nonnegative";
116
+ error: ValfuseRuleError;
117
+ };
118
+ type ValfuseNumberNegativeRule = {
119
+ name: "negative";
120
+ error: ValfuseRuleError;
121
+ };
122
+ type ValfuseNumberNonpositiveRule = {
123
+ name: "nonpositive";
124
+ error: ValfuseRuleError;
125
+ };
126
+ type ValfuseNumberMultipleOfRule = {
127
+ name: "multipleOf";
128
+ value: number;
129
+ error: ValfuseRuleError;
130
+ };
131
+ type ValfuseNumberRule = ValfuseNumberRequiredRule | ValfuseNumberMinRule | ValfuseNumberMaxRule | ValfuseNumberGtRule | ValfuseNumberGteRule | ValfuseNumberLtRule | ValfuseNumberLteRule | ValfuseNumberIntRule | ValfuseNumberPositiveRule | ValfuseNumberNonnegativeRule | ValfuseNumberNegativeRule | ValfuseNumberNonpositiveRule | ValfuseNumberMultipleOfRule;
132
+ type ValfuseBooleanRequiredRule = {
133
+ name: "required";
134
+ error: ValfuseRuleError;
135
+ };
136
+ type ValfuseBooleanLiteralRule = {
137
+ name: "literal";
138
+ value: boolean;
139
+ error: ValfuseRuleError;
140
+ };
141
+ type ValfuseBooleanAcceptedRule = {
142
+ name: "accepted";
143
+ error: ValfuseRuleError;
144
+ };
145
+ type ValfuseBooleanRule = ValfuseBooleanRequiredRule | ValfuseBooleanLiteralRule | ValfuseBooleanAcceptedRule;
146
+ type ValfuseArrayRequiredRule = {
147
+ name: "required";
148
+ error: ValfuseRuleError;
149
+ };
150
+ type ValfuseArrayMinRule = {
151
+ name: "min";
152
+ value: number;
153
+ error: ValfuseRuleError;
154
+ };
155
+ type ValfuseArrayMaxRule = {
156
+ name: "max";
157
+ value: number;
158
+ error: ValfuseRuleError;
159
+ };
160
+ type ValfuseArrayLengthRule = {
161
+ name: "length";
162
+ value: number;
163
+ error: ValfuseRuleError;
164
+ };
165
+ type ValfuseArrayNonemptyRule = {
166
+ name: "nonempty";
167
+ error: ValfuseRuleError;
168
+ };
169
+ type ValfuseArrayRule = ValfuseArrayRequiredRule | ValfuseArrayMinRule | ValfuseArrayMaxRule | ValfuseArrayLengthRule | ValfuseArrayNonemptyRule;
170
+ type ValfuseObjectRequiredRule = {
171
+ name: "required";
172
+ error: ValfuseRuleError;
173
+ };
174
+ type ValfuseObjectShapeRule = {
175
+ name: "shape";
176
+ value: Record<string, unknown>;
177
+ error: ValfuseRuleError;
178
+ };
179
+ type ValfuseObjectRule = ValfuseObjectRequiredRule | ValfuseObjectShapeRule;
180
+ type ValfuseCustomRule = {
181
+ name: "custom";
182
+ validate: (value: unknown, allValues: Record<string, unknown>) => boolean;
183
+ error: ValfuseRuleError;
184
+ };
185
+ type ValfuseRefineRule = {
186
+ name: "refine";
187
+ validate: (value: unknown, allValues: Record<string, unknown>) => boolean;
188
+ error: ValfuseRuleError;
189
+ };
190
+ type ValfuseMatchFieldRule = {
191
+ name: "matchField";
192
+ value: string;
193
+ error: ValfuseRuleError;
194
+ };
195
+ type ValfuseOneOfRule = {
196
+ name: "oneOf";
197
+ value: unknown[];
198
+ error: ValfuseRuleError;
199
+ };
200
+ type ValfuseNotOneOfRule = {
201
+ name: "notOneOf";
202
+ value: unknown[];
203
+ error: ValfuseRuleError;
204
+ };
205
+ type ValfuseGenericRule = ValfuseCustomRule | ValfuseRefineRule | ValfuseMatchFieldRule | ValfuseOneOfRule | ValfuseNotOneOfRule;
206
+
207
+ /**
208
+ * A function that transforms a raw field value before validation runs.
209
+ * Applied on every change, on `setValue`, and before `handleSubmit`.
210
+ *
211
+ * @example
212
+ * transform: t.pipe(t.trim, t.toLowerCase)
213
+ * transform: t.toNumber
214
+ * transform: (v) => String(v).replace(/\s+/g, "-")
215
+ */
216
+ type ValfuseTransformer = (value: unknown) => unknown;
217
+ type ValfuseStringFieldSchema = {
218
+ type: "string";
219
+ rules: (ValfuseStringRule | ValfuseGenericRule)[];
220
+ /** Optional transform applied to the value before validation and before submit. */
221
+ transform?: ValfuseTransformer;
222
+ };
223
+ type ValfuseNumberFieldSchema = {
224
+ type: "number";
225
+ rules: (ValfuseNumberRule | ValfuseGenericRule)[];
226
+ /** Optional transform applied to the value before validation and before submit. */
227
+ transform?: ValfuseTransformer;
228
+ };
229
+ type ValfuseBooleanFieldSchema = {
230
+ type: "boolean";
231
+ rules: (ValfuseBooleanRule | ValfuseGenericRule)[];
232
+ /** Optional transform applied to the value before validation and before submit. */
233
+ transform?: ValfuseTransformer;
234
+ };
235
+ type ValfuseArrayFieldSchema = {
236
+ type: "array";
237
+ rules: (ValfuseArrayRule | ValfuseGenericRule)[];
238
+ /** Optional transform applied to the value before validation and before submit. */
239
+ transform?: ValfuseTransformer;
240
+ };
241
+ type ValfuseObjectFieldSchema = {
242
+ type: "object";
243
+ rules: (ValfuseObjectRule | ValfuseGenericRule)[];
244
+ /** Optional transform applied to the value before validation and before submit. */
245
+ transform?: ValfuseTransformer;
246
+ };
247
+ type ValfuseFieldSchema = ValfuseStringFieldSchema | ValfuseNumberFieldSchema | ValfuseBooleanFieldSchema | ValfuseArrayFieldSchema | ValfuseObjectFieldSchema;
248
+ type ValfuseSchema = Record<string, ValfuseFieldSchema>;
249
+ /** Alias for {@link ValfuseFieldErrors} — preferred for setErrors input typing */
250
+ type SetErrorsInput<TFieldName extends string = string> = ValfuseFieldErrors<TFieldName>;
251
+
252
+ /**
253
+ * Controls when validation is triggered:
254
+ *
255
+ * | Mode | Behaviour |
256
+ * |--------------|-------------------------------------------------------------------------|
257
+ * | `onSubmit` | Validate only when the form is submitted (default) |
258
+ * | `onBlur` | Validate when a field loses focus |
259
+ * | `onChange` | Validate on every keystroke / value change |
260
+ */
261
+ type ValfuseFormMode = "onSubmit" | "onBlur" | "onChange";
262
+ /** A single field error */
263
+ interface ValfuseFieldError {
264
+ message: string;
265
+ /** Error originator: "validation" | "server" | "manual" | "custom" */
266
+ type?: string;
267
+ /** Optional semantic code (e.g. "email.required", "auth.not_found") */
268
+ code?: string;
269
+ metadata?: Record<string, unknown>;
270
+ }
271
+ /** Map of field names to their error */
272
+ type ValfuseFormErrors<TSchema extends Record<string, unknown>> = {
273
+ [K in keyof TSchema]?: ValfuseFieldError;
274
+ };
275
+ /** Map of dirty fields (value changed from default) */
276
+ type ValfuseDirtyFields<TSchema extends Record<string, unknown>> = {
277
+ [K in keyof TSchema]?: true;
278
+ };
279
+ /** Map of touched fields (user interacted with) */
280
+ type ValfuseTouchedFields<TSchema extends Record<string, unknown>> = {
281
+ [K in keyof TSchema]?: true;
282
+ };
283
+ /** Reactive form state exposed to consumers */
284
+ interface ValfuseFormState<TSchema extends Record<string, unknown>> {
285
+ /** All current field validation errors */
286
+ readonly errors: ValfuseFormErrors<TSchema>;
287
+ /** `true` while an async submit handler is running */
288
+ readonly isSubmitting: boolean;
289
+ /** `true` after the form has been submitted at least once */
290
+ readonly isSubmitted: boolean;
291
+ /** `true` if the most recent submission completed successfully */
292
+ readonly isSubmitSuccessful: boolean;
293
+ /** Total number of submit attempts */
294
+ readonly submitCount: number;
295
+ /** `true` if any field value differs from its default value */
296
+ readonly isDirty: boolean;
297
+ /** `true` if current values pass schema validation and there are no active errors */
298
+ readonly isValid: boolean;
299
+ /** Map of fields whose current value differs from the default */
300
+ readonly dirtyFields: ValfuseDirtyFields<TSchema>;
301
+ /** Map of fields the user has interacted with */
302
+ readonly touchedFields: ValfuseTouchedFields<TSchema>;
303
+ /** The defaultValues that were passed to useValfuseForm */
304
+ readonly defaultValues: Readonly<TSchema>;
305
+ }
306
+ /**
307
+ * Callback passed to `form.watch(callback)`.
308
+ * Called every time any field value changes.
309
+ */
310
+ type ValfuseWatchCallback<TSchema extends Record<string, unknown>> = (values: TSchema, info?: {
311
+ name?: string;
312
+ type?: string;
313
+ }) => void;
314
+ /**
315
+ * Callable type for `form.watch`:
316
+ *
317
+ * ```ts
318
+ * form.watch() // → TSchema (all values)
319
+ * form.watch("email") // → TSchema["email"]
320
+ * form.watch(["email", "name"]) // → Array of values
321
+ * form.watch((values, info) => void) // → () => void (unsubscribe)
322
+ * ```
323
+ */
324
+ interface ValfuseWatchFunction<TSchema extends Record<string, unknown>> {
325
+ (): TSchema;
326
+ <TName extends keyof TSchema & string>(name: TName): TSchema[TName];
327
+ (names: Array<keyof TSchema & string>): Array<TSchema[keyof TSchema]>;
328
+ (callback: ValfuseWatchCallback<TSchema>): () => void;
329
+ }
330
+ /** Props returned by `form.register(name)` — spread onto input element (React) */
331
+ interface ValfuseRegisterReturn {
332
+ name: string;
333
+ value?: string | number | readonly string[] | undefined;
334
+ onChange: (e: unknown) => void;
335
+ onBlur: () => void;
336
+ }
337
+ /** Props returned by `form.register(name)` — for Vue v-model compatibility */
338
+ interface ValfuseVueRegisterReturn {
339
+ name: string;
340
+ modelValue: unknown;
341
+ "onUpdate:modelValue": (value: unknown) => void;
342
+ onBlur: () => void;
343
+ }
344
+ /**
345
+ * Opaque control object — passed to ValfuseController.
346
+ * Internal fields are prefixed with `_` and not part of the public API.
347
+ */
348
+ interface ValfuseFormControl<TSchema extends Record<string, unknown>> {
349
+ /** @internal Current field values */
350
+ _values: TSchema;
351
+ /** @internal Current validation errors */
352
+ _errors: ValfuseFormErrors<TSchema>;
353
+ /** @internal Update a single field value */
354
+ _updateField: <TName extends keyof TSchema & string>(name: TName, value: TSchema[TName]) => void;
355
+ /** @internal Mark a field as touched */
356
+ _touchField: (name: string) => void;
357
+ /** @internal Set of names of fields the user has interacted with */
358
+ _touchedFields: ReadonlySet<keyof TSchema>;
359
+ }
360
+ /** Props passed to useValfuseForm */
361
+ interface UseValfuseFormProps<TSchema extends Record<string, unknown>> {
362
+ schema: ValfuseSchema;
363
+ defaultValues: TSchema;
364
+ mode?: ValfuseFormMode;
365
+ reValidateMode?: "onChange" | "onBlur" | "onSubmit";
366
+ }
367
+ /**
368
+ * Return type of useValfuseForm — defined as interface so adapters can implement it.
369
+ * This is the core form contract that React, Vue, and other adapters must fulfill.
370
+ */
371
+ interface UseValfuseFormReturn<TSchema extends Record<string, unknown>> {
372
+ /**
373
+ * Registers an input field.
374
+ * Returns props to spread onto the input element.
375
+ */
376
+ register: <TName extends keyof TSchema & string>(name: TName) => ValfuseRegisterReturn;
377
+ /** Passed to ValfuseController for controlled inputs */
378
+ control: ValfuseFormControl<TSchema>;
379
+ /**
380
+ * Wraps form submission: validates first, then calls onValid.
381
+ * Returns an event handler to pass to form onSubmit.
382
+ */
383
+ handleSubmit: (onValid: (values: TSchema) => void | Promise<void>) => (e?: unknown) => Promise<void>;
384
+ /** Reactive form state */
385
+ formState: ValfuseFormState<TSchema>;
386
+ /** Inject external errors (e.g. from API responses) */
387
+ setErrors: (errors: Partial<Record<string, ValfuseFieldError>>) => void;
388
+ /** Clear one, many, or all field errors */
389
+ clearErrors: (name?: keyof TSchema | Array<keyof TSchema>) => void;
390
+ /**
391
+ * Programmatically set a field value.
392
+ * Pass { shouldValidate: true } to run validation immediately.
393
+ */
394
+ setValue: <TName extends keyof TSchema>(name: TName, value: TSchema[TName], options?: {
395
+ shouldValidate?: boolean;
396
+ }) => void;
397
+ /**
398
+ * Manually trigger validation.
399
+ * - No argument → validate all fields
400
+ * - Single name → validate one field
401
+ * - Array of names → validate those fields
402
+ *
403
+ * Returns true if all triggered fields are valid, false otherwise.
404
+ */
405
+ trigger: (name?: keyof TSchema & string | Array<keyof TSchema & string>) => boolean;
406
+ /**
407
+ * Watch field values:
408
+ *
409
+ * ```ts
410
+ * form.watch() // all current values
411
+ * form.watch("email") // single field value
412
+ * form.watch(["email", "name"]) // array of values
413
+ * const unsub = form.watch((values, info) => { ... }); // subscribe
414
+ * unsub(); // unsubscribe
415
+ * ```
416
+ */
417
+ watch: ValfuseWatchFunction<TSchema>;
418
+ /** Reset the form to default values (or provided partial values) */
419
+ reset: (values?: Partial<TSchema>) => void;
420
+ /** Get a single field value (Vue only) */
421
+ getValue?: <TName extends keyof TSchema>(name: TName) => TSchema[TName];
422
+ /** Get all field values (Vue only) */
423
+ getValues?: () => TSchema;
424
+ }
425
+
426
+ declare function createSchema<T extends ValfuseSchema>(definition: T): T;
427
+
428
+ declare function validateSchema(schema: ValfuseSchema, values: Record<string, unknown>): Record<string, ValfuseError>;
429
+
430
+ /**
431
+ * Applies each field's `transform` function to the corresponding value,
432
+ * returning a new object with the transformed values.
433
+ *
434
+ * Fields without a `transform` definition are passed through unchanged.
435
+ * The original `values` object is never mutated.
436
+ *
437
+ * @example
438
+ * transformValues(schema, { email: " HELLO@EMAIL.COM ", age: "25" })
439
+ * // → { email: "hello@email.com", age: 25 }
440
+ */
441
+ declare function transformValues(schema: ValfuseSchema, values: Record<string, unknown>): Record<string, unknown>;
442
+
443
+ declare function normalizeError(error: string | ValfuseError): ValfuseError;
444
+
445
+ /**
446
+ * Compose multiple transformers left-to-right (output of each feeds into the next).
447
+ *
448
+ * @example
449
+ * t.pipe(t.trim, t.toLowerCase)(" HELLO@EMAIL.COM ") → "hello@email.com"
450
+ */
451
+ declare function pipe(...fns: ValfuseTransformer[]): ValfuseTransformer;
452
+ /**
453
+ * Built-in transformers — import as `import { t } from "@valfuse-node/form"`.
454
+ *
455
+ * @example
456
+ * transform: t.trim
457
+ * transform: t.toNumber
458
+ * transform: t.pipe(t.trim, t.toLowerCase)
459
+ */
460
+ declare const t: {
461
+ readonly trim: ValfuseTransformer;
462
+ readonly trimStart: ValfuseTransformer;
463
+ readonly trimEnd: ValfuseTransformer;
464
+ readonly toLowerCase: ValfuseTransformer;
465
+ readonly toUpperCase: ValfuseTransformer;
466
+ readonly toTitleCase: ValfuseTransformer;
467
+ readonly toSentenceCase: ValfuseTransformer;
468
+ readonly collapseSpaces: ValfuseTransformer;
469
+ readonly toNumber: ValfuseTransformer;
470
+ readonly toInteger: ValfuseTransformer;
471
+ readonly toFloat: ValfuseTransformer;
472
+ readonly toBoolean: ValfuseTransformer;
473
+ readonly pipe: typeof pipe;
474
+ };
475
+
476
+ /** Form values state */
477
+ interface FormValuesState<TSchema extends Record<string, unknown>> {
478
+ values: TSchema;
479
+ defaultValues: TSchema;
480
+ }
481
+ /** Create initial values state from default values */
482
+ declare function createValuesState<TSchema extends Record<string, unknown>>(defaultValues: TSchema): FormValuesState<TSchema>;
483
+ /** Update a single field value */
484
+ declare function updateValue<TSchema extends Record<string, unknown>>(state: FormValuesState<TSchema>, key: keyof TSchema & string, value: unknown): FormValuesState<TSchema>;
485
+ /** Reset values to default (or provided partial overrides) */
486
+ declare function resetValues<TSchema extends Record<string, unknown>>(state: FormValuesState<TSchema>, newValues?: Partial<TSchema>): FormValuesState<TSchema>;
487
+ /** Check if form is dirty (any field differs from default) */
488
+ declare function computeIsDirty<TSchema extends Record<string, unknown>>(state: FormValuesState<TSchema>): boolean;
489
+ /** Get all dirty fields */
490
+ declare function computeDirtyFields<TSchema extends Record<string, unknown>>(state: FormValuesState<TSchema>): ValfuseDirtyFields<TSchema>;
491
+ /** Check if a specific field is dirty */
492
+ declare function isFieldDirty<TSchema extends Record<string, unknown>>(state: FormValuesState<TSchema>, key: keyof TSchema & string): boolean;
493
+ /** Get a single field value */
494
+ declare function getValue<TSchema extends Record<string, unknown>, TName extends keyof TSchema>(state: FormValuesState<TSchema>, name: TName): TSchema[TName];
495
+ /** Get all values as plain object */
496
+ declare function getValues<TSchema extends Record<string, unknown>>(state: FormValuesState<TSchema>): TSchema;
497
+
498
+ /** Form touched state */
499
+ interface FormTouchedState {
500
+ touchedFields: Set<string>;
501
+ }
502
+ /** Create initial touched state (empty) */
503
+ declare function createTouchedState(): FormTouchedState;
504
+ /** Mark a field as touched */
505
+ declare function markTouched(state: FormTouchedState, name: string): FormTouchedState;
506
+ /** Mark a field as untouched */
507
+ declare function markUntouched(state: FormTouchedState, name: string): FormTouchedState;
508
+ /** Reset touched state (clear all) */
509
+ declare function resetTouched(): FormTouchedState;
510
+ /** Check if a field is touched */
511
+ declare function isTouched(state: FormTouchedState, name: string): boolean;
512
+ /** Convert touched Set to Record for public API */
513
+ declare function toTouchedFieldsRecord(state: FormTouchedState): ValfuseTouchedFields<Record<string, unknown>>;
514
+
515
+ /** Form errors state */
516
+ interface FormErrorsState {
517
+ errors: Record<string, ValfuseFieldError>;
518
+ }
519
+ /** Create initial errors state (empty) */
520
+ declare function createErrorsState(): FormErrorsState;
521
+ /** Set errors for specific fields (e.g., from server or setErrors call) */
522
+ declare function setErrors(state: FormErrorsState, fieldErrors: Partial<Record<string, ValfuseFieldError>>): FormErrorsState;
523
+ /** Set a single field error */
524
+ declare function setFieldError(state: FormErrorsState, name: string, error: ValfuseFieldError | null): FormErrorsState;
525
+ /** Clear errors for specific fields */
526
+ declare function clearFieldErrors(state: FormErrorsState, names?: string | string[]): FormErrorsState;
527
+ /** Reset errors state (clear all) */
528
+ declare function resetErrors(): FormErrorsState;
529
+ /** Check if there are any errors */
530
+ declare function hasErrors(state: FormErrorsState): boolean;
531
+ /** Get error for a specific field */
532
+ declare function getFieldError(state: FormErrorsState, name: string): ValfuseFieldError | undefined;
533
+ /** Convert errors state to form errors type */
534
+ declare function toFormErrors<TSchema extends Record<string, unknown>>(state: FormErrorsState): ValfuseFormErrors<TSchema>;
535
+
536
+ /** Form submission state */
537
+ interface FormSubmissionState {
538
+ isSubmitting: boolean;
539
+ isSubmitted: boolean;
540
+ isSubmitSuccessful: boolean;
541
+ submitCount: number;
542
+ }
543
+ /** Create initial submission state */
544
+ declare function createSubmissionState(): FormSubmissionState;
545
+ /** Start submission */
546
+ declare function startSubmit(state: FormSubmissionState): FormSubmissionState;
547
+ /** End submission successfully */
548
+ declare function endSubmitSuccess(state: FormSubmissionState): FormSubmissionState;
549
+ /** End submission with failure */
550
+ declare function endSubmitFailure(state: FormSubmissionState): FormSubmissionState;
551
+ /** Reset submission state */
552
+ declare function resetSubmission(): FormSubmissionState;
553
+
554
+ export { type FormErrorsState, type FormSubmissionState, type FormTouchedState, type FormValuesState, type SetErrorsInput, type UseValfuseFormProps, type UseValfuseFormReturn, type ValfuseArrayFieldSchema, type ValfuseArrayRule, type ValfuseBooleanFieldSchema, type ValfuseBooleanRule, type ValfuseCustomRule, type ValfuseDirtyFields, type ValfuseError, type ValfuseErrorType, type ValfuseFieldError, type ValfuseFieldErrors, type ValfuseFieldSchema, type ValfuseFormControl, type ValfuseFormErrors, type ValfuseFormMode, type ValfuseFormState, type ValfuseGenericRule, type ValfuseMatchFieldRule, type ValfuseNotOneOfRule, type ValfuseNumberFieldSchema, type ValfuseNumberRule, type ValfuseObjectFieldSchema, type ValfuseObjectRule, type ValfuseOneOfRule, type ValfuseRefineRule, type ValfuseRegexValue, type ValfuseRegisterReturn, type ValfuseRuleError, type ValfuseSchema, type ValfuseStringFieldSchema, type ValfuseStringRule, type ValfuseTouchedFields, type ValfuseTransformer, type ValfuseVueRegisterReturn, type ValfuseWatchCallback, type ValfuseWatchFunction, clearFieldErrors, computeDirtyFields, computeIsDirty, createErrorsState, createSchema, createSubmissionState, createTouchedState, createValuesState, endSubmitFailure, endSubmitSuccess, getFieldError, getValue, getValues, hasErrors, isFieldDirty, isTouched, markTouched, markUntouched, normalizeError, resetErrors, resetSubmission, resetTouched, resetValues, setErrors, setFieldError, startSubmit, t, toFormErrors, toTouchedFieldsRecord, transformValues, updateValue, validateSchema };