@valfuse-node/form 0.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.
- package/README.md +578 -0
- package/dist/index.d.mts +554 -0
- package/dist/index.d.ts +554 -0
- package/dist/index.js +641 -0
- package/dist/index.mjs +583 -0
- package/package.json +32 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,641 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
clearFieldErrors: () => clearFieldErrors,
|
|
24
|
+
computeDirtyFields: () => computeDirtyFields,
|
|
25
|
+
computeIsDirty: () => computeIsDirty,
|
|
26
|
+
createErrorsState: () => createErrorsState,
|
|
27
|
+
createSchema: () => createSchema,
|
|
28
|
+
createSubmissionState: () => createSubmissionState,
|
|
29
|
+
createTouchedState: () => createTouchedState,
|
|
30
|
+
createValuesState: () => createValuesState,
|
|
31
|
+
endSubmitFailure: () => endSubmitFailure,
|
|
32
|
+
endSubmitSuccess: () => endSubmitSuccess,
|
|
33
|
+
getFieldError: () => getFieldError,
|
|
34
|
+
getValue: () => getValue,
|
|
35
|
+
getValues: () => getValues,
|
|
36
|
+
hasErrors: () => hasErrors,
|
|
37
|
+
isFieldDirty: () => isFieldDirty,
|
|
38
|
+
isTouched: () => isTouched,
|
|
39
|
+
markTouched: () => markTouched,
|
|
40
|
+
markUntouched: () => markUntouched,
|
|
41
|
+
normalizeError: () => normalizeError,
|
|
42
|
+
resetErrors: () => resetErrors,
|
|
43
|
+
resetSubmission: () => resetSubmission,
|
|
44
|
+
resetTouched: () => resetTouched,
|
|
45
|
+
resetValues: () => resetValues,
|
|
46
|
+
setErrors: () => setErrors,
|
|
47
|
+
setFieldError: () => setFieldError,
|
|
48
|
+
startSubmit: () => startSubmit,
|
|
49
|
+
t: () => t,
|
|
50
|
+
toFormErrors: () => toFormErrors,
|
|
51
|
+
toTouchedFieldsRecord: () => toTouchedFieldsRecord,
|
|
52
|
+
transformValues: () => transformValues,
|
|
53
|
+
updateValue: () => updateValue,
|
|
54
|
+
validateSchema: () => validateSchema
|
|
55
|
+
});
|
|
56
|
+
module.exports = __toCommonJS(index_exports);
|
|
57
|
+
|
|
58
|
+
// src/schema/create-schema.ts
|
|
59
|
+
function createSchema(definition) {
|
|
60
|
+
return definition;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/rules/string.rule.ts
|
|
64
|
+
var EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
65
|
+
var URL_REGEX = /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)$/;
|
|
66
|
+
var UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
67
|
+
function toRegExp(regexValue) {
|
|
68
|
+
if (regexValue instanceof RegExp) {
|
|
69
|
+
return regexValue;
|
|
70
|
+
}
|
|
71
|
+
return new RegExp(regexValue.pattern, regexValue.flags);
|
|
72
|
+
}
|
|
73
|
+
function validateStringRule(value, rule) {
|
|
74
|
+
const stringValue = typeof value === "string" ? value : "";
|
|
75
|
+
switch (rule.name) {
|
|
76
|
+
case "required":
|
|
77
|
+
if (!value || stringValue.trim() === "") {
|
|
78
|
+
return rule.error;
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
81
|
+
case "min":
|
|
82
|
+
if (stringValue.length < rule.value) {
|
|
83
|
+
return rule.error;
|
|
84
|
+
}
|
|
85
|
+
break;
|
|
86
|
+
case "max":
|
|
87
|
+
if (stringValue.length > rule.value) {
|
|
88
|
+
return rule.error;
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
case "length":
|
|
92
|
+
if (stringValue.length !== rule.value) {
|
|
93
|
+
return rule.error;
|
|
94
|
+
}
|
|
95
|
+
break;
|
|
96
|
+
case "email":
|
|
97
|
+
if (!EMAIL_REGEX.test(stringValue)) {
|
|
98
|
+
return rule.error;
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
case "url":
|
|
102
|
+
if (!URL_REGEX.test(stringValue)) {
|
|
103
|
+
return rule.error;
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
case "uuid":
|
|
107
|
+
if (!UUID_REGEX.test(stringValue)) {
|
|
108
|
+
return rule.error;
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
case "regex": {
|
|
112
|
+
const builtRegex = toRegExp(rule.value);
|
|
113
|
+
if (!builtRegex.test(stringValue)) {
|
|
114
|
+
return rule.error;
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
case "includes":
|
|
119
|
+
if (!stringValue.includes(rule.value)) {
|
|
120
|
+
return rule.error;
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
123
|
+
case "startsWith":
|
|
124
|
+
if (!stringValue.startsWith(rule.value)) {
|
|
125
|
+
return rule.error;
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
case "endsWith":
|
|
129
|
+
if (!stringValue.endsWith(rule.value)) {
|
|
130
|
+
return rule.error;
|
|
131
|
+
}
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// src/rules/number.rule.ts
|
|
138
|
+
function validateNumberRule(value, rule) {
|
|
139
|
+
const numericValue = typeof value === "number" ? value : NaN;
|
|
140
|
+
const hasNumericValue = value !== null && value !== void 0 && value !== "" && !isNaN(numericValue);
|
|
141
|
+
switch (rule.name) {
|
|
142
|
+
case "required":
|
|
143
|
+
if (value === null || value === void 0 || value === "" || isNaN(numericValue)) {
|
|
144
|
+
return rule.error;
|
|
145
|
+
}
|
|
146
|
+
break;
|
|
147
|
+
case "min":
|
|
148
|
+
if (hasNumericValue && numericValue < rule.value) {
|
|
149
|
+
return rule.error;
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
case "max":
|
|
153
|
+
if (hasNumericValue && numericValue > rule.value) {
|
|
154
|
+
return rule.error;
|
|
155
|
+
}
|
|
156
|
+
break;
|
|
157
|
+
case "gt":
|
|
158
|
+
if (hasNumericValue && numericValue <= rule.value) {
|
|
159
|
+
return rule.error;
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
case "gte":
|
|
163
|
+
if (hasNumericValue && numericValue < rule.value) {
|
|
164
|
+
return rule.error;
|
|
165
|
+
}
|
|
166
|
+
break;
|
|
167
|
+
case "lt":
|
|
168
|
+
if (hasNumericValue && numericValue >= rule.value) {
|
|
169
|
+
return rule.error;
|
|
170
|
+
}
|
|
171
|
+
break;
|
|
172
|
+
case "lte":
|
|
173
|
+
if (hasNumericValue && numericValue > rule.value) {
|
|
174
|
+
return rule.error;
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
|
+
case "int":
|
|
178
|
+
if (hasNumericValue && !Number.isInteger(numericValue)) {
|
|
179
|
+
return rule.error;
|
|
180
|
+
}
|
|
181
|
+
break;
|
|
182
|
+
case "positive":
|
|
183
|
+
if (hasNumericValue && numericValue <= 0) {
|
|
184
|
+
return rule.error;
|
|
185
|
+
}
|
|
186
|
+
break;
|
|
187
|
+
case "nonnegative":
|
|
188
|
+
if (hasNumericValue && numericValue < 0) {
|
|
189
|
+
return rule.error;
|
|
190
|
+
}
|
|
191
|
+
break;
|
|
192
|
+
case "negative":
|
|
193
|
+
if (hasNumericValue && numericValue >= 0) {
|
|
194
|
+
return rule.error;
|
|
195
|
+
}
|
|
196
|
+
break;
|
|
197
|
+
case "nonpositive":
|
|
198
|
+
if (hasNumericValue && numericValue > 0) {
|
|
199
|
+
return rule.error;
|
|
200
|
+
}
|
|
201
|
+
break;
|
|
202
|
+
case "multipleOf":
|
|
203
|
+
if (hasNumericValue && numericValue % rule.value !== 0) {
|
|
204
|
+
return rule.error;
|
|
205
|
+
}
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// src/rules/boolean.rule.ts
|
|
212
|
+
function validateBooleanRule(value, rule) {
|
|
213
|
+
const isValuePresent = value !== null && value !== void 0;
|
|
214
|
+
switch (rule.name) {
|
|
215
|
+
case "required":
|
|
216
|
+
if (!isValuePresent) {
|
|
217
|
+
return rule.error;
|
|
218
|
+
}
|
|
219
|
+
break;
|
|
220
|
+
case "literal":
|
|
221
|
+
if (isValuePresent && value !== rule.value) {
|
|
222
|
+
return rule.error;
|
|
223
|
+
}
|
|
224
|
+
break;
|
|
225
|
+
case "accepted":
|
|
226
|
+
if (!value) {
|
|
227
|
+
return rule.error;
|
|
228
|
+
}
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// src/rules/array.rule.ts
|
|
235
|
+
function validateArrayRule(value, rule) {
|
|
236
|
+
const parsedArray = Array.isArray(value) ? value : null;
|
|
237
|
+
const isValuePresent = value !== null && value !== void 0;
|
|
238
|
+
switch (rule.name) {
|
|
239
|
+
case "required":
|
|
240
|
+
if (!isValuePresent || !parsedArray) {
|
|
241
|
+
return rule.error;
|
|
242
|
+
}
|
|
243
|
+
break;
|
|
244
|
+
case "min":
|
|
245
|
+
if (parsedArray && parsedArray.length < rule.value) {
|
|
246
|
+
return rule.error;
|
|
247
|
+
}
|
|
248
|
+
break;
|
|
249
|
+
case "max":
|
|
250
|
+
if (parsedArray && parsedArray.length > rule.value) {
|
|
251
|
+
return rule.error;
|
|
252
|
+
}
|
|
253
|
+
break;
|
|
254
|
+
case "length":
|
|
255
|
+
if (parsedArray && parsedArray.length !== rule.value) {
|
|
256
|
+
return rule.error;
|
|
257
|
+
}
|
|
258
|
+
break;
|
|
259
|
+
case "nonempty":
|
|
260
|
+
if (!parsedArray || parsedArray.length === 0) {
|
|
261
|
+
return rule.error;
|
|
262
|
+
}
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// src/rules/object.rule.ts
|
|
269
|
+
function validateObjectRule(value, rule) {
|
|
270
|
+
switch (rule.name) {
|
|
271
|
+
case "required":
|
|
272
|
+
if (value === null || value === void 0) {
|
|
273
|
+
return rule.error;
|
|
274
|
+
}
|
|
275
|
+
break;
|
|
276
|
+
case "shape":
|
|
277
|
+
if (value !== null && value !== void 0) {
|
|
278
|
+
if (typeof value !== "object" || Array.isArray(value)) {
|
|
279
|
+
return rule.error;
|
|
280
|
+
}
|
|
281
|
+
const obj = value;
|
|
282
|
+
for (const [k, expected] of Object.entries(rule.value)) {
|
|
283
|
+
if (obj[k] !== expected) {
|
|
284
|
+
return rule.error;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// src/rules/generic.rule.ts
|
|
294
|
+
var GENERIC_RULE_NAMES = /* @__PURE__ */ new Set([
|
|
295
|
+
"custom",
|
|
296
|
+
"refine",
|
|
297
|
+
"matchField",
|
|
298
|
+
"oneOf",
|
|
299
|
+
"notOneOf"
|
|
300
|
+
]);
|
|
301
|
+
function isGenericRule(rule) {
|
|
302
|
+
return GENERIC_RULE_NAMES.has(rule.name);
|
|
303
|
+
}
|
|
304
|
+
function validateGenericRule(value, rule, allValues) {
|
|
305
|
+
switch (rule.name) {
|
|
306
|
+
case "custom":
|
|
307
|
+
case "refine":
|
|
308
|
+
if (!rule.validate(value, allValues)) return rule.error;
|
|
309
|
+
break;
|
|
310
|
+
case "matchField":
|
|
311
|
+
if (value !== allValues[rule.value]) return rule.error;
|
|
312
|
+
break;
|
|
313
|
+
case "oneOf":
|
|
314
|
+
if (!rule.value.includes(value)) return rule.error;
|
|
315
|
+
break;
|
|
316
|
+
case "notOneOf":
|
|
317
|
+
if (rule.value.includes(value)) return rule.error;
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// src/validation/validate-schema.ts
|
|
324
|
+
function validateSchema(schema, values) {
|
|
325
|
+
const fieldErrors = {};
|
|
326
|
+
for (const [fieldName, fieldSchema] of Object.entries(schema)) {
|
|
327
|
+
const fieldValue = values[fieldName];
|
|
328
|
+
for (const rule of fieldSchema.rules) {
|
|
329
|
+
let ruleError = null;
|
|
330
|
+
if (isGenericRule(rule)) {
|
|
331
|
+
ruleError = validateGenericRule(fieldValue, rule, values);
|
|
332
|
+
} else {
|
|
333
|
+
switch (fieldSchema.type) {
|
|
334
|
+
case "string":
|
|
335
|
+
ruleError = validateStringRule(fieldValue, rule);
|
|
336
|
+
break;
|
|
337
|
+
case "number":
|
|
338
|
+
ruleError = validateNumberRule(fieldValue, rule);
|
|
339
|
+
break;
|
|
340
|
+
case "boolean":
|
|
341
|
+
ruleError = validateBooleanRule(fieldValue, rule);
|
|
342
|
+
break;
|
|
343
|
+
case "array":
|
|
344
|
+
ruleError = validateArrayRule(fieldValue, rule);
|
|
345
|
+
break;
|
|
346
|
+
case "object":
|
|
347
|
+
ruleError = validateObjectRule(fieldValue, rule);
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (ruleError) {
|
|
352
|
+
fieldErrors[fieldName] = ruleError;
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return fieldErrors;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// src/transformation/transform-values.ts
|
|
361
|
+
function transformValues(schema, values) {
|
|
362
|
+
const result = { ...values };
|
|
363
|
+
for (const [field, fieldSchema] of Object.entries(schema)) {
|
|
364
|
+
if (typeof fieldSchema.transform === "function" && field in result) {
|
|
365
|
+
result[field] = fieldSchema.transform(result[field]);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return result;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// src/errors/normalize-error.ts
|
|
372
|
+
function normalizeError(error) {
|
|
373
|
+
if (typeof error === "string") {
|
|
374
|
+
return { message: error };
|
|
375
|
+
}
|
|
376
|
+
return error;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// src/shared/transformers.ts
|
|
380
|
+
var trim = (v) => typeof v === "string" ? v.trim() : v;
|
|
381
|
+
var trimStart = (v) => typeof v === "string" ? v.trimStart() : v;
|
|
382
|
+
var trimEnd = (v) => typeof v === "string" ? v.trimEnd() : v;
|
|
383
|
+
var toLowerCase = (v) => typeof v === "string" ? v.toLowerCase() : v;
|
|
384
|
+
var toUpperCase = (v) => typeof v === "string" ? v.toUpperCase() : v;
|
|
385
|
+
var toTitleCase = (v) => typeof v === "string" ? v.replace(/\b\w/g, (c) => c.toUpperCase()) : v;
|
|
386
|
+
var toSentenceCase = (v) => typeof v === "string" && v.length > 0 ? v.charAt(0).toUpperCase() + v.slice(1).toLowerCase() : v;
|
|
387
|
+
var collapseSpaces = (v) => typeof v === "string" ? v.replace(/\s+/g, " ") : v;
|
|
388
|
+
var toNumber = (v) => {
|
|
389
|
+
const coerced = Number(v);
|
|
390
|
+
return Number.isNaN(coerced) ? v : coerced;
|
|
391
|
+
};
|
|
392
|
+
var toInteger = (v) => {
|
|
393
|
+
const coerced = parseInt(String(v), 10);
|
|
394
|
+
return Number.isNaN(coerced) ? v : coerced;
|
|
395
|
+
};
|
|
396
|
+
var toFloat = (v) => {
|
|
397
|
+
const coerced = parseFloat(String(v));
|
|
398
|
+
return Number.isNaN(coerced) ? v : coerced;
|
|
399
|
+
};
|
|
400
|
+
var toBoolean = (v) => v === true || v === "true" || v === 1 || v === "1";
|
|
401
|
+
function pipe(...fns) {
|
|
402
|
+
return (v) => fns.reduce((acc, fn) => fn(acc), v);
|
|
403
|
+
}
|
|
404
|
+
var t = {
|
|
405
|
+
// String
|
|
406
|
+
trim,
|
|
407
|
+
trimStart,
|
|
408
|
+
trimEnd,
|
|
409
|
+
toLowerCase,
|
|
410
|
+
toUpperCase,
|
|
411
|
+
toTitleCase,
|
|
412
|
+
toSentenceCase,
|
|
413
|
+
collapseSpaces,
|
|
414
|
+
// Coercion
|
|
415
|
+
toNumber,
|
|
416
|
+
toInteger,
|
|
417
|
+
toFloat,
|
|
418
|
+
toBoolean,
|
|
419
|
+
// Composition
|
|
420
|
+
pipe
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
// src/state/values.ts
|
|
424
|
+
function createValuesState(defaultValues) {
|
|
425
|
+
return {
|
|
426
|
+
values: { ...defaultValues },
|
|
427
|
+
defaultValues: { ...defaultValues }
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
function updateValue(state, key, value) {
|
|
431
|
+
return {
|
|
432
|
+
...state,
|
|
433
|
+
values: { ...state.values, [key]: value }
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
function resetValues(state, newValues) {
|
|
437
|
+
return {
|
|
438
|
+
values: { ...state.defaultValues, ...newValues },
|
|
439
|
+
defaultValues: state.defaultValues
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
function computeIsDirty(state) {
|
|
443
|
+
return Object.keys(state.defaultValues).some(
|
|
444
|
+
(key) => state.values[key] !== state.defaultValues[key]
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
function computeDirtyFields(state) {
|
|
448
|
+
const dirty = {};
|
|
449
|
+
for (const key of Object.keys(state.defaultValues)) {
|
|
450
|
+
if (state.values[key] !== state.defaultValues[key]) {
|
|
451
|
+
dirty[key] = true;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return dirty;
|
|
455
|
+
}
|
|
456
|
+
function isFieldDirty(state, key) {
|
|
457
|
+
return state.values[key] !== state.defaultValues[key];
|
|
458
|
+
}
|
|
459
|
+
function getValue(state, name) {
|
|
460
|
+
return state.values[name];
|
|
461
|
+
}
|
|
462
|
+
function getValues(state) {
|
|
463
|
+
return { ...state.values };
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// src/state/touched.ts
|
|
467
|
+
function createTouchedState() {
|
|
468
|
+
return {
|
|
469
|
+
touchedFields: /* @__PURE__ */ new Set()
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
function markTouched(state, name) {
|
|
473
|
+
if (state.touchedFields.has(name)) {
|
|
474
|
+
return state;
|
|
475
|
+
}
|
|
476
|
+
const newTouched = new Set(state.touchedFields);
|
|
477
|
+
newTouched.add(name);
|
|
478
|
+
return { touchedFields: newTouched };
|
|
479
|
+
}
|
|
480
|
+
function markUntouched(state, name) {
|
|
481
|
+
if (!state.touchedFields.has(name)) {
|
|
482
|
+
return state;
|
|
483
|
+
}
|
|
484
|
+
const newTouched = new Set(state.touchedFields);
|
|
485
|
+
newTouched.delete(name);
|
|
486
|
+
return { touchedFields: newTouched };
|
|
487
|
+
}
|
|
488
|
+
function resetTouched() {
|
|
489
|
+
return { touchedFields: /* @__PURE__ */ new Set() };
|
|
490
|
+
}
|
|
491
|
+
function isTouched(state, name) {
|
|
492
|
+
return state.touchedFields.has(name);
|
|
493
|
+
}
|
|
494
|
+
function toTouchedFieldsRecord(state) {
|
|
495
|
+
const record = {};
|
|
496
|
+
for (const field of state.touchedFields) {
|
|
497
|
+
record[field] = true;
|
|
498
|
+
}
|
|
499
|
+
return record;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
// src/state/errors.ts
|
|
503
|
+
function createErrorsState() {
|
|
504
|
+
return { errors: {} };
|
|
505
|
+
}
|
|
506
|
+
function setErrors(state, fieldErrors) {
|
|
507
|
+
const newErrors = { ...state.errors };
|
|
508
|
+
let changed = false;
|
|
509
|
+
for (const [field, error] of Object.entries(fieldErrors)) {
|
|
510
|
+
if (error === void 0) {
|
|
511
|
+
if (field in newErrors) {
|
|
512
|
+
delete newErrors[field];
|
|
513
|
+
changed = true;
|
|
514
|
+
}
|
|
515
|
+
} else {
|
|
516
|
+
if (newErrors[field]?.message !== error.message || newErrors[field]?.type !== error.type || newErrors[field]?.code !== error.code) {
|
|
517
|
+
newErrors[field] = error;
|
|
518
|
+
changed = true;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return changed ? { errors: newErrors } : state;
|
|
523
|
+
}
|
|
524
|
+
function setFieldError(state, name, error) {
|
|
525
|
+
if (error === null) {
|
|
526
|
+
if (!(name in state.errors)) {
|
|
527
|
+
return state;
|
|
528
|
+
}
|
|
529
|
+
const newErrors = { ...state.errors };
|
|
530
|
+
delete newErrors[name];
|
|
531
|
+
return { errors: newErrors };
|
|
532
|
+
}
|
|
533
|
+
const existing = state.errors[name];
|
|
534
|
+
if (existing?.message === error.message && existing?.type === error.type && existing?.code === error.code) {
|
|
535
|
+
return state;
|
|
536
|
+
}
|
|
537
|
+
return { errors: { ...state.errors, [name]: error } };
|
|
538
|
+
}
|
|
539
|
+
function clearFieldErrors(state, names) {
|
|
540
|
+
if (names === void 0) {
|
|
541
|
+
return Object.keys(state.errors).length > 0 ? { errors: {} } : state;
|
|
542
|
+
}
|
|
543
|
+
const fieldsToClear = Array.isArray(names) ? names : [names];
|
|
544
|
+
const newErrors = { ...state.errors };
|
|
545
|
+
let changed = false;
|
|
546
|
+
for (const name of fieldsToClear) {
|
|
547
|
+
if (name in newErrors) {
|
|
548
|
+
delete newErrors[name];
|
|
549
|
+
changed = true;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
return changed ? { errors: newErrors } : state;
|
|
553
|
+
}
|
|
554
|
+
function resetErrors() {
|
|
555
|
+
return { errors: {} };
|
|
556
|
+
}
|
|
557
|
+
function hasErrors(state) {
|
|
558
|
+
return Object.keys(state.errors).length > 0;
|
|
559
|
+
}
|
|
560
|
+
function getFieldError(state, name) {
|
|
561
|
+
return state.errors[name];
|
|
562
|
+
}
|
|
563
|
+
function toFormErrors(state) {
|
|
564
|
+
return state.errors;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// src/state/submitting.ts
|
|
568
|
+
function createSubmissionState() {
|
|
569
|
+
return {
|
|
570
|
+
isSubmitting: false,
|
|
571
|
+
isSubmitted: false,
|
|
572
|
+
isSubmitSuccessful: false,
|
|
573
|
+
submitCount: 0
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
function startSubmit(state) {
|
|
577
|
+
return {
|
|
578
|
+
...state,
|
|
579
|
+
isSubmitting: true
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
function endSubmitSuccess(state) {
|
|
583
|
+
return {
|
|
584
|
+
isSubmitting: false,
|
|
585
|
+
isSubmitted: true,
|
|
586
|
+
isSubmitSuccessful: true,
|
|
587
|
+
submitCount: state.submitCount + 1
|
|
588
|
+
};
|
|
589
|
+
}
|
|
590
|
+
function endSubmitFailure(state) {
|
|
591
|
+
return {
|
|
592
|
+
...state,
|
|
593
|
+
isSubmitting: false,
|
|
594
|
+
isSubmitted: true,
|
|
595
|
+
isSubmitSuccessful: false,
|
|
596
|
+
submitCount: state.submitCount + 1
|
|
597
|
+
};
|
|
598
|
+
}
|
|
599
|
+
function resetSubmission() {
|
|
600
|
+
return {
|
|
601
|
+
isSubmitting: false,
|
|
602
|
+
isSubmitted: false,
|
|
603
|
+
isSubmitSuccessful: false,
|
|
604
|
+
submitCount: 0
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
608
|
+
0 && (module.exports = {
|
|
609
|
+
clearFieldErrors,
|
|
610
|
+
computeDirtyFields,
|
|
611
|
+
computeIsDirty,
|
|
612
|
+
createErrorsState,
|
|
613
|
+
createSchema,
|
|
614
|
+
createSubmissionState,
|
|
615
|
+
createTouchedState,
|
|
616
|
+
createValuesState,
|
|
617
|
+
endSubmitFailure,
|
|
618
|
+
endSubmitSuccess,
|
|
619
|
+
getFieldError,
|
|
620
|
+
getValue,
|
|
621
|
+
getValues,
|
|
622
|
+
hasErrors,
|
|
623
|
+
isFieldDirty,
|
|
624
|
+
isTouched,
|
|
625
|
+
markTouched,
|
|
626
|
+
markUntouched,
|
|
627
|
+
normalizeError,
|
|
628
|
+
resetErrors,
|
|
629
|
+
resetSubmission,
|
|
630
|
+
resetTouched,
|
|
631
|
+
resetValues,
|
|
632
|
+
setErrors,
|
|
633
|
+
setFieldError,
|
|
634
|
+
startSubmit,
|
|
635
|
+
t,
|
|
636
|
+
toFormErrors,
|
|
637
|
+
toTouchedFieldsRecord,
|
|
638
|
+
transformValues,
|
|
639
|
+
updateValue,
|
|
640
|
+
validateSchema
|
|
641
|
+
});
|