@pyreon/form 0.6.0 → 0.8.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.
@@ -1,67 +1,31 @@
1
- function _notify() {
2
- for (const listener of _listeners) listener();
3
- }
1
+ //#region src/devtools.d.ts
4
2
  /**
5
- * Register a form instance for devtools inspection.
6
- *
7
- * @example
8
- * const form = useForm({ ... })
9
- * registerForm("login-form", form)
10
- */
11
- function registerForm(name, form) {
12
- _activeForms.set(name, new WeakRef(form));
13
- _notify();
14
- }
3
+ * @pyreon/form devtools introspection API.
4
+ * Import: `import { ... } from "@pyreon/form/devtools"`
5
+ */
6
+ /**
7
+ * Register a form instance for devtools inspection.
8
+ *
9
+ * @example
10
+ * const form = useForm({ ... })
11
+ * registerForm("login-form", form)
12
+ */
13
+ declare function registerForm(name: string, form: object): void;
15
14
  /** Unregister a form instance. */
16
- function unregisterForm(name) {
17
- _activeForms.delete(name);
18
- _notify();
19
- }
15
+ declare function unregisterForm(name: string): void;
20
16
  /** Get all registered form names. Cleans up garbage-collected instances. */
21
- function getActiveForms() {
22
- for (const [name, ref] of _activeForms) if (ref.deref() === void 0) _activeForms.delete(name);
23
- return [..._activeForms.keys()];
24
- }
17
+ declare function getActiveForms(): string[];
25
18
  /** Get a form instance by name (or undefined if GC'd or not registered). */
26
- function getFormInstance(name) {
27
- const ref = _activeForms.get(name);
28
- if (!ref) return void 0;
29
- const instance = ref.deref();
30
- if (!instance) {
31
- _activeForms.delete(name);
32
- return;
33
- }
34
- return instance;
35
- }
19
+ declare function getFormInstance(name: string): object | undefined;
36
20
  /**
37
- * Get a snapshot of a registered form's current state.
38
- * Returns values, errors, and form-level status signals.
39
- */
40
- function getFormSnapshot(name) {
41
- const form = getFormInstance(name);
42
- if (!form) return void 0;
43
- return {
44
- values: typeof form.values === "function" ? form.values() : void 0,
45
- errors: typeof form.errors === "function" ? form.errors() : void 0,
46
- isSubmitting: typeof form.isSubmitting === "function" ? form.isSubmitting() : void 0,
47
- isValid: typeof form.isValid === "function" ? form.isValid() : void 0,
48
- isDirty: typeof form.isDirty === "function" ? form.isDirty() : void 0,
49
- submitCount: typeof form.submitCount === "function" ? form.submitCount() : void 0
50
- };
51
- }
21
+ * Get a snapshot of a registered form's current state.
22
+ * Returns values, errors, and form-level status signals.
23
+ */
24
+ declare function getFormSnapshot(name: string): Record<string, unknown> | undefined;
52
25
  /** Subscribe to form registry changes. Returns unsubscribe function. */
53
- function onFormChange(listener) {
54
- _listeners.add(listener);
55
- return () => {
56
- _listeners.delete(listener);
57
- };
58
- }
26
+ declare function onFormChange(listener: () => void): () => void;
59
27
  /** @internal — reset devtools registry (for tests). */
60
- function _resetDevtools() {
61
- _activeForms.clear();
62
- _listeners.clear();
63
- }
64
-
28
+ declare function _resetDevtools(): void;
65
29
  //#endregion
66
30
  export { _resetDevtools, getActiveForms, getFormInstance, getFormSnapshot, onFormChange, registerForm, unregisterForm };
67
- //# sourceMappingURL=devtools.d.ts.map
31
+ //# sourceMappingURL=devtools2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtools.d.ts","names":[],"sources":["../../src/devtools.ts"],"mappings":"AAQA,SAAS,OAAA,CAAA,EAAgB;EACvB,KAAK,MAAM,QAAA,IAAY,UAAA,EAAY,QAAA,CAAA,CAAU;;;;;;;;;AAU/C,SAAgB,YAAA,CAAa,IAAA,EAAc,IAAA,EAAoB;EAC7D,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC;EACzC,OAAA,CAAA,CAAS;;;AAIX,SAAgB,cAAA,CAAe,IAAA,EAAoB;EACjD,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK;EACzB,OAAA,CAAA,CAAS;;;AAIX,SAAgB,cAAA,CAAA,EAA2B;EACzC,KAAK,MAAM,CAAC,IAAA,EAAM,GAAA,CAAA,IAAQ,YAAA,EACxB,IAAI,GAAA,CAAI,KAAA,CAAA,CAAO,KAAK,KAAA,CAAA,EAAW,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK;EAE1D,OAAO,CAAC,GAAG,YAAA,CAAa,IAAA,CAAA,CAAM,CAAC;;;AAIjC,SAAgB,eAAA,CAAgB,IAAA,EAAkC;EAChE,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK;EAClC,IAAI,CAAC,GAAA,EAAK,OAAO,KAAA,CAAA;EACjB,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAA,CAAO;EAC5B,IAAI,CAAC,QAAA,EAAU;IACb,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK;IACzB;;EAEF,OAAO,QAAA;;;;;;AAOT,SAAgB,eAAA,CACd,IAAA,EACqC;EACrC,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK;EAClC,IAAI,CAAC,IAAA,EAAM,OAAO,KAAA,CAAA;EAClB,OAAO;IACL,MAAA,EACE,OAAO,IAAA,CAAK,MAAA,KAAW,UAAA,GAClB,IAAA,CAAK,MAAA,CAAA,CAA0B,GAChC,KAAA,CAAA;IACN,MAAA,EACE,OAAO,IAAA,CAAK,MAAA,KAAW,UAAA,GAClB,IAAA,CAAK,MAAA,CAAA,CAA0B,GAChC,KAAA,CAAA;IACN,YAAA,EACE,OAAO,IAAA,CAAK,YAAA,KAAiB,UAAA,GACxB,IAAA,CAAK,YAAA,CAAA,CAAgC,GACtC,KAAA,CAAA;IACN,OAAA,EACE,OAAO,IAAA,CAAK,OAAA,KAAY,UAAA,GACnB,IAAA,CAAK,OAAA,CAAA,CAA2B,GACjC,KAAA,CAAA;IACN,OAAA,EACE,OAAO,IAAA,CAAK,OAAA,KAAY,UAAA,GACnB,IAAA,CAAK,OAAA,CAAA,CAA2B,GACjC,KAAA,CAAA;IACN,WAAA,EACE,OAAO,IAAA,CAAK,WAAA,KAAgB,UAAA,GACvB,IAAA,CAAK,WAAA,CAAA,CAA+B,GACrC,KAAA;GACP;;;AAIH,SAAgB,YAAA,CAAa,QAAA,EAAkC;EAC7D,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS;EACxB,OAAA,MAAa;IACX,UAAA,CAAW,MAAA,CAAO,QAAA,CAAS;;;;AAK/B,SAAgB,cAAA,CAAA,EAAuB;EACrC,YAAA,CAAa,KAAA,CAAA,CAAO;EACpB,UAAA,CAAW,KAAA,CAAA,CAAO"}
1
+ {"version":3,"file":"devtools2.d.ts","names":[],"sources":["../../../src/devtools.ts"],"mappings":";;AAmBA;;;;;AAMA;;;;;iBANgB,YAAA,CAAa,IAAA,UAAc,IAAA;;iBAM3B,cAAA,CAAe,IAAA;;iBAMf,cAAA,CAAA;AAQhB;AAAA,iBAAgB,eAAA,CAAgB,IAAA;;;;AAehC;iBAAgB,eAAA,CACd,IAAA,WACC,MAAA;;iBAgCa,YAAA,CAAa,QAAA;;iBAQb,cAAA,CAAA"}
@@ -1,456 +1,291 @@
1
- import { createContext, onUnmount, provide, useContext } from "@pyreon/core";
2
- import { computed, effect, signal } from "@pyreon/reactivity";
3
-
4
- //#region src/context.ts
1
+ import { Props, VNode, VNodeChild } from "@pyreon/core";
2
+ import { Computed, Signal } from "@pyreon/reactivity";
5
3
 
