solid-hook-form 1.9.4 → 1.10.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.
package/dist/main.d.ts CHANGED
@@ -36,6 +36,7 @@ type RegisterReturn<F extends FormValues> = {
36
36
  ref(ref: Ref): void;
37
37
  onInput(event: Event | unknown): void;
38
38
  onChange(event: Event | unknown): void;
39
+ onBlur(event: FocusEvent | unknown): void;
39
40
  };
40
41
  type Register<F extends FormValues> = (name: Path<F>, options?: Rules<F, Path<F>>) => RegisterReturn<F>;
41
42
 
@@ -65,18 +66,24 @@ type ControllerProps<F extends FormValues> = {
65
66
  render(arg: UseControllerReturn<F>): JSXElement;
66
67
  };
67
68
 
69
+ type TouchedFields<F extends FormValues = FormValues> = Partial<Record<Path<F>, boolean>>;
70
+
68
71
  type FormValues = Record<string, any>;
69
72
  type GetValues<F extends FormValues> = {
70
73
  (): F;
71
74
  <N extends FieldPath<F>>(name: N): FieldPathValue<F, N>;
72
75
  };
73
76
  type SetValue<F extends FormValues> = (name: Path<F>, value: FieldPathValue<F, Path<F>>) => void;
74
- type SubmitCallback<F extends FormValues> = (values: F) => void;
75
- type OnSubmit<F extends FormValues> = (submit: SubmitCallback<F>) => (event: SubmitEvent) => void;
76
- type Reset<F extends FormValues> = (newDefaultValues?: Partial<F>) => void;
77
+ type SubmitHandler<F extends FormValues> = (values: F) => void;
78
+ type SubmitErrorHandler<F extends FormValues> = (errors: FieldErrors<F>) => void;
79
+ type HandleSubmit<F extends FormValues> = (onSubmit: SubmitHandler<F>, onError?: SubmitErrorHandler<F>) => (event: SubmitEvent) => void;
80
+ type ResetOptions = {
81
+ keepTouched?: boolean;
82
+ };
83
+ type Reset<F extends FormValues> = (newDefaultValues?: Partial<F>, options?: ResetOptions) => void;
77
84
  type CreateFormArg<F extends FormValues> = {
78
85
  defaultValues: F;
79
- mode?: "onChange" | "onSubmit";
86
+ mode?: "onChange" | "onSubmit" | "onBlur";
80
87
  resolver?: Resolver<F>;
81
88
  };
82
89
  type CreateFormReturn<F extends FormValues = FormValues> = {
@@ -84,6 +91,7 @@ type CreateFormReturn<F extends FormValues = FormValues> = {
84
91
  formState: {
85
92
  errors: Accessor<FieldErrors<F>>;
86
93
  isValid: Accessor<boolean>;
94
+ touchedFields: Accessor<TouchedFields<F>>;
87
95
  };
88
96
  values: Accessor<F>;
89
97
  errors: Accessor<FieldErrors<F>>;
@@ -91,8 +99,8 @@ type CreateFormReturn<F extends FormValues = FormValues> = {
91
99
  register: Register<F>;
92
100
  getValues: GetValues<F>;
93
101
  setValue: SetValue<F>;
94
- onSubmit: OnSubmit<F>;
95
- handleSubmit: OnSubmit<F>;
102
+ onSubmit: HandleSubmit<F>;
103
+ handleSubmit: HandleSubmit<F>;
96
104
  reset: Reset<F>;
97
105
  };
98
106
  type CreateForm = <F extends FormValues>(arg?: CreateFormArg<F>) => CreateFormReturn<F>;
@@ -114,4 +122,4 @@ declare const get: (object: any, path: string, defaultValue?: unknown) => any;
114
122
 
115
123
  declare const set: (object: FormValues, path: string, value: unknown) => void;
116
124
 
117
- export { type Control, Controller, type CreateFormArg, type CreateFormReturn, type FieldError, type FieldErrors, FormProvider, type FormValues, type Rules, type UseControllerArg, type UseControllerReturn, createForm, get, set, useController, createForm as useForm, useFormContext };
125
+ export { type Control, Controller, type CreateFormArg, type CreateFormReturn, type FieldError, type FieldErrors, FormProvider, type FormValues, type Rules, type SubmitErrorHandler, type SubmitHandler, type UseControllerArg, type UseControllerReturn, createForm, get, set, useController, createForm as useForm, useFormContext };
package/dist/main.js CHANGED
@@ -213,6 +213,23 @@ var getResolverFields = (fields) => {
213
213
  return acc;
214
214
  }, {});
215
215
  };
