solid-hook-form 2.2.0 → 2.4.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
@@ -29,6 +29,11 @@ type FieldError = {
29
29
  message?: Message;
30
30
  };
31
31
  type FieldErrors<F extends FormValues = FormValues> = Partial<Record<Path<F>, FieldError>>;
32
+ type SetErrorOptions = {
33
+ shouldFocus?: boolean;
34
+ };
35
+ type SetError<F extends FormValues = FormValues> = (name: Path<F>, error: FieldError, options?: SetErrorOptions) => void;
36
+ type ClearErrors<F extends FormValues = FormValues> = (name?: Path<F> | Path<F>[]) => void;
32
37
 
33
38
  type Ref = HTMLElement | null;
34
39
  type RegisterReturn<F extends FormValues> = {
@@ -72,6 +77,8 @@ type ResetOptions = {
72
77
  keepValues?: boolean;
73
78
  keepTouched?: boolean;
74
79
  keepDirty?: boolean;
80
+ keepIsSubmitted?: boolean;
81
+ keepSubmitCount?: boolean;
75
82
  };
76
83
  type Reset<F extends FormValues> = (values?: Partial<F>, options?: ResetOptions) => void;
77
84
 
@@ -108,6 +115,8 @@ type CreateFormReturn<F extends FormValues = FormValues> = {
108
115
  isDirty: Accessor<boolean>;
109
116
  touchedFields: Accessor<TouchedFields<F>>;
110
117
  dirtyFields: Accessor<DirtyFields<F>>;
118
+ isSubmitted: Accessor<boolean>;
119
+ submitCount: Accessor<number>;
111
120
  };
112
121
  values: Accessor<F>;
113
122
  errors: FieldErrors<F>;
@@ -116,6 +125,8 @@ type CreateFormReturn<F extends FormValues = FormValues> = {
116
125
  setValue: SetValue<F>;
117
126
  handleSubmit: HandleSubmit<F>;
118
127
  reset: Reset<F>;
128
+ setError: SetError<F>;
129
+ clearErrors: ClearErrors<F>;
119
130
  trigger: Trigger<F>;
120
131
  };
121
132
  type CreateForm = <F extends FormValues>(arg: CreateFormArg<F>) => CreateFormReturn<F>;
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createContext, createSignal, createMemo, useContext } from 'solid-js';
2
- import { createStore, reconcile, produce } from 'solid-js/store';
2
+ import { createStore, produce, reconcile } from 'solid-js/store';
3
3
  import { memo, createComponent } from 'solid-js/web';
4
4
 
5
5
  // src/create_form.ts
@@ -88,7 +88,7 @@ var createErrors = () => {
88
88
  })
89
89
  );
90
90
  };
