@mantine/form 9.2.0 → 9.2.1
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/cjs/FormProvider/FormProvider.cjs.map +1 -1
- package/cjs/actions/actions.cjs.map +1 -1
- package/cjs/get-input-on-change/get-input-on-change.cjs.map +1 -1
- package/cjs/get-status/get-status.cjs.map +1 -1
- package/cjs/hooks/use-form-errors/filter-errors/filter-errors.cjs.map +1 -1
- package/cjs/hooks/use-form-errors/use-form-errors.cjs.map +1 -1
- package/cjs/hooks/use-form-list/use-form-list.cjs +9 -1
- package/cjs/hooks/use-form-list/use-form-list.cjs.map +1 -1
- package/cjs/hooks/use-form-status/use-form-status.cjs.map +1 -1
- package/cjs/hooks/use-form-validating/use-form-validating.cjs.map +1 -1
- package/cjs/hooks/use-form-values/use-form-values.cjs.map +1 -1
- package/cjs/hooks/use-form-watch/use-form-watch.cjs +11 -1
- package/cjs/hooks/use-form-watch/use-form-watch.cjs.map +1 -1
- package/cjs/lists/change-error-indices.cjs.map +1 -1
- package/cjs/lists/clear-list-state.cjs.map +1 -1
- package/cjs/lists/reorder-errors.cjs.map +1 -1
- package/cjs/paths/get-data-path.cjs.map +1 -1
- package/cjs/paths/get-path.cjs.map +1 -1
- package/cjs/paths/get-splitted-path.cjs.map +1 -1
- package/cjs/paths/insert-path.cjs.map +1 -1
- package/cjs/paths/remove-path.cjs.map +1 -1
- package/cjs/paths/reorder-path.cjs.map +1 -1
- package/cjs/paths/replace-path.cjs.map +1 -1
- package/cjs/paths/set-path.cjs.map +1 -1
- package/cjs/schema-resolver.cjs.map +1 -1
- package/cjs/use-field.cjs.map +1 -1
- package/cjs/use-form.cjs +14 -37
- package/cjs/use-form.cjs.map +1 -1
- package/cjs/validate/get-rule-for-path.cjs.map +1 -1
- package/cjs/validate/should-validate-on-change.cjs.map +1 -1
- package/cjs/validate/validate-field-value.cjs.map +1 -1
- package/cjs/validate/validate-values.cjs.map +1 -1
- package/cjs/validators/has-length/has-length.cjs.map +1 -1
- package/cjs/validators/is-email/is-email.cjs.map +1 -1
- package/cjs/validators/is-in-range/is-in-range.cjs.map +1 -1
- package/cjs/validators/is-json-string/is-json-string.cjs.map +1 -1
- package/cjs/validators/is-not-empty/is-not-empty.cjs.map +1 -1
- package/cjs/validators/is-not-empty-html/is-not-empty-html.cjs.map +1 -1
- package/cjs/validators/is-one-of/is-one-of.cjs.map +1 -1
- package/cjs/validators/is-url/is-url.cjs.map +1 -1
- package/cjs/validators/matches/matches.cjs.map +1 -1
- package/cjs/validators/matches-field/matches-field.cjs.map +1 -1
- package/esm/FormProvider/FormProvider.mjs.map +1 -1
- package/esm/actions/actions.mjs.map +1 -1
- package/esm/get-input-on-change/get-input-on-change.mjs.map +1 -1
- package/esm/get-status/get-status.mjs.map +1 -1
- package/esm/hooks/use-form-errors/filter-errors/filter-errors.mjs.map +1 -1
- package/esm/hooks/use-form-errors/use-form-errors.mjs.map +1 -1
- package/esm/hooks/use-form-list/use-form-list.mjs +9 -1
- package/esm/hooks/use-form-list/use-form-list.mjs.map +1 -1
- package/esm/hooks/use-form-status/use-form-status.mjs.map +1 -1
- package/esm/hooks/use-form-validating/use-form-validating.mjs.map +1 -1
- package/esm/hooks/use-form-values/use-form-values.mjs.map +1 -1
- package/esm/hooks/use-form-watch/use-form-watch.mjs +11 -1
- package/esm/hooks/use-form-watch/use-form-watch.mjs.map +1 -1
- package/esm/lists/change-error-indices.mjs.map +1 -1
- package/esm/lists/clear-list-state.mjs.map +1 -1
- package/esm/lists/reorder-errors.mjs.map +1 -1
- package/esm/paths/get-data-path.mjs.map +1 -1
- package/esm/paths/get-path.mjs.map +1 -1
- package/esm/paths/get-splitted-path.mjs.map +1 -1
- package/esm/paths/insert-path.mjs.map +1 -1
- package/esm/paths/remove-path.mjs.map +1 -1
- package/esm/paths/reorder-path.mjs.map +1 -1
- package/esm/paths/replace-path.mjs.map +1 -1
- package/esm/paths/set-path.mjs.map +1 -1
- package/esm/schema-resolver.mjs.map +1 -1
- package/esm/use-field.mjs.map +1 -1
- package/esm/use-form.mjs +14 -37
- package/esm/use-form.mjs.map +1 -1
- package/esm/validate/get-rule-for-path.mjs.map +1 -1
- package/esm/validate/should-validate-on-change.mjs.map +1 -1
- package/esm/validate/validate-field-value.mjs.map +1 -1
- package/esm/validate/validate-values.mjs.map +1 -1
- package/esm/validators/has-length/has-length.mjs.map +1 -1
- package/esm/validators/is-email/is-email.mjs.map +1 -1
- package/esm/validators/is-in-range/is-in-range.mjs.map +1 -1
- package/esm/validators/is-json-string/is-json-string.mjs.map +1 -1
- package/esm/validators/is-not-empty/is-not-empty.mjs.map +1 -1
- package/esm/validators/is-not-empty-html/is-not-empty-html.mjs.map +1 -1
- package/esm/validators/is-one-of/is-one-of.mjs.map +1 -1
- package/esm/validators/is-url/is-url.mjs.map +1 -1
- package/esm/validators/matches/matches.mjs.map +1 -1
- package/esm/validators/matches-field/matches-field.mjs.map +1 -1
- package/lib/hooks/use-form-list/use-form-list.d.ts +3 -1
- package/lib/hooks/use-form-watch/use-form-watch.d.ts +10 -2
- package/lib/validators/has-length/has-length.d.ts +2 -1
- package/lib/validators/is-email/is-email.d.ts +2 -1
- package/lib/validators/is-in-range/is-in-range.d.ts +2 -1
- package/lib/validators/is-json-string/is-json-string.d.ts +2 -1
- package/lib/validators/is-not-empty/is-not-empty.d.ts +2 -1
- package/lib/validators/is-not-empty-html/is-not-empty-html.d.ts +2 -1
- package/lib/validators/is-one-of/is-one-of.d.ts +2 -1
- package/lib/validators/is-url/is-url.d.ts +3 -2
- package/lib/validators/matches/matches.d.ts +2 -1
- package/lib/validators/matches-field/matches-field.d.ts +2 -1
- package/lib/validators/types.d.ts +1 -0
- package/package.json +2 -2
package/cjs/use-form.cjs
CHANGED
|
@@ -15,7 +15,8 @@ const require_validate_field_value = require("./validate/validate-field-value.cj
|
|
|
15
15
|
const require_should_validate_on_change = require("./validate/should-validate-on-change.cjs");
|
|
16
16
|
let react = require("react");
|
|
17
17
|
//#region packages/@mantine/form/src/use-form.ts
|
|
18
|
-
|
|
18
|
+
const defaultResolveValidationError = (err) => err instanceof Error ? err.message : String(err);
|
|
19
|
+
function useForm({ name, mode = "controlled", initialValues, initialErrors = {}, initialDirty = {}, initialTouched = {}, clearInputErrorOnChange = true, validateInputOnChange = false, validateInputOnBlur = false, onValuesChange, transformValues = ((values) => values), enhanceGetInputProps, validate: rules, onSubmitPreventDefault = "always", touchTrigger = "change", cascadeUpdates = false, validateDebounce = 0, resolveValidationError = defaultResolveValidationError } = {}) {
|
|
19
20
|
const $errors = require_use_form_errors.useFormErrors(initialErrors);
|
|
20
21
|
const $values = require_use_form_values.useFormValues({
|
|
21
22
|
initialValues,
|
|
@@ -28,14 +29,16 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
|
|
|
28
29
|
$values,
|
|
29
30
|
mode
|
|
30
31
|
});
|
|
32
|
+
const $watch = require_use_form_watch.useFormWatch({
|
|
33
|
+
$values,
|
|
34
|
+
$status,
|
|
35
|
+
cascadeUpdates
|
|
36
|
+
});
|
|
31
37
|
const $list = require_use_form_list.useFormList({
|
|
32
38
|
$values,
|
|
33
39
|
$errors,
|
|
34
|
-
$status
|
|
35
|
-
});
|
|
36
|
-
const $watch = require_use_form_watch.useFormWatch({
|
|
37
40
|
$status,
|
|
38
|
-
|
|
41
|
+
$watch
|
|
39
42
|
});
|
|
40
43
|
const $validating = require_use_form_validating.useFormValidating();
|
|
41
44
|
const [formKey, setFormKey] = (0, react.useState)(0);
|
|
@@ -50,21 +53,11 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
|
|
|
50
53
|
$validating.clearValidating();
|
|
51
54
|
mode === "uncontrolled" && setFormKey((key) => key + 1);
|
|
52
55
|
}, []);
|
|
53
|
-
const notifyWatchSubscribers = (0, react.useCallback)((previousValues) => {
|
|
54
|
-
Object.keys($watch.subscribers.current).forEach((path) => {
|
|
55
|
-
if (require_get_path.getPath(path, $values.refValues.current) !== require_get_path.getPath(path, previousValues)) $watch.subscribers.current[path]?.forEach((cb) => cb({
|
|
56
|
-
previousValue: require_get_path.getPath(path, previousValues),
|
|
57
|
-
value: require_get_path.getPath(path, $values.refValues.current),
|
|
58
|
-
touched: $status.isTouched(path),
|
|
59
|
-
dirty: $status.isDirty(path)
|
|
60
|
-
}));
|
|
61
|
-
});
|
|
62
|
-
}, []);
|
|
63
56
|
const handleValuesChanges = (0, react.useCallback)((previousValues) => {
|
|
64
57
|
clearInputErrorOnChange && $errors.clearErrors();
|
|
65
58
|
mode === "uncontrolled" && setFormKey((key) => key + 1);
|
|
66
|
-
notifyWatchSubscribers(previousValues);
|
|
67
|
-
}, [clearInputErrorOnChange
|
|
59
|
+
$watch.notifyWatchSubscribers(previousValues);
|
|
60
|
+
}, [clearInputErrorOnChange]);
|
|
68
61
|
const initialize = (0, react.useCallback)((values) => {
|
|
69
62
|
const previousValues = $values.refValues.current;
|
|
70
63
|
$values.initialize(values, () => mode === "uncontrolled" && setFormKey((key) => key + 1));
|
|
@@ -278,26 +271,10 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
|
|
|
278
271
|
isDirty: $status.isDirty,
|
|
279
272
|
getTouched: $status.getTouched,
|
|
280
273
|
getDirty: $status.getDirty,
|
|
281
|
-
reorderListItem:
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
}),
|
|
286
|
-
insertListItem: ((path, item, index) => {
|
|
287
|
-
const previousValues = $values.refValues.current;
|
|
288
|
-
$list.insertListItem(path, item, index);
|
|
289
|
-
notifyWatchSubscribers(previousValues);
|
|
290
|
-
}),
|
|
291
|
-
removeListItem: ((path, index) => {
|
|
292
|
-
const previousValues = $values.refValues.current;
|
|
293
|
-
$list.removeListItem(path, index);
|
|
294
|
-
notifyWatchSubscribers(previousValues);
|
|
295
|
-
}),
|
|
296
|
-
replaceListItem: ((path, index, item) => {
|
|
297
|
-
const previousValues = $values.refValues.current;
|
|
298
|
-
$list.replaceListItem(path, index, item);
|
|
299
|
-
notifyWatchSubscribers(previousValues);
|
|
300
|
-
}),
|
|
274
|
+
reorderListItem: $list.reorderListItem,
|
|
275
|
+
insertListItem: $list.insertListItem,
|
|
276
|
+
removeListItem: $list.removeListItem,
|
|
277
|
+
replaceListItem: $list.replaceListItem,
|
|
301
278
|
reset,
|
|
302
279
|
validate,
|
|
303
280
|
validateField,
|
package/cjs/use-form.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form.cjs","names":["useFormErrors","useFormValues","useFormStatus","useFormList","useFormWatch","useFormValidating","getPath","validateFieldValue","shouldValidateOnChange","validateValues","getInputOnChange","getDataPath"],"sources":["../src/use-form.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useFormActions } from './actions';\nimport { getInputOnChange } from './get-input-on-change';\nimport { useFormErrors } from './hooks/use-form-errors/use-form-errors';\nimport { useFormList } from './hooks/use-form-list/use-form-list';\nimport { useFormStatus } from './hooks/use-form-status/use-form-status';\nimport { useFormValidating } from './hooks/use-form-validating/use-form-validating';\nimport { useFormValues } from './hooks/use-form-values/use-form-values';\nimport { useFormWatch } from './hooks/use-form-watch/use-form-watch';\nimport { getDataPath, getPath } from './paths';\nimport type { FormPathValue, LooseKeys } from './paths.types';\nimport {\n FormErrors,\n FormRulesRecord,\n GetInputNode,\n GetInputProps,\n GetTransformedValues,\n Initialize,\n IsValidating,\n Key,\n OnReset,\n OnSubmit,\n Reset,\n SetFieldValue,\n SetValues,\n UseFormInput,\n UseFormReturnType,\n} from './types';\nimport { shouldValidateOnChange, validateFieldValue, validateValues } from './validate';\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n R extends FormErrors | Promise<FormErrors> = FormErrors,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: (values: Values) => R }\n): UseFormReturnType<Values, TransformedValues, (values: Values) => R>;\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n Rules extends FormRulesRecord<Values> = FormRulesRecord<Values>,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: Rules }\n): UseFormReturnType<Values, TransformedValues, Rules>;\n\nexport function useForm<\n Values extends Record<string, any> = Record<string, any>,\n TransformedValues = Values,\n>(\n input?: UseFormInput<Values, TransformedValues>\n): UseFormReturnType<Values, TransformedValues, undefined>;\n\nexport function useForm<\n Values extends Record<PropertyKey, any> = Record<string, any>,\n TransformedValues = Values,\n>({\n name,\n mode = 'controlled',\n initialValues,\n initialErrors = {},\n initialDirty = {},\n initialTouched = {},\n clearInputErrorOnChange = true,\n validateInputOnChange = false,\n validateInputOnBlur = false,\n onValuesChange,\n transformValues = ((values: Values) => values) as any,\n enhanceGetInputProps,\n validate: rules,\n onSubmitPreventDefault = 'always',\n touchTrigger = 'change',\n cascadeUpdates = false,\n validateDebounce = 0,\n resolveValidationError = (err: unknown) => (err instanceof Error ? err.message : String(err)),\n}: UseFormInput<Values, TransformedValues> = {}): UseFormReturnType<Values, TransformedValues> {\n const $errors = useFormErrors<Values>(initialErrors);\n const $values = useFormValues<Values>({ initialValues, onValuesChange, mode });\n const $status = useFormStatus<Values>({ initialDirty, initialTouched, $values, mode });\n const $list = useFormList<Values>({ $values, $errors, $status });\n const $watch = useFormWatch<Values>({ $status, cascadeUpdates });\n const $validating = useFormValidating();\n const [formKey, setFormKey] = useState(0);\n const [fieldKeys, setFieldKeys] = useState<Record<string, number>>({});\n const [submitting, setSubmitting] = useState(false);\n const validateGeneration = useRef(0);\n\n const reset: Reset = useCallback(() => {\n $values.resetValues();\n $errors.clearErrors();\n $status.resetDirty();\n $status.resetTouched();\n $validating.clearValidating();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n }, []);\n\n const notifyWatchSubscribers = useCallback((previousValues: Values) => {\n Object.keys($watch.subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n $watch.subscribers.current[path]?.forEach((cb) =>\n cb({\n previousValue: getPath(path, previousValues) as FormPathValue<\n Values,\n LooseKeys<Values>\n >,\n value: getPath(path, $values.refValues.current) as FormPathValue<\n Values,\n LooseKeys<Values>\n >,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n );\n }\n });\n }, []);\n\n const handleValuesChanges = useCallback(\n (previousValues: Values) => {\n clearInputErrorOnChange && $errors.clearErrors();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n notifyWatchSubscribers(previousValues);\n },\n [clearInputErrorOnChange, notifyWatchSubscribers]\n );\n\n const initialize: Initialize<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.initialize(values, () => mode === 'uncontrolled' && setFormKey((key) => key + 1));\n handleValuesChanges(previousValues);\n },\n [handleValuesChanges]\n );\n\n const debouncedValidateField = useMemo(() => {\n const timers: Record<string, ReturnType<typeof setTimeout>> = {};\n\n const handleValidation = (path: string) => {\n const signal = $validating.getAbortSignal(path);\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return;\n }\n if (results.hasError) {\n $errors.setFieldError(path as any, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(path, false);\n }\n };\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(path, true);\n result.then(applyResult).finally(cleanup);\n } else {\n applyResult(result);\n }\n };\n\n return (path: string) => {\n clearTimeout(timers[path]);\n if (validateDebounce > 0) {\n timers[path] = setTimeout(() => handleValidation(path), validateDebounce);\n } else {\n handleValidation(path);\n }\n };\n }, [validateDebounce, rules, resolveValidationError]);\n\n const setFieldValue: SetFieldValue<Values> = useCallback(\n (path, value, options) => {\n const shouldValidate = shouldValidateOnChange(path, validateInputOnChange);\n const resolvedValue =\n value instanceof Function ? value(getPath(path, $values.refValues.current) as any) : value;\n\n $status.setCalculatedFieldDirty(path, resolvedValue);\n touchTrigger === 'change' && $status.setFieldTouched(path, true);\n !shouldValidate && clearInputErrorOnChange && $errors.clearFieldError(path);\n\n $values.setFieldValue({\n path,\n value,\n updateState: mode === 'controlled',\n subscribers: [\n ...$watch.getFieldSubscribers(path),\n shouldValidate ? () => debouncedValidateField(String(path)) : null,\n options?.forceUpdate !== false && mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ],\n });\n },\n [onValuesChange, rules, debouncedValidateField]\n );\n\n const setValues: SetValues<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.setValues({ values, updateState: mode === 'controlled' });\n handleValuesChanges(previousValues);\n },\n [onValuesChange, handleValuesChanges]\n );\n\n const validate = useCallback(() => {\n const generation = ++validateGeneration.current;\n const signal = $validating.getAbortSignal('__form__');\n\n const handleResult = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (generation !== validateGeneration.current) {\n return { hasErrors: false, errors: {} };\n }\n $errors.setErrors(results.errors);\n return results;\n };\n\n const cleanup = () => {\n if (generation === validateGeneration.current) {\n $validating.setFormValidating(false);\n }\n };\n\n const result = validateValues(rules, $values.refValues.current, resolveValidationError, signal);\n\n if (result instanceof Promise) {\n $validating.setFormValidating(true);\n return result.then(handleResult).finally(cleanup);\n }\n\n return handleResult(result);\n }, [rules, resolveValidationError]);\n\n const validateField = useCallback(\n (path: string) => {\n const signal = $validating.getAbortSignal(String(path));\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return { hasError: false, error: null };\n }\n if (results.hasError) {\n $errors.setFieldError(path, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n return results;\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(String(path), false);\n }\n };\n\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(String(path), true);\n return result.then(applyResult).finally(cleanup);\n }\n\n return applyResult(result);\n },\n [rules, resolveValidationError]\n );\n\n const getInputProps: GetInputProps<Values> = (\n path,\n { type = 'input', withError = true, withFocus, ...otherOptions } = {}\n ) => {\n const _withFocus = withFocus ?? type !== 'radio';\n const onChange = getInputOnChange((value) =>\n setFieldValue(path, value as any, { forceUpdate: false })\n );\n\n const payload: any = { onChange, 'data-path': getDataPath(name, path) };\n\n if (withError) {\n payload.error = $errors.errorsState[path];\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = getPath(\n path,\n $values.refValues.current\n );\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n getPath(path, $values.refValues.current) === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = getPath(\n path,\n $values.refValues.current\n );\n }\n\n if (_withFocus) {\n payload.onFocus = () => $status.setFieldTouched(path, true);\n payload.onBlur = () => {\n if (shouldValidateOnChange(path, validateInputOnBlur)) {\n debouncedValidateField(String(path));\n }\n };\n }\n\n return Object.assign(\n payload,\n enhanceGetInputProps?.({\n inputProps: payload,\n field: path,\n options: { type, withError, withFocus: _withFocus, ...otherOptions },\n form: form as any,\n })\n );\n };\n\n const onSubmit: OnSubmit<Values, TransformedValues> =\n (handleSubmit, handleValidationFailure) => (event) => {\n if (onSubmitPreventDefault === 'always') {\n event?.preventDefault();\n }\n\n setSubmitting(true);\n\n const handleValidation = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (results.hasErrors) {\n if (onSubmitPreventDefault === 'validation-failed') {\n event?.preventDefault();\n }\n\n handleValidationFailure?.(results.errors, $values.refValues.current, event);\n setSubmitting(false);\n } else {\n const submitResult = handleSubmit?.(\n transformValues($values.refValues.current) as any,\n event\n );\n\n if (submitResult instanceof Promise) {\n submitResult.finally(() => setSubmitting(false));\n } else {\n setSubmitting(false);\n }\n }\n };\n\n const result = validate();\n if (result instanceof Promise) {\n result.then(handleValidation).catch(() => {\n setSubmitting(false);\n });\n } else {\n handleValidation(result);\n }\n };\n\n const getTransformedValues: GetTransformedValues<Values, TransformedValues> = (input) =>\n (transformValues as any)(input || $values.refValues.current);\n\n const onReset: OnReset = useCallback((event) => {\n event.preventDefault();\n reset();\n }, []);\n\n const isValid = useCallback(\n (path?: string) => {\n const signal = new AbortController().signal;\n if (path) {\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasError);\n }\n return !result.hasError;\n }\n const result = validateValues(\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasErrors);\n }\n return !result.hasErrors;\n },\n [rules, resolveValidationError]\n );\n\n const key: Key<Values> = (path) => `${formKey}-${String(path)}-${fieldKeys[String(path)] || 0}`;\n\n const getInputNode: GetInputNode<Values> = useCallback(\n (path) => document.querySelector(`[data-path=\"${getDataPath(name, path)}\"]`),\n []\n );\n\n const resetField = useCallback(\n (path: PropertyKey) => {\n $values.resetField(path, [\n mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ]);\n },\n [$values.resetField, mode, setFieldKeys]\n );\n\n const form = {\n watch: $watch.watch,\n\n initialized: $values.initialized.current,\n values: mode === 'uncontrolled' ? $values.refValues.current : $values.stateValues,\n getValues: $values.getValues,\n getInitialValues: $values.getValuesSnapshot,\n setInitialValues: $values.setValuesSnapshot,\n resetField,\n initialize,\n setValues,\n setFieldValue,\n\n submitting,\n setSubmitting,\n\n validating: $validating.validating,\n isValidating: $validating.isValidating as IsValidating<Values>,\n\n errors: $errors.errorsState,\n setErrors: $errors.setErrors,\n setFieldError: $errors.setFieldError,\n clearFieldError: $errors.clearFieldError,\n clearErrors: $errors.clearErrors,\n\n resetDirty: $status.resetDirty,\n setTouched: $status.setTouched,\n setDirty: $status.setDirty,\n isTouched: $status.isTouched,\n resetTouched: $status.resetTouched,\n isDirty: $status.isDirty,\n getTouched: $status.getTouched,\n getDirty: $status.getDirty,\n\n reorderListItem: ((path, payload) => {\n const previousValues = $values.refValues.current;\n $list.reorderListItem(path, payload);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.reorderListItem,\n insertListItem: ((path, item, index) => {\n const previousValues = $values.refValues.current;\n $list.insertListItem(path, item, index);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.insertListItem,\n removeListItem: ((path, index) => {\n const previousValues = $values.refValues.current;\n $list.removeListItem(path, index);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.removeListItem,\n replaceListItem: ((path, index, item) => {\n const previousValues = $values.refValues.current;\n $list.replaceListItem(path, index, item);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.replaceListItem,\n\n reset,\n validate,\n validateField,\n getInputProps,\n onSubmit,\n onReset,\n isValid,\n getTransformedValues,\n key,\n\n getInputNode,\n };\n\n useFormActions(name, form as any);\n\n return form as any;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAqDA,SAAgB,QAGd,EACA,MACA,OAAO,cACP,eACA,gBAAgB,EAAE,EAClB,eAAe,EAAE,EACjB,iBAAiB,EAAE,EACnB,0BAA0B,MAC1B,wBAAwB,OACxB,sBAAsB,OACtB,gBACA,oBAAoB,WAAmB,SACvC,sBACA,UAAU,OACV,yBAAyB,UACzB,eAAe,UACf,iBAAiB,OACjB,mBAAmB,GACnB,0BAA0B,QAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,KACjD,EAAE,EAAgD;CAC7F,MAAM,UAAUA,wBAAAA,cAAsB,cAAc;CACpD,MAAM,UAAUC,wBAAAA,cAAsB;EAAE;EAAe;EAAgB;EAAM,CAAC;CAC9E,MAAM,UAAUC,wBAAAA,cAAsB;EAAE;EAAc;EAAgB;EAAS;EAAM,CAAC;CACtF,MAAM,QAAQC,sBAAAA,YAAoB;EAAE;EAAS;EAAS;EAAS,CAAC;CAChE,MAAM,SAASC,uBAAAA,aAAqB;EAAE;EAAS;EAAgB,CAAC;CAChE,MAAM,cAAcC,4BAAAA,mBAAmB;CACvC,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,UAAuB,EAAE;CACzC,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,UAAiD,EAAE,CAAC;CACtE,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,UAA0B,MAAM;CACnD,MAAM,sBAAA,GAAA,MAAA,QAA4B,EAAE;CAEpC,MAAM,SAAA,GAAA,MAAA,mBAAiC;AACrC,UAAQ,aAAa;AACrB,UAAQ,aAAa;AACrB,UAAQ,YAAY;AACpB,UAAQ,cAAc;AACtB,cAAY,iBAAiB;AAC7B,WAAS,kBAAkB,YAAY,QAAQ,MAAM,EAAE;IACtD,EAAE,CAAC;CAEN,MAAM,0BAAA,GAAA,MAAA,cAAsC,mBAA2B;AACrE,SAAO,KAAK,OAAO,YAAY,QAAQ,CAAC,SAAS,SAAS;AAIxD,OAHcC,iBAAAA,QAAQ,MAAM,QAAQ,UAAU,QAAQ,KAChCA,iBAAAA,QAAQ,MAAM,eAAe,CAGjD,QAAO,YAAY,QAAQ,OAAO,SAAS,OACzC,GAAG;IACD,eAAeA,iBAAAA,QAAQ,MAAM,eAAe;IAI5C,OAAOA,iBAAAA,QAAQ,MAAM,QAAQ,UAAU,QAAQ;IAI/C,SAAS,QAAQ,UAAU,KAAK;IAChC,OAAO,QAAQ,QAAQ,KAAK;IAC7B,CAAC,CACH;IAEH;IACD,EAAE,CAAC;CAEN,MAAM,uBAAA,GAAA,MAAA,cACH,mBAA2B;AAC1B,6BAA2B,QAAQ,aAAa;AAChD,WAAS,kBAAkB,YAAY,QAAQ,MAAM,EAAE;AACvD,yBAAuB,eAAe;IAExC,CAAC,yBAAyB,uBAAuB,CAClD;CAED,MAAM,cAAA,GAAA,MAAA,cACH,WAAW;EACV,MAAM,iBAAiB,QAAQ,UAAU;AACzC,UAAQ,WAAW,cAAc,SAAS,kBAAkB,YAAY,QAAQ,MAAM,EAAE,CAAC;AACzF,sBAAoB,eAAe;IAErC,CAAC,oBAAoB,CACtB;CAED,MAAM,0BAAA,GAAA,MAAA,eAAuC;EAC3C,MAAM,SAAwD,EAAE;EAEhE,MAAM,oBAAoB,SAAiB;GACzC,MAAM,SAAS,YAAY,eAAe,KAAK;GAC/C,MAAM,SAASC,6BAAAA,mBACb,MACA,OACA,QAAQ,UAAU,SAClB,wBACA,OACD;GAED,MAAM,eAAe,YAA2D;AAC9E,QAAI,OAAO,QACT;AAEF,QAAI,QAAQ,SACV,SAAQ,cAAc,MAAa,QAAQ,MAAM;QAEjD,SAAQ,gBAAgB,KAAK;;GAIjC,MAAM,gBAAgB;AACpB,QAAI,CAAC,OAAO,QACV,aAAY,mBAAmB,MAAM,MAAM;;AAI/C,OAAI,kBAAkB,SAAS;AAC7B,gBAAY,mBAAmB,MAAM,KAAK;AAC1C,WAAO,KAAK,YAAY,CAAC,QAAQ,QAAQ;SAEzC,aAAY,OAAO;;AAIvB,UAAQ,SAAiB;AACvB,gBAAa,OAAO,MAAM;AAC1B,OAAI,mBAAmB,EACrB,QAAO,QAAQ,iBAAiB,iBAAiB,KAAK,EAAE,iBAAiB;OAEzE,kBAAiB,KAAK;;IAGzB;EAAC;EAAkB;EAAO;EAAuB,CAAC;CAErD,MAAM,iBAAA,GAAA,MAAA,cACH,MAAM,OAAO,YAAY;EACxB,MAAM,iBAAiBC,kCAAAA,uBAAuB,MAAM,sBAAsB;EAC1E,MAAM,gBACJ,iBAAiB,WAAW,MAAMF,iBAAAA,QAAQ,MAAM,QAAQ,UAAU,QAAQ,CAAQ,GAAG;AAEvF,UAAQ,wBAAwB,MAAM,cAAc;AACpD,mBAAiB,YAAY,QAAQ,gBAAgB,MAAM,KAAK;AAChE,GAAC,kBAAkB,2BAA2B,QAAQ,gBAAgB,KAAK;AAE3E,UAAQ,cAAc;GACpB;GACA;GACA,aAAa,SAAS;GACtB,aAAa;IACX,GAAG,OAAO,oBAAoB,KAAK;IACnC,uBAAuB,uBAAuB,OAAO,KAAK,CAAC,GAAG;IAC9D,SAAS,gBAAgB,SAAS,SAAS,qBAErC,cAAc,UAAU;KACtB,GAAG;MACF,QAAkB,KAAK,SAAmB,KAAK;KACjD,EAAE,GACL;IACL;GACF,CAAC;IAEJ;EAAC;EAAgB;EAAO;EAAuB,CAChD;CAED,MAAM,aAAA,GAAA,MAAA,cACH,WAAW;EACV,MAAM,iBAAiB,QAAQ,UAAU;AACzC,UAAQ,UAAU;GAAE;GAAQ,aAAa,SAAS;GAAc,CAAC;AACjE,sBAAoB,eAAe;IAErC,CAAC,gBAAgB,oBAAoB,CACtC;CAED,MAAM,YAAA,GAAA,MAAA,mBAA6B;EACjC,MAAM,aAAa,EAAE,mBAAmB;EACxC,MAAM,SAAS,YAAY,eAAe,WAAW;EAErD,MAAM,gBAAgB,YAAiE;AACrF,OAAI,eAAe,mBAAmB,QACpC,QAAO;IAAE,WAAW;IAAO,QAAQ,EAAE;IAAE;AAEzC,WAAQ,UAAU,QAAQ,OAAO;AACjC,UAAO;;EAGT,MAAM,gBAAgB;AACpB,OAAI,eAAe,mBAAmB,QACpC,aAAY,kBAAkB,MAAM;;EAIxC,MAAM,SAASG,wBAAAA,eAAe,OAAO,QAAQ,UAAU,SAAS,wBAAwB,OAAO;AAE/F,MAAI,kBAAkB,SAAS;AAC7B,eAAY,kBAAkB,KAAK;AACnC,UAAO,OAAO,KAAK,aAAa,CAAC,QAAQ,QAAQ;;AAGnD,SAAO,aAAa,OAAO;IAC1B,CAAC,OAAO,uBAAuB,CAAC;CAEnC,MAAM,iBAAA,GAAA,MAAA,cACH,SAAiB;EAChB,MAAM,SAAS,YAAY,eAAe,OAAO,KAAK,CAAC;EAEvD,MAAM,eAAe,YAA2D;AAC9E,OAAI,OAAO,QACT,QAAO;IAAE,UAAU;IAAO,OAAO;IAAM;AAEzC,OAAI,QAAQ,SACV,SAAQ,cAAc,MAAM,QAAQ,MAAM;OAE1C,SAAQ,gBAAgB,KAAK;AAE/B,UAAO;;EAGT,MAAM,gBAAgB;AACpB,OAAI,CAAC,OAAO,QACV,aAAY,mBAAmB,OAAO,KAAK,EAAE,MAAM;;EAIvD,MAAM,SAASF,6BAAAA,mBACb,MACA,OACA,QAAQ,UAAU,SAClB,wBACA,OACD;AAED,MAAI,kBAAkB,SAAS;AAC7B,eAAY,mBAAmB,OAAO,KAAK,EAAE,KAAK;AAClD,UAAO,OAAO,KAAK,YAAY,CAAC,QAAQ,QAAQ;;AAGlD,SAAO,YAAY,OAAO;IAE5B,CAAC,OAAO,uBAAuB,CAChC;CAED,MAAM,iBACJ,MACA,EAAE,OAAO,SAAS,YAAY,MAAM,WAAW,GAAG,iBAAiB,EAAE,KAClE;EACH,MAAM,aAAa,aAAa,SAAS;EAKzC,MAAM,UAAe;GAAE,UAJNG,4BAAAA,kBAAkB,UACjC,cAAc,MAAM,OAAc,EAAE,aAAa,OAAO,CAAC,CAC1D;GAEgC,aAAaC,sBAAAA,YAAY,MAAM,KAAK;GAAE;AAEvE,MAAI,UACF,SAAQ,QAAQ,QAAQ,YAAY;AAGtC,MAAI,SAAS,WACX,SAAQ,SAAS,eAAe,YAAY,oBAAoBL,iBAAAA,QAC9D,MACA,QAAQ,UAAU,QACnB;WACQ,SAAS,SAAS;AAC3B,WAAQ,SAAS,eAAe,YAAY,oBAC1CA,iBAAAA,QAAQ,MAAM,QAAQ,UAAU,QAAQ,KAAK,aAAa;AAC5D,WAAQ,QAAQ,aAAa;QAE7B,SAAQ,SAAS,eAAe,UAAU,kBAAkBA,iBAAAA,QAC1D,MACA,QAAQ,UAAU,QACnB;AAGH,MAAI,YAAY;AACd,WAAQ,gBAAgB,QAAQ,gBAAgB,MAAM,KAAK;AAC3D,WAAQ,eAAe;AACrB,QAAIE,kCAAAA,uBAAuB,MAAM,oBAAoB,CACnD,wBAAuB,OAAO,KAAK,CAAC;;;AAK1C,SAAO,OAAO,OACZ,SACA,uBAAuB;GACrB,YAAY;GACZ,OAAO;GACP,SAAS;IAAE;IAAM;IAAW,WAAW;IAAY,GAAG;IAAc;GAC9D;GACP,CAAC,CACH;;CAGH,MAAM,YACH,cAAc,6BAA6B,UAAU;AACpD,MAAI,2BAA2B,SAC7B,QAAO,gBAAgB;AAGzB,gBAAc,KAAK;EAEnB,MAAM,oBAAoB,YAAiE;AACzF,OAAI,QAAQ,WAAW;AACrB,QAAI,2BAA2B,oBAC7B,QAAO,gBAAgB;AAGzB,8BAA0B,QAAQ,QAAQ,QAAQ,UAAU,SAAS,MAAM;AAC3E,kBAAc,MAAM;UACf;IACL,MAAM,eAAe,eACnB,gBAAgB,QAAQ,UAAU,QAAQ,EAC1C,MACD;AAED,QAAI,wBAAwB,QAC1B,cAAa,cAAc,cAAc,MAAM,CAAC;QAEhD,eAAc,MAAM;;;EAK1B,MAAM,SAAS,UAAU;AACzB,MAAI,kBAAkB,QACpB,QAAO,KAAK,iBAAiB,CAAC,YAAY;AACxC,iBAAc,MAAM;IACpB;MAEF,kBAAiB,OAAO;;CAI9B,MAAM,wBAAyE,UAC5E,gBAAwB,SAAS,QAAQ,UAAU,QAAQ;CAE9D,MAAM,WAAA,GAAA,MAAA,cAAgC,UAAU;AAC9C,QAAM,gBAAgB;AACtB,SAAO;IACN,EAAE,CAAC;CAEN,MAAM,WAAA,GAAA,MAAA,cACH,SAAkB;EACjB,MAAM,SAAS,IAAI,iBAAiB,CAAC;AACrC,MAAI,MAAM;GACR,MAAM,SAASD,6BAAAA,mBACb,MACA,OACA,QAAQ,UAAU,SAClB,wBACA,OACD;AACD,OAAI,kBAAkB,QACpB,QAAO,OAAO,MAAM,MAAM,CAAC,EAAE,SAAS;AAExC,UAAO,CAAC,OAAO;;EAEjB,MAAM,SAASE,wBAAAA,eACb,OACA,QAAQ,UAAU,SAClB,wBACA,OACD;AACD,MAAI,kBAAkB,QACpB,QAAO,OAAO,MAAM,MAAM,CAAC,EAAE,UAAU;AAEzC,SAAO,CAAC,OAAO;IAEjB,CAAC,OAAO,uBAAuB,CAChC;CAED,MAAM,OAAoB,SAAS,GAAG,QAAQ,GAAG,OAAO,KAAK,CAAC,GAAG,UAAU,OAAO,KAAK,KAAK;CAE5F,MAAM,gBAAA,GAAA,MAAA,cACH,SAAS,SAAS,cAAc,eAAeE,sBAAAA,YAAY,MAAM,KAAK,CAAC,IAAI,EAC5E,EAAE,CACH;CAED,MAAM,cAAA,GAAA,MAAA,cACH,SAAsB;AACrB,UAAQ,WAAW,MAAM,CACvB,SAAS,qBAEH,cAAc,UAAU;GACtB,GAAG;IACF,QAAkB,KAAK,SAAmB,KAAK;GACjD,EAAE,GACL,KACL,CAAC;IAEJ;EAAC,QAAQ;EAAY;EAAM;EAAa,CACzC;CAED,MAAM,OAAO;EACX,OAAO,OAAO;EAEd,aAAa,QAAQ,YAAY;EACjC,QAAQ,SAAS,iBAAiB,QAAQ,UAAU,UAAU,QAAQ;EACtE,WAAW,QAAQ;EACnB,kBAAkB,QAAQ;EAC1B,kBAAkB,QAAQ;EAC1B;EACA;EACA;EACA;EAEA;EACA;EAEA,YAAY,YAAY;EACxB,cAAc,YAAY;EAE1B,QAAQ,QAAQ;EAChB,WAAW,QAAQ;EACnB,eAAe,QAAQ;EACvB,iBAAiB,QAAQ;EACzB,aAAa,QAAQ;EAErB,YAAY,QAAQ;EACpB,YAAY,QAAQ;EACpB,UAAU,QAAQ;EAClB,WAAW,QAAQ;EACnB,cAAc,QAAQ;EACtB,SAAS,QAAQ;EACjB,YAAY,QAAQ;EACpB,UAAU,QAAQ;EAElB,mBAAmB,MAAM,YAAY;GACnC,MAAM,iBAAiB,QAAQ,UAAU;AACzC,SAAM,gBAAgB,MAAM,QAAQ;AACpC,0BAAuB,eAAe;;EAExC,kBAAkB,MAAM,MAAM,UAAU;GACtC,MAAM,iBAAiB,QAAQ,UAAU;AACzC,SAAM,eAAe,MAAM,MAAM,MAAM;AACvC,0BAAuB,eAAe;;EAExC,kBAAkB,MAAM,UAAU;GAChC,MAAM,iBAAiB,QAAQ,UAAU;AACzC,SAAM,eAAe,MAAM,MAAM;AACjC,0BAAuB,eAAe;;EAExC,mBAAmB,MAAM,OAAO,SAAS;GACvC,MAAM,iBAAiB,QAAQ,UAAU;AACzC,SAAM,gBAAgB,MAAM,OAAO,KAAK;AACxC,0BAAuB,eAAe;;EAGxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACD;AAED,iBAAA,eAAe,MAAM,KAAY;AAEjC,QAAO"}
|
|
1
|
+
{"version":3,"file":"use-form.cjs","names":["useFormErrors","useFormValues","useFormStatus","useFormWatch","useFormList","useFormValidating","validateFieldValue","shouldValidateOnChange","getPath","validateValues","getInputOnChange","getDataPath"],"sources":["../src/use-form.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useFormActions } from './actions';\nimport { getInputOnChange } from './get-input-on-change';\nimport { useFormErrors } from './hooks/use-form-errors/use-form-errors';\nimport { useFormList } from './hooks/use-form-list/use-form-list';\nimport { useFormStatus } from './hooks/use-form-status/use-form-status';\nimport { useFormValidating } from './hooks/use-form-validating/use-form-validating';\nimport { useFormValues } from './hooks/use-form-values/use-form-values';\nimport { useFormWatch } from './hooks/use-form-watch/use-form-watch';\nimport { getDataPath, getPath } from './paths';\nimport {\n FormErrors,\n FormRulesRecord,\n GetInputNode,\n GetInputProps,\n GetTransformedValues,\n Initialize,\n IsValidating,\n Key,\n OnReset,\n OnSubmit,\n Reset,\n SetFieldValue,\n SetValues,\n UseFormInput,\n UseFormReturnType,\n} from './types';\nimport { shouldValidateOnChange, validateFieldValue, validateValues } from './validate';\n\nconst defaultResolveValidationError = (err: unknown) =>\n err instanceof Error ? err.message : String(err);\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n R extends FormErrors | Promise<FormErrors> = FormErrors,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: (values: Values) => R }\n): UseFormReturnType<Values, TransformedValues, (values: Values) => R>;\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n Rules extends FormRulesRecord<Values> = FormRulesRecord<Values>,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: Rules }\n): UseFormReturnType<Values, TransformedValues, Rules>;\n\nexport function useForm<\n Values extends Record<string, any> = Record<string, any>,\n TransformedValues = Values,\n>(\n input?: UseFormInput<Values, TransformedValues>\n): UseFormReturnType<Values, TransformedValues, undefined>;\n\nexport function useForm<\n Values extends Record<PropertyKey, any> = Record<string, any>,\n TransformedValues = Values,\n>({\n name,\n mode = 'controlled',\n initialValues,\n initialErrors = {},\n initialDirty = {},\n initialTouched = {},\n clearInputErrorOnChange = true,\n validateInputOnChange = false,\n validateInputOnBlur = false,\n onValuesChange,\n transformValues = ((values: Values) => values) as any,\n enhanceGetInputProps,\n validate: rules,\n onSubmitPreventDefault = 'always',\n touchTrigger = 'change',\n cascadeUpdates = false,\n validateDebounce = 0,\n resolveValidationError = defaultResolveValidationError,\n}: UseFormInput<Values, TransformedValues> = {}): UseFormReturnType<Values, TransformedValues> {\n const $errors = useFormErrors<Values>(initialErrors);\n const $values = useFormValues<Values>({ initialValues, onValuesChange, mode });\n const $status = useFormStatus<Values>({ initialDirty, initialTouched, $values, mode });\n const $watch = useFormWatch<Values>({ $values, $status, cascadeUpdates });\n const $list = useFormList<Values>({ $values, $errors, $status, $watch });\n const $validating = useFormValidating();\n const [formKey, setFormKey] = useState(0);\n const [fieldKeys, setFieldKeys] = useState<Record<string, number>>({});\n const [submitting, setSubmitting] = useState(false);\n const validateGeneration = useRef(0);\n\n const reset: Reset = useCallback(() => {\n $values.resetValues();\n $errors.clearErrors();\n $status.resetDirty();\n $status.resetTouched();\n $validating.clearValidating();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n }, []);\n\n const handleValuesChanges = useCallback(\n (previousValues: Values) => {\n clearInputErrorOnChange && $errors.clearErrors();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n $watch.notifyWatchSubscribers(previousValues);\n },\n [clearInputErrorOnChange]\n );\n\n const initialize: Initialize<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.initialize(values, () => mode === 'uncontrolled' && setFormKey((key) => key + 1));\n handleValuesChanges(previousValues);\n },\n [handleValuesChanges]\n );\n\n const debouncedValidateField = useMemo(() => {\n const timers: Record<string, ReturnType<typeof setTimeout>> = {};\n\n const handleValidation = (path: string) => {\n const signal = $validating.getAbortSignal(path);\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return;\n }\n if (results.hasError) {\n $errors.setFieldError(path as any, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(path, false);\n }\n };\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(path, true);\n result.then(applyResult).finally(cleanup);\n } else {\n applyResult(result);\n }\n };\n\n return (path: string) => {\n clearTimeout(timers[path]);\n if (validateDebounce > 0) {\n timers[path] = setTimeout(() => handleValidation(path), validateDebounce);\n } else {\n handleValidation(path);\n }\n };\n }, [validateDebounce, rules, resolveValidationError]);\n\n const setFieldValue: SetFieldValue<Values> = useCallback(\n (path, value, options) => {\n const shouldValidate = shouldValidateOnChange(path, validateInputOnChange);\n const resolvedValue =\n value instanceof Function ? value(getPath(path, $values.refValues.current) as any) : value;\n\n $status.setCalculatedFieldDirty(path, resolvedValue);\n touchTrigger === 'change' && $status.setFieldTouched(path, true);\n !shouldValidate && clearInputErrorOnChange && $errors.clearFieldError(path);\n\n $values.setFieldValue({\n path,\n value,\n updateState: mode === 'controlled',\n subscribers: [\n ...$watch.getFieldSubscribers(path),\n shouldValidate ? () => debouncedValidateField(String(path)) : null,\n options?.forceUpdate !== false && mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ],\n });\n },\n [onValuesChange, rules, debouncedValidateField]\n );\n\n const setValues: SetValues<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.setValues({ values, updateState: mode === 'controlled' });\n handleValuesChanges(previousValues);\n },\n [onValuesChange, handleValuesChanges]\n );\n\n const validate = useCallback(() => {\n const generation = ++validateGeneration.current;\n const signal = $validating.getAbortSignal('__form__');\n\n const handleResult = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (generation !== validateGeneration.current) {\n return { hasErrors: false, errors: {} };\n }\n $errors.setErrors(results.errors);\n return results;\n };\n\n const cleanup = () => {\n if (generation === validateGeneration.current) {\n $validating.setFormValidating(false);\n }\n };\n\n const result = validateValues(rules, $values.refValues.current, resolveValidationError, signal);\n\n if (result instanceof Promise) {\n $validating.setFormValidating(true);\n return result.then(handleResult).finally(cleanup);\n }\n\n return handleResult(result);\n }, [rules, resolveValidationError]);\n\n const validateField = useCallback(\n (path: string) => {\n const signal = $validating.getAbortSignal(String(path));\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return { hasError: false, error: null };\n }\n if (results.hasError) {\n $errors.setFieldError(path, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n return results;\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(String(path), false);\n }\n };\n\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(String(path), true);\n return result.then(applyResult).finally(cleanup);\n }\n\n return applyResult(result);\n },\n [rules, resolveValidationError]\n );\n\n const getInputProps: GetInputProps<Values> = (\n path,\n { type = 'input', withError = true, withFocus, ...otherOptions } = {}\n ) => {\n const _withFocus = withFocus ?? type !== 'radio';\n const onChange = getInputOnChange((value) =>\n setFieldValue(path, value as any, { forceUpdate: false })\n );\n\n const payload: any = { onChange, 'data-path': getDataPath(name, path) };\n\n if (withError) {\n payload.error = $errors.errorsState[path];\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = getPath(\n path,\n $values.refValues.current\n );\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n getPath(path, $values.refValues.current) === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = getPath(\n path,\n $values.refValues.current\n );\n }\n\n if (_withFocus) {\n payload.onFocus = () => $status.setFieldTouched(path, true);\n payload.onBlur = () => {\n if (shouldValidateOnChange(path, validateInputOnBlur)) {\n debouncedValidateField(String(path));\n }\n };\n }\n\n return Object.assign(\n payload,\n enhanceGetInputProps?.({\n inputProps: payload,\n field: path,\n options: { type, withError, withFocus: _withFocus, ...otherOptions },\n form: form as any,\n })\n );\n };\n\n const onSubmit: OnSubmit<Values, TransformedValues> =\n (handleSubmit, handleValidationFailure) => (event) => {\n if (onSubmitPreventDefault === 'always') {\n event?.preventDefault();\n }\n\n setSubmitting(true);\n\n const handleValidation = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (results.hasErrors) {\n if (onSubmitPreventDefault === 'validation-failed') {\n event?.preventDefault();\n }\n\n handleValidationFailure?.(results.errors, $values.refValues.current, event);\n setSubmitting(false);\n } else {\n const submitResult = handleSubmit?.(\n transformValues($values.refValues.current) as any,\n event\n );\n\n if (submitResult instanceof Promise) {\n submitResult.finally(() => setSubmitting(false));\n } else {\n setSubmitting(false);\n }\n }\n };\n\n const result = validate();\n if (result instanceof Promise) {\n result.then(handleValidation).catch(() => {\n setSubmitting(false);\n });\n } else {\n handleValidation(result);\n }\n };\n\n const getTransformedValues: GetTransformedValues<Values, TransformedValues> = (input) =>\n (transformValues as any)(input || $values.refValues.current);\n\n const onReset: OnReset = useCallback((event) => {\n event.preventDefault();\n reset();\n }, []);\n\n const isValid = useCallback(\n (path?: string) => {\n const signal = new AbortController().signal;\n if (path) {\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasError);\n }\n return !result.hasError;\n }\n const result = validateValues(\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasErrors);\n }\n return !result.hasErrors;\n },\n [rules, resolveValidationError]\n );\n\n const key: Key<Values> = (path) => `${formKey}-${String(path)}-${fieldKeys[String(path)] || 0}`;\n\n const getInputNode: GetInputNode<Values> = useCallback(\n (path) => document.querySelector(`[data-path=\"${getDataPath(name, path)}\"]`),\n []\n );\n\n const resetField = useCallback(\n (path: PropertyKey) => {\n $values.resetField(path, [\n mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ]);\n },\n [$values.resetField, mode, setFieldKeys]\n );\n\n const form = {\n watch: $watch.watch,\n\n initialized: $values.initialized.current,\n values: mode === 'uncontrolled' ? $values.refValues.current : $values.stateValues,\n getValues: $values.getValues,\n getInitialValues: $values.getValuesSnapshot,\n setInitialValues: $values.setValuesSnapshot,\n resetField,\n initialize,\n setValues,\n setFieldValue,\n\n submitting,\n setSubmitting,\n\n validating: $validating.validating,\n isValidating: $validating.isValidating as IsValidating<Values>,\n\n errors: $errors.errorsState,\n setErrors: $errors.setErrors,\n setFieldError: $errors.setFieldError,\n clearFieldError: $errors.clearFieldError,\n clearErrors: $errors.clearErrors,\n\n resetDirty: $status.resetDirty,\n setTouched: $status.setTouched,\n setDirty: $status.setDirty,\n isTouched: $status.isTouched,\n resetTouched: $status.resetTouched,\n isDirty: $status.isDirty,\n getTouched: $status.getTouched,\n getDirty: $status.getDirty,\n\n reorderListItem: $list.reorderListItem,\n insertListItem: $list.insertListItem,\n removeListItem: $list.removeListItem,\n replaceListItem: $list.replaceListItem,\n\n reset,\n validate,\n validateField,\n getInputProps,\n onSubmit,\n onReset,\n isValid,\n getTransformedValues,\n key,\n\n getInputNode,\n };\n\n useFormActions(name, form as any);\n\n return form as any;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-rule-for-path.cjs","names":[],"sources":["../../src/validate/get-rule-for-path.ts"],"sourcesContent":["import type { FormRulesRecord } from '../types';\n\nexport function getRuleForPath<T>(\n path: string,\n rules: FormRulesRecord<T> | undefined\n): ((value: any, values: any, path: string, signal: AbortSignal) => any) | null {\n if (!rules) {\n return null;\n }\n\n const segments = path.split('.');\n let current: any = rules;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n\n if (/^\\d+$/.test(segment)) {\n continue;\n }\n\n if (current == null || typeof current !== 'object') {\n return null;\n }\n\n current = current[segment];\n }\n\n if (typeof current === 'function') {\n return current;\n }\n\n return null;\n}\n"],"mappings":";;AAEA,SAAgB,eACd,MACA,OAC8E;
|
|
1
|
+
{"version":3,"file":"get-rule-for-path.cjs","names":[],"sources":["../../src/validate/get-rule-for-path.ts"],"sourcesContent":["import type { FormRulesRecord } from '../types';\n\nexport function getRuleForPath<T>(\n path: string,\n rules: FormRulesRecord<T> | undefined\n): ((value: any, values: any, path: string, signal: AbortSignal) => any) | null {\n if (!rules) {\n return null;\n }\n\n const segments = path.split('.');\n let current: any = rules;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n\n if (/^\\d+$/.test(segment)) {\n continue;\n }\n\n if (current == null || typeof current !== 'object') {\n return null;\n }\n\n current = current[segment];\n }\n\n if (typeof current === 'function') {\n return current;\n }\n\n return null;\n}\n"],"mappings":";;AAEA,SAAgB,eACd,MACA,OAC8E;CAC9E,IAAI,CAAC,OACH,OAAO;CAGT,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,UAAe;CAEnB,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,UAAU,SAAS;EAEzB,IAAI,QAAQ,KAAK,OAAO,GACtB;EAGF,IAAI,WAAW,QAAQ,OAAO,YAAY,UACxC,OAAO;EAGT,UAAU,QAAQ;CACpB;CAEA,IAAI,OAAO,YAAY,YACrB,OAAO;CAGT,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"should-validate-on-change.cjs","names":["FORM_INDEX"],"sources":["../../src/validate/should-validate-on-change.ts"],"sourcesContent":["import { FORM_INDEX } from '../form-index';\n\nexport function shouldValidateOnChange(path: unknown, validateInputOnChange: boolean | unknown[]) {\n if (!validateInputOnChange) {\n return false;\n }\n\n if (typeof validateInputOnChange === 'boolean') {\n return validateInputOnChange;\n }\n\n if (Array.isArray(validateInputOnChange)) {\n return validateInputOnChange.includes((path as string).replace(/[.][0-9]+/g, `.${FORM_INDEX}`));\n }\n\n return false;\n}\n"],"mappings":";;;AAEA,SAAgB,uBAAuB,MAAe,uBAA4C;
|
|
1
|
+
{"version":3,"file":"should-validate-on-change.cjs","names":["FORM_INDEX"],"sources":["../../src/validate/should-validate-on-change.ts"],"sourcesContent":["import { FORM_INDEX } from '../form-index';\n\nexport function shouldValidateOnChange(path: unknown, validateInputOnChange: boolean | unknown[]) {\n if (!validateInputOnChange) {\n return false;\n }\n\n if (typeof validateInputOnChange === 'boolean') {\n return validateInputOnChange;\n }\n\n if (Array.isArray(validateInputOnChange)) {\n return validateInputOnChange.includes((path as string).replace(/[.][0-9]+/g, `.${FORM_INDEX}`));\n }\n\n return false;\n}\n"],"mappings":";;;AAEA,SAAgB,uBAAuB,MAAe,uBAA4C;CAChG,IAAI,CAAC,uBACH,OAAO;CAGT,IAAI,OAAO,0BAA0B,WACnC,OAAO;CAGT,IAAI,MAAM,QAAQ,qBAAqB,GACrC,OAAO,sBAAsB,SAAU,KAAgB,QAAQ,cAAc,IAAIA,mBAAAA,YAAY,CAAC;CAGhG,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-field-value.cjs","names":["validateValues","getRuleForPath","getPath"],"sources":["../../src/validate/validate-field-value.ts"],"sourcesContent":["import { getPath } from '../paths';\nimport { FormFieldValidationResult, FormValidateInput } from '../types';\nimport { getRuleForPath } from './get-rule-for-path';\nimport { validateValues } from './validate-values';\n\nconst defaultResolveError = (err: unknown): React.ReactNode =>\n err instanceof Error ? err.message : String(err);\n\nfunction fieldResultFromErrors(\n path: string,\n errors: Record<string, React.ReactNode>\n): FormFieldValidationResult {\n const pathInError = Object.keys(errors).find((errorKey) =>\n path.split('.').every((pathPart, i) => pathPart === errorKey.split('.')[i])\n );\n return { hasError: !!pathInError, error: pathInError ? errors[pathInError] : null };\n}\n\nexport function validateFieldValue<T>(\n path: unknown,\n rules: FormValidateInput<T> | undefined,\n values: T,\n resolveValidationError: (error: unknown) => React.ReactNode = defaultResolveError,\n signal: AbortSignal = new AbortController().signal\n): FormFieldValidationResult | Promise<FormFieldValidationResult> {\n if (typeof path !== 'string') {\n return { hasError: false, error: null };\n }\n\n if (typeof rules === 'function') {\n const results = validateValues(rules, values, resolveValidationError, signal);\n if (results instanceof Promise) {\n return results.then((r) => fieldResultFromErrors(path, r.errors));\n }\n return fieldResultFromErrors(path, results.errors);\n }\n\n const rule = getRuleForPath(path, rules);\n\n if (rule) {\n const value = getPath(path, values);\n try {\n const result = rule(value, values, path, signal);\n if (result instanceof Promise) {\n return result.then(\n (error) => {\n if (error) {\n return { hasError: true, error };\n }\n return { hasError: false, error: null };\n },\n (err) => ({ hasError: true, error: resolveValidationError(err) })\n );\n }\n if (result) {\n return { hasError: true, error: result };\n }\n return { hasError: false, error: null };\n } catch (err) {\n const error = resolveValidationError(err);\n return { hasError: true, error };\n }\n }\n\n const results = validateValues(rules, values, resolveValidationError, signal);\n if (results instanceof Promise) {\n return results.then((r) => fieldResultFromErrors(path, r.errors));\n }\n return fieldResultFromErrors(path, results.errors);\n}\n"],"mappings":";;;;;AAKA,MAAM,uBAAuB,QAC3B,eAAe,QAAQ,IAAI,UAAU,OAAO,
|
|
1
|
+
{"version":3,"file":"validate-field-value.cjs","names":["validateValues","getRuleForPath","getPath"],"sources":["../../src/validate/validate-field-value.ts"],"sourcesContent":["import { getPath } from '../paths';\nimport { FormFieldValidationResult, FormValidateInput } from '../types';\nimport { getRuleForPath } from './get-rule-for-path';\nimport { validateValues } from './validate-values';\n\nconst defaultResolveError = (err: unknown): React.ReactNode =>\n err instanceof Error ? err.message : String(err);\n\nfunction fieldResultFromErrors(\n path: string,\n errors: Record<string, React.ReactNode>\n): FormFieldValidationResult {\n const pathInError = Object.keys(errors).find((errorKey) =>\n path.split('.').every((pathPart, i) => pathPart === errorKey.split('.')[i])\n );\n return { hasError: !!pathInError, error: pathInError ? errors[pathInError] : null };\n}\n\nexport function validateFieldValue<T>(\n path: unknown,\n rules: FormValidateInput<T> | undefined,\n values: T,\n resolveValidationError: (error: unknown) => React.ReactNode = defaultResolveError,\n signal: AbortSignal = new AbortController().signal\n): FormFieldValidationResult | Promise<FormFieldValidationResult> {\n if (typeof path !== 'string') {\n return { hasError: false, error: null };\n }\n\n if (typeof rules === 'function') {\n const results = validateValues(rules, values, resolveValidationError, signal);\n if (results instanceof Promise) {\n return results.then((r) => fieldResultFromErrors(path, r.errors));\n }\n return fieldResultFromErrors(path, results.errors);\n }\n\n const rule = getRuleForPath(path, rules);\n\n if (rule) {\n const value = getPath(path, values);\n try {\n const result = rule(value, values, path, signal);\n if (result instanceof Promise) {\n return result.then(\n (error) => {\n if (error) {\n return { hasError: true, error };\n }\n return { hasError: false, error: null };\n },\n (err) => ({ hasError: true, error: resolveValidationError(err) })\n );\n }\n if (result) {\n return { hasError: true, error: result };\n }\n return { hasError: false, error: null };\n } catch (err) {\n const error = resolveValidationError(err);\n return { hasError: true, error };\n }\n }\n\n const results = validateValues(rules, values, resolveValidationError, signal);\n if (results instanceof Promise) {\n return results.then((r) => fieldResultFromErrors(path, r.errors));\n }\n return fieldResultFromErrors(path, results.errors);\n}\n"],"mappings":";;;;;AAKA,MAAM,uBAAuB,QAC3B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAEjD,SAAS,sBACP,MACA,QAC2B;CAC3B,MAAM,cAAc,OAAO,KAAK,MAAM,EAAE,MAAM,aAC5C,KAAK,MAAM,GAAG,EAAE,OAAO,UAAU,MAAM,aAAa,SAAS,MAAM,GAAG,EAAE,EAAE,CAC5E;CACA,OAAO;EAAE,UAAU,CAAC,CAAC;EAAa,OAAO,cAAc,OAAO,eAAe;CAAK;AACpF;AAEA,SAAgB,mBACd,MACA,OACA,QACA,yBAA8D,qBAC9D,SAAsB,IAAI,gBAAgB,EAAE,QACoB;CAChE,IAAI,OAAO,SAAS,UAClB,OAAO;EAAE,UAAU;EAAO,OAAO;CAAK;CAGxC,IAAI,OAAO,UAAU,YAAY;EAC/B,MAAM,UAAUA,wBAAAA,eAAe,OAAO,QAAQ,wBAAwB,MAAM;EAC5E,IAAI,mBAAmB,SACrB,OAAO,QAAQ,MAAM,MAAM,sBAAsB,MAAM,EAAE,MAAM,CAAC;EAElE,OAAO,sBAAsB,MAAM,QAAQ,MAAM;CACnD;CAEA,MAAM,OAAOC,0BAAAA,eAAe,MAAM,KAAK;CAEvC,IAAI,MAAM;EACR,MAAM,QAAQC,iBAAAA,QAAQ,MAAM,MAAM;EAClC,IAAI;GACF,MAAM,SAAS,KAAK,OAAO,QAAQ,MAAM,MAAM;GAC/C,IAAI,kBAAkB,SACpB,OAAO,OAAO,MACX,UAAU;IACT,IAAI,OACF,OAAO;KAAE,UAAU;KAAM;IAAM;IAEjC,OAAO;KAAE,UAAU;KAAO,OAAO;IAAK;GACxC,IACC,SAAS;IAAE,UAAU;IAAM,OAAO,uBAAuB,GAAG;GAAE,EACjE;GAEF,IAAI,QACF,OAAO;IAAE,UAAU;IAAM,OAAO;GAAO;GAEzC,OAAO;IAAE,UAAU;IAAO,OAAO;GAAK;EACxC,SAAS,KAAK;GAEZ,OAAO;IAAE,UAAU;IAAM,OADX,uBAAuB,GACR;GAAE;EACjC;CACF;CAEA,MAAM,UAAUF,wBAAAA,eAAe,OAAO,QAAQ,wBAAwB,MAAM;CAC5E,IAAI,mBAAmB,SACrB,OAAO,QAAQ,MAAM,MAAM,sBAAsB,MAAM,EAAE,MAAM,CAAC;CAElE,OAAO,sBAAsB,MAAM,QAAQ,MAAM;AACnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-values.cjs","names":["filterErrors","getPath"],"sources":["../../src/validate/validate-values.ts"],"sourcesContent":["import { filterErrors } from '../hooks/use-form-errors/filter-errors/filter-errors';\nimport { getPath } from '../paths';\nimport {\n FormErrors,\n FormRule,\n FormRulesRecord,\n FormValidateInput,\n FormValidationResult,\n} from '../types';\n\nexport const formRootRule = Symbol('root-rule');\n\nfunction getValidationResults(errors: FormErrors): FormValidationResult {\n const filteredErrors = filterErrors(errors);\n return { hasErrors: Object.keys(filteredErrors).length > 0, errors: filteredErrors };\n}\n\nfunction validateRulesRecord<T>(\n rules: FormRulesRecord<T> | undefined,\n values: T,\n resolveValidationError: (error: unknown) => React.ReactNode,\n signal: AbortSignal,\n path = '',\n errors: FormErrors = {}\n): FormErrors | Promise<FormErrors> {\n if (typeof rules !== 'object' || rules === null) {\n return errors;\n }\n\n const asyncTasks: Array<{ rulePath: string; promise: Promise<React.ReactNode> }> = [];\n const pendingRecursions: Array<Promise<FormErrors>> = [];\n\n for (const ruleKey of Object.keys(rules)) {\n const rule: FormRule<any, any> = (rules as any)[ruleKey];\n const rulePath = `${path === '' ? '' : `${path}.`}${ruleKey}`;\n const value = getPath(rulePath, values);\n let arrayValidation = false;\n\n if (typeof rule === 'function') {\n const result = rule(value, values, rulePath, signal);\n if (result instanceof Promise) {\n asyncTasks.push({ rulePath, promise: result });\n } else {\n errors[rulePath] = result;\n }\n }\n\n if (typeof rule === 'object' && Array.isArray(value)) {\n arrayValidation = true;\n for (let index = 0; index < value.length; index++) {\n const recursionResult = validateRulesRecord(\n rule,\n values,\n resolveValidationError,\n signal,\n `${rulePath}.${index}`,\n errors\n );\n if (recursionResult instanceof Promise) {\n pendingRecursions.push(recursionResult);\n }\n }\n\n if (formRootRule in rule) {\n const rootResult = (rule as any)[formRootRule](value, values, rulePath, signal);\n if (rootResult instanceof Promise) {\n asyncTasks.push({ rulePath, promise: rootResult });\n } else {\n errors[rulePath] = rootResult;\n }\n }\n }\n\n if (typeof rule === 'object' && typeof value === 'object' && value !== null) {\n if (!arrayValidation) {\n const recursionResult = validateRulesRecord(\n rule,\n values,\n resolveValidationError,\n signal,\n rulePath,\n errors\n );\n if (recursionResult instanceof Promise) {\n pendingRecursions.push(recursionResult);\n }\n }\n\n if (formRootRule in rule) {\n const rootResult = (rule as any)[formRootRule](value, values, rulePath, signal);\n if (rootResult instanceof Promise) {\n asyncTasks.push({ rulePath, promise: rootResult });\n } else {\n errors[rulePath] = rootResult;\n }\n }\n }\n }\n\n if (asyncTasks.length === 0 && pendingRecursions.length === 0) {\n return errors;\n }\n\n return (async () => {\n await Promise.all(pendingRecursions);\n\n if (asyncTasks.length > 0) {\n const settled = await Promise.allSettled(asyncTasks.map((t) => t.promise));\n settled.forEach((result, index) => {\n const { rulePath } = asyncTasks[index];\n if (result.status === 'fulfilled') {\n errors[rulePath] = result.value;\n } else {\n errors[rulePath] = resolveValidationError(result.reason);\n }\n });\n }\n\n return errors;\n })();\n}\n\nconst defaultResolveError = (err: unknown): React.ReactNode =>\n err instanceof Error ? err.message : String(err);\n\nexport function validateValues<T>(\n validate: FormValidateInput<T> | undefined,\n values: T,\n resolveValidationError: (error: unknown) => React.ReactNode = defaultResolveError,\n signal: AbortSignal = new AbortController().signal\n): FormValidationResult | Promise<FormValidationResult> {\n if (typeof validate === 'function') {\n const result = validate(values);\n if (result instanceof Promise) {\n return result.then(getValidationResults);\n }\n return getValidationResults(result);\n }\n\n const errorsResult = validateRulesRecord(validate, values, resolveValidationError, signal);\n if (errorsResult instanceof Promise) {\n return errorsResult.then(getValidationResults);\n }\n return getValidationResults(errorsResult);\n}\n"],"mappings":";;;;AAUA,MAAa,eAAe,OAAO,
|
|
1
|
+
{"version":3,"file":"validate-values.cjs","names":["filterErrors","getPath"],"sources":["../../src/validate/validate-values.ts"],"sourcesContent":["import { filterErrors } from '../hooks/use-form-errors/filter-errors/filter-errors';\nimport { getPath } from '../paths';\nimport {\n FormErrors,\n FormRule,\n FormRulesRecord,\n FormValidateInput,\n FormValidationResult,\n} from '../types';\n\nexport const formRootRule = Symbol('root-rule');\n\nfunction getValidationResults(errors: FormErrors): FormValidationResult {\n const filteredErrors = filterErrors(errors);\n return { hasErrors: Object.keys(filteredErrors).length > 0, errors: filteredErrors };\n}\n\nfunction validateRulesRecord<T>(\n rules: FormRulesRecord<T> | undefined,\n values: T,\n resolveValidationError: (error: unknown) => React.ReactNode,\n signal: AbortSignal,\n path = '',\n errors: FormErrors = {}\n): FormErrors | Promise<FormErrors> {\n if (typeof rules !== 'object' || rules === null) {\n return errors;\n }\n\n const asyncTasks: Array<{ rulePath: string; promise: Promise<React.ReactNode> }> = [];\n const pendingRecursions: Array<Promise<FormErrors>> = [];\n\n for (const ruleKey of Object.keys(rules)) {\n const rule: FormRule<any, any> = (rules as any)[ruleKey];\n const rulePath = `${path === '' ? '' : `${path}.`}${ruleKey}`;\n const value = getPath(rulePath, values);\n let arrayValidation = false;\n\n if (typeof rule === 'function') {\n const result = rule(value, values, rulePath, signal);\n if (result instanceof Promise) {\n asyncTasks.push({ rulePath, promise: result });\n } else {\n errors[rulePath] = result;\n }\n }\n\n if (typeof rule === 'object' && Array.isArray(value)) {\n arrayValidation = true;\n for (let index = 0; index < value.length; index++) {\n const recursionResult = validateRulesRecord(\n rule,\n values,\n resolveValidationError,\n signal,\n `${rulePath}.${index}`,\n errors\n );\n if (recursionResult instanceof Promise) {\n pendingRecursions.push(recursionResult);\n }\n }\n\n if (formRootRule in rule) {\n const rootResult = (rule as any)[formRootRule](value, values, rulePath, signal);\n if (rootResult instanceof Promise) {\n asyncTasks.push({ rulePath, promise: rootResult });\n } else {\n errors[rulePath] = rootResult;\n }\n }\n }\n\n if (typeof rule === 'object' && typeof value === 'object' && value !== null) {\n if (!arrayValidation) {\n const recursionResult = validateRulesRecord(\n rule,\n values,\n resolveValidationError,\n signal,\n rulePath,\n errors\n );\n if (recursionResult instanceof Promise) {\n pendingRecursions.push(recursionResult);\n }\n }\n\n if (formRootRule in rule) {\n const rootResult = (rule as any)[formRootRule](value, values, rulePath, signal);\n if (rootResult instanceof Promise) {\n asyncTasks.push({ rulePath, promise: rootResult });\n } else {\n errors[rulePath] = rootResult;\n }\n }\n }\n }\n\n if (asyncTasks.length === 0 && pendingRecursions.length === 0) {\n return errors;\n }\n\n return (async () => {\n await Promise.all(pendingRecursions);\n\n if (asyncTasks.length > 0) {\n const settled = await Promise.allSettled(asyncTasks.map((t) => t.promise));\n settled.forEach((result, index) => {\n const { rulePath } = asyncTasks[index];\n if (result.status === 'fulfilled') {\n errors[rulePath] = result.value;\n } else {\n errors[rulePath] = resolveValidationError(result.reason);\n }\n });\n }\n\n return errors;\n })();\n}\n\nconst defaultResolveError = (err: unknown): React.ReactNode =>\n err instanceof Error ? err.message : String(err);\n\nexport function validateValues<T>(\n validate: FormValidateInput<T> | undefined,\n values: T,\n resolveValidationError: (error: unknown) => React.ReactNode = defaultResolveError,\n signal: AbortSignal = new AbortController().signal\n): FormValidationResult | Promise<FormValidationResult> {\n if (typeof validate === 'function') {\n const result = validate(values);\n if (result instanceof Promise) {\n return result.then(getValidationResults);\n }\n return getValidationResults(result);\n }\n\n const errorsResult = validateRulesRecord(validate, values, resolveValidationError, signal);\n if (errorsResult instanceof Promise) {\n return errorsResult.then(getValidationResults);\n }\n return getValidationResults(errorsResult);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"has-length.cjs","names":[],"sources":["../../../src/validators/has-length/has-length.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"has-length.cjs","names":[],"sources":["../../../src/validators/has-length/has-length.ts"],"sourcesContent":["import type { SyncReactNode } from '../types';\n\ninterface HasLengthOptions {\n max?: number;\n min?: number;\n}\n\ntype HasLengthPayload = HasLengthOptions | number;\n\nfunction isLengthValid(payload: HasLengthPayload, value: any) {\n if (typeof payload === 'number') {\n return value.length === payload;\n }\n\n const { max, min } = payload;\n let valid = true;\n\n if (typeof max === 'number' && value.length > max) {\n valid = false;\n }\n\n if (typeof min === 'number' && value.length < min) {\n valid = false;\n }\n\n return valid;\n}\n\nexport function hasLength(payload: HasLengthPayload, error?: SyncReactNode) {\n const _error = error || true;\n\n return (value: unknown): SyncReactNode => {\n if (typeof value === 'string') {\n return isLengthValid(payload, value.trim()) ? null : _error;\n }\n\n if (typeof value === 'object' && value !== null && 'length' in value) {\n return isLengthValid(payload, value) ? null : _error;\n }\n\n return _error;\n };\n}\n"],"mappings":";;AASA,SAAS,cAAc,SAA2B,OAAY;CAC5D,IAAI,OAAO,YAAY,UACrB,OAAO,MAAM,WAAW;CAG1B,MAAM,EAAE,KAAK,QAAQ;CACrB,IAAI,QAAQ;CAEZ,IAAI,OAAO,QAAQ,YAAY,MAAM,SAAS,KAC5C,QAAQ;CAGV,IAAI,OAAO,QAAQ,YAAY,MAAM,SAAS,KAC5C,QAAQ;CAGV,OAAO;AACT;AAEA,SAAgB,UAAU,SAA2B,OAAuB;CAC1E,MAAM,SAAS,SAAS;CAExB,QAAQ,UAAkC;EACxC,IAAI,OAAO,UAAU,UACnB,OAAO,cAAc,SAAS,MAAM,KAAK,CAAC,IAAI,OAAO;EAGvD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY,OAC7D,OAAO,cAAc,SAAS,KAAK,IAAI,OAAO;EAGhD,OAAO;CACT;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-email.cjs","names":["matches"],"sources":["../../../src/validators/is-email/is-email.ts"],"sourcesContent":["import { matches } from '../matches/matches';\n\nexport function isEmail(error?:
|
|
1
|
+
{"version":3,"file":"is-email.cjs","names":["matches"],"sources":["../../../src/validators/is-email/is-email.ts"],"sourcesContent":["import { matches } from '../matches/matches';\nimport type { SyncReactNode } from '../types';\n\nexport function isEmail(error?: SyncReactNode) {\n return matches(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/, error);\n}\n"],"mappings":";;;AAGA,SAAgB,QAAQ,OAAuB;CAC7C,OAAOA,gBAAAA,QAAQ,oDAAoD,KAAK;AAC1E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-in-range.cjs","names":[],"sources":["../../../src/validators/is-in-range/is-in-range.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"is-in-range.cjs","names":[],"sources":["../../../src/validators/is-in-range/is-in-range.ts"],"sourcesContent":["import type { SyncReactNode } from '../types';\n\ninterface IsInRangePayload {\n min?: number;\n max?: number;\n}\n\nexport function isInRange({ min, max }: IsInRangePayload, error?: SyncReactNode) {\n const _error = error || true;\n\n return (value: unknown): SyncReactNode => {\n if (typeof value !== 'number') {\n return _error;\n }\n\n let valid = true;\n\n if (typeof min === 'number' && value < min) {\n valid = false;\n }\n\n if (typeof max === 'number' && value > max) {\n valid = false;\n }\n\n return valid ? null : _error;\n };\n}\n"],"mappings":";;AAOA,SAAgB,UAAU,EAAE,KAAK,OAAyB,OAAuB;CAC/E,MAAM,SAAS,SAAS;CAExB,QAAQ,UAAkC;EACxC,IAAI,OAAO,UAAU,UACnB,OAAO;EAGT,IAAI,QAAQ;EAEZ,IAAI,OAAO,QAAQ,YAAY,QAAQ,KACrC,QAAQ;EAGV,IAAI,OAAO,QAAQ,YAAY,QAAQ,KACrC,QAAQ;EAGV,OAAO,QAAQ,OAAO;CACxB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-json-string.cjs","names":[],"sources":["../../../src/validators/is-json-string/is-json-string.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"is-json-string.cjs","names":[],"sources":["../../../src/validators/is-json-string/is-json-string.ts"],"sourcesContent":["import type { SyncReactNode } from '../types';\n\nexport function isJSONString(error?: SyncReactNode) {\n const _error = error || true;\n\n return (value: unknown): SyncReactNode => {\n if (typeof value === 'string') {\n try {\n JSON.parse(value);\n return null;\n } catch (e) {\n return _error;\n }\n }\n\n return _error;\n };\n}\n"],"mappings":";;AAEA,SAAgB,aAAa,OAAuB;CAClD,MAAM,SAAS,SAAS;CAExB,QAAQ,UAAkC;EACxC,IAAI,OAAO,UAAU,UACnB,IAAI;GACF,KAAK,MAAM,KAAK;GAChB,OAAO;EACT,SAAS,GAAG;GACV,OAAO;EACT;EAGF,OAAO;CACT;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-not-empty.cjs","names":[],"sources":["../../../src/validators/is-not-empty/is-not-empty.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"is-not-empty.cjs","names":[],"sources":["../../../src/validators/is-not-empty/is-not-empty.ts"],"sourcesContent":["import type { SyncReactNode } from '../types';\n\nexport function isNotEmpty(error?: SyncReactNode) {\n const _error = error || true;\n\n return (value: unknown): SyncReactNode => {\n if (typeof value === 'string') {\n return value.trim().length > 0 ? null : _error;\n }\n\n if (Array.isArray(value)) {\n return value.length > 0 ? null : _error;\n }\n\n if (value === null || value === undefined) {\n return _error;\n }\n\n if (value === false) {\n return _error;\n }\n\n return null;\n };\n}\n"],"mappings":";;AAEA,SAAgB,WAAW,OAAuB;CAChD,MAAM,SAAS,SAAS;CAExB,QAAQ,UAAkC;EACxC,IAAI,OAAO,UAAU,UACnB,OAAO,MAAM,KAAK,EAAE,SAAS,IAAI,OAAO;EAG1C,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,SAAS,IAAI,OAAO;EAGnC,IAAI,UAAU,QAAQ,UAAU,KAAA,GAC9B,OAAO;EAGT,IAAI,UAAU,OACZ,OAAO;EAGT,OAAO;CACT;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-not-empty-html.cjs","names":[],"sources":["../../../src/validators/is-not-empty-html/is-not-empty-html.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"is-not-empty-html.cjs","names":[],"sources":["../../../src/validators/is-not-empty-html/is-not-empty-html.ts"],"sourcesContent":["import type { SyncReactNode } from '../types';\n\nfunction removeHtmlTags(input: string): string {\n return input.replace(/<\\/?[^>]+(>|$)/g, '');\n}\n\nexport function isNotEmptyHTML(error?: SyncReactNode) {\n const _error = error || true;\n\n return (value: unknown): SyncReactNode => {\n if (typeof value === 'string') {\n return removeHtmlTags(value).trim().length > 0 ? null : _error;\n }\n\n return _error;\n };\n}\n"],"mappings":";;AAEA,SAAS,eAAe,OAAuB;CAC7C,OAAO,MAAM,QAAQ,mBAAmB,EAAE;AAC5C;AAEA,SAAgB,eAAe,OAAuB;CACpD,MAAM,SAAS,SAAS;CAExB,QAAQ,UAAkC;EACxC,IAAI,OAAO,UAAU,UACnB,OAAO,eAAe,KAAK,EAAE,KAAK,EAAE,SAAS,IAAI,OAAO;EAG1D,OAAO;CACT;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-one-of.cjs","names":[],"sources":["../../../src/validators/is-one-of/is-one-of.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"is-one-of.cjs","names":[],"sources":["../../../src/validators/is-one-of/is-one-of.ts"],"sourcesContent":["import type { SyncReactNode } from '../types';\n\nexport function isOneOf<T>(values: readonly T[], error?: SyncReactNode) {\n const _error = error || true;\n\n return (value: unknown): SyncReactNode => {\n return (values as readonly unknown[]).includes(value) ? null : _error;\n };\n}\n"],"mappings":";;AAEA,SAAgB,QAAW,QAAsB,OAAuB;CACtE,MAAM,SAAS,SAAS;CAExB,QAAQ,UAAkC;EACxC,OAAQ,OAA8B,SAAS,KAAK,IAAI,OAAO;CACjE;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-url.cjs","names":[],"sources":["../../../src/validators/is-url/is-url.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"is-url.cjs","names":[],"sources":["../../../src/validators/is-url/is-url.ts"],"sourcesContent":["import type { SyncReactNode } from '../types';\n\ninterface IsUrlOptions {\n protocols?: string[];\n allowLocalhost?: boolean;\n}\n\nexport function isUrl(error?: SyncReactNode): (value: unknown) => SyncReactNode;\nexport function isUrl(\n options: IsUrlOptions,\n error?: SyncReactNode\n): (value: unknown) => SyncReactNode;\nexport function isUrl(optionsOrError?: IsUrlOptions | SyncReactNode, error?: SyncReactNode) {\n let _options: IsUrlOptions = {};\n let _error: SyncReactNode;\n\n if (\n optionsOrError !== null &&\n optionsOrError !== undefined &&\n typeof optionsOrError === 'object' &&\n !Array.isArray(optionsOrError) &&\n ('protocols' in optionsOrError || 'allowLocalhost' in optionsOrError)\n ) {\n _options = optionsOrError as IsUrlOptions;\n _error = error || true;\n } else {\n _error = (optionsOrError as SyncReactNode) || true;\n }\n\n const protocols = _options.protocols ?? ['http', 'https'];\n const allowLocalhost = _options.allowLocalhost ?? false;\n\n return (value: unknown): SyncReactNode => {\n if (typeof value !== 'string') {\n return _error;\n }\n\n try {\n const url = new URL(value);\n const protocol = url.protocol.replace(':', '');\n\n if (!protocols.includes(protocol)) {\n return _error;\n }\n\n if (!allowLocalhost && url.hostname === 'localhost') {\n return _error;\n }\n\n return null;\n } catch {\n return _error;\n }\n };\n}\n"],"mappings":";;AAYA,SAAgB,MAAM,gBAA+C,OAAuB;CAC1F,IAAI,WAAyB,CAAC;CAC9B,IAAI;CAEJ,IACE,mBAAmB,QACnB,mBAAmB,KAAA,KACnB,OAAO,mBAAmB,YAC1B,CAAC,MAAM,QAAQ,cAAc,MAC5B,eAAe,kBAAkB,oBAAoB,iBACtD;EACA,WAAW;EACX,SAAS,SAAS;CACpB,OACE,SAAU,kBAAoC;CAGhD,MAAM,YAAY,SAAS,aAAa,CAAC,QAAQ,OAAO;CACxD,MAAM,iBAAiB,SAAS,kBAAkB;CAElD,QAAQ,UAAkC;EACxC,IAAI,OAAO,UAAU,UACnB,OAAO;EAGT,IAAI;GACF,MAAM,MAAM,IAAI,IAAI,KAAK;GACzB,MAAM,WAAW,IAAI,SAAS,QAAQ,KAAK,EAAE;GAE7C,IAAI,CAAC,UAAU,SAAS,QAAQ,GAC9B,OAAO;GAGT,IAAI,CAAC,kBAAkB,IAAI,aAAa,aACtC,OAAO;GAGT,OAAO;EACT,QAAQ;GACN,OAAO;EACT;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matches.cjs","names":[],"sources":["../../../src/validators/matches/matches.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"matches.cjs","names":[],"sources":["../../../src/validators/matches/matches.ts"],"sourcesContent":["import type { SyncReactNode } from '../types';\n\nexport function matches(regexp: RegExp, error?: SyncReactNode) {\n const _error = error || true;\n\n return (value: unknown): SyncReactNode => {\n if (typeof value !== 'string') {\n return _error;\n }\n\n return regexp.test(value) ? null : _error;\n };\n}\n"],"mappings":";;AAEA,SAAgB,QAAQ,QAAgB,OAAuB;CAC7D,MAAM,SAAS,SAAS;CAExB,QAAQ,UAAkC;EACxC,IAAI,OAAO,UAAU,UACnB,OAAO;EAGT,OAAO,OAAO,KAAK,KAAK,IAAI,OAAO;CACrC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matches-field.cjs","names":[],"sources":["../../../src/validators/matches-field/matches-field.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"matches-field.cjs","names":[],"sources":["../../../src/validators/matches-field/matches-field.ts"],"sourcesContent":["import type { SyncReactNode } from '../types';\n\nexport function matchesField<T>(field: keyof T, error?: SyncReactNode) {\n const _error = error || true;\n\n return (value: unknown, values: T): SyncReactNode => {\n if (!values || !(field in (values as any))) {\n return _error;\n }\n\n return value === values[field] ? null : _error;\n };\n}\n"],"mappings":";;AAEA,SAAgB,aAAgB,OAAgB,OAAuB;CACrE,MAAM,SAAS,SAAS;CAExB,QAAQ,OAAgB,WAA6B;EACnD,IAAI,CAAC,UAAU,EAAE,SAAU,SACzB,OAAO;EAGT,OAAO,UAAU,OAAO,SAAS,OAAO;CAC1C;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormProvider.mjs","names":[],"sources":["../../src/FormProvider/FormProvider.tsx"],"sourcesContent":["import { createContext, use } from 'react';\nimport { UseForm, UseFormReturnType } from '../types';\nimport { useForm } from '../use-form';\n\nexport interface FormProviderProps<Form> {\n form: Form;\n children: React.ReactNode;\n}\n\nexport function createFormContext<Values, TransformedValues = Values, Rules = any>() {\n type Form = UseFormReturnType<Values, TransformedValues, Rules>;\n\n const FormContext = createContext<Form | null>(null);\n\n function FormProvider({ form, children }: FormProviderProps<Form>) {\n return <FormContext value={form}>{children}</FormContext>;\n }\n\n function useFormContext() {\n const ctx = use(FormContext);\n if (!ctx) {\n throw new Error('useFormContext was called outside of FormProvider context');\n }\n\n return ctx;\n }\n\n return [FormProvider, useFormContext, useForm] as [\n React.FC<FormProviderProps<Form>>,\n () => Form,\n UseForm<Values, TransformedValues, Rules>,\n ];\n}\n"],"mappings":";;;;;AASA,SAAgB,oBAAqE;CAGnF,MAAM,cAAc,cAA2B,
|
|
1
|
+
{"version":3,"file":"FormProvider.mjs","names":[],"sources":["../../src/FormProvider/FormProvider.tsx"],"sourcesContent":["import { createContext, use } from 'react';\nimport { UseForm, UseFormReturnType } from '../types';\nimport { useForm } from '../use-form';\n\nexport interface FormProviderProps<Form> {\n form: Form;\n children: React.ReactNode;\n}\n\nexport function createFormContext<Values, TransformedValues = Values, Rules = any>() {\n type Form = UseFormReturnType<Values, TransformedValues, Rules>;\n\n const FormContext = createContext<Form | null>(null);\n\n function FormProvider({ form, children }: FormProviderProps<Form>) {\n return <FormContext value={form}>{children}</FormContext>;\n }\n\n function useFormContext() {\n const ctx = use(FormContext);\n if (!ctx) {\n throw new Error('useFormContext was called outside of FormProvider context');\n }\n\n return ctx;\n }\n\n return [FormProvider, useFormContext, useForm] as [\n React.FC<FormProviderProps<Form>>,\n () => Form,\n UseForm<Values, TransformedValues, Rules>,\n ];\n}\n"],"mappings":";;;;;AASA,SAAgB,oBAAqE;CAGnF,MAAM,cAAc,cAA2B,IAAI;CAEnD,SAAS,aAAa,EAAE,MAAM,YAAqC;EACjE,OAAO,oBAAC,aAAD;GAAa,OAAO;GAAO;EAAsB,CAAA;CAC1D;CAEA,SAAS,iBAAiB;EACxB,MAAM,MAAM,IAAI,WAAW;EAC3B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,2DAA2D;EAG7E,OAAO;CACT;CAEA,OAAO;EAAC;EAAc;EAAgB;CAAO;AAK/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.mjs","names":[],"sources":["../../src/actions/actions.ts"],"sourcesContent":["import { useEffect, useLayoutEffect } from 'react';\nimport type {\n ClearErrors,\n ClearFieldError,\n InsertListItem,\n RemoveListItem,\n ReorderListItem,\n Reset,\n ResetDirty,\n ResetStatus,\n SetErrors,\n SetFieldError,\n SetFieldValue,\n SetFormStatus,\n SetInitialValues,\n SetValues,\n UseFormReturnType,\n} from '../types';\n\nfunction dispatchEvent(type: string, detail?: any): any {\n window.dispatchEvent(new CustomEvent(type, { detail }));\n}\n\nfunction validateFormName(name: string) {\n if (!/^[0-9a-zA-Z-]+$/.test(name)) {\n throw new Error(\n `[@mantine/use-form] Form name \"${name}\" is invalid, it should contain only letters, numbers and dashes`\n );\n }\n}\n\nexport const useIsomorphicEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport function createFormActions<FormValues extends Record<string, any> = Record<string, any>>(\n name: string\n) {\n validateFormName(name);\n\n const setFieldValue: SetFieldValue<FormValues> = (path, value) =>\n dispatchEvent(`mantine-form:${name}:set-field-value`, { path, value });\n\n const setValues: SetValues<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:set-values`, values);\n\n const setInitialValues: SetInitialValues<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:set-initial-values`, values);\n\n const setErrors: SetErrors = (errors) => dispatchEvent(`mantine-form:${name}:set-errors`, errors);\n\n const setFieldError: SetFieldError<FormValues> = (path, error) =>\n dispatchEvent(`mantine-form:${name}:set-field-error`, { path, error });\n\n const clearFieldError: ClearFieldError = (path) =>\n dispatchEvent(`mantine-form:${name}:clear-field-error`, path);\n\n const clearErrors: ClearErrors = () => dispatchEvent(`mantine-form:${name}:clear-errors`);\n\n const reset: Reset = () => dispatchEvent(`mantine-form:${name}:reset`);\n\n const validate: () => void = () => dispatchEvent(`mantine-form:${name}:validate`);\n\n const validateField: (path: any) => void = (path) =>\n dispatchEvent(`mantine-form:${name}:validate-field`, path);\n\n const reorderListItem: ReorderListItem<FormValues> = (path, payload) =>\n dispatchEvent(`mantine-form:${name}:reorder-list-item`, { path, payload });\n\n const removeListItem: RemoveListItem<FormValues> = (path, index) =>\n dispatchEvent(`mantine-form:${name}:remove-list-item`, { path, index });\n\n const insertListItem: InsertListItem<FormValues> = (path, item, index) =>\n dispatchEvent(`mantine-form:${name}:insert-list-item`, { path, index, item });\n\n const setDirty: SetFormStatus = (value) => dispatchEvent(`mantine-form:${name}:set-dirty`, value);\n\n const setTouched: SetFormStatus = (value) =>\n dispatchEvent(`mantine-form:${name}:set-touched`, value);\n\n const resetDirty: ResetDirty<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:reset-dirty`, values);\n\n const resetTouched: ResetStatus = () => dispatchEvent(`mantine-form:${name}:reset-touched`);\n\n return {\n setFieldValue,\n setValues,\n setInitialValues,\n setErrors,\n setFieldError,\n clearFieldError,\n clearErrors,\n reset,\n validate,\n validateField,\n reorderListItem,\n removeListItem,\n insertListItem,\n setDirty,\n setTouched,\n resetDirty,\n resetTouched,\n };\n}\n\nfunction useFormEvent(eventKey: string | undefined, handler: (event: any) => void) {\n useIsomorphicEffect(() => {\n if (eventKey) {\n window.addEventListener(eventKey, handler);\n return () => window.removeEventListener(eventKey, handler);\n }\n return undefined;\n }, [eventKey]);\n}\n\nexport function useFormActions<Values = Record<string, unknown>, TransformedValues = Values>(\n name: string | undefined,\n form: UseFormReturnType<Values, TransformedValues, any>\n) {\n if (name) {\n validateFormName(name);\n }\n\n useFormEvent(`mantine-form:${name}:set-field-value`, (event: CustomEvent) =>\n form.setFieldValue(event.detail.path, event.detail.value)\n );\n\n useFormEvent(`mantine-form:${name}:set-values`, (event: CustomEvent) =>\n form.setValues(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-initial-values`, (event: CustomEvent) =>\n form.setInitialValues(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-errors`, (event: CustomEvent) =>\n form.setErrors(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-field-error`, (event: CustomEvent) =>\n form.setFieldError(event.detail.path, event.detail.error)\n );\n\n useFormEvent(`mantine-form:${name}:clear-field-error`, (event: CustomEvent) =>\n form.clearFieldError(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:clear-errors`, form.clearErrors);\n useFormEvent(`mantine-form:${name}:reset`, form.reset);\n useFormEvent(`mantine-form:${name}:validate`, form.validate);\n\n useFormEvent(`mantine-form:${name}:validate-field`, (event: CustomEvent) =>\n form.validateField(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reorder-list-item`, (event: CustomEvent) =>\n form.reorderListItem(event.detail.path, event.detail.payload)\n );\n\n useFormEvent(`mantine-form:${name}:remove-list-item`, (event: CustomEvent) =>\n form.removeListItem(event.detail.path, event.detail.index)\n );\n\n useFormEvent(`mantine-form:${name}:insert-list-item`, (event: CustomEvent) =>\n form.insertListItem(event.detail.path, event.detail.item, event.detail.index)\n );\n\n useFormEvent(`mantine-form:${name}:set-dirty`, (event: CustomEvent) =>\n form.setDirty(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-touched`, (event: CustomEvent) =>\n form.setTouched(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reset-dirty`, (event: CustomEvent) =>\n form.resetDirty(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reset-touched`, form.resetTouched);\n}\n"],"mappings":";;;AAmBA,SAAS,cAAc,MAAc,QAAmB;
|
|
1
|
+
{"version":3,"file":"actions.mjs","names":[],"sources":["../../src/actions/actions.ts"],"sourcesContent":["import { useEffect, useLayoutEffect } from 'react';\nimport type {\n ClearErrors,\n ClearFieldError,\n InsertListItem,\n RemoveListItem,\n ReorderListItem,\n Reset,\n ResetDirty,\n ResetStatus,\n SetErrors,\n SetFieldError,\n SetFieldValue,\n SetFormStatus,\n SetInitialValues,\n SetValues,\n UseFormReturnType,\n} from '../types';\n\nfunction dispatchEvent(type: string, detail?: any): any {\n window.dispatchEvent(new CustomEvent(type, { detail }));\n}\n\nfunction validateFormName(name: string) {\n if (!/^[0-9a-zA-Z-]+$/.test(name)) {\n throw new Error(\n `[@mantine/use-form] Form name \"${name}\" is invalid, it should contain only letters, numbers and dashes`\n );\n }\n}\n\nexport const useIsomorphicEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport function createFormActions<FormValues extends Record<string, any> = Record<string, any>>(\n name: string\n) {\n validateFormName(name);\n\n const setFieldValue: SetFieldValue<FormValues> = (path, value) =>\n dispatchEvent(`mantine-form:${name}:set-field-value`, { path, value });\n\n const setValues: SetValues<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:set-values`, values);\n\n const setInitialValues: SetInitialValues<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:set-initial-values`, values);\n\n const setErrors: SetErrors = (errors) => dispatchEvent(`mantine-form:${name}:set-errors`, errors);\n\n const setFieldError: SetFieldError<FormValues> = (path, error) =>\n dispatchEvent(`mantine-form:${name}:set-field-error`, { path, error });\n\n const clearFieldError: ClearFieldError = (path) =>\n dispatchEvent(`mantine-form:${name}:clear-field-error`, path);\n\n const clearErrors: ClearErrors = () => dispatchEvent(`mantine-form:${name}:clear-errors`);\n\n const reset: Reset = () => dispatchEvent(`mantine-form:${name}:reset`);\n\n const validate: () => void = () => dispatchEvent(`mantine-form:${name}:validate`);\n\n const validateField: (path: any) => void = (path) =>\n dispatchEvent(`mantine-form:${name}:validate-field`, path);\n\n const reorderListItem: ReorderListItem<FormValues> = (path, payload) =>\n dispatchEvent(`mantine-form:${name}:reorder-list-item`, { path, payload });\n\n const removeListItem: RemoveListItem<FormValues> = (path, index) =>\n dispatchEvent(`mantine-form:${name}:remove-list-item`, { path, index });\n\n const insertListItem: InsertListItem<FormValues> = (path, item, index) =>\n dispatchEvent(`mantine-form:${name}:insert-list-item`, { path, index, item });\n\n const setDirty: SetFormStatus = (value) => dispatchEvent(`mantine-form:${name}:set-dirty`, value);\n\n const setTouched: SetFormStatus = (value) =>\n dispatchEvent(`mantine-form:${name}:set-touched`, value);\n\n const resetDirty: ResetDirty<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:reset-dirty`, values);\n\n const resetTouched: ResetStatus = () => dispatchEvent(`mantine-form:${name}:reset-touched`);\n\n return {\n setFieldValue,\n setValues,\n setInitialValues,\n setErrors,\n setFieldError,\n clearFieldError,\n clearErrors,\n reset,\n validate,\n validateField,\n reorderListItem,\n removeListItem,\n insertListItem,\n setDirty,\n setTouched,\n resetDirty,\n resetTouched,\n };\n}\n\nfunction useFormEvent(eventKey: string | undefined, handler: (event: any) => void) {\n useIsomorphicEffect(() => {\n if (eventKey) {\n window.addEventListener(eventKey, handler);\n return () => window.removeEventListener(eventKey, handler);\n }\n return undefined;\n }, [eventKey]);\n}\n\nexport function useFormActions<Values = Record<string, unknown>, TransformedValues = Values>(\n name: string | undefined,\n form: UseFormReturnType<Values, TransformedValues, any>\n) {\n if (name) {\n validateFormName(name);\n }\n\n useFormEvent(`mantine-form:${name}:set-field-value`, (event: CustomEvent) =>\n form.setFieldValue(event.detail.path, event.detail.value)\n );\n\n useFormEvent(`mantine-form:${name}:set-values`, (event: CustomEvent) =>\n form.setValues(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-initial-values`, (event: CustomEvent) =>\n form.setInitialValues(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-errors`, (event: CustomEvent) =>\n form.setErrors(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-field-error`, (event: CustomEvent) =>\n form.setFieldError(event.detail.path, event.detail.error)\n );\n\n useFormEvent(`mantine-form:${name}:clear-field-error`, (event: CustomEvent) =>\n form.clearFieldError(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:clear-errors`, form.clearErrors);\n useFormEvent(`mantine-form:${name}:reset`, form.reset);\n useFormEvent(`mantine-form:${name}:validate`, form.validate);\n\n useFormEvent(`mantine-form:${name}:validate-field`, (event: CustomEvent) =>\n form.validateField(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reorder-list-item`, (event: CustomEvent) =>\n form.reorderListItem(event.detail.path, event.detail.payload)\n );\n\n useFormEvent(`mantine-form:${name}:remove-list-item`, (event: CustomEvent) =>\n form.removeListItem(event.detail.path, event.detail.index)\n );\n\n useFormEvent(`mantine-form:${name}:insert-list-item`, (event: CustomEvent) =>\n form.insertListItem(event.detail.path, event.detail.item, event.detail.index)\n );\n\n useFormEvent(`mantine-form:${name}:set-dirty`, (event: CustomEvent) =>\n form.setDirty(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-touched`, (event: CustomEvent) =>\n form.setTouched(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reset-dirty`, (event: CustomEvent) =>\n form.resetDirty(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reset-touched`, form.resetTouched);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-input-on-change.mjs","names":[],"sources":["../../src/get-input-on-change/get-input-on-change.ts"],"sourcesContent":["export function getInputOnChange<Value>(\n setValue: (value: Value | ((current: Value) => Value)) => void\n) {\n return (val: Value | React.ChangeEvent<unknown> | ((current: Value) => Value)) => {\n if (!val) {\n setValue(val as Value);\n } else if (typeof val === 'function') {\n setValue(val);\n } else if (typeof val === 'object' && 'nativeEvent' in val) {\n const { currentTarget } = val;\n if (currentTarget instanceof HTMLInputElement) {\n if (currentTarget.type === 'checkbox') {\n setValue(currentTarget.checked as any);\n } else {\n setValue(currentTarget.value as any);\n }\n } else if (\n currentTarget instanceof HTMLTextAreaElement ||\n currentTarget instanceof HTMLSelectElement\n ) {\n setValue(currentTarget.value as any);\n }\n } else {\n setValue(val);\n }\n };\n}\n"],"mappings":";;AAAA,SAAgB,iBACd,UACA;
|
|
1
|
+
{"version":3,"file":"get-input-on-change.mjs","names":[],"sources":["../../src/get-input-on-change/get-input-on-change.ts"],"sourcesContent":["export function getInputOnChange<Value>(\n setValue: (value: Value | ((current: Value) => Value)) => void\n) {\n return (val: Value | React.ChangeEvent<unknown> | ((current: Value) => Value)) => {\n if (!val) {\n setValue(val as Value);\n } else if (typeof val === 'function') {\n setValue(val);\n } else if (typeof val === 'object' && 'nativeEvent' in val) {\n const { currentTarget } = val;\n if (currentTarget instanceof HTMLInputElement) {\n if (currentTarget.type === 'checkbox') {\n setValue(currentTarget.checked as any);\n } else {\n setValue(currentTarget.value as any);\n }\n } else if (\n currentTarget instanceof HTMLTextAreaElement ||\n currentTarget instanceof HTMLSelectElement\n ) {\n setValue(currentTarget.value as any);\n }\n } else {\n setValue(val);\n }\n };\n}\n"],"mappings":";;AAAA,SAAgB,iBACd,UACA;CACA,QAAQ,QAA0E;EAChF,IAAI,CAAC,KACH,SAAS,GAAY;OAChB,IAAI,OAAO,QAAQ,YACxB,SAAS,GAAG;OACP,IAAI,OAAO,QAAQ,YAAY,iBAAiB,KAAK;GAC1D,MAAM,EAAE,kBAAkB;GAC1B,IAAI,yBAAyB,kBAC3B,IAAI,cAAc,SAAS,YACzB,SAAS,cAAc,OAAc;QAErC,SAAS,cAAc,KAAY;QAEhC,IACL,yBAAyB,uBACzB,yBAAyB,mBAEzB,SAAS,cAAc,KAAY;EAEvC,OACE,SAAS,GAAG;CAEhB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-status.mjs","names":[],"sources":["../../src/get-status/get-status.ts"],"sourcesContent":["import { FormStatus } from '../types';\n\nexport function getStatus(status: FormStatus, path?: unknown) {\n const paths = Object.keys(status);\n\n if (typeof path === 'string') {\n const nestedPaths = paths.filter((statusPath) => statusPath.startsWith(`${path}.`));\n return status[path] || nestedPaths.some((statusPath) => status[statusPath]) || false;\n }\n\n return paths.some((statusPath) => status[statusPath]);\n}\n"],"mappings":";;AAEA,SAAgB,UAAU,QAAoB,MAAgB;CAC5D,MAAM,QAAQ,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"get-status.mjs","names":[],"sources":["../../src/get-status/get-status.ts"],"sourcesContent":["import { FormStatus } from '../types';\n\nexport function getStatus(status: FormStatus, path?: unknown) {\n const paths = Object.keys(status);\n\n if (typeof path === 'string') {\n const nestedPaths = paths.filter((statusPath) => statusPath.startsWith(`${path}.`));\n return status[path] || nestedPaths.some((statusPath) => status[statusPath]) || false;\n }\n\n return paths.some((statusPath) => status[statusPath]);\n}\n"],"mappings":";;AAEA,SAAgB,UAAU,QAAoB,MAAgB;CAC5D,MAAM,QAAQ,OAAO,KAAK,MAAM;CAEhC,IAAI,OAAO,SAAS,UAAU;EAC5B,MAAM,cAAc,MAAM,QAAQ,eAAe,WAAW,WAAW,GAAG,KAAK,EAAE,CAAC;EAClF,OAAO,OAAO,SAAS,YAAY,MAAM,eAAe,OAAO,WAAW,KAAK;CACjF;CAEA,OAAO,MAAM,MAAM,eAAe,OAAO,WAAW;AACtD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-errors.mjs","names":[],"sources":["../../../../src/hooks/use-form-errors/filter-errors/filter-errors.ts"],"sourcesContent":["import type { FormErrors } from '../../../types';\n\nexport function filterErrors(errors: FormErrors): FormErrors {\n if (errors === null || typeof errors !== 'object') {\n return {};\n }\n\n return Object.keys(errors).reduce<FormErrors>((acc, key) => {\n const errorValue = errors[key];\n\n if (errorValue !== undefined && errorValue !== null && errorValue !== false) {\n acc[key] = errorValue;\n }\n\n return acc;\n }, {});\n}\n"],"mappings":";;AAEA,SAAgB,aAAa,QAAgC;
|
|
1
|
+
{"version":3,"file":"filter-errors.mjs","names":[],"sources":["../../../../src/hooks/use-form-errors/filter-errors/filter-errors.ts"],"sourcesContent":["import type { FormErrors } from '../../../types';\n\nexport function filterErrors(errors: FormErrors): FormErrors {\n if (errors === null || typeof errors !== 'object') {\n return {};\n }\n\n return Object.keys(errors).reduce<FormErrors>((acc, key) => {\n const errorValue = errors[key];\n\n if (errorValue !== undefined && errorValue !== null && errorValue !== false) {\n acc[key] = errorValue;\n }\n\n return acc;\n }, {});\n}\n"],"mappings":";;AAEA,SAAgB,aAAa,QAAgC;CAC3D,IAAI,WAAW,QAAQ,OAAO,WAAW,UACvC,OAAO,CAAC;CAGV,OAAO,OAAO,KAAK,MAAM,EAAE,QAAoB,KAAK,QAAQ;EAC1D,MAAM,aAAa,OAAO;EAE1B,IAAI,eAAe,KAAA,KAAa,eAAe,QAAQ,eAAe,OACpE,IAAI,OAAO;EAGb,OAAO;CACT,GAAG,CAAC,CAAC;AACP"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-errors.mjs","names":[],"sources":["../../../src/hooks/use-form-errors/use-form-errors.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { ClearErrors, ClearFieldError, FormErrors, SetErrors, SetFieldError } from '../../types';\nimport { filterErrors } from './filter-errors/filter-errors';\n\nexport interface $FormErrors<Values extends Record<string, any>> {\n errorsState: FormErrors;\n setErrors: SetErrors;\n clearErrors: ClearErrors;\n setFieldError: SetFieldError<Values>;\n clearFieldError: ClearFieldError;\n}\n\nexport function useFormErrors<Values extends Record<string, any>>(\n initialErrors: FormErrors\n): $FormErrors<Values> {\n const [errorsState, setErrorsState] = useState(filterErrors(initialErrors));\n const errorsRef = useRef(errorsState);\n\n const setErrors: SetErrors = useCallback((errors) => {\n setErrorsState((current) => {\n const newErrors = filterErrors(typeof errors === 'function' ? errors(current) : errors);\n errorsRef.current = newErrors;\n return newErrors;\n });\n }, []);\n\n const clearErrors: ClearErrors = useCallback(() => setErrors({}), []);\n\n const clearFieldError: ClearFieldError = useCallback(\n (path) => {\n if (errorsRef.current[path as string] === undefined) {\n return;\n }\n\n setErrors((current) => {\n const errors = { ...current };\n delete errors[path as string];\n return errors;\n });\n },\n [errorsState]\n );\n\n const setFieldError: SetFieldError<Values> = useCallback(\n (path, error) => {\n if (error == null || error === false) {\n clearFieldError(path);\n } else if (errorsRef.current[path as string] !== error) {\n setErrors((current) => ({ ...current, [path]: error }));\n }\n },\n [errorsState]\n );\n\n return {\n errorsState,\n setErrors,\n clearErrors,\n setFieldError,\n clearFieldError,\n };\n}\n"],"mappings":";;;;AAYA,SAAgB,cACd,eACqB;CACrB,MAAM,CAAC,aAAa,kBAAkB,SAAS,aAAa,
|
|
1
|
+
{"version":3,"file":"use-form-errors.mjs","names":[],"sources":["../../../src/hooks/use-form-errors/use-form-errors.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { ClearErrors, ClearFieldError, FormErrors, SetErrors, SetFieldError } from '../../types';\nimport { filterErrors } from './filter-errors/filter-errors';\n\nexport interface $FormErrors<Values extends Record<string, any>> {\n errorsState: FormErrors;\n setErrors: SetErrors;\n clearErrors: ClearErrors;\n setFieldError: SetFieldError<Values>;\n clearFieldError: ClearFieldError;\n}\n\nexport function useFormErrors<Values extends Record<string, any>>(\n initialErrors: FormErrors\n): $FormErrors<Values> {\n const [errorsState, setErrorsState] = useState(filterErrors(initialErrors));\n const errorsRef = useRef(errorsState);\n\n const setErrors: SetErrors = useCallback((errors) => {\n setErrorsState((current) => {\n const newErrors = filterErrors(typeof errors === 'function' ? errors(current) : errors);\n errorsRef.current = newErrors;\n return newErrors;\n });\n }, []);\n\n const clearErrors: ClearErrors = useCallback(() => setErrors({}), []);\n\n const clearFieldError: ClearFieldError = useCallback(\n (path) => {\n if (errorsRef.current[path as string] === undefined) {\n return;\n }\n\n setErrors((current) => {\n const errors = { ...current };\n delete errors[path as string];\n return errors;\n });\n },\n [errorsState]\n );\n\n const setFieldError: SetFieldError<Values> = useCallback(\n (path, error) => {\n if (error == null || error === false) {\n clearFieldError(path);\n } else if (errorsRef.current[path as string] !== error) {\n setErrors((current) => ({ ...current, [path]: error }));\n }\n },\n [errorsState]\n );\n\n return {\n errorsState,\n setErrors,\n clearErrors,\n setFieldError,\n clearFieldError,\n };\n}\n"],"mappings":";;;;AAYA,SAAgB,cACd,eACqB;CACrB,MAAM,CAAC,aAAa,kBAAkB,SAAS,aAAa,aAAa,CAAC;CAC1E,MAAM,YAAY,OAAO,WAAW;CAEpC,MAAM,YAAuB,aAAa,WAAW;EACnD,gBAAgB,YAAY;GAC1B,MAAM,YAAY,aAAa,OAAO,WAAW,aAAa,OAAO,OAAO,IAAI,MAAM;GACtF,UAAU,UAAU;GACpB,OAAO;EACT,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,MAAM,cAA2B,kBAAkB,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;CAEpE,MAAM,kBAAmC,aACtC,SAAS;EACR,IAAI,UAAU,QAAQ,UAAoB,KAAA,GACxC;EAGF,WAAW,YAAY;GACrB,MAAM,SAAS,EAAE,GAAG,QAAQ;GAC5B,OAAO,OAAO;GACd,OAAO;EACT,CAAC;CACH,GACA,CAAC,WAAW,CACd;CAaA,OAAO;EACL;EACA;EACA;EACA,eAf2C,aAC1C,MAAM,UAAU;GACf,IAAI,SAAS,QAAQ,UAAU,OAC7B,gBAAgB,IAAI;QACf,IAAI,UAAU,QAAQ,UAAoB,OAC/C,WAAW,aAAa;IAAE,GAAG;KAAU,OAAO;GAAM,EAAE;EAE1D,GACA,CAAC,WAAW,CAOA;EACZ;CACF;AACF"}
|
|
@@ -7,38 +7,46 @@ import { removePath } from "../../paths/remove-path.mjs";
|
|
|
7
7
|
import { replacePath } from "../../paths/replace-path.mjs";
|
|
8
8
|
import { useCallback } from "react";
|
|
9
9
|
//#region packages/@mantine/form/src/hooks/use-form-list/use-form-list.ts
|
|
10
|
-
function useFormList({ $values, $errors, $status }) {
|
|
10
|
+
function useFormList({ $values, $errors, $status, $watch }) {
|
|
11
11
|
return {
|
|
12
12
|
reorderListItem: useCallback((path, payload) => {
|
|
13
|
+
const previousValues = $values.refValues.current;
|
|
13
14
|
$status.clearFieldDirty(path);
|
|
14
15
|
$errors.setErrors((errs) => reorderErrors(path, payload, errs));
|
|
15
16
|
$values.setValues({
|
|
16
17
|
values: reorderPath(path, payload, $values.refValues.current),
|
|
17
18
|
updateState: true
|
|
18
19
|
});
|
|
20
|
+
$watch.notifyWatchSubscribers(previousValues);
|
|
19
21
|
}, []),
|
|
20
22
|
removeListItem: useCallback((path, index) => {
|
|
23
|
+
const previousValues = $values.refValues.current;
|
|
21
24
|
$status.clearFieldDirty(path);
|
|
22
25
|
$errors.setErrors((errs) => changeErrorIndices(path, index, errs, -1));
|
|
23
26
|
$values.setValues({
|
|
24
27
|
values: removePath(path, index, $values.refValues.current),
|
|
25
28
|
updateState: true
|
|
26
29
|
});
|
|
30
|
+
$watch.notifyWatchSubscribers(previousValues);
|
|
27
31
|
}, []),
|
|
28
32
|
insertListItem: useCallback((path, item, index) => {
|
|
33
|
+
const previousValues = $values.refValues.current;
|
|
29
34
|
$status.clearFieldDirty(path);
|
|
30
35
|
$errors.setErrors((errs) => changeErrorIndices(path, index, errs, 1));
|
|
31
36
|
$values.setValues({
|
|
32
37
|
values: insertPath(path, item, index, $values.refValues.current),
|
|
33
38
|
updateState: true
|
|
34
39
|
});
|
|
40
|
+
$watch.notifyWatchSubscribers(previousValues);
|
|
35
41
|
}, []),
|
|
36
42
|
replaceListItem: useCallback((path, index, item) => {
|
|
43
|
+
const previousValues = $values.refValues.current;
|
|
37
44
|
$status.clearFieldDirty(path);
|
|
38
45
|
$values.setValues({
|
|
39
46
|
values: replacePath(path, item, index, $values.refValues.current),
|
|
40
47
|
updateState: true
|
|
41
48
|
});
|
|
49
|
+
$watch.notifyWatchSubscribers(previousValues);
|
|
42
50
|
}, [])
|
|
43
51
|
};
|
|
44
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-list.mjs","names":[],"sources":["../../../src/hooks/use-form-list/use-form-list.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { changeErrorIndices, reorderErrors } from '../../lists';\nimport { insertPath, removePath, reorderPath, replacePath } from '../../paths';\nimport { InsertListItem, RemoveListItem, ReorderListItem, ReplaceListItem } from '../../types';\nimport type { $FormErrors } from '../use-form-errors/use-form-errors';\nimport type { $FormStatus } from '../use-form-status/use-form-status';\nimport type { $FormValues } from '../use-form-values/use-form-values';\n\ninterface UseFormListInput<Values extends Record<string, any>> {\n $values: $FormValues<Values>;\n $errors: $FormErrors<Values>;\n $status: $FormStatus<Values>;\n}\n\nexport function useFormList<Values extends Record<string, any>>({\n $values,\n $errors,\n $status,\n}: UseFormListInput<Values>) {\n const reorderListItem: ReorderListItem<Values> = useCallback((path, payload) => {\n $status.clearFieldDirty(path);\n $errors.setErrors((errs) => reorderErrors(path, payload, errs));\n $values.setValues({\n values: reorderPath(path, payload, $values.refValues.current),\n updateState: true,\n });\n }, []);\n\n const removeListItem: RemoveListItem<Values> = useCallback((path, index) => {\n $status.clearFieldDirty(path);\n $errors.setErrors((errs) => changeErrorIndices(path, index, errs, -1));\n $values.setValues({\n values: removePath(path, index, $values.refValues.current),\n updateState: true,\n });\n }, []);\n\n const insertListItem: InsertListItem<Values> = useCallback((path, item, index) => {\n $status.clearFieldDirty(path);\n $errors.setErrors((errs) => changeErrorIndices(path, index, errs, 1));\n $values.setValues({\n values: insertPath(path, item, index, $values.refValues.current),\n updateState: true,\n });\n }, []);\n\n const replaceListItem: ReplaceListItem<Values> = useCallback((path, index, item) => {\n $status.clearFieldDirty(path);\n $values.setValues({\n values: replacePath(path, item, index, $values.refValues.current),\n updateState: true,\n });\n }, []);\n\n return { reorderListItem, removeListItem, insertListItem, replaceListItem };\n}\n"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"use-form-list.mjs","names":[],"sources":["../../../src/hooks/use-form-list/use-form-list.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { changeErrorIndices, reorderErrors } from '../../lists';\nimport { insertPath, removePath, reorderPath, replacePath } from '../../paths';\nimport { InsertListItem, RemoveListItem, ReorderListItem, ReplaceListItem } from '../../types';\nimport type { $FormErrors } from '../use-form-errors/use-form-errors';\nimport type { $FormStatus } from '../use-form-status/use-form-status';\nimport type { $FormValues } from '../use-form-values/use-form-values';\nimport type { $FormWatch } from '../use-form-watch/use-form-watch';\n\ninterface UseFormListInput<Values extends Record<string, any>> {\n $values: $FormValues<Values>;\n $errors: $FormErrors<Values>;\n $status: $FormStatus<Values>;\n $watch: $FormWatch<Values>;\n}\n\nexport function useFormList<Values extends Record<string, any>>({\n $values,\n $errors,\n $status,\n $watch,\n}: UseFormListInput<Values>) {\n const reorderListItem: ReorderListItem<Values> = useCallback((path, payload) => {\n const previousValues = $values.refValues.current;\n $status.clearFieldDirty(path);\n $errors.setErrors((errs) => reorderErrors(path, payload, errs));\n $values.setValues({\n values: reorderPath(path, payload, $values.refValues.current),\n updateState: true,\n });\n $watch.notifyWatchSubscribers(previousValues);\n }, []);\n\n const removeListItem: RemoveListItem<Values> = useCallback((path, index) => {\n const previousValues = $values.refValues.current;\n $status.clearFieldDirty(path);\n $errors.setErrors((errs) => changeErrorIndices(path, index, errs, -1));\n $values.setValues({\n values: removePath(path, index, $values.refValues.current),\n updateState: true,\n });\n $watch.notifyWatchSubscribers(previousValues);\n }, []);\n\n const insertListItem: InsertListItem<Values> = useCallback((path, item, index) => {\n const previousValues = $values.refValues.current;\n $status.clearFieldDirty(path);\n $errors.setErrors((errs) => changeErrorIndices(path, index, errs, 1));\n $values.setValues({\n values: insertPath(path, item, index, $values.refValues.current),\n updateState: true,\n });\n $watch.notifyWatchSubscribers(previousValues);\n }, []);\n\n const replaceListItem: ReplaceListItem<Values> = useCallback((path, index, item) => {\n const previousValues = $values.refValues.current;\n $status.clearFieldDirty(path);\n $values.setValues({\n values: replacePath(path, item, index, $values.refValues.current),\n updateState: true,\n });\n $watch.notifyWatchSubscribers(previousValues);\n }, []);\n\n return { reorderListItem, removeListItem, insertListItem, replaceListItem };\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,YAAgD,EAC9D,SACA,SACA,SACA,UAC2B;CA4C3B,OAAO;EAAE,iBA3CwC,aAAa,MAAM,YAAY;GAC9E,MAAM,iBAAiB,QAAQ,UAAU;GACzC,QAAQ,gBAAgB,IAAI;GAC5B,QAAQ,WAAW,SAAS,cAAc,MAAM,SAAS,IAAI,CAAC;GAC9D,QAAQ,UAAU;IAChB,QAAQ,YAAY,MAAM,SAAS,QAAQ,UAAU,OAAO;IAC5D,aAAa;GACf,CAAC;GACD,OAAO,uBAAuB,cAAc;EAC9C,GAAG,CAAC,CAkCmB;EAAG,gBAhCqB,aAAa,MAAM,UAAU;GAC1E,MAAM,iBAAiB,QAAQ,UAAU;GACzC,QAAQ,gBAAgB,IAAI;GAC5B,QAAQ,WAAW,SAAS,mBAAmB,MAAM,OAAO,MAAM,EAAE,CAAC;GACrE,QAAQ,UAAU;IAChB,QAAQ,WAAW,MAAM,OAAO,QAAQ,UAAU,OAAO;IACzD,aAAa;GACf,CAAC;GACD,OAAO,uBAAuB,cAAc;EAC9C,GAAG,CAAC,CAuBmC;EAAG,gBArBK,aAAa,MAAM,MAAM,UAAU;GAChF,MAAM,iBAAiB,QAAQ,UAAU;GACzC,QAAQ,gBAAgB,IAAI;GAC5B,QAAQ,WAAW,SAAS,mBAAmB,MAAM,OAAO,MAAM,CAAC,CAAC;GACpE,QAAQ,UAAU;IAChB,QAAQ,WAAW,MAAM,MAAM,OAAO,QAAQ,UAAU,OAAO;IAC/D,aAAa;GACf,CAAC;GACD,OAAO,uBAAuB,cAAc;EAC9C,GAAG,CAAC,CAYmD;EAAG,iBAVT,aAAa,MAAM,OAAO,SAAS;GAClF,MAAM,iBAAiB,QAAQ,UAAU;GACzC,QAAQ,gBAAgB,IAAI;GAC5B,QAAQ,UAAU;IAChB,QAAQ,YAAY,MAAM,MAAM,OAAO,QAAQ,UAAU,OAAO;IAChE,aAAa;GACf,CAAC;GACD,OAAO,uBAAuB,cAAc;EAC9C,GAAG,CAAC,CAEoE;CAAE;AAC5E"}
|