react-f0rm 1.1.0 → 1.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.
Files changed (61) hide show
  1. package/README.md +152 -32
  2. package/dist/devtools/index.cjs.js +1 -1
  3. package/dist/devtools/index.cjs.js.map +1 -1
  4. package/dist/devtools/index.d.ts +2 -2
  5. package/dist/devtools/index.mjs +1 -1
  6. package/dist/devtools/index.mjs.map +1 -1
  7. package/dist/errors-CxSjrWJO.cjs.js +2 -0
  8. package/dist/errors-CxSjrWJO.cjs.js.map +1 -0
  9. package/dist/errors-CzWtwjO0.mjs +2 -0
  10. package/dist/errors-CzWtwjO0.mjs.map +1 -0
  11. package/dist/form-CvmWHUrd.d.ts +423 -0
  12. package/dist/index.cjs.js +1 -1
  13. package/dist/index.cjs.js.map +1 -1
  14. package/dist/index.d.ts +786 -102
  15. package/dist/index.mjs +1 -1
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/index.umd.js +801 -354
  18. package/dist/index.umd.js.map +1 -1
  19. package/dist/index.umd.min.js +2 -2
  20. package/dist/index.umd.min.js.map +1 -1
  21. package/dist/persist.cjs.js +2 -0
  22. package/dist/persist.cjs.js.map +1 -0
  23. package/dist/persist.d.ts +49 -0
  24. package/dist/persist.mjs +2 -0
  25. package/dist/persist.mjs.map +1 -0
  26. package/dist/resolvers/standard-schema.cjs.js +1 -1
  27. package/dist/resolvers/standard-schema.cjs.js.map +1 -1
  28. package/dist/resolvers/standard-schema.d.ts +7 -5
  29. package/dist/resolvers/standard-schema.mjs +1 -1
  30. package/dist/resolvers/standard-schema.mjs.map +1 -1
  31. package/dist/resolvers/yup.cjs.js +1 -1
  32. package/dist/resolvers/yup.cjs.js.map +1 -1
  33. package/dist/resolvers/yup.d.ts +1 -1
  34. package/dist/resolvers/yup.mjs +1 -1
  35. package/dist/resolvers/yup.mjs.map +1 -1
  36. package/dist/resolvers/zod.cjs.js +1 -1
  37. package/dist/resolvers/zod.cjs.js.map +1 -1
  38. package/dist/resolvers/zod.d.ts +1 -1
  39. package/dist/resolvers/zod.mjs +1 -1
  40. package/dist/resolvers/zod.mjs.map +1 -1
  41. package/dist/server/index.cjs.js +2 -0
  42. package/dist/server/index.cjs.js.map +1 -0
  43. package/dist/server/index.d.ts +77 -0
  44. package/dist/server/index.mjs +2 -0
  45. package/dist/server/index.mjs.map +1 -0
  46. package/dist/validate-B1Gdjeaq.mjs +2 -0
  47. package/dist/validate-B1Gdjeaq.mjs.map +1 -0
  48. package/dist/validate-CUmNZqg6.d.ts +238 -0
  49. package/dist/validate-DAfz8Nbb.cjs.js +2 -0
  50. package/dist/validate-DAfz8Nbb.cjs.js.map +1 -0
  51. package/dist/values-B1IV-6V4.mjs +2 -0
  52. package/dist/values-B1IV-6V4.mjs.map +1 -0
  53. package/dist/values-CDNAYEOB.cjs.js +2 -0
  54. package/dist/values-CDNAYEOB.cjs.js.map +1 -0
  55. package/package.json +71 -24
  56. package/dist/form-BGWPwts2.mjs +0 -2
  57. package/dist/form-BGWPwts2.mjs.map +0 -1
  58. package/dist/form-BiDaJLjD.d.ts +0 -826
  59. package/dist/form-DwuY91QB.cjs.js +0 -2
  60. package/dist/form-DwuY91QB.cjs.js.map +0 -1
  61. package/dist/validate-2XUilILy.d.ts +0 -22