91
- const removeError = (name) => {
91
+ const clearError = (name) => {
92
92
  setErrors(
93
93
  produce((prevState) => {
94
94
  delete prevState[name];
@@ -101,12 +101,30 @@ var createErrors = () => {
101
101
  }
102
102
  setErrors(reconcile({}));
103
103
  };
104
+ const clearErrors = (name) => {
105
+ if (!name) {
106
+ resetErrors();
107
+ return;
108
+ }
109
+ if (typeof name === "string") {
110
+ clearError(name);
111
+ return;
112
+ }
113
+ setErrors(
114
+ produce((prevState) => {
115
+ name.forEach((name2) => {
116
+ delete prevState[name2];
117
+ });
118
+ })
119
+ );
120
+ };
104
121
  return {
105
122
  errors,
106
123
  appendError,
107
- removeError,
124
+ clearError,
108
125
  resetErrors,
109
- getError
126
+ getError,
127
+ clearErrors
110
128
  };
111
129
  };
112
130
 
@@ -119,10 +137,14 @@ var createFields = () => {
119
137
  const setField = (name, element) => {
120
138
  fields[name] = element;
121
139
  };
140
+ const focusField = (name) => {
141
+ getField(name)?.focus();
142
+ };
122
143
  return {
123
144
  fields,
124
145
  getField,
125
- setField
146
+ setField,
147
+ focusField
126
148
  };
127
149
  };
128
150
 
@@ -146,6 +168,23 @@ var createRules = () => {
146
168
  };
147
169
  return { rules, addRule, getRule };
148
170
  };
171
+ var createSubmit = () => {
172
+ const [isSubmitted, setIsSubmitted] = createSignal(false);
173
+ const [submitCount, setSubmitCount] = createSignal(0);
174
+ const logSubmit = () => {
175
+ setIsSubmitted(true);
176
+ setSubmitCount((prev) => prev + 1);
177
+ };
178
+ const resetSubmit = (keepIsSubmitted, keepSubmitCount) => {
179
+ if (!keepIsSubmitted) {
180
+ setIsSubmitted(false);
181
+ }
182
+ if (!keepSubmitCount) {
183
+ setSubmitCount(0);
184
+ }
185
+ };
186
+ return { isSubmitted, submitCount, logSubmit, resetSubmit };
187
+ };
149
188
  var createTouchedFields = () => {
150
189
  const [touchedFields, setTouchedFields] = createSignal({});
151
190
  const addTouched = (name) => {
@@ -277,24 +316,25 @@ var getResolverFields = (fields) => {
277
316
  // src/create_form.ts
278
317
  var createForm = (arg) => {
279
318
  const { defaultValues, mode = "onChange", resolver } = arg;
280
- const { fields, getField, setField } = createFields();
319
+ const { fields, getField, setField, focusField } = createFields();
281
320
  const { rules, addRule, getRule } = createRules();
282
321
  const [values, setValues] = createSignal(structuredClone(defaultValues));
283
- const { errors, appendError, removeError, resetErrors, getError } = createErrors();
322
+ const { errors, appendError, clearError, resetErrors, clearErrors, getError } = createErrors();
284
323
  const { touchedFields, addTouched, resetTouched } = createTouchedFields();
285
324
  const { dirtyFields, isDirty, checkDirty, resetDirty } = createDirtyFields(defaultValues);
325
+ const { isSubmitted, submitCount, logSubmit, resetSubmit } = createSubmit();
286
326
  const isValid = createMemo(() => {
287
327
  return !Object.keys(errors).length;
288
328
  });
289
- const setFieldError = (name, error) => {
329
+ const setError = (name, error, options) => {
290
330
  const field = getField(name);
291
331
  if (field) {
292
332
  error.ref = field;
293
333
  }
294
334
  appendError(name, error);
295
- };
296
- const clearFieldError = (name) => {
297
- removeError(name);
335
+ if (options?.shouldFocus) {
336
+ focusField(name);
337
+ }
298
338
  };
299
339
  const runSchema = async (names) => {
300
340
  if (!resolver) {
@@ -307,9 +347,9 @@ var createForm = (arg) => {
307
347
  for (const name of names) {
308
348
  const error = get(result.errors, name);
309
349
  if (error) {
310
- setFieldError(name, error);
350
+ setError(name, error);
311
351
  } else {
312
- clearFieldError(name);
352
+ clearError(name);
313
353
  }
314
354
  }
315
355
  };
@@ -321,9 +361,9 @@ var createForm = (arg) => {
321
361
  const rule = getRule(name);
322
362
  const error = validate(values(), name, rule);
323
363
  if (error) {
324
- setFieldError(name, error);
364
+ setError(name, error);
325
365
  } else {
326
- clearFieldError(name);
366
+ clearError(name);
327
367
  }
328
368
  };
329
369
  const validateAllFields = async () => {
@@ -418,6 +458,7 @@ var createForm = (arg) => {
418
458
  const handleSubmit = (onSubmit, onError) => {
419
459
  return async (event) => {
420
460
  event.preventDefault();
461
+ logSubmit();
421
462
  await validateAllFields();
422
463
  if (isValid()) {
423
464
  onSubmit(getValues());
@@ -428,6 +469,7 @@ var createForm = (arg) => {
428
469
  };
429
470
  };
430
471
  const reset = (values2, options = {}) => {
472
+ resetSubmit(options.keepIsSubmitted, options.keepSubmitCount);
431
473
  resetErrors(options.keepErrors);
432
474
  resetTouched(options.keepTouched);
433
475
  resetDirty(options.keepDirty);
@@ -458,7 +500,9 @@ var createForm = (arg) => {
458
500
  isValid,
459
501
  isDirty,
460
502
  touchedFields,
461
- dirtyFields
503
+ dirtyFields,
504
+ isSubmitted,
505
+ submitCount
462
506
  },
463
507
  values,
464
508
  errors,
@@ -467,6 +511,8 @@ var createForm = (arg) => {
467
511
  setValue,
468
512
  handleSubmit,
469
513
  reset,
514
+ setError,
515
+ clearErrors,
470
516
  trigger
471
517
  };
472
518
  };
package/dist/main.jsx CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/create_form.ts
2
- import { createMemo as createMemo2, createSignal as createSignal3 } from "solid-js";
2
+ import { createMemo as createMemo2, createSignal as createSignal4 } from "solid-js";
3
3
 
4
4
  // src/logic/create_dirty_fields.ts
5
5
  import { createMemo, createSignal } from "solid-js";
@@ -91,7 +91,7 @@ var createErrors = () => {
91
91
  })
92
92
  );
93
93
  };
94
- const removeError = (name) => {
94
+ const clearError = (name) => {
95
95
  setErrors(
96
96
  produce((prevState) => {
97
97
  delete prevState[name];
@@ -104,12 +104,30 @@ var createErrors = () => {
104
104
  }
105
105
  setErrors(reconcile({}));
106
106
  };
107
+ const clearErrors = (name) => {
108
+ if (!name) {
109
+ resetErrors();
110
+ return;
111
+ }
112
+ if (typeof name === "string") {
113
+ clearError(name);
114
+ return;
115
+ }
116
+ setErrors(
117
+ produce((prevState) => {
118
+ name.forEach((name2) => {
119
+ delete prevState[name2];
120
+ });
121
+ })
122
+ );
123
+ };
107
124
  return {
108
125
  errors,
109
126
  appendError,
110
- removeError,
127
+ clearError,
111
128
  resetErrors,
112
- getError
129
+ getError,
130
+ clearErrors
113
131
  };
114
132
  };
115
133
 
@@ -122,10 +140,14 @@ var createFields = () => {
122
140
  const setField = (name, element) => {
123
141
  fields[name] = element;
124
142
  };
143
+ const focusField = (name) => {
144
+ getField(name)?.focus();
145
+ };
125
146
  return {
126
147
  fields,
127
148
  getField,
128
- setField
149
+ setField,
150
+ focusField
129
151
  };
130
152
  };
131
153
 
@@ -150,10 +172,30 @@ var createRules = () => {
150
172
  return { rules, addRule, getRule };
151
173
  };
152
174
 
153
- // src/logic/create_touched_fields.ts
175
+ // src/logic/create_submit.ts
154
176
  import { createSignal as createSignal2 } from "solid-js";
177
+ var createSubmit = () => {
178
+ const [isSubmitted, setIsSubmitted] = createSignal2(false);
179
+ const [submitCount, setSubmitCount] = createSignal2(0);
180
+ const logSubmit = () => {
181
+ setIsSubmitted(true);
182
+ setSubmitCount((prev) => prev + 1);
183
+ };
184
+ const resetSubmit = (keepIsSubmitted, keepSubmitCount) => {
185
+ if (!keepIsSubmitted) {
186
+ setIsSubmitted(false);
187
+ }
188
+ if (!keepSubmitCount) {
189
+ setSubmitCount(0);
190
+ }
191
+ };
192
+ return { isSubmitted, submitCount, logSubmit, resetSubmit };
193
+ };
194
+
195
+ // src/logic/create_touched_fields.ts
196
+ import { createSignal as createSignal3 } from "solid-js";
155
197
  var createTouchedFields = () => {
156
- const [touchedFields, setTouchedFields] = createSignal2({});
198
+ const [touchedFields, setTouchedFields] = createSignal3({});
157
199
  const addTouched = (name) => {
158
200
  setTouchedFields((prev) => {
159
201
  const newState = { ...prev };
@@ -283,24 +325,25 @@ var getResolverFields = (fields) => {
283
325
  // src/create_form.ts
284
326
  var createForm = (arg) => {
285
327
  const { defaultValues, mode = "onChange", resolver } = arg;
286
- const { fields, getField, setField } = createFields();
328
+ const { fields, getField, setField, focusField } = createFields();
287
329
  const { rules, addRule, getRule } = createRules();
288
- const [values, setValues] = createSignal3(structuredClone(defaultValues));
289
- const { errors, appendError, removeError, resetErrors, getError } = createErrors();
330
+ const [values, setValues] = createSignal4(structuredClone(defaultValues));
331
+ const { errors, appendError, clearError, resetErrors, clearErrors, getError } = createErrors();
290
332
  const { touchedFields, addTouched, resetTouched } = createTouchedFields();
291
333
  const { dirtyFields, isDirty, checkDirty, resetDirty } = createDirtyFields(defaultValues);
334
+ const { isSubmitted, submitCount, logSubmit, resetSubmit } = createSubmit();
292
335
  const isValid = createMemo2(() => {
293
336
  return !Object.keys(errors).length;
294
337
  });
295
- const setFieldError = (name, error) => {
338
+ const setError = (name, error, options) => {
296
339
  const field = getField(name);
297
340
  if (field) {
298
341
  error.ref = field;
299
342
  }
300
343
  appendError(name, error);
301
- };
302
- const clearFieldError = (name) => {
303
- removeError(name);
344
+ if (options?.shouldFocus) {
345
+ focusField(name);
346
+ }
304
347
  };
305
348
  const runSchema = async (names) => {
306
349
  if (!resolver) {
@@ -313,9 +356,9 @@ var createForm = (arg) => {
313
356
  for (const name of names) {
314
357
  const error = get(result.errors, name);
315
358
  if (error) {
316
- setFieldError(name, error);
359
+ setError(name, error);
317
360
  } else {
318
- clearFieldError(name);
361
+ clearError(name);
319
362
  }
320
363
  }
321
364
  };
@@ -327,9 +370,9 @@ var createForm = (arg) => {
327
370
  const rule = getRule(name);
328
371
  const error = validate(values(), name, rule);
329
372
  if (error) {
330
- setFieldError(name, error);
373
+ setError(name, error);
331
374
  } else {
332
- clearFieldError(name);
375
+ clearError(name);
333
376
  }
334
377
  };
335
378
  const validateAllFields = async () => {
@@ -424,6 +467,7 @@ var createForm = (arg) => {
424
467
  const handleSubmit = (onSubmit, onError) => {
425
468
  return async (event) => {
426
469
  event.preventDefault();
470
+ logSubmit();
427
471
  await validateAllFields();
428
472
  if (isValid()) {
429
473
  onSubmit(getValues());
@@ -434,6 +478,7 @@ var createForm = (arg) => {
434
478
  };
435
479
  };
436
480
  const reset = (values2, options = {}) => {
481
+ resetSubmit(options.keepIsSubmitted, options.keepSubmitCount);
437
482
  resetErrors(options.keepErrors);
438
483
  resetTouched(options.keepTouched);
439
484
  resetDirty(options.keepDirty);
@@ -464,7 +509,9 @@ var createForm = (arg) => {
464
509
  isValid,
465
510
  isDirty,
466
511
  touchedFields,
467
- dirtyFields
512
+ dirtyFields,
513
+ isSubmitted,
514
+ submitCount
468
515
  },
469
516
  values,
470
517
  errors,
@@ -473,6 +520,8 @@ var createForm = (arg) => {
473
520
  setValue,
474
521
  handleSubmit,
475
522
  reset,
523
+ setError,
524
+ clearErrors,
476
525
  trigger
477
526
  };
478
527
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "solid-hook-form",
3
- "version": "2.2.0",
3
+ "version": "2.4.0",
4
4
  "type": "module",
5
5
  "main": "./dist/main.js",
6
6
  "module": "./dist/main.js",