216
+ var createTouched = () => {
217
+ const [touchedFields, setTouchedFields] = createSignal({});
218
+ const addTouched = (name) => {
219
+ setTouchedFields((prev) => {
220
+ const newState = { ...prev };
221
+ set(newState, name, true);
222
+ return newState;
223
+ });
224
+ };
225
+ const resetTouched = (keepTouched) => {
226
+ if (keepTouched) {
227
+ return;
228
+ }
229
+ setTouchedFields({});
230
+ };
231
+ return { touchedFields, addTouched, resetTouched };
232
+ };
216
233
 
217
234
  // src/create_form.ts
218
235
  var createForm = (arg = { defaultValues: {} }) => {
@@ -221,6 +238,7 @@ var createForm = (arg = { defaultValues: {} }) => {
221
238
  const { rules, addRule, getRule } = createRules();
222
239
  const [values, setValues] = createSignal(defaultValues);
223
240
  const { errors, appendError, removeError, resetErrors, getError } = createErrors();
241
+ const { touchedFields, addTouched, resetTouched } = createTouched();
224
242
  const isValid = createMemo(() => {
225
243
  return !Object.keys(errors()).length;
226
244
  });
@@ -306,6 +324,12 @@ var createForm = (arg = { defaultValues: {} }) => {
306
324
  onFieldChange(event, name);
307
325
  }
308
326
  },
327
+ onBlur(event) {
328
+ if (mode === "onBlur") {
329
+ onFieldChange(event, name);
330
+ }
331
+ addTouched(name);
332
+ },
309
333
  ref(element) {
310
334
  const field = getField(name);
311
335
  if (field) {
@@ -340,23 +364,26 @@ var createForm = (arg = { defaultValues: {} }) => {
340
364
  setFieldValue(field, value);
341
365
  }
342
366
  };
343
- const onSubmit = (submit) => {
367
+ const handleSubmit = (onSubmit, onError) => {
344
368
  return async (event) => {
345
369
  event.preventDefault();
346
370
  await validateAllFields();
347
371
  if (isValid()) {
348
- submit(getValues());
372
+ onSubmit(getValues());
373
+ return;
349
374
  }
375
+ onError?.(errors());
350
376
  focusFirstError();
351
377
  };
352
378
  };
353
- const reset = (newDefaultValues = {}) => {
379
+ const reset = (newDefaultValues = {}, options = {}) => {
354
380
  const newValues = {
355
381
  ...structuredClone(defaultValues),
356
382
  ...newDefaultValues
357
383
  };
358
384
  setValues(() => newValues);
359
385
  resetErrors();
386
+ resetTouched(options.keepTouched);
360
387
  Object.entries(fields).forEach(([name, field]) => {
361
388
  if (field) {
362
389
  setFieldValue(field, get(newValues, name));
@@ -367,7 +394,8 @@ var createForm = (arg = { defaultValues: {} }) => {
367
394
  control,
368
395
  formState: {
369
396
  errors,
370
- isValid
397
+ isValid,
398
+ touchedFields
371
399
  },
372
400
  values,
373
401
  errors,
@@ -375,8 +403,8 @@ var createForm = (arg = { defaultValues: {} }) => {
375
403
  register,
376
404
  getValues,
377
405
  setValue,
378
- onSubmit,
379
- handleSubmit: onSubmit,
406
+ onSubmit: handleSubmit,
407
+ handleSubmit,
380
408
  reset
381
409
  };
382
410
  };
package/dist/main.jsx CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/create_form.ts
2
- import { createMemo, createSignal as createSignal2 } from "solid-js";
2
+ import { createMemo, createSignal as createSignal3 } from "solid-js";
3
3
 
4
4
  // src/logic/get_value.ts
5
5
  var getFieldValue = (event) => {
@@ -215,13 +215,34 @@ var getResolverFields = (fields) => {
215
215
  }, {});
216
216
  };
217
217
 
218
+ // src/logic/create_touched.ts
219
+ import { createSignal as createSignal2 } from "solid-js";
220
+ var createTouched = () => {
221
+ const [touchedFields, setTouchedFields] = createSignal2({});
222
+ const addTouched = (name) => {
223
+ setTouchedFields((prev) => {
224
+ const newState = { ...prev };
225
+ set(newState, name, true);
226
+ return newState;
227
+ });
228
+ };
229
+ const resetTouched = (keepTouched) => {
230
+ if (keepTouched) {
231
+ return;
232
+ }
233
+ setTouchedFields({});
234
+ };
235
+ return { touchedFields, addTouched, resetTouched };
236
+ };
237
+
218
238
  // src/create_form.ts
219
239
  var createForm = (arg = { defaultValues: {} }) => {
220
240
  const { defaultValues, mode = "onChange", resolver } = arg;
221
241
  const { fields, getField, setField } = createFields();
222
242
  const { rules, addRule, getRule } = createRules();
223
- const [values, setValues] = createSignal2(defaultValues);
243
+ const [values, setValues] = createSignal3(defaultValues);
224
244
  const { errors, appendError, removeError, resetErrors, getError } = createErrors();
245
+ const { touchedFields, addTouched, resetTouched } = createTouched();
225
246
  const isValid = createMemo(() => {
226
247
  return !Object.keys(errors()).length;
227
248
  });
@@ -307,6 +328,12 @@ var createForm = (arg = { defaultValues: {} }) => {
307
328
  onFieldChange(event, name);
308
329
  }
309
330
  },
331
+ onBlur(event) {
332
+ if (mode === "onBlur") {
333
+ onFieldChange(event, name);
334
+ }
335
+ addTouched(name);
336
+ },
310
337
  ref(element) {
311
338
  const field = getField(name);
312
339
  if (field) {
@@ -341,23 +368,26 @@ var createForm = (arg = { defaultValues: {} }) => {
341
368
  setFieldValue(field, value);
342
369
  }
343
370
  };
344
- const onSubmit = (submit) => {
371
+ const handleSubmit = (onSubmit, onError) => {
345
372
  return async (event) => {
346
373
  event.preventDefault();
347
374
  await validateAllFields();
348
375
  if (isValid()) {
349
- submit(getValues());
376
+ onSubmit(getValues());
377
+ return;
350
378
  }
379
+ onError?.(errors());
351
380
  focusFirstError();
352
381
  };
353
382
  };
354
- const reset = (newDefaultValues = {}) => {
383
+ const reset = (newDefaultValues = {}, options = {}) => {
355
384
  const newValues = {
356
385
  ...structuredClone(defaultValues),
357
386
  ...newDefaultValues
358
387
  };
359
388
  setValues(() => newValues);
360
389
  resetErrors();
390
+ resetTouched(options.keepTouched);
361
391
  Object.entries(fields).forEach(([name, field]) => {
362
392
  if (field) {
363
393
  setFieldValue(field, get(newValues, name));
@@ -368,7 +398,8 @@ var createForm = (arg = { defaultValues: {} }) => {
368
398
  control,
369
399
  formState: {
370
400
  errors,
371
- isValid
401
+ isValid,
402
+ touchedFields
372
403
  },
373
404
  values,
374
405
  errors,
@@ -376,8 +407,8 @@ var createForm = (arg = { defaultValues: {} }) => {
376
407
  register,
377
408
  getValues,
378
409
  setValue,
379
- onSubmit,
380
- handleSubmit: onSubmit,
410
+ onSubmit: handleSubmit,
411
+ handleSubmit,
381
412
  reset
382
413
  };
383
414
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "solid-hook-form",
3
- "version": "1.9.4",
3
+ "version": "1.10.0",
4
4
  "type": "module",
5
5
  "main": "./dist/main.js",
6
6
  "module": "./dist/main.js",