@@ -0,0 +1,423 @@
1
+ import { EventEmitter } from '@for-fun/event-emitter';
2
+
3
+ type PathSegments = (string | number)[];
4
+ type Name = string | PathSegments;
5
+ type Path = {
6
+ value: PathSegments;
7
+ key: string;
8
+ };
9
+
10
+ /**
11
+ * Compile-time field path utilities: `FieldPath<T>` enumerates the valid
12
+ * path strings for a values shape `T` ('a', 'a.b', 'a[0]', 'a[b]', ...),
13
+ * and `PathValue<T, P>` resolves the leaf type a path points at.
14
+ * The grammar mirrors the paths accepted at runtime by `normalizePath`:
15
+ * numeric segments are bracket-only ('a[0]', never 'a.0' — dotted
16
+ * numerics throw a TypeError at runtime).
17
+ */
18
+ /** `true` only for the `any` type (`0 extends 1 & any`). */
19
+ type IsAny<T> = 0 extends 1 & T ? true : false;
20
+ type Primitive = null | undefined | string | number | boolean | symbol | bigint;
21
+ /** Depth countdown: Prev[9] = 8 ... Prev[1] = 0, Prev[0] = never stops recursion. */
22
+ type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
23
+ /** Paths are capped at 10 segments to keep instantiation depth bounded. */
24
+ type MaxDepth = 9;
25
+ /**
26
+ * Valid path continuations after a segment: `.k` / `[k]` / `[0]`,
27
+ * optionally followed by deeper continuations into the child node.
28
+ * Numeric segments are bracket-only (`.0` throws at runtime); object
29
+ * keys that are themselves numeric strings likewise enumerate just the
30
+ * bracket subscript.
31
+ */
32
+ type Continue<T, D extends number> = [D] extends [never] ? never : IsAny<T> extends true ? string : T extends Primitive | Function ? never : T extends readonly (infer U)[] ? `[${number}]` | `[${number}]${Continue<U, Prev[D]>}` : {
33
+ [K in Extract<keyof T, string>]: (K extends `${number}` ? never : `.${K}`) | `[${K}]` | (K extends `${number}` ? never : `.${K}${Continue<T[K], Prev[D]>}`) | `[${K}]${Continue<T[K], Prev[D]>}`;
34
+ }[Extract<keyof T, string>];
35
+ /**
36
+ * Every valid field path string for a values shape `T`.
37
+ * @example FieldPath<{a: {b: string}}> // 'a' | 'a.b' | 'a[b]'
38
+ */
39
+ type FieldPath<T> = IsAny<T> extends true ? string : T extends Primitive | Function ? never : T extends readonly (infer U)[] ? `[${number}]` | `[${number}]${Continue<U, MaxDepth>}` : {
40
+ [K in Extract<keyof T, string>]: K extends `${number}` ? never : K | `${K}${Continue<T[K], MaxDepth>}`;
41
+ }[Extract<keyof T, string>];
42
+ /** Resolve `T[K]` for one bare segment: array index -> element, object key -> value. */
43
+ type Lookup<T, K extends string> = K extends `${number}` ? T extends readonly (infer U)[] ? U : never : K extends keyof T ? T[K] : never;
44
+ /** One dot-separated chunk: a bare segment plus any `[k]` / `[0]` suffixes. */
45
+ type ChunkValue<T, C extends string> = C extends `${infer Key}[${infer Tail}` ? ChunkSuffix<Lookup<T, Key>, `[${Tail}`> : Lookup<T, C>;
46
+ type ChunkSuffix<T, S extends string> = S extends `[${infer Key}]${infer Rest}` ? Rest extends '' ? Lookup<T, Key> : PathOf<Lookup<T, Key>, Rest> : never;
47
+ /** Resolve the value type the path string `P` points at inside `T`. */
48
+ type PathOf<T, P extends string> = P extends '' ? never : P extends `[${infer Key}]${infer Rest}` ? Rest extends '' ? Lookup<T, Key> : PathOf<Lookup<T, Key>, Rest> : P extends `.${infer Rest}` ? PathOf<T, Rest> : P extends `${infer Chunk}.${infer Rest}` ? PathOf<ChunkValue<T, Chunk>, Rest> : ChunkValue<T, P>;
49
+ /**
50
+ * The value type at path `P` of a values shape `T`.
51
+ * @example PathValue<{a: {b: string}}, 'a.b'> // string
52
+ */
53
+ type PathValue<T, P extends FieldPath<T>> = PathOf<T, P & string>;
54
+ /**
55
+ * The value type at path `P` of `T`, or `any` when `P` is not a known
56
+ * field path (plain `string` / segment-array calls keep their old behavior).
57
+ */
58
+ type PathValueOf<T, P> = P extends FieldPath<T> ? PathValue<T, Extract<P, FieldPath<T>>> : any;
59
+
60
+ /** Options accepted by {@link setFocus}. All flags default to `false`. */
61
+ type SetFocusOptions = {
62
+ /** Select the field's text after focusing it. Bound fields call
63
+ * `select()` on their element; elements without one (custom `as`
64
+ * components) just focus. */
65
+ shouldSelect?: boolean;
66
+ };
67
+ /**
68
+ * Programmatically focus a bound field's element (e.g. the <Field>'s
69
+ * input).
70
+ *
71
+ * Rides the same 'focusError' event channel a failed handleSubmit uses to
72
+ * focus the first errored field: the payload is the target's path key,
73
+ * with the focus options as a second, backward-compatible argument (older
74
+ * subscribers declared with a single `key` parameter simply ignore it).
75
+ * Being event-driven, it is a silent no-op when the field is unmounted or
76
+ * nothing subscribes — unknown names never throw.
77
+ *
78
+ * @param form form instance
79
+ * @param name field name (dot path or segments path)
80
+ * @param options focus options
81
+ */
82
+ declare function setFocus(form: Form, name: Name, options?: SetFocusOptions): void;
83
+
84
+ /** Reserved top-level path segment for form-level errors. The Standard
85
+ * Schema form-level adapter lands path-less issues under this key; the
86
+ * exported constant replaces the magic string, and readers consume it via
87
+ * getError(form, FORM_ERROR) / getFieldErrors(form, FORM_ERROR). */
88
+ declare const FORM_ERROR = "_form";
89
+ /** When a field is validated:
90
+ * - `'onSubmit'` (default): only on submit
91
+ * - `'onBlur'`: when the field loses focus
92
+ * - `'onChange'`: on every change
93
+ * - `'onTouched'`: on first blur, then on every change
94
+ * - `'all'`: on both change and blur
95
+ */
96
+ /** Brand marking a form-level validate result as a structured
97
+ * {@link ValidationOutcome} (parsed values and/or errors) rather than a
98
+ * plain nested error record. Symbols cannot collide with user error
99
+ * records, so detection is an exact `VALIDATION_OUTCOME in result`. */
100
+ declare const VALIDATION_OUTCOME: unique symbol;
101
+ /** Structured form-level validate result: `errors` uses the same nested
102
+ * shape a plain error record uses, `values` is the schema's parsed output
103
+ * (coerce/transform results included). Either side may be omitted. */
104
+ /**
105
+ * Get field error
106
+ * @param form
107
+ * @param name
108
+ * @return FieldError object or undefined
109
+ */
110
+ declare function getError<T extends Record<string, any> = any, P extends FieldPath<T> | PathSegments = FieldPath<T> | PathSegments>(form: Form<T>, name: P): FieldError | undefined;
111
+ /**
112
+ * Get field error by path
113
+ * @param form
114
+ * @param path
115
+ * @return first FieldError of the field, or undefined
116
+ */
117
+ declare function getErrorByPath({ errors }: Form, path: Path): FieldError | undefined;
118
+ /**
119
+ * Get all errors of a field
120
+ * @param form
121
+ * @param name
122
+ * @return every error registered for the field (insertion order); an empty
123
+ * array when the field has none
124
+ */
125
+ declare function getFieldErrors<T extends Record<string, any> = any, P extends FieldPath<T> | PathSegments = FieldPath<T> | PathSegments>(form: Form<T>, name: P): FieldError[];
126
+ /**
127
+ * Get all errors of a field by path
128
+ * @param form
129
+ * @param path
130
+ * @return every error registered for the field (insertion order); an empty
131
+ * array when the field has none
132
+ */
133
+ declare function getFieldErrorsByPath({ errors }: Form, path: Path): FieldError[];
134
+ /**
135
+ * Get all errors
136
+ * @param form
137
+ * @return array of {path, type, message} entries, in insertion order; path
138
+ * is the user-facing dotted field path ('a.b', 'list.0'), and a
139
+ * field holding several errors contributes one entry per error
140
+ */
141
+ declare function getErrors({ errors }: Form): FieldErrorEntry[];
142
+ /**
143
+ * Get first error message
144
+ * @param form
145
+ * @return first error's message string, or undefined when there are no errors
146
+ */
147
+ declare function getFirstError({ errors }: Form): string | undefined;
148
+ /** Snapshot of one field's aggregated state, as {@link getFieldState}
149
+ * returns it. `errors` is the stored array shared with the form — treat it
150
+ * as read-only, like every {@link getFieldErrors} result. */
151
+ /**
152
+ * Set field error
153
+ * @param form
154
+ * @param name
155
+ * @param error string is normalized to {type: 'custom', message}; a
156
+ * FieldError object is stored as-is; an array holds several errors
157
+ * (falsy items dropped, strings normalized); undefined clears
158
+ */
159
+ declare function setError<T extends Record<string, any> = any, P extends FieldPath<T> | PathSegments = FieldPath<T> | PathSegments>(form: Form<T>, name: P, error: string | FieldError | (string | FieldError)[] | undefined): void;
160
+ /**
161
+ * Set field error
162
+ * @param form
163
+ * @param path
164
+ * @param error string is normalized to {type: 'custom', message}; a
165
+ * FieldError object is stored as-is; an array holds several errors
166
+ * (falsy items dropped, strings normalized); undefined clears
167
+ */
168
+ declare function setErrorByPath({ emitter, errors }: Form, path: Path, error: string | FieldError | (string | FieldError)[] | undefined): void;
169
+ /**
170
+ * Clear errors
171
+ * @param form
172
+ * @param name a single path or a list of paths; omit to clear every error
173
+ */
174
+ declare function clearErrors(form: Form, name?: Name | Name[]): void;
175
+ /** Options accepted by {@link setServerErrors}. */
176
+ type SetServerErrorsOptions = {
177
+ /** Keep existing field errors instead of clearing them first. Defaults
178
+ * to `false`: a fresh server response replaces the prior error state. */
179
+ keepExisting?: boolean;
180
+ };
181
+ /**
182
+ * Land a server-side error response on the form: each entry becomes the
183
+ * named field's error(s) with `type: 'server'`, ready for the same
184
+ * renderError/`useError` channel client-side validation uses. Takes the
185
+ * flat `Record<string, string | string[]>` shape REST APIs commonly
186
+ * return (RealWorld: `422 {errors: {email: ['has already been taken']}}`)
187
+ * without a hand-rolled `Object.entries` + `setError` loop.
188
+ *
189
+ * A string value lands as one error, a string array as several (first one
190
+ * is what `getError`/`error` expose); an empty array clears that field's
191
+ * errors. By default every existing error is cleared first — a fresh
192
+ * response describes the current state, not a patch onto stale client
193
+ * errors; pass `keepExisting: true` to layer instead.
194
+ * @param form
195
+ * @param errors field errors keyed by name
196
+ * @param options
197
+ */
198
+ declare function setServerErrors(form: Form, errors: Record<string, string | string[]>, options?: SetServerErrorsOptions): void;
199
+ /**
200
+ * Set field touched state
201
+ * @param form
202
+ * @param name
203
+ */
204
+ /**
205
+ * @param form
206
+ */
207
+ declare function hasErrors({ errors }: Form): boolean;
208
+
209
+ /** A field error: `type` identifies the error kind ('custom' for plain
210
+ * string errors), `message` is the display text. */
211
+ type FieldError = {
212
+ type: string;
213
+ message: string;
214
+ };
215
+ /** A flattened entry from {@link getErrors}. */
216
+ type FieldErrorEntry = {
217
+ path: string;
218
+ type: string;
219
+ message: string;
220
+ };
221
+ /** When a field is validated:
222
+ * - `'onSubmit'` (default): only on submit
223
+ * - `'onBlur'`: when the field loses focus
224
+ * - `'onChange'`: on every change
225
+ * - `'onTouched'`: on first blur, then on every change
226
+ * - `'all'`: on both change and blur
227
+ */
228
+ type ValidationMode = 'onSubmit' | 'onBlur' | 'onChange' | 'onTouched' | 'all';
229
+ /** When a field is re-validated after it already has an error:
230
+ * - `'onChange'` (default): on every change
231
+ * - `'onBlur'`: when the field loses focus
232
+ * - `'onSubmit'`: only on submit (no live re-validation)
233
+ */
234
+ type ReValidateMode = 'onChange' | 'onBlur' | 'onSubmit';
235
+ /** Structured form-level validate result: `errors` uses the same nested
236
+ * shape a plain error record uses, `values` is the schema's parsed output
237
+ * (coerce/transform results included). Either side may be omitted.
238
+ *
239
+ * The brand constant itself lives in the errors module (the leaf module of
240
+ * the core dependency graph — every consumer imports it from there) and is
241
+ * re-exported below with `export *`. */
242
+ type ValidationOutcome<T> = {
243
+ [VALIDATION_OUTCOME]: true;
244
+ errors?: Record<string, any>;
245
+ values?: T;
246
+ };
247
+ /** What a form-level validate function may return: a plain nested error
248
+ * record (flattened into field errors — the long-standing shape), or a
249
+ * branded {@link ValidationOutcome} whose `values` become the form's
250
+ * parsedValues baseline. */
251
+ type ValidateResult<T> = Record<string, any> | ValidationOutcome<T> | Promise<Record<string, any> | ValidationOutcome<T>>;
252
+ /** Context passed to a form-level `validate` function's second argument.
253
+ * `signal` aborts as soon as the round is superseded — a newer round
254
+ * started (which only happens under a positive `validateDebounce`, where
255
+ * kicks merge into windows) — so async validators can cancel their
256
+ * underlying work instead of racing a stale result home. Stale results
257
+ * are dropped independently by the round gate, so validators that ignore
258
+ * the signal stay correct too; the same contract field-level validators
259
+ * get through their own `meta`. */
260
+ type FormValidateMeta<T extends Record<string, any> = any> = {
261
+ form: Form<T>;
262
+ signal: AbortSignal;
263
+ };
264
+ /** Form-level validator: receives all values (plus {@link
265
+ * FormValidateMeta} as an optional second argument) and returns a
266
+ * {@link ValidateResult} — sync or async — or `undefined`/nothing when
267
+ * valid (the runtime skips falsy results, so implicit-return callbacks
268
+ * type-check). */
269
+ type FormValidateFn<T extends Record<string, any> = any> = (values: T, meta: FormValidateMeta<T>) => ValidateResult<T> | undefined;
270
+ /**
271
+ * The emitter event table for {@link Form.emitter}: each event's payload
272
+ * tuple. Path-carrying events declare an optional single `Path` payload —
273
+ * emit sites send it for single-field mutations and omit it for bulk
274
+ * payload-less broadcasts (reset, setInitialValues, clear-all), both of
275
+ * which subscribers handle. `focusError` carries the target's path key
276
+ * plus optional {@link SetFocusOptions}.
277
+ */
278
+ type FormEvents = ['change', [path?: Path]] | ['errors', [path?: Path]] | ['touched', [path?: Path]] | ['validating', [path?: Path]] | ['submitting', []] | ['submitCount', []] | ['submitSuccessful', []] | ['reset', []] | ['disabled', []] | ['loading', []] | ['focusError', [key: string, options?: SetFocusOptions]];
279
+ type Form<T extends Record<string, any> = any> = {
280
+ emitter: EventEmitter<FormEvents>;
281
+ mode: ValidationMode;
282
+ reValidateMode: ReValidateMode;
283
+ initialValues: T;
284
+ values: Map<string, any>;
285
+ /** Tombstones of unregistered field paths (JSON path keys): reading or
286
+ * merging values must not fall back to initialValues for these paths. */
287
+ deleted: Set<string>;
288
+ /** Every error registered for a field, as a non-empty array (the
289
+ * write-side {@link setErrorByPath} normalizes to this invariant, so
290
+ * readers never need to guard against an empty list). Readers wanting
291
+ * the display error take the first entry ({@link getError}); readers
292
+ * wanting all of them use {@link getFieldErrors}. */
293
+ errors: Map<string, FieldError[]>;
294
+ touched: Set<string>;
295
+ /** Per-field validation kicks, registered by {@link
296
+ * registerValidatorByPath} (`useValidate` is the React-side
297
+ * registration): each is the field's debounce/lock-aware kick —
298
+ * invoking it validates the field's current value. `trigger` /
299
+ * `ensureValidate` run every entry; the user-change gate ({@link
300
+ * userChangeByPath}) runs the entry at the changed path. */
301
+ validators: Map<string, () => void>;
302
+ validating: Set<string>;
303
+ /** Parsed values from the last successful schema validation: the
304
+ * schema's complete output tree (coerced/transformed values included).
305
+ * Sits between initialValues and the values Map in {@link getValues}
306
+ * until `reset`/`setInitialValues` clears it. Never affects dirty
307
+ * state — that compares live edits against initialValues only. */
308
+ parsedValues: T | undefined;
309
+ /** Form-level validator, seeded from {@link Options.validate}. May
310
+ * receive a second {@link FormValidateMeta} argument. */
311
+ validate?: FormValidateFn<T>;
312
+ /** Delay in milliseconds before the form-level `validate` runs; seeded
313
+ * from {@link Options.validateDebounce} and fixed at create time. */
314
+ validateDebounce?: number;
315
+ /** Path keys (JSON-stringified segments) of the fields whose user
316
+ * changes re-run the form-level `validate`; normalized from {@link
317
+ * Options.validateDeps} at create time and fixed thereafter. */
318
+ validateDeps?: ReadonlySet<string>;
319
+ isSubmitting: boolean;
320
+ submitCount: number;
321
+ isSubmitSuccessful: boolean | undefined;
322
+ /** True while an async {@link Options.initialValues} source (a Promise,
323
+ * or a thunk returning one) is still pending — the form starts empty
324
+ * and the resolved values become the baseline via setInitialValues when
325
+ * it lands. Flips through the payload-less 'loading' event
326
+ * (`useIsLoading` / `useFormState().isLoading`). */
327
+ isLoading: boolean;
328
+ /** Form-level default for a bound field's unmount behavior, seeded from
329
+ * {@link Options.shouldUnregister}: `true` (the default) tombstones an
330
+ * unmounted field, `false` keeps its value (react-hook-form's
331
+ * `shouldUnregister` semantics). A field's own `shouldUnregister` option
332
+ * overrides this. */
333
+ shouldUnregister?: boolean;
334
+ /** Form-level disabled flag, OR-ed into every bound field's `disabled`
335
+ * (form flag || the field's own option). Seeded from
336
+ * {@link Options}.disabled at create time and toggled at runtime with
337
+ * {@link setDisabled}, which emits a payload-less 'disabled' event so
338
+ * subscribed fields re-render. */
339
+ disabled: boolean;
340
+ };
341
+ type Options<T extends Record<string, any> = any> = {
342
+ /**
343
+ * The values baseline. Sync objects seed immediately (SSR renders
344
+ * them). Async sources — a Promise, or a thunk returning a value or
345
+ * Promise (react-hook-form's async `defaultValues` shape) — start the
346
+ * form empty with `isLoading: true` and land the resolved values as
347
+ * the baseline via setInitialValues once they resolve: value
348
+ * subscribers re-sync, dirty/touched state starts clean, and a later
349
+ * `reset()` returns to the resolved baseline. A rejected source flips
350
+ * isLoading back to false, keeps the form empty, and logs the error in
351
+ * DEV — attach a `.catch` on the source itself to handle it. The thunk
352
+ * runs at create time: keep its identity stable (module scope or
353
+ * useMemo) when passing it inline, and note StrictMode double-invokes
354
+ * it in development, like every render-phase call.
355
+ */
356
+ initialValues?: T | Promise<T> | (() => T | Promise<T>);
357
+ /** When fields are validated. Defaults to `'onSubmit'`. See
358
+ * {@link ValidationMode}. */
359
+ mode?: ValidationMode;
360
+ /** When a field is re-validated after it already has an error — it only
361
+ * takes effect once the field has an error. Defaults to `'onChange'`. See
362
+ * {@link ReValidateMode}. */
363
+ reValidateMode?: ReValidateMode;
364
+ /**
365
+ * Form-level validator. Returns a record of errors keyed by field path;
366
+ * nested objects are flattened ('a.b' style) and array values contribute
367
+ * every non-empty string they hold as separate errors (zod `flatten()`
368
+ * formErrors style). Schema adapters instead return a branded
369
+ * {@link ValidationOutcome}: `errors` flattens the same way, `values`
370
+ * (the schema's parsed output) becomes the form's parsedValues baseline
371
+ * that {@link getValues} layers over initialValues.
372
+ */
373
+ validate?: FormValidateFn<T>;
374
+ /**
375
+ * Milliseconds to debounce the form-level `validate`: kicks from
376
+ * `trigger`/`ensureValidate`/submit inside the window merge into one
377
+ * run, and while the timer is pending the form counts as validating,
378
+ * so `trigger` and submit wait the window out — the same contract the
379
+ * per-field `validateDebounce` gives field validators. The merged run
380
+ * reads the values current when its timer fires. Defaults to `0`
381
+ * (validate runs immediately, exactly as before this option existed).
382
+ */
383
+ validateDebounce?: number;
384
+ /** Fields whose user changes re-run the form-level `validate` — the
385
+ * cross-field dependency list (password-confirm mismatch and friends).
386
+ * Each entry is a field path ('password', 'user.email', 'items.0.qty');
387
+ * a user change to a listed field re-runs the form-level `validate`
388
+ * under the same mode/`reValidateMode` gating the field's own
389
+ * validator gets. Omit it and the form-level `validate` only runs on
390
+ * `trigger`/submit, exactly as before this option existed.
391
+ *
392
+ * Opting in also changes what a re-run may clear: each round first
393
+ * drops the errors the previous round wrote (paths it flattened onto),
394
+ * so a dep change that fixes the cross-field error makes it disappear.
395
+ * Errors the round never wrote — field validators', `setServerErrors`,
396
+ * manual `setError` — are never touched. TanStack Form's counterpart is
397
+ * `onChangeListenTo` (v1) / validator `triggers` (v2 alpha). */
398
+ validateDeps?: FieldPath<T>[];
399
+ /**
400
+ * Form-level default for a bound field's unmount behavior. `true` (the
401
+ * default) tombstones an unmounted field — it drops out of
402
+ * `getValues()` instead of reviving its initial value (this library's
403
+ * historical default); `false` keeps the value, matching
404
+ * react-hook-form's `shouldUnregister`. A field's own
405
+ * `useField({shouldUnregister})` option overrides the form-level flag
406
+ * in either direction.
407
+ */
408
+ shouldUnregister?: boolean;
409
+ /** Start the form with every bound field disabled — the flag bound
410
+ * fields OR with their own `disabled` option (a field cannot opt out
411
+ * of a disabled form). Toggle later with {@link setDisabled}.
412
+ * Defaults to `false`. */
413
+ disabled?: boolean;
414
+ };
415
+ /**
416
+ * Create form instance
417
+ * @param options
418
+ * @return form instance
419
+ */
420
+ declare function create<T extends Record<string, any> = any>(options?: Options<T>): Form<T>;
421
+
422
+ export { setServerErrors as A, FORM_ERROR as g, VALIDATION_OUTCOME as l, clearErrors as o, create as p, getError as q, getErrorByPath as r, getErrors as s, getFieldErrors as t, getFieldErrorsByPath as u, getFirstError as v, hasErrors as w, setError as x, setErrorByPath as y, setFocus as z };
423
+ export type { Form as F, Name as N, Options as O, Path as P, ReValidateMode as R, SetFocusOptions as S, ValidationMode as V, FieldError as a, FieldPath as b, PathSegments as c, PathValueOf as d, FieldErrorEntry as e, FormEvents as f, FormValidateFn as h, FormValidateMeta as i, PathValue as j, SetServerErrorsOptions as k, ValidateResult as m, ValidationOutcome as n };
package/dist/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react");function t(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}}),t.default=e,Object.freeze(t)}var r=t(e);function n(e,t){for(var r=arguments.length,n=new Array(r>2?r-2:0),o=2;o<r;o++)n[o-2]=arguments[o];(e.get(t)||[]).forEach(function(e){return e.apply(void 0,n)})}function o(e,t,r){var n=function(e,t){var r=e.get(t);if(r)return r;var n=new Set;return e.set(t,n),n}(e,t);return n.add(r),function(){return n.delete(r)}}const s=new Map;function i(e){if(Array.isArray(e))return e;const t=s.get(e);if(t)return t;const r=function(e){const t=[];let r="";const n=()=>{if(u(r)){const n=[...t.map(String),r].join("."),o=t.reduce((e,t)=>e+("number"==typeof t?`[${t}]`:`${e?".":""}${t}`),"");throw new TypeError(`Numeric path segment must use bracket notation: "${n}" → "${o}[${r}]" (path: ${e})`)}t.push(r),r=""};for(let o=0;o<e.length;o++){const s=e[o];if("."===s)""!==r&&n();else if("["===s){""!==r&&n();const s=e[o+1];if('"'===s||"'"===s){const r=e.indexOf(s,o+2);if(-1===r)throw new TypeError(`Unterminated quote in path: ${e}`);if("]"!==e[r+1])throw new TypeError(`Expected "]" after quoted segment in path: ${e}`);t.push(e.slice(o+2,r)),o=r+1}else{const r=e.indexOf("]",o+1);if(-1===r)throw new TypeError(`Unterminated bracket in path: ${e}`);const n=e.slice(o+1,r);t.push(u(n)?Number(n):n),o=r}}else r+=s}""===r&&0!==t.length||n();return t}(e);return s.set(e,r),r}const u=e=>/^-?\d+$/.test(e);function a(e,t){return t.reduce((e,t)=>{if(null!=e)return e[t]},e)}function c(e,t){if(!t.length||null==e)return e;const[r,...n]=t;if(n.length){const t=c(e[r],n);return t===e[r]?e:l(e,[r],t)}if(Array.isArray(e)){if(!(r in e))return e;const t=e.slice();return delete t[r],t}if("object"!=typeof e||!(r in e))return e;const o={...e};return delete o[r],o}function l(e,t,r){if(!t.length)return r;const[n,...o]=t,s="number"==typeof n?n:Array.isArray(e)&&"string"==typeof n&&u(n)?Number(n):void 0;if(void 0!==s){const t=Array.isArray(e)?e.slice():[];return t[s]=l(t[s],o,r),t}return{...e,[n]:l(e&&e[n],o,r)}}function f(e,t,r,n){if(!t.length)return r;let o=e,s=null,i="";for(let a=0;a<t.length;a++){const c=t[a];if(!n.has(o)){let t;t="number"==typeof c||Array.isArray(o)&&"string"==typeof c&&u(c)?Array.isArray(o)?o.slice():[]:{...o},n.add(t),0===a?e=t:s[i]=t,o=t}a===t.length-1?o[c]=r:(s=o,i=c,o=o[c])}return e}function d(e){return e&&"function"==typeof e.then}function p(e,t){if(Object.is(e,t))return!0;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(!e||!t||"object"!=typeof e||"object"!=typeof t)return!1;const r=Array.isArray(e);if(r!==Array.isArray(t))return!1;if(r){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!p(e[r],t[r]))return!1;return!0}const n=Object.getPrototypeOf(e);if(n!==Object.prototype&&null!==n)return!1;if(Object.getPrototypeOf(t)!==n)return!1;const o=Object.keys(e),s=Object.keys(t);if(o.length!==s.length)return!1;for(const r of o)if(!p(e[r],t[r]))return!1;return!0}function m(e,t,r,n){return new Promise((s,i)=>{if(n())return void i();if(r())return void s();const u=o(e,t,()=>{if(n())return u(),void i();r()&&(u(),s())})})}function h(e){const t=i(e);return{value:t,key:JSON.stringify(t)}}const y=Symbol("validation-outcome");function g(e){return{emitter:new Map,...e,mode:e?.mode??"onSubmit",reValidateMode:e?.reValidateMode??"onChange",disabled:e?.disabled??!1,validateDeps:e?.validateDeps?new Set(e.validateDeps.map(e=>h(e).key)):void 0,initialValues:e?.initialValues??{},values:new Map,deleted:new Set,errors:new Map,touched:new Set,validators:new Map,changeHandlers:new Map,validating:new Set,parsedValues:void 0,isSubmitting:!1,submitCount:0,isSubmitSuccessful:void 0}}const v=new WeakMap;function b(e){const t=v.get(e);t&&t.version++}function x(e){let t=v.get(e);return t?t.version>0&&(t.result=k(e),t.version=0):(t={version:0,result:k(e)},v.set(e,t)),t.result}function k(e){const{initialValues:t,parsedValues:r,values:n,deleted:o}=e,s=new Set;let i=r??t;for(const[e,t]of n)i=f(i,JSON.parse(e),t,s);for(const e of o)i=c(i,JSON.parse(e));return i}function E({initialValues:e,parsedValues:t,values:r,deleted:n},o){const{key:s,value:i}=o;if(r.has(s))return r.get(s);if(!n.has(s)){for(let e=i.length-1;e>0;e--){const t=JSON.stringify(i.slice(0,e));if(r.has(t))return a(r.get(t),i.slice(e))}return a(t??e,i)}}function S(e,t,r,o){const{emitter:s,values:i,deleted:u}=e;i.set(t.key,r),X(i,t),Z(u,t),H(e,t),!1===o?.shouldDirty&&q(e,t,r),G(e),b(e),o?.shouldTouch&&L(e,t),o?.shouldValidate&&e.validators.get(t.key)?.(),n(s,"change",t)}function V(e,t,r){const{values:n,deleted:o}=e;n.set(t.key,r),X(n,t),Z(o,t),H(e,t),G(e),b(e)}function w({emitter:e},t){n(e,"change",t)}function C(e,t,r,n){!1===n?.shouldDirty&&q(e,t,r);const o=e.changeHandlers.get(t.key);o?o(r):S(e,t,r,n)}function O({errors:e},t){return e.get(t.key)?.[0]}const A=[];function T({errors:e},t){return e.get(t.key)??A}function _({errors:e}){const t=[];for(const[r,n]of e){const e=JSON.parse(r).join(".");for(const{type:r,message:o}of n)t.push({path:e,type:r,message:o})}return t}function D({errors:e}){return e.values().next().value?.[0]?.message}function j({emitter:e,validating:t},r){t.delete(r.key),n(e,"validating",r)}function F({emitter:e,validating:t},r){t.add(r.key),n(e,"validating",r)}function P(e,t,r){M(e,h(t),r)}function M({emitter:e,errors:t},r,o){const s=function(e){if("string"==typeof e)return e?[{type:"custom",message:e}]:void 0;if(ne(e))return[e];if(!e)return;const t=[];return e.forEach(e=>{"string"==typeof e&&e?t.push({type:"custom",message:e}):ne(e)&&t.push(e)}),t.length?t:void 0}(o);s?t.set(r.key,s):t.delete(r.key),n(e,"errors",r)}function B(e,t){const{emitter:r,errors:o}=e;if(void 0===t)return o.clear(),void n(r,"errors");const s="string"==typeof t||re(t)?[h(t)]:t.map(e=>h(e));for(const{key:e}of s)o.delete(e);for(const e of s)n(r,"errors",e)}function L({emitter:e,touched:t},r){t.has(r.key)||(t.add(r.key),n(e,"touched",r))}function N({touched:e},t){return e.has(t.key)}function R(e){let t=!1;return $(e,()=>{t=!0}),t}function $(e,t){for(const[r,n]of e.values){const o=JSON.parse(r);W(e,r,o)!==n&&t(o.join("."))}}const I=new WeakMap;function W(e,t,r){const n=I.get(e);return n?.has(t)?n.get(t):a(e.initialValues,r)}function q(e,{key:t},r){let n=I.get(e);n||(n=new Map,I.set(e,n)),n.set(t,r)}function H(e,{key:t}){const r=I.get(e);if(!r?.size)return;const n=`${t.slice(0,-1)},`;for(const e of r.keys())e.startsWith(n)&&r.delete(e)}function J(e,t){const r=I.get(e);r&&(void 0===t?r.clear():r.delete(t))}const U=new WeakMap;function G(e){const t=U.get(e);t&&t.version++}function z(e){const t={};return $(e,e=>{t[e]=!0}),t}function K(e){let t=U.get(e);if(t){if(t.version>0){const r=z(e);(function(e,t){const r=Object.keys(e);return r.length===Object.keys(t).length&&r.every(e=>!0===t[e])})(t.result,r)||(t.result=r),t.version=0}}else t={version:0,result:z(e)},U.set(e,t);return t.result}function Y({touched:e}){return Array.from(e,e=>JSON.parse(e).join("."))}function Q(e,t){const{key:r,value:o}=t,{emitter:s,values:i,touched:u,errors:a,validating:c,deleted:l}=e;i.delete(r),u.delete(r),a.delete(r),c.delete(r),J(e,r),function(e,t){for(let r=1;r<t.length;r++)if(e.has(JSON.stringify(t.slice(0,r))))return!0;const r=`${JSON.stringify(t).slice(0,-1)},`;for(const t of e.keys())if(t.startsWith(r))return!0;return!1}(i,o)||l.add(r),G(e),b(e),n(s,"change",t),n(s,"touched",t),n(s,"errors",t),n(s,"validating",t)}function X(e,{key:t}){if(!e.size)return;const r=`${t.slice(0,-1)},`;for(const t of e.keys())t.startsWith(r)&&e.delete(t)}function Z(e,{key:t}){if(e.size)for(const r of e)(r===t||r.startsWith(`${t.slice(0,-1)},`)||t.startsWith(`${r.slice(0,-1)},`))&&e.delete(r)}function ee(e,t){e.initialValues===t||p(e.initialValues,t)||(e.initialValues=t,e.parsedValues=void 0,e.values.clear(),e.deleted.clear(),J(e),G(e),b(e),n(e.emitter,"change"))}function te({errors:e}){return e.size>0}function re(e){return e.some(e=>"number"==typeof e)}function ne(e){return!!e&&"object"==typeof e&&"string"==typeof e.type&&"string"==typeof e.message}function oe(e,t,r=[],n){Object.entries(t).forEach(([t,o])=>{const s=[...r,...u(t)?[t]:i(t)];"string"==typeof o?o&&(P(e,s,o),se(e,s,n)):Array.isArray(o)||ne(o)?(P(e,s,o),se(e,s,n)):o&&"object"==typeof o&&oe(e,o,s,n)})}function se(e,t,r){if(!r)return;const n=h(t),o=e.errors.get(n.key);o&&r.set(n.key,o)}function ie(e,t){const r=e.validateDeps?function(e){let t=ue.get(e);t||(t=new Map,ue.set(e,t));return t}(e):void 0;if(r&&(!function(e,t){for(const[r,o]of t){e.errors.get(r)===o&&(e.errors.delete(r),n(e.emitter,"errors",h(JSON.parse(r))))}}(e,r),r.clear()),t){if("object"==typeof t&&y in t){const o=t;return o.errors&&oe(e,o.errors,[],r),void function(e,t){void 0!==t&&t!==e.parsedValues&&(e.parsedValues=t,b(e),n(e.emitter,"change"))}(e,o.values)}oe(e,t,[],r)}}const ue=new WeakMap;const ae="__form_validate__";function ce(e){for(const t of e.validating)if(t!==ae)return!1;return!0}const le=Symbol("form-validate-settled"),fe=new WeakMap;function de(e){const t=e.validate;if(!t)return Promise.resolve();const r=e.validateDebounce??0;if(r<=0){const r=new AbortController;return Promise.resolve(t(x(e),{form:e,signal:r.signal})).then(t=>{ie(e,t)})}const o=function(e){let t=fe.get(e);return t||(t={timer:null,controller:null,round:null,marked:!1,waiters:[]},fe.set(e,t)),t}(e);return null!==o.timer?clearTimeout(o.timer):(o.marked=!0,e.validating.add(ae),n(e.emitter,"validating")),o.timer=setTimeout(()=>{o.timer=null;const t=o.round={};(function(e,t,r){const n=e.validate;if(!n)return Promise.resolve();t.controller?.abort();const o=t.controller=new AbortController;let s;try{s=Promise.resolve(n(x(e),{form:e,signal:o.signal}))}catch(e){s=Promise.reject(e)}return s.then(n=>{t.round===r&&ie(e,n)},e=>{if(t.round===r)throw e})})(e,o,t).then(()=>pe(e,o,t,le),r=>pe(e,o,t,r))},r),new Promise((e,t)=>{o.waiters.push({resolve:e,reject:t})})}function pe(e,t,r,o){if(t.round!==r)return;if(t.round=null,null!==t.timer)return;t.marked&&(t.marked=!1,e.validating.delete(ae),n(e.emitter,"validating"));const s=t.waiters;t.waiters=[];for(const e of s)o===le?e.resolve():e.reject(o)}function me(e,t,r){e.validateDeps?.has(t.key)&&e.validate&&("onChange"===r||"all"===r||"onTouched"===r&&N(e,t)||"onChange"===e.reValidateMode&&function(e){const t=ue.get(e);if(!t)return!1;for(const[r,n]of t)if(e.errors.get(r)===n)return!0;return!1}(e))&&de(e).catch(()=>{})}const he=new WeakMap;function ye(e,t,r){let n=he.get(e);n||(n=new Map,he.set(e,n));for(const e of r){let r=n.get(e);r||(r=new Set,n.set(e,r)),r.add(t)}}function ge(e,t,r){const n=he.get(e);if(n)for(const e of r){const r=n.get(e);r?.delete(t)&&(r.size||n.delete(e))}}function ve(e,t,r){const n=he.get(e)?.get(t.key);if(n?.size)for(const o of n)o!==t.key&&("onChange"===r||"all"===r||"onTouched"===r&&N(e,t)||"onChange"===e.reValidateMode&&e.errors.has(o))&&e.validators.get(o)?.()}function be(e){const t=new Error(D(e));return t.errors=_(e),t}async function xe(e){if(e.validators.forEach(e=>e()),await m(e.emitter,"validating",()=>ce(e),()=>te(e)).catch(()=>{throw be(e)}),e.validate&&(await de(e),te(e)))throw be(e)}async function ke(e){return xe(e).catch(e=>e.message)}function Ee(e,t){e.isSubmitting=t,n(e.emitter,"submitting")}function Se(e){e.submitCount++,n(e.emitter,"submitCount")}function Ve(e,t){e.isSubmitSuccessful=t,n(e.emitter,"submitSuccessful")}function we(e){if(e.startsWith("["))try{const t=JSON.parse(e);if(Array.isArray(t))return t.join(".")}catch{}return e}function Ce(e,t){const{onSubmit:r,onValidSubmit:o,onInvalidSubmit:s,shouldFocusError:i=!0}=t??{};return async t=>{t&&"function"==typeof t.preventDefault&&t.preventDefault();const u=t?.currentTarget;Ee(e,!0),Se(e);const a=x(e);if(u&&"function"==typeof u.checkValidity&&!1===u.checkValidity()){if(u.reportValidity(),i&&"function"==typeof u.querySelector){const e=u.querySelector(":invalid");e&&"function"==typeof e.focus&&e.focus()}return Ee(e,!1),Ve(e,!1),void(s&&s(function(e){const t=[],{elements:r}=e;for(let e=0;e<r.length;e++){const n=r[e];n.name&&"function"==typeof n.checkValidity&&!n.checkValidity()&&t.push({path:we(n.name),type:"native",message:n.validationMessage})}return t}(u),a))}if(await ke(e)){if(Ee(e,!1),Ve(e,!1),i){const t=e.errors.keys().next().value;void 0!==t&&n(e.emitter,"focusError",t)}s&&s(_(e),a)}else try{const n=x(e);r&&await r(n,t),o&&await o(n,t),Ve(e,!0)}catch{Ve(e,!1)}finally{Ee(e,!1)}}}function Oe(e,t){switch(e){case"required":return"This field is required";case"min":return`Must be at least ${t}`;case"max":return`Must be at most ${t}`;case"minLength":return`Must be at least ${t} characters`;case"maxLength":return`Must be at most ${t} characters`;case"pattern":return"Invalid format";default:return"Invalid value"}}var Ae,Te={exports:{}},_e={};var De,je,Fe={};var Pe=(je||(je=1,"production"===process.env.NODE_ENV?Te.exports=function(){if(Ae)return _e;Ae=1;var t=e,r="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},n=t.useState,o=t.useEffect,s=t.useLayoutEffect,i=t.useDebugValue;function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch(e){return!0}}var a="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var r=t(),a=n({inst:{value:r,getSnapshot:t}}),c=a[0].inst,l=a[1];return s(function(){c.value=r,c.getSnapshot=t,u(c)&&l({inst:c})},[e,r,t]),o(function(){return u(c)&&l({inst:c}),e(function(){u(c)&&l({inst:c})})},[e]),i(r),r};return _e.useSyncExternalStore=void 0!==t.useSyncExternalStore?t.useSyncExternalStore:a,_e}():Te.exports=(De||(De=1,"production"!==process.env.NODE_ENV&&function(){function t(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!n(e,r)}catch(e){return!0}}"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var r=e,n="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,s=r.useEffect,i=r.useLayoutEffect,u=r.useDebugValue,a=!1,c=!1,l="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,l){a||void 0===r.startTransition||(a=!0,console.error("You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release."));var f=l();if(!c){var d=l();n(f,d)||(console.error("The result of getSnapshot should be cached to avoid an infinite loop"),c=!0)}var p=(d=o({inst:{value:f,getSnapshot:l}}))[0].inst,m=d[1];return i(function(){p.value=f,p.getSnapshot=l,t(p)&&m({inst:p})},[e,f,l]),s(function(){return t(p)&&m({inst:p}),e(function(){t(p)&&m({inst:p})})},[e]),u(f),f};Fe.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:l,"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),Fe)),Te.exports);function Me(e,t){return e.startsWith(`${t.slice(0,-1)},`)}function Be(e,t,r,n,s){const{key:i}=r;return o(e,t,e=>{(void 0===e||e.key===i||Me(i,e.key)||"branch"===n&&Me(e.key,i))&&s()})}function Le(e,t,r,n){return o(e,t,e=>{void 0!==e&&e.key!==r||n()})}function Ne(t){const[r]=e.useState(()=>{const e=g(t);return t&&void 0!==t.values&&ee(e,t.values),e}),n=t&&t.initialValues,o=t&&t.values,s=e.useRef(null);null===s.current&&(s.current={done:!1,source:void 0}),e.useEffect(()=>{if(void 0===n)return;const e=s.current;e.done&&(e.source===n||p(e.source,n))||(e.done=!0,e.source=n,ee(r,n))},[r,n]);const i=e.useRef(null);return null===i.current&&(i.current={done:!1,source:void 0}),e.useEffect(()=>{if(void 0===o)return;const e=i.current;e.done&&(e.source===o||p(e.source,o))||(e.done=!0,e.source=o,ee(r,o))},[r,o]),r}function Re(t,r){const n=e.useRef(null);null===n.current&&(n.current={hasValue:!1});const o=n.current,s=e.useRef(r);s.current=r;const i=e.useCallback(()=>(o.hasValue||(o.value=s.current(),o.hasValue=!0),o.value),[o]),u=e.useCallback(e=>{o.hasValue=!1;return t(()=>{o.hasValue=!1,e()})},[t,o]);return Pe.useSyncExternalStore(u,i,i)}function $e(t,r,n){return Re(e.useCallback(e=>o(t,r,e),[t,r]),n)}function Ie(t,r){const{emitter:n}=t,{key:o}=r;return Re(e.useCallback(e=>Be(n,"change",r,"leaf",e),[n,o]),E.bind(null,t,r))}function We(t,r){const{emitter:n}=t,{key:o}=r;return Re(e.useCallback(e=>Le(n,"touched",o,e),[n,o]),N.bind(null,t,r))}function qe(t,r){const{emitter:n}=t,{key:o}=r;return Re(e.useCallback(e=>Le(n,"errors",o,e),[n,o]),O.bind(null,t,r))}function He(t,r){const{emitter:n}=t,{key:o}=r;return Re(e.useCallback(e=>Le(n,"errors",o,e),[n,o]),T.bind(null,t,r))}function Je(t){const r=e.useMemo(()=>h(i(t)),[t]);return e.useMemo(()=>r,[r.key])}function Ue(t){const r=e.useRef(t);return r.current=t,r}function Ge(t){const r=Ue(t);return e.useCallback((...e)=>r.current(...e),[r])}function ze(e,t){if(!e)return t;const r=function(e){return t=>{if(e.required&&(""===t||null==t))return[{type:"required",message:"string"==typeof e.required?e.required:Oe("required")}];const r=[],n=(t,r)=>e.messages?.[t]??Oe(t,r);if(void 0!==e.min){const o=Number(t);!Number.isNaN(o)&&o<e.min&&r.push({type:"min",message:n("min",e.min)})}if(void 0!==e.max){const o=Number(t);!Number.isNaN(o)&&o>e.max&&r.push({type:"max",message:n("max",e.max)})}return void 0!==e.minLength&&"string"==typeof t&&t.length<e.minLength&&r.push({type:"minLength",message:n("minLength",e.minLength)}),void 0!==e.maxLength&&"string"==typeof t&&t.length>e.maxLength&&r.push({type:"maxLength",message:n("maxLength",e.maxLength)}),e.pattern&&!e.pattern.value.test(t)&&r.push({type:"pattern",message:e.messages?.pattern??e.pattern.message??Oe("pattern")}),r.length?r:void 0}}(e);return t?(e,n)=>{const o=r(e,n),s=e=>{const t=[...o??[]];return Array.isArray(e)?t.push(...e):e&&t.push(e),t.length?t:void 0},i=t(e,n);return d(i)?i.then(s):s(i)}:r}function Ke({form:t,name:r,initialValue:n,shouldUnregister:o,validate:s,rules:i,validateDebounce:u,validateDeps:a,delayError:c,disabled:l,mode:f},p){const m=e.useContext(p),y=t||m;if(!y)throw new Error("no form provided");const g=Je(r),v=e.useRef(!1);void 0!==n&&void 0===E(y,g)&&(V(y,g,n),v.current=!0),e.useEffect(()=>{v.current&&(v.current=!1,w(y,g))});const b=function(t,r,n,o){const s=e.useContext(ot),i=n||s;if(!i)throw new Error("no form provided");const u=e.useRef(null),a=e.useRef(t);a.current=t;const c=e.useRef(o?.debounce??0);return c.current=o?.debounce??0,e.useEffect(()=>{let e=null,t=null,n=!1;const o=()=>{n||(n=!0,F(i,r))},s=()=>{n&&(n=!1,j(i,r))},l=()=>{e=null;const n=a.current;if(!n)return void s();t?.abort(),t=new AbortController;const c=u.current={};let l;try{l=n(E(i,r),{form:i,path:r,signal:t.signal})}catch(e){throw s(),e}if(!d(l))return M(i,r,l),void s();o(),l.then(e=>{c===u.current&&M(i,r,e)}).catch(()=>{}).finally(()=>{c===u.current&&(s(),u.current=null)})};return i.validators.set(r.key,()=>{const t=c.current;if(t>0)return null!==e?clearTimeout(e):o(),void(e=setTimeout(l,t));l()}),()=>{i.validators.delete(r.key),null!==e&&(clearTimeout(e),e=null),s(),t?.abort()}},[i,r.key]),Ge(()=>i.validators.get(r.key)?.())}(ze(i,s),g,y,{debounce:u}),x=He(y,g),k=function(t,r){const[n,o]=e.useState(t);return e.useEffect(()=>{if(void 0===r)return;if(0===t.length)return void o(t);if(n.length>0)return void o(t);const e=setTimeout(()=>o(t),r);return()=>clearTimeout(e)},[t,r,n]),void 0===r?t:n}(x,c),C=k[0],O=C?.message,A=Ie(y,g),T=$e(y.emitter,"disabled",()=>y.disabled),_=f??y.mode,D=Ge(e=>{S(y,g,e),("onChange"===_||"all"===_||"onTouched"===_&&N(y,g)||x.length>0&&"onChange"===y.reValidateMode)&&b(),me(y,g,_),ve(y,g,_)});e.useEffect(()=>(y.changeHandlers.set(g.key,D),()=>{y.changeHandlers.get(g.key)===D&&y.changeHandlers.delete(g.key)}),[y,g.key,D]);const P=a?.length?a.join("\n"):void 0;e.useEffect(()=>{if(!P)return;const e=a.map(e=>h(e).key);return ye(y,g.key,e),()=>ge(y,g.key,e)},[y,g.key,P]);const B=Ge(()=>{L(y,g),("onBlur"===_||"onTouched"===_||"all"===_||x.length>0&&"onBlur"===y.reValidateMode)&&b()});return e.useEffect(()=>()=>{!1!==o&&Q(y,g)},[g,y,o]),{form:y,value:A,error:O,errorObject:C,errors:k,onChange:D,onBlur:B,name:g.key,disabled:T||!!l}}function Ye(e){return Ke(e,ot)}const Qe=new WeakMap;function Xe(e){const t=(Qe.get(e)??0)+1;return Qe.set(e,t),`_${t}`}const Ze=new WeakMap;function et(e,t,r){let n=Ze.get(e);n||(n=new Map,Ze.set(e,n)),n.set(t,r)}function tt(e){return e+1}function rt(t,r){const n=e.useContext(r),o=t.form||n;if(!o)throw new Error("no form provided");const s=Je(t.name),i=e.useRef([]),u=e.useCallback(()=>E(o,s)||[],[o,s]),a=e.useCallback(e=>{S(o,s,e)},[o,s]),c=e.useCallback(()=>{const e=u();for(;i.current.length<e.length;)i.current.push(Xe(o));for(;i.current.length>e.length;)i.current.pop();return i.current.map((e,t)=>({id:e,index:t}))},[u,o]),[l,f]=e.useReducer(c,void 0,c);e.useEffect(()=>Be(o.emitter,"change",s,"branch",f),[o.emitter,s]),et(o,s.key,i.current),e.useEffect(()=>(et(o,s.key,i.current),()=>{const e=Ze.get(o);e?.get(s.key)===i.current&&e.delete(s.key)}),[o,s.key]);return{fields:l,append:Ge(e=>{const t=u();i.current.push(Xe(o)),a([...t,e])}),prepend:Ge(e=>{const t=u();i.current.unshift(Xe(o)),a([e,...t])}),insert:Ge((e,t)=>{const r=u();i.current.splice(e,0,Xe(o));const n=[...r.slice(0,e),t,...r.slice(e)];a(n)}),remove:Ge(e=>{const t=u();i.current.splice(e,1);const r=t.filter((t,r)=>r!==e);a(r)}),swap:Ge((e,t)=>{const r=u();[i.current[e],i.current[t]]=[i.current[t],i.current[e]];const n=[...r];[n[e],n[t]]=[n[t],n[e]],a(n)}),move:Ge((e,t)=>{const r=u(),[n]=i.current.splice(e,1);i.current.splice(t,0,n);const o=[...r],[s]=o.splice(e,1);o.splice(t,0,s),a(o)}),replace:Ge(e=>{i.current=e.map(()=>Xe(o)),a([...e])}),update:Ge((e,t)=>{const r=u();if(e<0||e>=r.length)return;const n=[...r];n[e]=t,a(n)})}}function nt(t,r){const n=e.useContext(r),o=t.form||n;if(!o)throw new Error("no form provided");const{id:s}=t,i=Je(t.name),u=e.useCallback(()=>function(e,t){return Ze.get(e)?.get(t)}(o,i.key)?.indexOf(s)??-1,[o,i.key,s]),a=e.useCallback(e=>{const t=E(o,i);return Array.isArray(t)?t[e]:void 0},[o,i]),c=u(),l=a(c),f=e.useRef({index:c,value:l});f.current={index:c,value:l};const d=Ue({computeIndex:u,computeValue:a}),[,p]=e.useReducer(tt,0);e.useEffect(()=>Be(o.emitter,"change",i,"leaf",()=>{const{computeIndex:e,computeValue:t}=d.current,r=e();r===f.current.index&&Object.is(t(r),f.current.value)||p()}),[o.emitter,i,d]);const m=Je([...i.value,c]),h=He(o,m);return{value:l,setValue:Ge(e=>{if(c<0)return;const t=[...E(o,i)??[]];c>=t.length||(t[c]=e,S(o,i,t))}),errors:h,error:h[0]?.message,name:m.key,index:c,form:o}}const ot=e.createContext(null),st=ot.Provider;const it=e.createContext(null),ut=it.Provider;function at(e){return e.replace(/["'[\],\s]+/g,"-").replace(/^-+|-+$/g,"")||"field"}function ct(e,t,r){return{"aria-invalid":!!e||r["aria-invalid"],"aria-describedby":e?[r["aria-describedby"],at(t)].filter(Boolean).join(" "):r["aria-describedby"]}}const lt=r.forwardRef(({validate:e,eventToValue:t,initialValue:n,name:s,asProps:i,renderError:u,as:a,valueToProps:c,form:l,shouldUnregister:f,rules:d,validateDebounce:p,disabled:m,delayError:h,mode:y,...g},v)=>{const b=r.useRef(null),[x,k]=r.useState(0),E=r.useCallback(e=>{b.current=e,function(e,t){"function"==typeof e?e(t):e&&(e.current=t)}(v,e)},[v]),{value:S,onChange:V,onBlur:w,error:C,form:O,name:A,disabled:T}=Ye({name:s,form:l,initialValue:n,shouldUnregister:f,rules:d,validateDebounce:p,delayError:h,disabled:m,mode:y,validate:(...t)=>{const r=b.current;if(!r||"function"!=typeof r.checkValidity||(r.setCustomValidity(""),!1!==r.checkValidity()))return e?e(...t):void 0;k(e=>e+1)}}),_=a||"input";r.useEffect(()=>{const e=b.current;e&&"function"==typeof e.setCustomValidity&&("string"==typeof C?(e.setCustomValidity(C),e.reportValidity()):e.setCustomValidity(""))},[C]),r.useEffect(()=>{x>0&&b.current?.reportValidity()},[x]),r.useEffect(()=>o(O.emitter,"focusError",(e,t)=>{if(e!==A)return;const r=b.current;r&&"function"==typeof r.focus&&(r.focus(),t?.shouldSelect&&"function"==typeof r.select&&r.select())}),[O,A]);const D=t??(e=>e.target.value),j=at(A);return r.createElement(r.Fragment,null,r.createElement(_,{...g,name:A,onBlur:w,...i,...c?c(S):{value:S},...ct(C,A,g),disabled:T,onChange:e=>V(D(e)),ref:E}),C&&u?r.createElement("span",{id:j,role:"alert"},u(C,j)):null)}),ft=r.forwardRef(({name:e,form:t,initialValue:n,shouldUnregister:o,validate:s,rules:i,validateDebounce:u,disabled:a,delayError:c,mode:l,...f},d)=>{const{value:p,onChange:m,onBlur:h,error:y,name:g,disabled:v}=Ye({name:e,form:t,initialValue:n,shouldUnregister:o,validate:s,rules:i,validateDebounce:u,delayError:c,disabled:a,mode:l});return r.createElement("input",{...f,name:g,onBlur:h,type:"checkbox",checked:!!p,...ct(y,g,f),disabled:v,onChange:e=>m(e.target.checked),ref:d})});function dt(e,t){return e?Array.isArray(t)?t:[]:t??""}const pt=r.forwardRef(({name:e,multiple:t,children:n,form:o,initialValue:s,shouldUnregister:i,validate:u,rules:a,validateDebounce:c,disabled:l,delayError:f,mode:d,...p},m)=>{const{value:h,onChange:y,onBlur:g,error:v,name:b,disabled:x}=Ye({name:e,form:o,initialValue:s,shouldUnregister:i,validate:u,rules:a,validateDebounce:c,delayError:f,disabled:l,mode:d});return r.createElement("select",{...p,name:b,onBlur:g,multiple:t,value:dt(t,h),...ct(v,b,p),disabled:x,onChange:e=>y(t?Array.from(e.target.selectedOptions,e=>e.value):e.target.value),ref:m},n)});exports.Checkbox=ft,exports.CheckboxGroupContext=it,exports.CheckboxGroupProvider=ut,exports.Field=lt,exports.Form=function({form:e,context:t,initialValues:n,values:o,onSubmit:s,onValidSubmit:i,onInvalidSubmit:u,shouldFocusError:a,...c}){const l=Ne({initialValues:n,values:o}),f=e||l,d=Ce(f,{onSubmit:s,onValidSubmit:i,onInvalidSubmit:u,shouldFocusError:a}),{Provider:p}=t??ot;return r.createElement(p,{value:f},r.createElement("form",{...c,noValidate:!0,onSubmit:d}))},exports.FormContext=ot,exports.FormProvider=st,exports.Select=pt,exports.VALIDATION_OUTCOME=y,exports.changeValue=function(e,t,r,n){C(e,h(t),r,n)},exports.changeValueByPath=C,exports.clearErrors=B,exports.createForm=g,exports.createFormContext=function(){const t=e.createContext(null);return{context:t,FormProvider:function({form:r,children:n}){return e.createElement(t.Provider,{value:r},n)},useFormContext:function(){const r=e.useContext(t);if(!r)throw new Error("no form provided");return r},useField:function(e){return Ke(e,t)},useFieldArray:function(e){return rt(e,t)},useFieldArrayItem:function(e){return nt(e,t)}}},exports.emitChangeByPath=w,exports.ensureValidate=xe,exports.fieldErrorId=function(e){return at(h(e).key)},exports.getDirtyFields=K,exports.getError=function(e,t){return O(e,h(t))},exports.getErrorByPath=O,exports.getErrors=_,exports.getFieldErrors=function(e,t){return T(e,h(t))},exports.getFieldErrorsByPath=T,exports.getFieldState=function(e,t){const r=h(t),{values:n,touched:o,validating:s}=e,i=n.get(r.key);return{value:E(e,r),error:O(e,r),errors:T(e,r),isDirty:n.has(r.key)&&W(e,r.key,r.value)!==i,isTouched:o.has(r.key),isValidating:s.has(r.key)}},exports.getFirstError=D,exports.getTouchedFields=Y,exports.getValue=function(e,t){return E(e,h(t))},exports.getValueByPath=E,exports.getValues=x,exports.handleSubmit=Ce,exports.hasErrors=te,exports.hasTouched=function(e,t){return N(e,h(t))},exports.hasTouchedByPath=N,exports.incrementSubmitCount=Se,exports.isDirty=R,exports.isTouched=function({touched:e}){return e.size>0},exports.registerFieldValidateDeps=ye,exports.removeField=function(e,t){Q(e,h(t))},exports.removeFieldByPath=Q,exports.reset=function(e,t,r){const o=[];if(r?.keepDirtyValues)for(const[t,r]of e.values){const n=JSON.parse(t);W(e,t,n)!==r&&o.push({segments:n,value:r})}e.initialValues=t,e.parsedValues=void 0,r?.keepErrors||B(e);const{emitter:s,touched:i,values:u,deleted:a,validating:c}=e;u.clear(),a.clear(),J(e),r?.keepTouched||i.clear(),c.clear(),r?.keepIsSubmitting||(e.isSubmitting=!1),r?.keepSubmitCount||(e.submitCount=0),r?.keepIsSubmitted||(e.isSubmitSuccessful=void 0),G(e),b(e);for(const{segments:t,value:r}of o)S(e,h(t),r);n(s,"change"),n(s,"touched"),n(s,"validating"),n(s,"submitting"),n(s,"submitCount"),n(s,"submitSuccessful"),n(s,"reset")},exports.resetField=function(e,t,r){const o=h(t),{emitter:s,values:i,touched:u,errors:l,deleted:f}=e;if(i.delete(o.key),J(e,o.key),void 0!==e.parsedValues){e.parsedValues=c(e.parsedValues,o.value);const t=a(e.initialValues,o.value);void 0!==t&&i.set(o.key,t)}r&&"value"in r&&i.set(o.key,r.value),Z(f,o),n(s,"change"),!r?.keepTouched&&u.delete(o.key)&&n(s,"touched",o),!r?.keepErrors&&l.delete(o.key)&&n(s,"errors",o),G(e),b(e)},exports.revalidateDependentsOnChange=ve,exports.revalidateFormOnChange=me,exports.seedValueByPath=V,exports.setDisabled=function(e,t){e.disabled=t,n(e.emitter,"disabled")},exports.setError=P,exports.setErrorByPath=M,exports.setFocus=function(e,t,r){const{key:o}=h(t);r?n(e.emitter,"focusError",o,r):n(e.emitter,"focusError",o)},exports.setInitialValues=ee,exports.setIsSubmitting=Ee,exports.setServerErrors=function(e,t,r){r?.keepExisting||B(e);for(const[r,n]of Object.entries(t))P(e,r,(Array.isArray(n)?n:[n]).map(e=>({type:"server",message:e})))},exports.setSubmitSuccessful=Ve,exports.setTouched=function(e,t){L(e,h(t))},exports.setTouchedByPath=L,exports.setValidatingByPath=F,exports.setValue=function(e,t,r,n){S(e,h(t),r,n)},exports.setValueByPath=S,exports.subscribe=function(e,t){const{name:r,event:n="change",scope:s="branch",callback:i}=t;if(void 0===r)return o(e.emitter,n,i);const u=(function(e){return Array.isArray(e)&&e.every(e=>"number"!=typeof e)}(r)?r:[r]).map(t=>{const r=h(t);return"errors"===n||"touched"===n?Le(e.emitter,n,r.key,i):Be(e.emitter,n,r,s,i)});return 1===u.length?u[0]:()=>u.forEach(e=>e())},exports.trigger=async function(e,t){const r=t=>m(e.emitter,"validating",()=>void 0===t?ce(e):t.every(t=>!e.validating.has(t)),()=>!1);if(void 0===t)return e.validators.forEach(e=>e()),await r(),e.validate&&await de(e),!te(e);const n="string"==typeof t||re(t)?[h(t).key]:t.map(e=>h(e).key);return n.forEach(t=>e.validators.get(t)?.()),await r(n),n.every(t=>!e.errors.has(t))},exports.unregisterFieldValidateDeps=ge,exports.unsetValidatingByPath=j,exports.useCanSubmit=function(t){const{emitter:r}=t;return Re(e.useCallback(e=>{const t=o(r,"errors",e),n=o(r,"submitting",e);return()=>{t(),n()}},[r]),()=>!t.isSubmitting&&!te(t))},exports.useCheckboxGroupContext=function(){const t=e.useContext(it);if(!t)throw new Error("no group provided");return t},exports.useDirtyFields=function(e){return $e(e.emitter,"change",K.bind(null,e))},exports.useError=function(e,t){return qe(e,h(t))?.message},exports.useErrorByPath=qe,exports.useField=Ye,exports.useFieldArray=function(e){return rt(e,ot)},exports.useFieldArrayItem=function(e){return nt(e,ot)},exports.useFieldErrors=function(e,t){return He(e,h(t))},exports.useFieldErrorsByPath=He,exports.useForm=Ne,exports.useFormContext=function(){const t=e.useContext(ot);if(!t)throw new Error("no form provided");return t},exports.useHasErrors=function(e){return $e(e.emitter,"errors",te.bind(null,e))},exports.useIsDirty=function(e){return $e(e.emitter,"change",R.bind(null,e))},exports.useIsSubmitting=function(e){return $e(e.emitter,"submitting",()=>e.isSubmitting)},exports.useSubmitCount=function(e){return $e(e.emitter,"submitCount",()=>e.submitCount)},exports.useTouched=function(e,t){return We(e,h(t))},exports.useTouchedByPath=We,exports.useTouchedFields=function(e){return $e(e.emitter,"touched",Y.bind(null,e))},exports.useValue=function(e,t){return Ie(e,h(t))},exports.useValueByPath=Ie,exports.useWatch=$e,exports.validate=ke;
1
+ "use strict";var e=require("@for-fun/event-emitter"),t=require("react");function r(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}}),t.default=e,Object.freeze(t)}var n=r(t);const o=new Map;function i(e){if(Array.isArray(e))return e;const t=o.get(e);if(t)return t;const r=function(e){const t=[];let r="";const n=()=>{if(s(r)){const n=[...t.map(String),r].join("."),o=t.reduce((e,t)=>e+("number"==typeof t?`[${t}]`:`${e?".":""}${t}`),"");throw new TypeError(`Numeric path segment must use bracket notation: "${n}" → "${o}[${r}]" (path: ${e})`)}t.push(r),r=""};for(let o=0;o<e.length;o++){const i=e[o];if("."===i)""!==r&&n();else if("["===i){""!==r&&n();const i=e[o+1];if('"'===i||"'"===i){const r=e.indexOf(i,o+2);if(-1===r)throw new TypeError(`Unterminated quote in path: ${e}`);if("]"!==e[r+1])throw new TypeError(`Expected "]" after quoted segment in path: ${e}`);t.push(e.slice(o+2,r)),o=r+1}else{const r=e.indexOf("]",o+1);if(-1===r)throw new TypeError(`Unterminated bracket in path: ${e}`);const n=e.slice(o+1,r);t.push(s(n)?Number(n):n),o=r}}else r+=i}""===r&&0!==t.length||n();return t}(e);if(o.size>=1e4){const e=o.keys().next();e.done||o.delete(e.value)}return o.set(e,r),r}const s=e=>/^-?\d+$/.test(e);function u(e,t){return t.reduce((e,t)=>{if(null!=e)return e[t]},e)}function a(e,t){if(!t.length||null==e)return e;const[r,...n]=t;if(n.length){const t=a(e[r],n);return t===e[r]?e:c(e,[r],t)}if(Array.isArray(e)){if(!(r in e))return e;const t=e.slice();return delete t[r],t}if("object"!=typeof e||!(r in e))return e;const o={...e};return delete o[r],o}function c(e,t,r){if(!t.length)return r;const[n,...o]=t,i="number"==typeof n?n:Array.isArray(e)&&"string"==typeof n&&s(n)?Number(n):void 0;if(void 0!==i){const t=Array.isArray(e)?e.slice():[];return t[i]=c(t[i],o,r),t}return{...e,[n]:c(e&&e[n],o,r)}}function l(e,t,r,n){if(!t.length)return r;let o=e,i=null,u="";for(let a=0;a<t.length;a++){const c=t[a];if(!n.has(o)){let t;t="number"==typeof c||Array.isArray(o)&&"string"==typeof c&&s(c)?Array.isArray(o)?o.slice():[]:{...o},n.add(t),0===a?e=t:i[u]=t,o=t}a===t.length-1?o[c]=r:(i=o,u=c,o=o[c])}return e}function d(e){return e&&"function"==typeof e.then}function f(e,t){if(Object.is(e,t))return!0;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(!e||!t||"object"!=typeof e||"object"!=typeof t)return!1;const r=Array.isArray(e);if(r!==Array.isArray(t))return!1;if(r){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!f(e[r],t[r]))return!1;return!0}const n=Object.getPrototypeOf(e);if(n!==Object.prototype&&null!==n)return!1;if(Object.getPrototypeOf(t)!==n)return!1;const o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(const r of o)if(!f(e[r],t[r]))return!1;return!0}function m(t,r,n,o){return new Promise((i,s)=>{if(o())return void s();if(n())return void i();const u=e.on(t,r,()=>{if(o())return u(),void s();n()&&(u(),i())})})}function p(e){const t=i(e);return{value:t,key:JSON.stringify(t)}}const h=new WeakMap;function g(e){const t=h.get(e);t&&t.version++}const y=new WeakMap;function v(e,t,r){const n=y.get(e);return n?.has(t)?n.get(t):u(e.initialValues,r)}function b(e,{key:t},r){let n=y.get(e);n||(n=new Map,y.set(e,n)),n.set(t,r)}function x(e,{key:t}){const r=y.get(e);if(!r?.size)return;const n=`${t.slice(0,-1)},`;for(const e of r.keys())e.startsWith(n)&&r.delete(e)}function k(e,t){const r=y.get(e);r&&(void 0===t?r.clear():r.delete(t))}const S=new WeakMap;function E(e){const t=S.get(e);t&&t.version++}function V(e){return e.some(e=>"number"==typeof e)}function w(e){return!!e&&"object"==typeof e&&"string"==typeof e.type&&"string"==typeof e.message}const C="_form",O=Symbol("validation-outcome");function A({errors:e},t){return e.get(t.key)?.[0]}const F=[];function T({errors:e},t){return e.get(t.key)??F}function _({errors:e}){const t=[];for(const[r,n]of e){const e=JSON.parse(r).join(".");for(const{type:r,message:o}of n)t.push({path:e,type:r,message:o})}return t}function D({errors:e}){return e.values().next().value?.[0]?.message}function L(e,t,r){j(e,p(t),r)}function j({emitter:t,errors:r},n,o){const i=function(e){if("string"==typeof e)return e?[{type:"custom",message:e}]:void 0;if(w(e))return[e];if(!e)return;const t=[];return e.forEach(e=>{"string"==typeof e&&e?t.push({type:"custom",message:e}):w(e)&&t.push(e)}),t.length?t:void 0}(o);i?r.set(n.key,i):r.delete(n.key),e.emit(t,"errors",n)}function M(t,r){const{emitter:n,errors:o}=t;if(void 0===r)return o.clear(),void e.emit(n,"errors");const i="string"==typeof r||V(r)?[p(r)]:r.map(e=>p(e));for(const{key:e}of i)o.delete(e);for(const t of i)e.emit(n,"errors",t)}function P({errors:e}){return e.size>0}function B({emitter:t,touched:r},n){r.has(n.key)||(r.add(n.key),e.emit(t,"touched",n))}function R({touched:e},t){return e.has(t.key)}function N({touched:e}){return Array.from(e,e=>JSON.parse(e).join("."))}function I(e){let t=h.get(e);return t?t.version>0&&(t.result=$(e),t.version=0):(t={version:0,result:$(e)},h.set(e,t)),t.result}function $(e){const{initialValues:t,parsedValues:r,values:n,deleted:o}=e,i=new Set;let s=r??t;for(const[e,t]of n)s=l(s,JSON.parse(e),t,i);for(const e of o)s=a(s,JSON.parse(e));return s}function q({initialValues:e,parsedValues:t,values:r,deleted:n},o){const{key:i,value:s}=o;if(r.has(i))return r.get(i);if(!n.has(i)){for(let e=s.length-1;e>0;e--){const t=JSON.stringify(s.slice(0,e));if(r.has(t))return u(r.get(t),s.slice(e))}return u(t??e,s)}}function W(t,r,n,o){const{emitter:i,values:s,deleted:u}=t;s.set(r.key,n),G(s,r),H(u,r),x(t,r),!1===o?.shouldDirty&&b(t,r,n),E(t),g(t),o?.shouldTouch&&B(t,r),o?.shouldValidate&&t.validators.get(r.key)?.(),e.emit(i,"change",r)}function J(e,t,r){const{values:n,deleted:o}=e;n.set(t.key,r),G(n,t),H(o,t),x(e,t),E(e),g(e)}function U({emitter:t},r){e.emit(t,"change",r)}function z(t,r,n){const{key:o,value:i}=r,{emitter:s,values:u,touched:a,errors:c,validating:l,deleted:d}=t;n?.keepValue||n?.keepDirty||(u.delete(o),k(t,o),function(e,t){for(let r=1;r<t.length;r++)if(e.has(JSON.stringify(t.slice(0,r))))return!0;const r=`${JSON.stringify(t).slice(0,-1)},`;for(const t of e.keys())if(t.startsWith(r))return!0;return!1}(u,i)||d.add(o)),n?.keepTouched||a.delete(o),n?.keepError||c.delete(o),l.delete(o),E(t),g(t),e.emit(s,"change",r),e.emit(s,"touched",r),e.emit(s,"errors",r),e.emit(s,"validating",r)}function G(e,{key:t}){if(!e.size)return;const r=`${t.slice(0,-1)},`;for(const t of e.keys())t.startsWith(r)&&e.delete(t)}function H(e,{key:t}){if(e.size)for(const r of e)(r===t||r.startsWith(`${t.slice(0,-1)},`)||t.startsWith(`${r.slice(0,-1)},`))&&e.delete(r)}function K(t,r){t.initialValues===r||f(t.initialValues,r)||(t.initialValues=r,t.parsedValues=void 0,t.values.clear(),t.deleted.clear(),k(t),E(t),g(t),e.emit(t.emitter,"change"))}function Y(e,t,r){if(null!==e&&"object"==typeof e){if(Array.isArray(e)){for(let n=0;n<e.length;n++)Y(e[n],[...t,n],r);return}const n=Object.keys(e);if(n.length>0){for(const o of n)Y(e[o],[...t,o],r);return}}r.push({segments:t,value:e})}function Q(e){let t=!1;return X(e,()=>{t=!0}),t}function X(e,t){for(const[r,n]of e.values){const o=JSON.parse(r);v(e,r,o)!==n&&t(o.join("."))}}function Z(e){const t={};return X(e,e=>{t[e]=!0}),t}function ee(e){let t=S.get(e);if(t){if(t.version>0){const r=Z(e);(function(e,t){const r=Object.keys(e);return r.length===Object.keys(t).length&&r.every(e=>!0===t[e])})(t.result,r)||(t.result=r),t.version=0}}else t={version:0,result:Z(e)},S.set(e,t);return t.result}function te({emitter:t,validating:r},n){r.delete(n.key),e.emit(t,"validating",n)}function re({emitter:t,validating:r},n){r.add(n.key),e.emit(t,"validating",n)}function ne(e,t,r){let n=null,o=null,i=!1,s=null,u=null;const a=e=>void 0!==e&&!(Array.isArray(e)&&0===e.length),c=()=>{i||(i=!0,re(e,t))},l=()=>{i&&(i=!1,te(e,t))},f=()=>{const n=r.sync();if(!n)return!1;const o=n(q(e,t),{form:e,path:t});return a(o)?(j(e,t,o),u="sync",!0):(r.validate()&&"sync"!==u||(j(e,t,void 0),u=null),!1)},m=()=>{null!==n&&(clearTimeout(n),n=null),o?.abort(),s={}},p=()=>{const n=r.validate();if(!n)return void l();o?.abort(),o=new AbortController;const i=s={};let f;try{f=n(q(e,t),{form:e,path:t,signal:o.signal})}catch(e){throw l(),e}if(!d(f))return j(e,t,f),u=a(f)?"validator":null,void l();c(),f.then(r=>{s===i&&(j(e,t,r),u=a(r)?"validator":null)}).catch(()=>{}).finally(()=>{s===i&&(l(),s=null)})},h=()=>{if(n=null,f())return m(),void l();p()};return e.validators.set(t.key,()=>{if(f())return m(),void l();if(!r.validate())return;const e=r.debounce();if(e>0)return null!==n?clearTimeout(n):c(),void(n=setTimeout(h,e));p()}),()=>{e.validators.delete(t.key),null!==n&&(clearTimeout(n),n=null),l(),o?.abort()}}function oe(e,t){t.forEach(t=>B(e,p(JSON.parse(t))))}function ie(e,t,r=[],n){Object.entries(t).forEach(([t,o])=>{const u=[...r,...s(t)?[t]:i(t)];"string"==typeof o?o&&(L(e,u,o),se(e,u,n)):Array.isArray(o)||w(o)?(L(e,u,o),se(e,u,n)):o&&"object"==typeof o&&ie(e,o,u,n)})}function se(e,t,r){if(!r)return;const n=p(t),o=e.errors.get(n.key);o&&r.set(n.key,o)}function ue(t,r){const n=t.validateDeps?function(e){let t=ae.get(e);t||(t=new Map,ae.set(e,t));return t}(t):void 0;if(n&&(!function(t,r){for(const[n,o]of r){t.errors.get(n)===o&&(t.errors.delete(n),e.emit(t.emitter,"errors",p(JSON.parse(n))))}}(t,n),n.clear()),r){if("object"==typeof r&&O in r){const o=r;return o.errors&&ie(t,o.errors,[],n),void function(t,r){void 0!==r&&r!==t.parsedValues&&(t.parsedValues=r,g(t),e.emit(t.emitter,"change"))}(t,o.values)}ie(t,r,[],n)}}const ae=new WeakMap;const ce="__form_validate__";function le(e){for(const t of e.validating)if(t!==ce)return!1;return!0}const de=Symbol("form-validate-settled"),fe=new WeakMap;function me(t){const r=t.validate;if(!r)return Promise.resolve();const n=t.validateDebounce??0;if(n<=0){const e=new AbortController;return Promise.resolve(r(I(t),{form:t,signal:e.signal})).then(e=>{ue(t,e)})}const o=function(e){let t=fe.get(e);return t||(t={timer:null,controller:null,round:null,marked:!1,waiters:[]},fe.set(e,t)),t}(t);return null!==o.timer?clearTimeout(o.timer):(o.marked=!0,t.validating.add(ce),e.emit(t.emitter,"validating")),o.timer=setTimeout(()=>{o.timer=null;const e=o.round={};(function(e,t,r){const n=e.validate;if(!n)return Promise.resolve();t.controller?.abort();const o=t.controller=new AbortController;let i;try{i=Promise.resolve(n(I(e),{form:e,signal:o.signal}))}catch(e){i=Promise.reject(e)}return i.then(n=>{t.round===r&&ue(e,n)},e=>{if(t.round===r)throw e})})(t,o,e).then(()=>pe(t,o,e,de),r=>pe(t,o,e,r))},n),new Promise((e,t)=>{o.waiters.push({resolve:e,reject:t})})}function pe(t,r,n,o){if(r.round!==n)return;if(r.round=null,null!==r.timer)return;r.marked&&(r.marked=!1,t.validating.delete(ce),e.emit(t.emitter,"validating"));const i=r.waiters;r.waiters=[];for(const e of i)o===de?e.resolve():e.reject(o)}function he(e,t,r){e.validateDeps?.has(t.key)&&e.validate&&("onChange"===r||"all"===r||"onTouched"===r&&R(e,t)||"onChange"===e.reValidateMode&&function(e){const t=ae.get(e);if(!t)return!1;for(const[r,n]of t)if(e.errors.get(r)===n)return!0;return!1}(e))&&me(e).catch(()=>{})}const ge=new WeakMap;function ye(e,t,r){let n=ge.get(e);n||(n=new Map,ge.set(e,n));for(const e of r){let r=n.get(e);r||(r=new Set,n.set(e,r)),r.add(t)}}function ve(e,t,r){const n=ge.get(e);if(n)for(const e of r){const r=n.get(e);r?.delete(t)&&(r.size||n.delete(e))}}function be(e,t,r){const n=ge.get(e)?.get(t.key);if(n?.size)for(const o of n)o!==t.key&&("onChange"===r||"all"===r||"onTouched"===r&&R(e,t)||"onChange"===e.reValidateMode&&e.errors.has(o))&&e.validators.get(o)?.()}function xe(e){const t=new Error(D(e));return t.errors=_(e),t}async function ke(e){if(e.validators.forEach(e=>e()),await m(e.emitter,"validating",()=>le(e),()=>P(e)).catch(()=>{throw xe(e)}),e.validate&&(await me(e),P(e)))throw xe(e)}async function Se(e){return ke(e).catch(e=>e.message)}const Ee=new WeakMap;function Ve(e,t,r,n){!1===n?.shouldDirty&&b(e,t,r),Ee.get(e)?.get(t.key)?Oe(e,t,r):W(e,t,r,n)}function we(e,t,r){let n=Ee.get(e);n||(n=new Map,Ee.set(e,n));const o=n.has(t.key),i={};return n.set(t.key,{mode:r,token:i}),{token:i,displaced:o}}function Ce(e,t,r){const n=Ee.get(e),o=n?.get(t.key);n&&o&&o.token===r&&n.delete(t.key)}function Oe(e,t,r){W(e,t,r);const n=Ee.get(e)?.get(t.key);n&&function(e,t,r){("onChange"===r||"all"===r||"onTouched"===r&&R(e,t)||T(e,t).length>0&&"onChange"===e.reValidateMode)&&e.validators.get(t.key)?.(),he(e,t,r),be(e,t,r)}(e,t,n.mode??e.mode)}function Ae(e,t){B(e,t);const r=Ee.get(e)?.get(t.key);if(!r)return;const n=r.mode??e.mode;("onBlur"===n||"onTouched"===n||"all"===n||T(e,t).length>0&&"onBlur"===e.reValidateMode)&&e.validators.get(t.key)?.()}function Fe(t,r){t.isSubmitting=r,e.emit(t.emitter,"submitting")}function Te(t){t.submitCount++,e.emit(t.emitter,"submitCount")}function _e(t,r){t.isSubmitSuccessful=r,e.emit(t.emitter,"submitSuccessful")}function De(e){if(e.startsWith("["))try{const t=JSON.parse(e);if(Array.isArray(t))return t.join(".")}catch{}return e}function Le(t,r){const{onSubmit:n,onValidSubmit:o,onInvalidSubmit:i,onAction:s,shouldFocusError:u=!0}=r??{};return async r=>{r&&"function"==typeof r.preventDefault&&r.preventDefault();const a=r?.currentTarget;Fe(t,!0),Te(t);const c=I(t);if(a&&"function"==typeof a.checkValidity&&!1===a.checkValidity()){if(a.reportValidity(),u&&"function"==typeof a.querySelector){const e=a.querySelector(":invalid");e&&"function"==typeof e.focus&&e.focus()}return Fe(t,!1),_e(t,!1),void(i&&i(function(e){const t=[],{elements:r}=e;for(let e=0;e<r.length;e++){const n=r[e];n.name&&"function"==typeof n.checkValidity&&!n.checkValidity()&&t.push({path:De(n.name),type:"native",message:n.validationMessage})}return t}(a),c))}if(await Se(t)){if(Fe(t,!1),_e(t,!1),u){const r=t.errors.keys().next().value;void 0!==r&&e.emit(t.emitter,"focusError",r)}i&&i(_(t),c)}else try{const e=I(t);n&&await n(e,r),o&&await o(e,r),s&&await s(e,r),_e(t,!0)}catch{_e(t,!1)}finally{Fe(t,!1)}}}function je(t){const r=e.create();e.setMaxListeners(r,0);let n=t?.initialValues??{};"function"==typeof n&&(n=n());const o={emitter:r,...t,mode:t?.mode??"onSubmit",reValidateMode:t?.reValidateMode??"onChange",disabled:t?.disabled??!1,validateDeps:t?.validateDeps?new Set(t.validateDeps.map(e=>p(e).key)):void 0,initialValues:{},values:new Map,deleted:new Set,errors:new Map,touched:new Set,validators:new Map,validating:new Set,parsedValues:void 0,isSubmitting:!1,submitCount:0,isSubmitSuccessful:void 0,isLoading:!1};return d(n)?(o.isLoading=!0,e.emit(r,"loading"),Promise.resolve(n).then(t=>{o.isLoading=!1,e.emit(r,"loading"),K(o,t??{})},t=>{o.isLoading=!1,e.emit(r,"loading")})):o.initialValues=n,o}function Me(e,t){switch(e){case"required":return"This field is required";case"min":return`Must be at least ${t}`;case"max":return`Must be at most ${t}`;case"minLength":return`Must be at least ${t} characters`;case"maxLength":return`Must be at most ${t} characters`;case"pattern":return"Invalid format";default:return"Invalid value"}}function Pe(e){return t=>{if(e.required&&(""===t||null==t))return[{type:"required",message:"string"==typeof e.required?e.required:Me("required")}];const r=[],n=(t,r)=>e.messages?.[t]??Me(t,r);if(void 0!==e.min){const o=Number(t);!Number.isNaN(o)&&o<e.min&&r.push({type:"min",message:n("min",e.min)})}if(void 0!==e.max){const o=Number(t);!Number.isNaN(o)&&o>e.max&&r.push({type:"max",message:n("max",e.max)})}return void 0!==e.minLength&&"string"==typeof t&&t.length<e.minLength&&r.push({type:"minLength",message:n("minLength",e.minLength)}),void 0!==e.maxLength&&"string"==typeof t&&t.length>e.maxLength&&r.push({type:"maxLength",message:n("maxLength",e.maxLength)}),e.pattern&&!e.pattern.value.test(t)&&r.push({type:"pattern",message:e.messages?.pattern??e.pattern.message??Me("pattern")}),r.length?r:void 0}}var Be,Re={exports:{}},Ne={};var Ie,$e,qe={};var We=($e||($e=1,"production"===process.env.NODE_ENV?Re.exports=function(){if(Be)return Ne;Be=1;var e=t,r="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},n=e.useState,o=e.useEffect,i=e.useLayoutEffect,s=e.useDebugValue;function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch(e){return!0}}var a="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var r=t(),a=n({inst:{value:r,getSnapshot:t}}),c=a[0].inst,l=a[1];return i(function(){c.value=r,c.getSnapshot=t,u(c)&&l({inst:c})},[e,r,t]),o(function(){return u(c)&&l({inst:c}),e(function(){u(c)&&l({inst:c})})},[e]),s(r),r};return Ne.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:a,Ne}():Re.exports=(Ie||(Ie=1,"production"!==process.env.NODE_ENV&&function(){function e(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!n(e,r)}catch(e){return!0}}"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var r=t,n="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,i=r.useEffect,s=r.useLayoutEffect,u=r.useDebugValue,a=!1,c=!1,l="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(t,l){a||void 0===r.startTransition||(a=!0,console.error("You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release."));var d=l();if(!c){var f=l();n(d,f)||(console.error("The result of getSnapshot should be cached to avoid an infinite loop"),c=!0)}var m=(f=o({inst:{value:d,getSnapshot:l}}))[0].inst,p=f[1];return s(function(){m.value=d,m.getSnapshot=l,e(m)&&p({inst:m})},[t,d,l]),i(function(){return e(m)&&p({inst:m}),t(function(){e(m)&&p({inst:m})})},[t]),u(d),d};qe.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:l,"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),qe)),Re.exports);function Je(e,t){return e.startsWith(`${t.slice(0,-1)},`)}function Ue(t,r,n,o,i){const{key:s}=n;return e.on(t,r,e=>{(void 0===e||e.key===s||Je(s,e.key)||"branch"===o&&Je(e.key,s))&&i()})}function ze(t,r,n,o){return e.on(t,r,e=>{void 0!==e&&e.key!==n||o()})}function Ge(e){const[r]=t.useState(()=>{const t=je(e);return e&&void 0!==e.values&&K(t,e.values),t}),n=e&&e.initialValues,o=e&&e.values,i=t.useRef(null);null===i.current&&(i.current={done:!1,source:void 0}),t.useEffect(()=>{if(void 0===n)return;if("function"==typeof n||d(n))return;const e=i.current;e.done&&(e.source===n||f(e.source,n))||(e.done=!0,e.source=n,K(r,n))},[r,n]);const s=t.useRef(null);return null===s.current&&(s.current={done:!1,source:void 0}),t.useEffect(()=>{if(void 0===o)return;const e=s.current;e.done&&(e.source===o||f(e.source,o))||(e.done=!0,e.source=o,K(r,o))},[r,o]),r}function He(e,r,n){const o=t.useRef(null);null===o.current&&(o.current={hasValue:!1});const i=o.current,s=t.useRef(r);s.current=r;const u=t.useRef(n);u.current=n;const a=t.useCallback(()=>(i.hasValue||(i.value=s.current(),i.hasValue=!0),i.value),[i]),c=t.useCallback(t=>{i.hasValue=!1;return e(()=>{const e=u.current;if(e&&i.hasValue){const r=s.current();if(e(i.value,r))return;return i.value=r,void t()}i.hasValue=!1,t()})},[e,i]);return We.useSyncExternalStore(c,a,a)}function Ke(r,n,o,i){const s="emitter"in r?r.emitter:r;return He(t.useCallback(t=>e.on(s,n,t),[s,n]),o,i)}function Ye(e,r){const{emitter:n}=e,{key:o}=r;return He(t.useCallback(e=>Ue(n,"change",r,"leaf",e),[n,o]),q.bind(null,e,r))}function Qe(e,r){const{emitter:n}=e,{key:o}=r;return He(t.useCallback(e=>ze(n,"touched",o,e),[n,o]),R.bind(null,e,r))}function Xe(e,r){const{emitter:n}=e,{key:o}=r;return He(t.useCallback(e=>ze(n,"errors",o,e),[n,o]),A.bind(null,e,r))}function Ze(e,r){const{emitter:n}=e,{key:o}=r;return He(t.useCallback(e=>ze(n,"errors",o,e),[n,o]),T.bind(null,e,r))}const et=["change","errors","touched","validating","submitting","submitCount","submitSuccessful","disabled","loading"];function tt(e,t){const r=e.touchedFields.length===t.touchedFields.length&&e.touchedFields.every((e,r)=>e===t.touchedFields[r]);return e.isDirty===t.isDirty&&e.dirtyFields===t.dirtyFields&&e.isTouched===t.isTouched&&r&&e.hasErrors===t.hasErrors&&e.isValid===t.isValid&&e.isSubmitting===t.isSubmitting&&e.isValidating===t.isValidating&&e.isSubmitSuccessful===t.isSubmitSuccessful&&e.submitCount===t.submitCount&&e.isLoading===t.isLoading&&e.disabled===t.disabled}function rt(e){const r=t.useMemo(()=>p(i(e)),[e]);return t.useMemo(()=>r,[r.key])}function nt(e){const r=t.useRef(e);return r.current=e,r}function ot(e){const r=nt(e);return t.useCallback((...e)=>r.current(...e),[r])}function it({form:r,name:n,initialValue:o,shouldUnregister:i,validate:s,rules:u,validateDebounce:a,validateDeps:c,delayError:l,disabled:f,uncontrolled:m,mode:h},g){const y=t.useContext(g),v=r||y;if(!v)throw new Error("no form provided");const b=rt(n),x=t.useRef(!1);void 0!==o&&void 0===q(v,b)&&(J(v,b,o),x.current=!0),t.useEffect(()=>{x.current&&(x.current=!1,U(v,b))});!function(e,r,n,o){const i=t.useContext(pt),s=n||i;if(!s)throw new Error("no form provided");const u=t.useRef(e);u.current=e;const a=t.useRef(o?.debounce??0);a.current=o?.debounce??0;const c=t.useRef(o?.sync);c.current=o?.sync,t.useEffect(()=>ne(s,r,{validate:()=>u.current,debounce:()=>a.current,sync:()=>c.current}),[s,r.key]),ot(()=>s.validators.get(r.key)?.())}(function(e,t){if(!e||!function(e){return void 0!==e.required||void 0!==e.min||void 0!==e.max||void 0!==e.minLength||void 0!==e.maxLength||void 0!==e.pattern}(e))return t;const r=Pe(e);return t?(e,n)=>{const o=r(e,n),i=e=>{const t=[...o??[]];return Array.isArray(e)?t.push(...e):e&&t.push(e),t.length?t:void 0},s=t(e,n);return d(s)?s.then(i):i(s)}:r}(u?{...u,required:void 0}:void 0,s),b,v,{debounce:a,sync:u&&void 0!==u.required?Pe({required:u.required}):void 0});const k=function(e,r){const[n,o]=t.useState(e);return t.useEffect(()=>{if(void 0===r)return;if(0===e.length)return void o(e);if(n.length>0)return void o(e);const t=setTimeout(()=>o(e),r);return()=>clearTimeout(t)},[e,r,n]),void 0===r?e:n}(Ze(v,b),l),S=k[0],E=S?.message,V=function(e,r,n){const o=t.useRef({has:!1,value:void 0}),i=t.useCallback(()=>n?(o.current.has||(o.current={has:!0,value:q(e,r)}),o.current.value):q(e,r),[n,e,r]);return He(t.useCallback(t=>n?()=>{}:Ue(e.emitter,"change",r,"leaf",t),[n,e.emitter,r]),i)}(v,b,!!m),w=Ke(v,"disabled",()=>v.disabled),C=ot(e=>Oe(v,b,e)),O=ot(()=>Ae(v,b));t.useEffect(()=>{const{token:e,displaced:t}=we(v,b,h);return()=>Ce(v,b,e)},[v,b.key,h]);const A=c?.length?c.join("\n"):void 0;t.useEffect(()=>{if(!A)return;const e=c.map(e=>p(e).key);return ye(v,b.key,e),()=>ve(v,b.key,e)},[v,b.key,A]);const F=t.useRef(null),T=t.useCallback(e=>{F.current=e},[]);return t.useEffect(()=>e.on(v.emitter,"focusError",(e,t)=>{if(e!==b.key)return;const r=F.current;r&&"function"==typeof r.focus&&(r.focus(),t?.shouldSelect&&"function"==typeof r.select&&r.select())}),[v,b.key]),t.useEffect(()=>()=>{!1!==(i??v.shouldUnregister)&&z(v,b)},[b,v,i]),{form:v,value:V,error:E,errorObject:S,errors:k,onChange:C,onBlur:O,name:b.key,disabled:w||!!f,focusRef:T}}function st(e){return it(e,pt)}const ut=new WeakMap;function at(e){const t=(ut.get(e)??0)+1;return ut.set(e,t),`_${t}`}const ct=new WeakMap;function lt(e,t,r){let n=ct.get(e);n||(n=new Map,ct.set(e,n)),n.set(t,r)}function dt(e){return e+1}function ft(e,r){const n=t.useContext(r),o=e.form||n;if(!o)throw new Error("no form provided");const i=rt(e.name),s=t.useRef([]),u=t.useCallback(()=>q(o,i)||[],[o,i]),a=t.useCallback(e=>{W(o,i,e)},[o,i]),c=t.useCallback(()=>{const e=u();for(;s.current.length<e.length;)s.current.push(at(o));for(;s.current.length>e.length;)s.current.pop();return s.current.map((e,t)=>({id:e,index:t}))},[u,o]),[l,d]=t.useReducer(c,void 0,c);t.useEffect(()=>Ue(o.emitter,"change",i,"branch",d),[o.emitter,i]),lt(o,i.key,s.current),t.useEffect(()=>(lt(o,i.key,s.current),()=>{const e=ct.get(o);e?.get(i.key)===s.current&&e.delete(i.key)}),[o,i.key]);return{fields:l,append:ot(e=>{const t=u();s.current.push(at(o)),a([...t,e])}),prepend:ot(e=>{const t=u();s.current.unshift(at(o)),a([e,...t])}),insert:ot((e,t)=>{const r=u();s.current.splice(e,0,at(o));const n=[...r.slice(0,e),t,...r.slice(e)];a(n)}),remove:ot(e=>{const t=u();s.current.splice(e,1);const r=t.filter((t,r)=>r!==e);a(r)}),swap:ot((e,t)=>{const r=u();[s.current[e],s.current[t]]=[s.current[t],s.current[e]];const n=[...r];[n[e],n[t]]=[n[t],n[e]],a(n)}),move:ot((e,t)=>{const r=u(),[n]=s.current.splice(e,1);s.current.splice(t,0,n);const o=[...r],[i]=o.splice(e,1);o.splice(t,0,i),a(o)}),replace:ot(e=>{s.current=e.map(()=>at(o)),a([...e])}),update:ot((e,t)=>{const r=u();if(e<0||e>=r.length)return;const n=[...r];n[e]=t,a(n)})}}function mt(e,r){const n=t.useContext(r),o=e.form||n;if(!o)throw new Error("no form provided");const{id:i}=e,s=rt(e.name),u=t.useCallback(()=>function(e,t){return ct.get(e)?.get(t)}(o,s.key)?.indexOf(i)??-1,[o,s.key,i]),a=t.useCallback(e=>{const t=q(o,s);return Array.isArray(t)?t[e]:void 0},[o,s]),c=u(),l=a(c),d=t.useRef({index:c,value:l});d.current={index:c,value:l};const f=nt({computeIndex:u,computeValue:a}),[,m]=t.useReducer(dt,0);t.useEffect(()=>Ue(o.emitter,"change",s,"leaf",()=>{const{computeIndex:e,computeValue:t}=f.current,r=e();r===d.current.index&&Object.is(t(r),d.current.value)||m()}),[o.emitter,s,f]);const p=rt([...s.value,c]),h=Ze(o,p);return{value:l,setValue:ot(e=>{if(c<0)return;const t=[...q(o,s)??[]];c>=t.length||(t[c]=e,W(o,s,t))}),errors:h,error:h[0]?.message,name:p.key,index:c,form:o}}const pt=t.createContext(null),ht=pt.Provider;const gt=t.createContext(null),yt=gt.Provider;function vt(e,t,r){if(null!=r)if(Array.isArray(r))for(const n of r)vt(e,t,n);else if("undefined"!=typeof FileList&&r instanceof FileList)for(let n=0;n<r.length;n++)e.append(t,r.item(n));else"undefined"!=typeof File&&r instanceof File?e.append(t,r,r.name):"undefined"!=typeof Blob&&r instanceof Blob?e.append(t,r):r instanceof Date?e.append(t,r.toISOString()):e.append(t,"object"==typeof r?JSON.stringify(r):String(r))}function bt(e){return e.replace(/["'[\],\s]+/g,"-").replace(/^-+|-+$/g,"")||"field"}function xt(e,t,r){return{"aria-invalid":!!e||r["aria-invalid"],"aria-describedby":e?[r["aria-describedby"],bt(t)].filter(Boolean).join(" "):r["aria-describedby"]}}const kt=n.forwardRef(({validate:e,eventToValue:t,initialValue:r,name:o,asProps:i,renderError:s,as:u,valueToProps:a,form:c,shouldUnregister:l,rules:d,validateDebounce:f,disabled:m,delayError:p,mode:h,uncontrolled:g,...y},v)=>{const b=n.useRef(null),[x,k]=n.useState(0),{value:S,onChange:E,onBlur:V,error:w,name:C,disabled:O,focusRef:A}=st({name:o,form:c,initialValue:r,shouldUnregister:l,rules:d,validateDebounce:f,delayError:p,disabled:m,mode:h,uncontrolled:g||"file"===y.type,validate:(...t)=>{const r=b.current;if(!r||"function"!=typeof r.checkValidity||(r.setCustomValidity(""),!1!==r.checkValidity()))return e?e(...t):void 0;k(e=>e+1)}}),F=n.useCallback(e=>{b.current=e,A(e),function(e,t){"function"==typeof e?e(t):e&&(e.current=t)}(v,e)},[v,A]),T=u||"input";n.useEffect(()=>{const e=b.current;e&&"function"==typeof e.setCustomValidity&&("string"==typeof w?(e.setCustomValidity(w),e.reportValidity()):e.setCustomValidity(""))},[w]),n.useEffect(()=>{x>0&&b.current?.reportValidity()},[x]);const _="file"===y.type,D=t??(_?e=>e.target.files:e=>e.target.value),L=a?a(S):_?{}:g?{defaultValue:S}:{value:S},j=bt(C);return n.createElement(n.Fragment,null,n.createElement(T,{...y,name:C,onBlur:V,...i,...L,...xt(w,C,y),disabled:O,onChange:e=>E(D(e)),ref:F}),w&&s?n.createElement("span",{id:j,role:"alert"},s(w,j)):null)}),St=n.forwardRef(({name:e,form:t,initialValue:r,shouldUnregister:o,validate:i,rules:s,validateDebounce:u,disabled:a,delayError:c,mode:l,...d},f)=>{const{value:m,onChange:p,onBlur:h,error:g,name:y,disabled:v}=st({name:e,form:t,initialValue:r,shouldUnregister:o,validate:i,rules:s,validateDebounce:u,delayError:c,disabled:a,mode:l});return n.createElement("input",{...d,name:y,onBlur:h,type:"checkbox",checked:!!m,...xt(g,y,d),disabled:v,onChange:e=>p(e.target.checked),ref:f})});function Et(e,t){return e?Array.isArray(t)?t:[]:t??""}const Vt=n.forwardRef(({name:e,multiple:t,children:r,form:o,initialValue:i,shouldUnregister:s,validate:u,rules:a,validateDebounce:c,disabled:l,delayError:d,mode:f,...m},p)=>{const{value:h,onChange:g,onBlur:y,error:v,name:b,disabled:x}=st({name:e,form:o,initialValue:i,shouldUnregister:s,validate:u,rules:a,validateDebounce:c,delayError:d,disabled:l,mode:f});return n.createElement("select",{...m,name:b,onBlur:y,multiple:t,value:Et(t,h),...xt(v,b,m),disabled:x,onChange:e=>g(t?Array.from(e.target.selectedOptions,e=>e.value):e.target.value),ref:p},r)});exports.Checkbox=St,exports.CheckboxGroupContext=gt,exports.CheckboxGroupProvider=yt,exports.FORM_ERROR=C,exports.Field=kt,exports.Form=function({form:e,context:t,initialValues:r,values:o,shouldUnregister:i,onSubmit:s,onValidSubmit:u,onInvalidSubmit:a,action:c,shouldFocusError:l,...d}){const f=Ge({initialValues:r,values:o,shouldUnregister:i}),m=e||f,p=Le(m,{onSubmit:s,onValidSubmit:u,onInvalidSubmit:a,shouldFocusError:l,onAction:c?e=>c(function(e){const t=new FormData;for(const r of Object.keys(e))vt(t,r,e[r]);return t}(e)):void 0}),{Provider:h}=t??pt;return n.createElement(h,{value:m},n.createElement("form",{...d,noValidate:!0,onSubmit:p}))},exports.FormContext=pt,exports.FormField=function({children:e,...t}){return e(st(t))},exports.FormProvider=ht,exports.Select=Vt,exports.VALIDATION_OUTCOME=O,exports.changeValue=function(e,t,r,n){Ve(e,p(t),r,n)},exports.changeValueByPath=Ve,exports.clearErrors=M,exports.createForm=je,exports.createFormContext=function(){const e=t.createContext(null);return{context:e,FormProvider:function({form:r,children:n}){return t.createElement(e.Provider,{value:r},n)},useFormContext:function(){const r=t.useContext(e);if(!r)throw new Error("no form provided");return r},useField:function(t){return it(t,e)},useFieldArray:function(t){return ft(t,e)},useFieldArrayItem:function(t){return mt(t,e)}}},exports.emitChangeByPath=U,exports.ensureValidate=ke,exports.fieldErrorId=function(e){return bt(p(e).key)},exports.getDirtyFields=ee,exports.getError=function(e,t){return A(e,p(t))},exports.getErrorByPath=A,exports.getErrors=_,exports.getFieldErrors=function(e,t){return T(e,p(t))},exports.getFieldErrorsByPath=T,exports.getFieldState=function(e,t){const r=p(t),{values:n,touched:o,validating:i}=e,s=n.get(r.key);return{value:q(e,r),error:A(e,r),errors:T(e,r),isDirty:n.has(r.key)&&v(e,r.key,r.value)!==s,isTouched:o.has(r.key),isValidating:i.has(r.key)}},exports.getFirstError=D,exports.getTouchedFields=N,exports.getValue=function(e,t){return q(e,p(t))},exports.getValueByPath=q,exports.getValues=I,exports.handleSubmit=Le,exports.hasErrors=P,exports.hasTouched=function(e,t){return R(e,p(t))},exports.hasTouchedByPath=R,exports.incrementSubmitCount=Te,exports.isDirty=Q,exports.isTouched=function({touched:e}){return e.size>0},exports.registerFieldMode=we,exports.registerFieldValidateDeps=ye,exports.registerValidatorByPath=ne,exports.removeField=function(e,t,r){z(e,p(t),r)},exports.removeFieldByPath=z,exports.reset=function(t,r,n){const o=[];if(n?.keepValues)Y(I(t),[],o);else if(n?.keepDirtyValues)for(const[e,r]of t.values){const n=JSON.parse(e);v(t,e,n)!==r&&o.push({segments:n,value:r})}t.initialValues=n?.keepDefaultValues?t.initialValues:r??t.initialValues,t.parsedValues=void 0,n?.keepErrors||M(t);const{emitter:i,touched:s,values:u,deleted:a,validating:c}=t;u.clear(),a.clear(),k(t),n?.keepTouched||s.clear(),c.clear(),n?.keepIsSubmitting||(t.isSubmitting=!1),n?.keepSubmitCount||(t.submitCount=0),n?.keepIsSubmitted||(t.isSubmitSuccessful=void 0),E(t),g(t);for(const{segments:e,value:r}of o)W(t,p(e),r);e.emit(i,"change"),e.emit(i,"touched"),e.emit(i,"validating"),e.emit(i,"submitting"),e.emit(i,"submitCount"),e.emit(i,"submitSuccessful"),e.emit(i,"reset")},exports.resetField=function(t,r,n){const o=p(r),{emitter:i,values:s,touched:c,errors:l,deleted:d}=t;if(s.delete(o.key),k(t,o.key),void 0!==t.parsedValues){t.parsedValues=a(t.parsedValues,o.value);const e=u(t.initialValues,o.value);void 0!==e&&s.set(o.key,e)}n&&"value"in n&&s.set(o.key,n.value),H(d,o),e.emit(i,"change"),!n?.keepTouched&&c.delete(o.key)&&e.emit(i,"touched",o),!n?.keepErrors&&l.delete(o.key)&&e.emit(i,"errors",o),E(t),g(t)},exports.revalidateDependentsOnChange=be,exports.revalidateFormOnChange=he,exports.seedValueByPath=J,exports.setDisabled=function(t,r){t.disabled=r,e.emit(t.emitter,"disabled")},exports.setError=L,exports.setErrorByPath=j,exports.setFocus=function(t,r,n){const{key:o}=p(r);n?e.emit(t.emitter,"focusError",o,n):e.emit(t.emitter,"focusError",o)},exports.setInitialValues=K,exports.setIsSubmitting=Fe,exports.setServerErrors=function(e,t,r){r?.keepExisting||M(e);for(const[r,n]of Object.entries(t))L(e,r,(Array.isArray(n)?n:[n]).map(e=>({type:"server",message:e})))},exports.setSubmitSuccessful=_e,exports.setTouched=function(e,t){B(e,p(t))},exports.setTouchedByPath=B,exports.setValidatingByPath=re,exports.setValue=function(e,t,r,n){W(e,p(t),r,n)},exports.setValueByPath=W,exports.subscribe=function(t,r){const{name:n,event:o="change",scope:i="branch",callback:s}=r;if(void 0===n)return e.on(t.emitter,o,s);const u=(function(e){return Array.isArray(e)&&e.every(e=>"number"!=typeof e)}(n)?n:[n]).map(e=>{const r=p(e);return"errors"===o||"touched"===o?ze(t.emitter,o,r.key,s):Ue(t.emitter,o,r,i,s)});return 1===u.length?u[0]:()=>u.forEach(e=>e())},exports.trigger=async function(t,r,n){const o=e=>m(t.emitter,"validating",()=>void 0===e?le(t):e.every(e=>!t.validating.has(e)),()=>!1);if(void 0===r){if(t.validators.forEach(e=>e()),await o(),t.validate&&await me(t),n?.shouldTouch&&oe(t,[...t.validators.keys()]),n?.shouldFocus){const r=t.errors.keys().next().value;void 0!==r&&e.emit(t.emitter,"focusError",r)}return!P(t)}const i="string"==typeof r||V(r)?[p(r).key]:r.map(e=>p(e).key);if(i.forEach(e=>t.validators.get(e)?.()),await o(i),n?.shouldTouch&&oe(t,i),n?.shouldFocus){const r=i.find(e=>t.errors.has(e));void 0!==r&&e.emit(t.emitter,"focusError",r)}return i.every(e=>!t.errors.has(e))},exports.unregisterFieldMode=Ce,exports.unregisterFieldValidateDeps=ve,exports.unsetValidatingByPath=te,exports.useCanSubmit=function(r){const{emitter:n}=r;return He(t.useCallback(t=>{const r=e.on(n,"errors",t),o=e.on(n,"submitting",t);return()=>{r(),o()}},[n]),()=>!r.isSubmitting&&!P(r))},exports.useCheckboxGroupContext=function(){const e=t.useContext(gt);if(!e)throw new Error("no group provided");return e},exports.useDirtyFields=function(e){return Ke(e,"change",ee.bind(null,e))},exports.useError=function(e,t){return Xe(e,p(t))?.message},exports.useErrorByPath=Xe,exports.useField=st,exports.useFieldArray=function(e){return ft(e,pt)},exports.useFieldArrayItem=function(e){return mt(e,pt)},exports.useFieldErrors=function(e,t){return Ze(e,p(t))},exports.useFieldErrorsByPath=Ze,exports.useForm=Ge,exports.useFormContext=function(){const e=t.useContext(pt);if(!e)throw new Error("no form provided");return e},exports.useFormError=function(e){return Xe(e,p(C))?.message},exports.useFormErrors=function(e){return Ze(e,p(C))},exports.useFormState=function(r){const n=t.useCallback(()=>function(e){return{isDirty:Q(e),dirtyFields:ee(e),isTouched:e.touched.size>0,touchedFields:N(e),hasErrors:P(e),isValid:!P(e),isSubmitting:e.isSubmitting,isValidating:e.validating.size>0,isSubmitSuccessful:e.isSubmitSuccessful,submitCount:e.submitCount,isLoading:e.isLoading,disabled:e.disabled}}(r),[r]);return He(t.useCallback(t=>{const n=et.map(n=>e.on(r.emitter,n,t));return()=>{for(const e of n)e()}},[r.emitter]),n,tt)},exports.useHasErrors=function(e){return Ke(e,"errors",P.bind(null,e))},exports.useIsDirty=function(e){return Ke(e,"change",Q.bind(null,e))},exports.useIsLoading=function(e){return Ke(e,"loading",()=>e.isLoading)},exports.useIsSubmitSuccessful=function(e){return Ke(e.emitter,"submitSuccessful",()=>!!e.isSubmitSuccessful)},exports.useIsSubmitting=function(e){return Ke(e,"submitting",()=>e.isSubmitting)},exports.useIsValid=function(e){return Ke(e,"errors",()=>!P(e))},exports.useIsValidating=function(e){return Ke(e,"validating",()=>e.validating.size>0)},exports.useSubmitCount=function(e){return Ke(e,"submitCount",()=>e.submitCount)},exports.useTouched=function(e,t){return Qe(e,p(t))},exports.useTouchedByPath=Qe,exports.useTouchedFields=function(e){return Ke(e,"touched",N.bind(null,e))},exports.useValue=function(e,t){return Ye(e,p(t))},exports.useValueByPath=Ye,exports.useWatch=Ke,exports.useWatchCore=He,exports.userBlur=Ae,exports.userChangeByPath=Oe,exports.validate=Se;
2
2
  //# sourceMappingURL=index.cjs.js.map