4
+ //#region src/types.d.ts
5
+ type ValidationError = string | undefined;
6
6
  /**
7
- * Provide a form instance to the component tree so nested components
8
- * can access it via `useFormContext()`.
9
- *
10
- * @example
11
- * const form = useForm({ initialValues: { email: '' }, onSubmit: ... })
12
- *
13
- * <FormProvider form={form}>
14
- * <EmailField />
15
- * <SubmitButton />
16
- * </FormProvider>
17
- */
18
- function FormProvider(props) {
19
- provide(FormContext, props.form);
20
- const ch = props.children;
21
- return typeof ch === "function" ? ch() : ch;
22
- }
7
+ * A reactive value that can be read by calling it.
8
+ * Both `Signal<T>` and `Computed<T>` satisfy this interface.
9
+ */
10
+ type Accessor<T> = Signal<T> | Computed<T>;
23
11
  /**
24
- * Access the form instance from the nearest `FormProvider`.
25
- * Must be called within a component tree wrapped by `FormProvider`.
26
- *
27
- * @example
28
- * function EmailField() {
29
- * const form = useFormContext<{ email: string }>()
30
- * return <input {...form.register('email')} />
31
- * }
32
- */
33
- function useFormContext() {
34
- const form = useContext(FormContext);
35
- if (!form) throw new Error("[@pyreon/form] useFormContext() must be used within a <FormProvider>.");
36
- return form;
12
+ * Field validator function. Receives the field value and all current form values
13
+ * for cross-field validation.
14
+ */
15
+ type ValidateFn<T, TValues = Record<string, unknown>> = (value: T, allValues: TValues) => ValidationError | Promise<ValidationError>;
16
+ type SchemaValidateFn<TValues> = (values: TValues) => Partial<Record<keyof TValues, ValidationError>> | Promise<Partial<Record<keyof TValues, ValidationError>>>;
17
+ interface FieldState<T = unknown> {
18
+ /** Current field value. */
19
+ value: Signal<T>;
20
+ /** Field error message (undefined if no error). */
21
+ error: Signal<ValidationError>;
22
+ /** Whether the field has been blurred at least once. */
23
+ touched: Signal<boolean>;
24
+ /** Whether the field value differs from its initial value. */
25
+ dirty: Signal<boolean>;
26
+ /** Set the field value. */
27
+ setValue: (value: T) => void;
28
+ /** Mark the field as touched (typically on blur). */
29
+ setTouched: () => void;
30
+ /** Reset the field to its initial value and clear error/touched/dirty. */
31
+ reset: () => void;
37
32
  }
38
-
39
- //#endregion
40
- //#region src/use-field.ts
41
- /**
42
- * Extract a single field's state and helpers from a form instance.
43
- * Useful for building isolated field components.
44
- *
45
- * @example
46
- * function EmailField({ form }: { form: FormState<{ email: string }> }) {
47
- * const field = useField(form, 'email')
48
- * return (
49
- * <>
50
- * <input {...field.register()} />
51
- * {field.showError() && <span>{field.error()}</span>}
52
- * </>
53
- * )
54
- * }
55
- */
56
- function useField(form, name) {
57
- const fieldState = form.fields[name];
58
- const hasError = computed(() => fieldState.error() !== void 0);
59
- const showError = computed(() => fieldState.touched() && hasError());
60
- return {
61
- value: fieldState.value,
62
- error: fieldState.error,
63
- touched: fieldState.touched,
64
- dirty: fieldState.dirty,
65
- setValue: fieldState.setValue,
66
- setTouched: fieldState.setTouched,
67
- reset: fieldState.reset,
68
- register: opts => form.register(name, opts),
69
- hasError,
70
- showError
71
- };
33
+ /** Props returned by `register()` for binding an input element. */
34
+ interface FieldRegisterProps<T> {
35
+ value: Signal<T>;
36
+ onInput: (e: Event) => void;
37
+ onBlur: () => void;
38
+ checked?: Accessor<boolean>;
39
+ }
40
+ interface FormState<TValues extends Record<string, unknown>> {
41
+ /** Individual field states keyed by field name. */
42
+ fields: { [K in keyof TValues]: FieldState<TValues[K]> };
43
+ /** Whether the form is currently being submitted. */
44
+ isSubmitting: Signal<boolean>;
45
+ /** Whether async validation is currently running. */
46
+ isValidating: Signal<boolean>;
47
+ /** Whether any field has an error (computed — read-only). */
48
+ isValid: Accessor<boolean>;
49
+ /** Whether any field value differs from its initial value (computed — read-only). */
50
+ isDirty: Accessor<boolean>;
51
+ /** Number of times the form has been submitted. */
52
+ submitCount: Signal<number>;
53
+ /** Error thrown by onSubmit (undefined if no error). */
54
+ submitError: Signal<unknown>;
55
+ /** All current form values as a plain object. */
56
+ values: () => TValues;
57
+ /** All current errors as a record. */
58
+ errors: () => Partial<Record<keyof TValues, ValidationError>>;
59
+ /** Set a single field's value. */
60
+ setFieldValue: <K extends keyof TValues>(field: K, value: TValues[K]) => void;
61
+ /** Set a single field's error (e.g. from server-side validation). */
62
+ setFieldError: (field: keyof TValues, error: ValidationError) => void;
63
+ /** Set multiple field errors at once (e.g. from server-side validation). */
64
+ setErrors: (errors: Partial<Record<keyof TValues, ValidationError>>) => void;
65
+ /** Clear all field errors. */
66
+ clearErrors: () => void;
67
+ /** Reset a single field to its initial value. */
68
+ resetField: (field: keyof TValues) => void;
69
+ /**
70
+ * Returns props for binding an input element to a field.
71
+ * For text/select: includes `value` signal, `onInput`, and `onBlur`.
72
+ * For checkboxes: pass `{ type: 'checkbox' }` to also get a `checked` signal.
73
+ * For numbers: pass `{ type: 'number' }` to use `valueAsNumber` on input.
74
+ */
75
+ register: <K extends keyof TValues & string>(field: K, options?: {
76
+ type?: 'checkbox' | 'number';
77
+ }) => FieldRegisterProps<TValues[K]>;
78
+ /**
79
+ * Submit handler — runs validation, then calls onSubmit if valid.
80
+ * Can be called directly or as a form event handler (calls preventDefault).
81
+ */
82
+ handleSubmit: (e?: Event) => Promise<void>;
83
+ /** Reset all fields to initial values. */
84
+ reset: () => void;
85
+ /** Validate all fields and return whether the form is valid. */
86
+ validate: () => Promise<boolean>;
87
+ }
88
+ interface UseFormOptions<TValues extends Record<string, unknown>> {
89
+ /** Initial values for each field. */
90
+ initialValues: TValues;
91
+ /** Called with validated values on successful submit. */
92
+ onSubmit: (values: TValues) => void | Promise<void>;
93
+ /** Per-field validators. Receives field value and all form values. */
94
+ validators?: Partial<{ [K in keyof TValues]: ValidateFn<TValues[K], TValues> }>;
95
+ /** Schema-level validator (runs after field validators). */
96
+ schema?: SchemaValidateFn<TValues>;
97
+ /** When to validate: 'blur' (default), 'change', or 'submit'. */
98
+ validateOn?: 'blur' | 'change' | 'submit';
99
+ /** Debounce delay in ms for validators (useful for async validators). */
100
+ debounceMs?: number;
72
101
  }
73
-
74
102
  //#endregion
75
- //#region src/use-field-array.ts
76
- /**
77
- * Manage a dynamic array of form fields with stable keys.
78
- *
79
- * @example
80
- * const tags = useFieldArray<string>([])
81
- * tags.append('typescript')
82
- * tags.append('pyreon')
83
- * // tags.items() — array of { key, value } for keyed rendering
84
- */
85
- function useFieldArray(initial = []) {
86
- let nextKey = 0;
87
- const makeItem = value => ({
88
- key: nextKey++,
89
- value: signal(value)
90
- });
91
- const items = signal(initial.map(makeItem));
92
- return {
93
- items,
94
- length: computed(() => items().length),
95
- append(value) {
96
- items.update(arr => [...arr, makeItem(value)]);
97
- },
98
- prepend(value) {
99
- items.update(arr => [makeItem(value), ...arr]);
100
- },
101
- insert(index, value) {
102
- items.update(arr => {
103
- const next = [...arr];
104
- next.splice(index, 0, makeItem(value));
105
- return next;
106
- });
107
- },
108
- remove(index) {
109
- items.update(arr => arr.filter((_, i) => i !== index));
110
- },
111
- update(index, value) {
112
- const item = items.peek()[index];
113
- if (item) item.value.set(value);
114
- },
115
- move(from, to) {
116
- items.update(arr => {
117
- const next = [...arr];
118
- const [item] = next.splice(from, 1);
119
- if (item) next.splice(to, 0, item);
120
- return next;
121
- });
122
- },
123
- swap(indexA, indexB) {
124
- items.update(arr => {
125
- const next = [...arr];
126
- const a = next[indexA];
127
- const b = next[indexB];
128
- if (a && b) {
129
- next[indexA] = b;
130
- next[indexB] = a;
131
- }
132
- return next;
133
- });
134
- },
135
- replace(values) {
136
- items.set(values.map(makeItem));
137
- },
138
- values() {
139
- return items.peek().map(item => item.value.peek());
140
- }
141
- };
103
+ //#region src/context.d.ts
104
+ interface FormProviderProps<TValues extends Record<string, unknown>> extends Props {
105
+ form: FormState<TValues>;
106
+ children?: VNodeChild;
142
107
  }
143
-
108
+ /**
109
+ * Provide a form instance to the component tree so nested components
110
+ * can access it via `useFormContext()`.
111
+ *
112
+ * @example
113
+ * const form = useForm({ initialValues: { email: '' }, onSubmit: ... })
114
+ *
115
+ * <FormProvider form={form}>
116
+ * <EmailField />
117
+ * <SubmitButton />
118
+ * </FormProvider>
119
+ */
120
+ declare function FormProvider<TValues extends Record<string, unknown>>(props: FormProviderProps<TValues>): VNode;
121
+ /**
122
+ * Access the form instance from the nearest `FormProvider`.
123
+ * Must be called within a component tree wrapped by `FormProvider`.
124
+ *
125
+ * @example
126
+ * function EmailField() {
127
+ * const form = useFormContext<{ email: string }>()
128
+ * return <input {...form.register('email')} />
129
+ * }
130
+ */
131
+ declare function useFormContext<TValues extends Record<string, unknown> = Record<string, unknown>>(): FormState<TValues>;
144
132
  //#endregion
145
- //#region src/use-form.ts
133
+ //#region src/use-field.d.ts
134
+ interface UseFieldResult<T> {
135
+ /** Current field value (reactive signal). */
136
+ value: Signal<T>;
137
+ /** Field error message (reactive signal). */
138
+ error: Signal<ValidationError>;
139
+ /** Whether the field has been touched (reactive signal). */
140
+ touched: Signal<boolean>;
141
+ /** Whether the field value differs from initial (reactive signal). */
142
+ dirty: Signal<boolean>;
143
+ /** Set the field value. */
144
+ setValue: (value: T) => void;
145
+ /** Mark the field as touched. */
146
+ setTouched: () => void;
147
+ /** Reset the field to its initial value. */
148
+ reset: () => void;
149
+ /** Register props for input binding. */
150
+ register: (opts?: {
151
+ type?: 'checkbox';
152
+ }) => FieldRegisterProps<T>;
153
+ /** Whether the field has an error (computed). */
154
+ hasError: Computed<boolean>;
155
+ /** Whether the field should show its error (touched + has error). */
156
+ showError: Computed<boolean>;
157
+ }
146
158
  /**
147
- * Create a signal-based form. Returns reactive field states, form-level
148
- * signals, and handlers for submit/reset/validate.
149
- *
150
- * @example
151
- * const form = useForm({
152
- * initialValues: { email: '', password: '', remember: false },
153
- * validators: {
154
- * email: (v) => (!v ? 'Required' : undefined),
155
- * password: (v, all) => (v.length < 8 ? 'Too short' : undefined),
156
- * },
157
- * onSubmit: async (values) => { await login(values) },
158
- * })
159
- *
160
- * // Bind with register():
161
- * // h('input', form.register('email'))
162
- * // h('input', { type: 'checkbox', ...form.register('remember', { type: 'checkbox' }) })
163
- */
164
- function useForm(options) {
165
- const {
166
- initialValues,
167
- onSubmit,
168
- validators,
169
- schema,
170
- validateOn = "blur",
171
- debounceMs
172
- } = options;
173
- const fieldEntries = Object.entries(initialValues);
174
- const fields = {};
175
- const debounceTimers = {};
176
- const validationVersions = {};
177
- const getValues = () => {
178
- const values = {};
179
- for (const [name] of fieldEntries) values[name] = fields[name]?.value.peek() ?? initialValues[name];
180
- return values;
181
- };
182
- const clearAllTimers = () => {
183
- for (const key of Object.keys(debounceTimers)) {
184
- clearTimeout(debounceTimers[key]);
185
- delete debounceTimers[key];
186
- }
187
- };
188
- const isValidating = signal(false);
189
- const submitError = signal(void 0);
190
- let disposed = false;
191
- for (const [name, initial] of fieldEntries) {
192
- const valueSig = signal(initial);
193
- const errorSig = signal(void 0);
194
- const touchedSig = signal(false);
195
- const dirtySig = signal(false);
196
- validationVersions[name] = 0;
197
- const runValidation = async value => {
198
- const fieldValidator = validators?.[name];
199
- if (fieldValidator) {
200
- validationVersions[name] = (validationVersions[name] ?? 0) + 1;
201
- const currentVersion = validationVersions[name];
202
- try {
203
- const result = await fieldValidator(value, getValues());
204
- if (!disposed && validationVersions[name] === currentVersion) errorSig.set(result);
205
- return result;
206
- } catch (err) {
207
- if (!disposed && validationVersions[name] === currentVersion) {
208
- const message = err instanceof Error ? err.message : String(err);
209
- errorSig.set(message);
210
- }
211
- return err instanceof Error ? err.message : String(err);
212
- }
213
- }
214
- errorSig.set(void 0);
215
- };
216
- const validateField = debounceMs ? value => {
217
- clearTimeout(debounceTimers[name]);
218
- return new Promise(resolve => {
219
- debounceTimers[name] = setTimeout(async () => {
220
- resolve(await runValidation(value));
221
- }, debounceMs);
222
- });
223
- } : runValidation;
224
- if (validateOn === "change") effect(() => {
225
- validateField(valueSig());
226
- });
227
- fields[name] = {
228
- value: valueSig,
229
- error: errorSig,
230
- touched: touchedSig,
231
- dirty: dirtySig,
232
- setValue: value => {
233
- valueSig.set(value);
234
- dirtySig.set(!structuredEqual(value, initial));
235
- },
236
- setTouched: () => {
237
- touchedSig.set(true);
238
- if (validateOn === "blur") validateField(valueSig.peek());
239
- },
240
- reset: () => {
241
- valueSig.set(initial);
242
- errorSig.set(void 0);
243
- touchedSig.set(false);
244
- dirtySig.set(false);
245
- clearTimeout(debounceTimers[name]);
246
- }
247
- };
248
- }
249
- onUnmount(() => {
250
- disposed = true;
251
- clearAllTimers();
252
- });
253
- const isSubmitting = signal(false);
254
- const submitCount = signal(0);
255
- const isValid = computed(() => {
256
- for (const name of fieldEntries.map(([n]) => n)) if (fields[name].error() !== void 0) return false;
257
- return true;
258
- });
259
- const isDirty = computed(() => {
260
- for (const name of fieldEntries.map(([n]) => n)) if (fields[name].dirty()) return true;
261
- return false;
262
- });
263
- const getErrors = () => {
264
- const errors = {};
265
- for (const [name] of fieldEntries) {
266
- const err = fields[name].error.peek();
267
- if (err !== void 0) errors[name] = err;
268
- }
269
- return errors;
270
- };
271
- const validate = async () => {
272
- clearAllTimers();
273
- isValidating.set(true);
274
- try {
275
- const allValues = getValues();
276
- for (const [name] of fieldEntries) fields[name].error.set(void 0);
277
- await Promise.all(fieldEntries.map(async ([name]) => {
278
- const fieldValidator = validators?.[name];
279
- if (fieldValidator) {
280
- validationVersions[name] = (validationVersions[name] ?? 0) + 1;
281
- const currentVersion = validationVersions[name];
282
- try {
283
- const error = await fieldValidator(fields[name].value.peek(), allValues);
284
- if (validationVersions[name] === currentVersion) fields[name].error.set(error);
285
- } catch (err) {
286
- if (validationVersions[name] === currentVersion) fields[name].error.set(err instanceof Error ? err.message : String(err));
287
- }
288
- }
289
- }));
290
- if (schema) try {
291
- const schemaErrors = await schema(allValues);
292
- for (const [name] of fieldEntries) {
293
- const schemaError = schemaErrors[name];
294
- if (schemaError !== void 0 && fields[name].error.peek() === void 0) fields[name].error.set(schemaError);
295
- }
296
- } catch (err) {
297
- submitError.set(err);
298
- return false;
299
- }
300
- for (const [name] of fieldEntries) if (fields[name].error.peek() !== void 0) return false;
301
- return true;
302
- } finally {
303
- isValidating.set(false);
304
- }
305
- };
306
- const handleSubmit = async e => {
307
- if (e && typeof e.preventDefault === "function") e.preventDefault();
308
- submitError.set(void 0);
309
- submitCount.update(n => n + 1);
310
- for (const [name] of fieldEntries) fields[name].touched.set(true);
311
- if (!(await validate())) return;
312
- isSubmitting.set(true);
313
- try {
314
- await onSubmit(getValues());
315
- } catch (err) {
316
- submitError.set(err);
317
- throw err;
318
- } finally {
319
- isSubmitting.set(false);
320
- }
321
- };
322
- const reset = () => {
323
- clearAllTimers();
324
- for (const [name] of fieldEntries) fields[name].reset();
325
- submitCount.set(0);
326
- submitError.set(void 0);
327
- };
328
- const setFieldValue = (field, value) => {
329
- if (!fields[field]) throw new Error(`[@pyreon/form] Field "${String(field)}" does not exist. Available fields: ${fieldEntries.map(([n]) => n).join(", ")}`);
330
- fields[field].setValue(value);
331
- };
332
- const setFieldError = (field, error) => {
333
- if (!fields[field]) throw new Error(`[@pyreon/form] Field "${String(field)}" does not exist. Available fields: ${fieldEntries.map(([n]) => n).join(", ")}`);
334
- fields[field].error.set(error);
335
- };
336
- const setErrors = errors => {
337
- for (const [name, error] of Object.entries(errors)) setFieldError(name, error);
338
- };
339
- const clearErrors = () => {
340
- for (const [name] of fieldEntries) fields[name].error.set(void 0);
341
- };
342
- const resetField = field => {
343
- if (fields[field]) fields[field].reset();
344
- };
345
- const registerCache = /* @__PURE__ */new Map();
346
- const register = (field, opts) => {
347
- const cacheKey = `${field}:${opts?.type ?? "text"}`;
348
- const cached = registerCache.get(cacheKey);
349
- if (cached) return cached;
350
- const fieldState = fields[field];
351
- const props = {
352
- value: fieldState.value,
353
- onInput: e => {
354
- const target = e.target;
355
- if (opts?.type === "checkbox") fieldState.setValue(target.checked);else if (opts?.type === "number") {
356
- const num = target.valueAsNumber;
357
- fieldState.setValue(Number.isNaN(num) ? target.value : num);
358
- } else fieldState.setValue(target.value);
359
- },
360
- onBlur: () => {
361
- fieldState.setTouched();
362
- }
363
- };
364
- if (opts?.type === "checkbox") props.checked = computed(() => Boolean(fieldState.value()));
365
- registerCache.set(cacheKey, props);
366
- return props;
367
- };
368
- return {
369
- fields,
370
- isSubmitting,
371
- isValidating,
372
- isValid,
373
- isDirty,
374
- submitCount,
375
- submitError,
376
- values: getValues,
377
- errors: getErrors,
378
- setFieldValue,
379
- setFieldError,
380
- setErrors,
381
- clearErrors,
382
- resetField,
383
- register,
384
- handleSubmit,
385
- reset,
386
- validate
387
- };
159
+ * Extract a single field's state and helpers from a form instance.
160
+ * Useful for building isolated field components.
161
+ *
162
+ * @example
163
+ * function EmailField({ form }: { form: FormState<{ email: string }> }) {
164
+ * const field = useField(form, 'email')
165
+ * return (
166
+ * <>
167
+ * <input {...field.register()} />
168
+ * {field.showError() && <span>{field.error()}</span>}
169
+ * </>
170
+ * )
171
+ * }
172
+ */
173
+ declare function useField<TValues extends Record<string, unknown>, K extends keyof TValues & string>(form: FormState<TValues>, name: K): UseFieldResult<TValues[K]>;
174
+ //#endregion
175
+ //#region src/use-field-array.d.ts
176
+ interface FieldArrayItem<T> {
177
+ /** Stable key for keyed rendering. */
178
+ key: number;
179
+ /** Reactive value for this item. */
180
+ value: Signal<T>;
388
181
  }
389
- /** Deep structural equality with depth limit to guard against circular references. */
390
- function structuredEqual(a, b, depth = 0) {
391
- if (Object.is(a, b)) return true;
392
- if (a == null || b == null) return false;
393
- if (typeof a !== typeof b) return false;
394
- if (depth > 10) return false;
395
- if (Array.isArray(a) && Array.isArray(b)) {
396
- if (a.length !== b.length) return false;
397
- for (let i = 0; i < a.length; i++) if (!structuredEqual(a[i], b[i], depth + 1)) return false;
398
- return true;
399
- }
400
- if (typeof a === "object" && typeof b === "object") {
401
- const aObj = a;
402
- const bObj = b;
403
- const aKeys = Object.keys(aObj);
404
- const bKeys = Object.keys(bObj);
405
- if (aKeys.length !== bKeys.length) return false;
406
- for (const key of aKeys) if (!structuredEqual(aObj[key], bObj[key], depth + 1)) return false;
407
- return true;
408
- }
409
- return false;
182
+ interface UseFieldArrayResult<T> {
183
+ /** Reactive list of items with stable keys. */
184
+ items: Signal<FieldArrayItem<T>[]>;
185
+ /** Number of items. */
186
+ length: Computed<number>;
187
+ /** Append a new item to the end. */
188
+ append: (value: T) => void;
189
+ /** Prepend a new item to the start. */
190
+ prepend: (value: T) => void;
191
+ /** Insert an item at the given index. */
192
+ insert: (index: number, value: T) => void;
193
+ /** Remove the item at the given index. */
194
+ remove: (index: number) => void;
195
+ /** Update the value of an item at the given index. */
196
+ update: (index: number, value: T) => void;
197
+ /** Move an item from one index to another. */
198
+ move: (from: number, to: number) => void;
199
+ /** Swap two items by index. */
200
+ swap: (indexA: number, indexB: number) => void;
201
+ /** Replace all items. */
202
+ replace: (values: T[]) => void;
203
+ /** Get all current values as a plain array. */
204
+ values: () => T[];
410
205
  }
411
-
206
+ /**
207
+ * Manage a dynamic array of form fields with stable keys.
208
+ *
209
+ * @example
210
+ * const tags = useFieldArray<string>([])
211
+ * tags.append('typescript')
212
+ * tags.append('pyreon')
213
+ * // tags.items() — array of { key, value } for keyed rendering
214
+ */
215
+ declare function useFieldArray<T>(initial?: T[]): UseFieldArrayResult<T>;
412
216
  //#endregion
413
- //#region src/use-form-state.ts
414
- function useFormState(form, selector) {
415
- const buildSummary = () => {
416
- const touchedFields = {};
417
- const dirtyFields = {};
418
- const errors = {};
419
- for (const key of Object.keys(form.fields)) {
420
- const field = form.fields[key];
421
- if (field.touched()) touchedFields[key] = true;
422
- if (field.dirty()) dirtyFields[key] = true;
423
- const err = field.error();
424
- if (err !== void 0) errors[key] = err;
425
- }
426
- return {
427
- isSubmitting: form.isSubmitting(),
428
- isValidating: form.isValidating(),
429
- isValid: form.isValid(),
430
- isDirty: form.isDirty(),
431
- submitCount: form.submitCount(),
432
- submitError: form.submitError(),
433
- touchedFields,
434
- dirtyFields,
435
- errors
436
- };
437
- };
438
- if (selector) return computed(() => selector(buildSummary()));
439
- return computed(buildSummary);
440
- }
441
-
217
+ //#region src/use-form.d.ts
218
+ /**
219
+ * Create a signal-based form. Returns reactive field states, form-level
220
+ * signals, and handlers for submit/reset/validate.
221
+ *
222
+ * @example
223
+ * const form = useForm({
224
+ * initialValues: { email: '', password: '', remember: false },
225
+ * validators: {
226
+ * email: (v) => (!v ? 'Required' : undefined),
227
+ * password: (v, all) => (v.length < 8 ? 'Too short' : undefined),
228
+ * },
229
+ * onSubmit: async (values) => { await login(values) },
230
+ * })
231
+ *
232
+ * // Bind with register():
233
+ * // h('input', form.register('email'))
234
+ * // h('input', { type: 'checkbox', ...form.register('remember', { type: 'checkbox' }) })
235
+ */
236
+ declare function useForm<TValues extends Record<string, unknown>>(options: UseFormOptions<TValues>): FormState<TValues>;
442
237
  //#endregion
443
- //#region src/use-watch.ts
444
- function useWatch(form, nameOrNames) {
445
- if (nameOrNames === void 0) return computed(() => {
446
- const result = {};
447
- for (const key of Object.keys(form.fields)) result[key] = form.fields[key].value();
448
- return result;
449
- });
450
- if (Array.isArray(nameOrNames)) return nameOrNames.map(name => form.fields[name].value);
451
- return form.fields[nameOrNames].value;
238
+ //#region src/use-form-state.d.ts
239
+ interface FormStateSummary<TValues extends Record<string, unknown>> {
240
+ isSubmitting: boolean;
241
+ isValidating: boolean;
242
+ isValid: boolean;
243
+ isDirty: boolean;
244
+ submitCount: number;
245
+ submitError: unknown;
246
+ touchedFields: Partial<Record<keyof TValues, boolean>>;
247
+ dirtyFields: Partial<Record<keyof TValues, boolean>>;
248
+ errors: Partial<Record<keyof TValues, ValidationError>>;
452
249
  }
453
-
250
+ /**
251
+ * Subscribe to the full form state as a single computed signal.
252
+ * Useful for rendering form-level UI (submit button disabled state,
253
+ * error summaries, progress indicators).
254
+ *
255
+ * @example
256
+ * const state = useFormState(form)
257
+ * // state() => { isSubmitting, isValid, isDirty, errors, ... }
258
+ *
259
+ * @example
260
+ * // Use a selector for fine-grained reactivity
261
+ * const canSubmit = useFormState(form, (s) => s.isValid && !s.isSubmitting)
262
+ */
263
+ declare function useFormState<TValues extends Record<string, unknown>>(form: FormState<TValues>): Computed<FormStateSummary<TValues>>;
264
+ declare function useFormState<TValues extends Record<string, unknown>, R>(form: FormState<TValues>, selector: (state: FormStateSummary<TValues>) => R): Computed<R>;
265
+ //#endregion
266
+ //#region src/use-watch.d.ts
267
+ /**
268
+ * Watch specific field values reactively. Returns a computed signal
269
+ * that re-evaluates when any of the watched fields change.
270
+ *
271
+ * @example
272
+ * // Watch a single field
273
+ * const email = useWatch(form, 'email')
274
+ * // email() => current email value
275
+ *
276
+ * @example
277
+ * // Watch multiple fields
278
+ * const [first, last] = useWatch(form, ['firstName', 'lastName'])
279
+ * // first() => firstName value, last() => lastName value
280
+ *
281
+ * @example
282
+ * // Watch all fields
283
+ * const all = useWatch(form)
284
+ * // all() => { email: '...', password: '...' }
285
+ */
286
+ declare function useWatch<TValues extends Record<string, unknown>, K extends keyof TValues & string>(form: FormState<TValues>, name: K): Signal<TValues[K]>;
287
+ declare function useWatch<TValues extends Record<string, unknown>, K extends (keyof TValues & string)[]>(form: FormState<TValues>, names: K): { [I in keyof K]: Signal<TValues[K[I] & keyof TValues]> };
288
+ declare function useWatch<TValues extends Record<string, unknown>>(form: FormState<TValues>): Computed<TValues>;
454
289
  //#endregion
455
- export { FormProvider, useField, useFieldArray, useForm, useFormContext, useFormState, useWatch };
456
- //# sourceMappingURL=index.d.ts.map
290
+ export { type Accessor, type FieldArrayItem, type FieldRegisterProps, type FieldState, FormProvider, type FormState, type FormStateSummary, type SchemaValidateFn, type UseFieldArrayResult, type UseFieldResult, type UseFormOptions, type ValidateFn, type ValidationError, useField, useFieldArray, useForm, useFormContext, useFormState, useWatch };
291
+ //# sourceMappingURL=index2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/context.ts","../../src/use-field.ts","../../src/use-field-array.ts","../../src/use-form.ts","../../src/use-form-state.ts","../../src/use-watch.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index2.d.ts","names":[],"sources":["../../../src/types.ts","../../../src/context.ts","../../../src/use-field.ts","../../../src/use-field-array.ts","../../../src/use-form.ts","../../../src/use-form-state.ts","../../../src/use-watch.ts"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pyreon/form",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Signal-based form management for Pyreon",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -45,7 +45,7 @@
45
45
  "typecheck": "tsc --noEmit"
46
46
  },
47
47
  "peerDependencies": {
48
- "@pyreon/core": ">=0.5.0 <1.0.0",
49
- "@pyreon/reactivity": ">=0.5.0 <1.0.0"
48
+ "@pyreon/core": ">=0.7.0 <0.8.0",
49
+ "@pyreon/reactivity": ">=0.7.0 <0.8.0"
50
50
  }
51
51
  }
@@ -1,31 +0,0 @@
1
- //#region src/devtools.d.ts
2
- /**
3
- * @pyreon/form devtools introspection API.
4
- * Import: `import { ... } from "@pyreon/form/devtools"`
5
- */
6
- /**
7
- * Register a form instance for devtools inspection.
8
- *
9
- * @example
10
- * const form = useForm({ ... })
11
- * registerForm("login-form", form)
12
- */
13
- declare function registerForm(name: string, form: object): void;
14
- /** Unregister a form instance. */
15
- declare function unregisterForm(name: string): void;
16
- /** Get all registered form names. Cleans up garbage-collected instances. */
17
- declare function getActiveForms(): string[];
18
- /** Get a form instance by name (or undefined if GC'd or not registered). */
19
- declare function getFormInstance(name: string): object | undefined;
20
- /**
21
- * Get a snapshot of a registered form's current state.
22
- * Returns values, errors, and form-level status signals.
23
- */
24
- declare function getFormSnapshot(name: string): Record<string, unknown> | undefined;
25
- /** Subscribe to form registry changes. Returns unsubscribe function. */
26
- declare function onFormChange(listener: () => void): () => void;
27
- /** @internal — reset devtools registry (for tests). */
28
- declare function _resetDevtools(): void;
29
- //#endregion
30
- export { _resetDevtools, getActiveForms, getFormInstance, getFormSnapshot, onFormChange, registerForm, unregisterForm };
31
- //# sourceMappingURL=devtools2.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"devtools2.d.ts","names":[],"sources":["../../src/devtools.ts"],"mappings":";;AAmBA;;;;;AAMA;;;;;iBANgB,YAAA,CAAa,IAAA,UAAc,IAAA;;iBAM3B,cAAA,CAAe,IAAA;;iBAMf,cAAA,CAAA;AAQhB;AAAA,iBAAgB,eAAA,CAAgB,IAAA;;;;AAehC;iBAAgB,eAAA,CACd,IAAA,WACC,MAAA;;iBAgCa,YAAA,CAAa,QAAA;;iBAQb,cAAA,CAAA"}
@@ -1,291 +0,0 @@
1
- import { Props, VNode, VNodeChild } from "@pyreon/core";
2
- import { Computed, Signal } from "@pyreon/reactivity";
3
-
4
- //#region src/types.d.ts
5
- type ValidationError = string | undefined;
6
- /**
7
- * A reactive value that can be read by calling it.
8
- * Both `Signal<T>` and `Computed<T>` satisfy this interface.
9
- */
10
- type Accessor<T> = Signal<T> | Computed<T>;
11
- /**
12
- * Field validator function. Receives the field value and all current form values
13
- * for cross-field validation.
14
- */
15
- type ValidateFn<T, TValues = Record<string, unknown>> = (value: T, allValues: TValues) => ValidationError | Promise<ValidationError>;
16
- type SchemaValidateFn<TValues> = (values: TValues) => Partial<Record<keyof TValues, ValidationError>> | Promise<Partial<Record<keyof TValues, ValidationError>>>;
17
- interface FieldState<T = unknown> {
18
- /** Current field value. */
19
- value: Signal<T>;
20
- /** Field error message (undefined if no error). */
21
- error: Signal<ValidationError>;
22
- /** Whether the field has been blurred at least once. */
23
- touched: Signal<boolean>;
24
- /** Whether the field value differs from its initial value. */
25
- dirty: Signal<boolean>;
26
- /** Set the field value. */
27
- setValue: (value: T) => void;
28
- /** Mark the field as touched (typically on blur). */
29
- setTouched: () => void;
30
- /** Reset the field to its initial value and clear error/touched/dirty. */
31
- reset: () => void;
32
- }
33
- /** Props returned by `register()` for binding an input element. */
34
- interface FieldRegisterProps<T> {
35
- value: Signal<T>;
36
- onInput: (e: Event) => void;
37
- onBlur: () => void;
38
- checked?: Accessor<boolean>;
39
- }
40
- interface FormState<TValues extends Record<string, unknown>> {
41
- /** Individual field states keyed by field name. */
42
- fields: { [K in keyof TValues]: FieldState<TValues[K]> };
43
- /** Whether the form is currently being submitted. */
44
- isSubmitting: Signal<boolean>;
45
- /** Whether async validation is currently running. */
46
- isValidating: Signal<boolean>;
47
- /** Whether any field has an error (computed — read-only). */
48
- isValid: Accessor<boolean>;
49
- /** Whether any field value differs from its initial value (computed — read-only). */
50
- isDirty: Accessor<boolean>;
51
- /** Number of times the form has been submitted. */
52
- submitCount: Signal<number>;
53
- /** Error thrown by onSubmit (undefined if no error). */
54
- submitError: Signal<unknown>;
55
- /** All current form values as a plain object. */
56
- values: () => TValues;
57
- /** All current errors as a record. */
58
- errors: () => Partial<Record<keyof TValues, ValidationError>>;
59
- /** Set a single field's value. */
60
- setFieldValue: <K extends keyof TValues>(field: K, value: TValues[K]) => void;
61
- /** Set a single field's error (e.g. from server-side validation). */
62
- setFieldError: (field: keyof TValues, error: ValidationError) => void;
63
- /** Set multiple field errors at once (e.g. from server-side validation). */
64
- setErrors: (errors: Partial<Record<keyof TValues, ValidationError>>) => void;
65
- /** Clear all field errors. */
66
- clearErrors: () => void;
67
- /** Reset a single field to its initial value. */
68
- resetField: (field: keyof TValues) => void;
69
- /**
70
- * Returns props for binding an input element to a field.
71
- * For text/select: includes `value` signal, `onInput`, and `onBlur`.
72
- * For checkboxes: pass `{ type: 'checkbox' }` to also get a `checked` signal.
73
- * For numbers: pass `{ type: 'number' }` to use `valueAsNumber` on input.
74
- */
75
- register: <K extends keyof TValues & string>(field: K, options?: {
76
- type?: 'checkbox' | 'number';
77
- }) => FieldRegisterProps<TValues[K]>;
78
- /**
79
- * Submit handler — runs validation, then calls onSubmit if valid.
80
- * Can be called directly or as a form event handler (calls preventDefault).
81
- */
82
- handleSubmit: (e?: Event) => Promise<void>;
83
- /** Reset all fields to initial values. */
84
- reset: () => void;
85
- /** Validate all fields and return whether the form is valid. */
86
- validate: () => Promise<boolean>;
87
- }
88
- interface UseFormOptions<TValues extends Record<string, unknown>> {
89
- /** Initial values for each field. */
90
- initialValues: TValues;
91
- /** Called with validated values on successful submit. */
92
- onSubmit: (values: TValues) => void | Promise<void>;
93
- /** Per-field validators. Receives field value and all form values. */
94
- validators?: Partial<{ [K in keyof TValues]: ValidateFn<TValues[K], TValues> }>;
95
- /** Schema-level validator (runs after field validators). */
96
- schema?: SchemaValidateFn<TValues>;
97
- /** When to validate: 'blur' (default), 'change', or 'submit'. */
98
- validateOn?: 'blur' | 'change' | 'submit';
99
- /** Debounce delay in ms for validators (useful for async validators). */
100
- debounceMs?: number;
101
- }
102
- //#endregion
103
- //#region src/context.d.ts
104
- interface FormProviderProps<TValues extends Record<string, unknown>> extends Props {
105
- form: FormState<TValues>;
106
- children?: VNodeChild;
107
- }
108
- /**
109
- * Provide a form instance to the component tree so nested components
110
- * can access it via `useFormContext()`.
111
- *
112
- * @example
113
- * const form = useForm({ initialValues: { email: '' }, onSubmit: ... })
114
- *
115
- * <FormProvider form={form}>
116
- * <EmailField />
117
- * <SubmitButton />
118
- * </FormProvider>
119
- */
120
- declare function FormProvider<TValues extends Record<string, unknown>>(props: FormProviderProps<TValues>): VNode;
121
- /**
122
- * Access the form instance from the nearest `FormProvider`.
123
- * Must be called within a component tree wrapped by `FormProvider`.
124
- *
125
- * @example
126
- * function EmailField() {
127
- * const form = useFormContext<{ email: string }>()
128
- * return <input {...form.register('email')} />
129
- * }
130
- */
131
- declare function useFormContext<TValues extends Record<string, unknown> = Record<string, unknown>>(): FormState<TValues>;
132
- //#endregion
133
- //#region src/use-field.d.ts
134
- interface UseFieldResult<T> {
135
- /** Current field value (reactive signal). */
136
- value: Signal<T>;
137
- /** Field error message (reactive signal). */
138
- error: Signal<ValidationError>;
139
- /** Whether the field has been touched (reactive signal). */
140
- touched: Signal<boolean>;
141
- /** Whether the field value differs from initial (reactive signal). */
142
- dirty: Signal<boolean>;
143
- /** Set the field value. */
144
- setValue: (value: T) => void;
145
- /** Mark the field as touched. */
146
- setTouched: () => void;
147
- /** Reset the field to its initial value. */
148
- reset: () => void;
149
- /** Register props for input binding. */
150
- register: (opts?: {
151
- type?: 'checkbox';
152
- }) => FieldRegisterProps<T>;
153
- /** Whether the field has an error (computed). */
154
- hasError: Computed<boolean>;
155
- /** Whether the field should show its error (touched + has error). */
156
- showError: Computed<boolean>;
157
- }
158
- /**
159
- * Extract a single field's state and helpers from a form instance.
160
- * Useful for building isolated field components.
161
- *
162
- * @example
163
- * function EmailField({ form }: { form: FormState<{ email: string }> }) {
164
- * const field = useField(form, 'email')
165
- * return (
166
- * <>
167
- * <input {...field.register()} />
168
- * {field.showError() && <span>{field.error()}</span>}
169
- * </>
170
- * )
171
- * }
172
- */
173
- declare function useField<TValues extends Record<string, unknown>, K extends keyof TValues & string>(form: FormState<TValues>, name: K): UseFieldResult<TValues[K]>;
174
- //#endregion
175
- //#region src/use-field-array.d.ts
176
- interface FieldArrayItem<T> {
177
- /** Stable key for keyed rendering. */
178
- key: number;
179
- /** Reactive value for this item. */
180
- value: Signal<T>;
181
- }
182
- interface UseFieldArrayResult<T> {
183
- /** Reactive list of items with stable keys. */
184
- items: Signal<FieldArrayItem<T>[]>;
185
- /** Number of items. */
186
- length: Computed<number>;
187
- /** Append a new item to the end. */
188
- append: (value: T) => void;
189
- /** Prepend a new item to the start. */
190
- prepend: (value: T) => void;
191
- /** Insert an item at the given index. */
192
- insert: (index: number, value: T) => void;
193
- /** Remove the item at the given index. */
194
- remove: (index: number) => void;
195
- /** Update the value of an item at the given index. */
196
- update: (index: number, value: T) => void;
197
- /** Move an item from one index to another. */
198
- move: (from: number, to: number) => void;
199
- /** Swap two items by index. */
200
- swap: (indexA: number, indexB: number) => void;
201
- /** Replace all items. */
202
- replace: (values: T[]) => void;
203
- /** Get all current values as a plain array. */
204
- values: () => T[];
205
- }
206
- /**
207
- * Manage a dynamic array of form fields with stable keys.
208
- *
209
- * @example
210
- * const tags = useFieldArray<string>([])
211
- * tags.append('typescript')
212
- * tags.append('pyreon')
213
- * // tags.items() — array of { key, value } for keyed rendering
214
- */
215
- declare function useFieldArray<T>(initial?: T[]): UseFieldArrayResult<T>;
216
- //#endregion
217
- //#region src/use-form.d.ts
218
- /**
219
- * Create a signal-based form. Returns reactive field states, form-level
220
- * signals, and handlers for submit/reset/validate.
221
- *
222
- * @example
223
- * const form = useForm({
224
- * initialValues: { email: '', password: '', remember: false },
225
- * validators: {
226
- * email: (v) => (!v ? 'Required' : undefined),
227
- * password: (v, all) => (v.length < 8 ? 'Too short' : undefined),
228
- * },
229
- * onSubmit: async (values) => { await login(values) },
230
- * })
231
- *
232
- * // Bind with register():
233
- * // h('input', form.register('email'))
234
- * // h('input', { type: 'checkbox', ...form.register('remember', { type: 'checkbox' }) })
235
- */
236
- declare function useForm<TValues extends Record<string, unknown>>(options: UseFormOptions<TValues>): FormState<TValues>;
237
- //#endregion
238
- //#region src/use-form-state.d.ts
239
- interface FormStateSummary<TValues extends Record<string, unknown>> {
240
- isSubmitting: boolean;
241
- isValidating: boolean;
242
- isValid: boolean;
243
- isDirty: boolean;
244
- submitCount: number;
245
- submitError: unknown;
246
- touchedFields: Partial<Record<keyof TValues, boolean>>;
247
- dirtyFields: Partial<Record<keyof TValues, boolean>>;
248
- errors: Partial<Record<keyof TValues, ValidationError>>;
249
- }
250
- /**
251
- * Subscribe to the full form state as a single computed signal.
252
- * Useful for rendering form-level UI (submit button disabled state,
253
- * error summaries, progress indicators).
254
- *
255
- * @example
256
- * const state = useFormState(form)
257
- * // state() => { isSubmitting, isValid, isDirty, errors, ... }
258
- *
259
- * @example
260
- * // Use a selector for fine-grained reactivity
261
- * const canSubmit = useFormState(form, (s) => s.isValid && !s.isSubmitting)
262
- */
263
- declare function useFormState<TValues extends Record<string, unknown>>(form: FormState<TValues>): Computed<FormStateSummary<TValues>>;
264
- declare function useFormState<TValues extends Record<string, unknown>, R>(form: FormState<TValues>, selector: (state: FormStateSummary<TValues>) => R): Computed<R>;
265
- //#endregion
266
- //#region src/use-watch.d.ts
267
- /**
268
- * Watch specific field values reactively. Returns a computed signal
269
- * that re-evaluates when any of the watched fields change.
270
- *
271
- * @example
272
- * // Watch a single field
273
- * const email = useWatch(form, 'email')
274
- * // email() => current email value
275
- *
276
- * @example
277
- * // Watch multiple fields
278
- * const [first, last] = useWatch(form, ['firstName', 'lastName'])
279
- * // first() => firstName value, last() => lastName value
280
- *
281
- * @example
282
- * // Watch all fields
283
- * const all = useWatch(form)
284
- * // all() => { email: '...', password: '...' }
285
- */
286
- declare function useWatch<TValues extends Record<string, unknown>, K extends keyof TValues & string>(form: FormState<TValues>, name: K): Signal<TValues[K]>;
287
- declare function useWatch<TValues extends Record<string, unknown>, K extends (keyof TValues & string)[]>(form: FormState<TValues>, names: K): { [I in keyof K]: Signal<TValues[K[I] & keyof TValues]> };
288
- declare function useWatch<TValues extends Record<string, unknown>>(form: FormState<TValues>): Computed<TValues>;
289
- //#endregion
290
- export { type Accessor, type FieldArrayItem, type FieldRegisterProps, type FieldState, FormProvider, type FormState, type FormStateSummary, type SchemaValidateFn, type UseFieldArrayResult, type UseFieldResult, type UseFormOptions, type ValidateFn, type ValidationError, useField, useFieldArray, useForm, useFormContext, useFormState, useWatch };
291
- //# sourceMappingURL=index2.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index2.d.ts","names":[],"sources":["../../src/types.ts","../../src/context.ts","../../src/use-field.ts","../../src/use-field-array.ts","../../src/use-form.ts","../../src/use-form-state.ts","../../src/use-watch.ts"],"mappings":"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"}