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 +11 -0
- package/dist/main.js +62 -16
- package/dist/main.jsx +68 -19
- package/package.json +1 -1
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,
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
297
|
-
|
|
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
|
-
|
|
350
|
+
setError(name, error);
|
|
311
351
|
} else {
|
|
312
|
-
|
|
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
|
-
|
|
364
|
+
setError(name, error);
|
|
325
365
|
} else {
|
|
326
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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/
|
|
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] =
|
|
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] =
|
|
289
|
-
const { errors, appendError,
|
|
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
|
|
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
|
-
|
|
303
|
-
|
|
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
|
-
|
|
359
|
+
setError(name, error);
|
|
317
360
|
} else {
|
|
318
|
-
|
|
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
|
-
|
|
373
|
+
setError(name, error);
|
|
331
374
|
} else {
|
|
332
|
-
|
|
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
|
};
|