@mantine/form 9.3.2 → 9.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/FormProvider/FormProvider.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.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.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/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.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/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/esm/hooks/use-form-errors/filter-errors/filter-errors.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.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/schema-resolver.mjs.map +1 -1
- package/esm/use-form.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/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/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormProvider.cjs","names":["useForm"],"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,eAAA,GAAA,MAAA,
|
|
1
|
+
{"version":3,"file":"FormProvider.cjs","names":["useForm"],"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,eAAA,GAAA,MAAA,cAAA,CAAyC,IAAI;CAEnD,SAAS,aAAa,EAAE,MAAM,YAAqC;EACjE,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;GAAa,OAAO;GAAO;EAAsB,CAAA;CAC1D;CAEA,SAAS,iBAAiB;EACxB,MAAM,OAAA,GAAA,MAAA,IAAA,CAAU,WAAW;EAC3B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,2DAA2D;EAG7E,OAAO;CACT;CAEA,OAAO;EAAC;EAAc;EAAgBA,iBAAAA;CAAO;AAK/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-errors.cjs","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,
|
|
1
|
+
{"version":3,"file":"filter-errors.cjs","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,CAAC,CAAC,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.cjs","names":["filterErrors"],"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,mBAAA,GAAA,MAAA,
|
|
1
|
+
{"version":3,"file":"use-form-errors.cjs","names":["filterErrors"],"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,mBAAA,GAAA,MAAA,SAAA,CAA2BA,sBAAAA,aAAa,aAAa,CAAC;CAC1E,MAAM,aAAA,GAAA,MAAA,OAAA,CAAmB,WAAW;CAEpC,MAAM,aAAA,GAAA,MAAA,YAAA,EAAoC,WAAW;EACnD,gBAAgB,YAAY;GAC1B,MAAM,YAAYA,sBAAAA,aAAa,OAAO,WAAW,aAAa,OAAO,OAAO,IAAI,MAAM;GACtF,UAAU,UAAU;GACpB,OAAO;EACT,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,MAAM,eAAA,GAAA,MAAA,YAAA,OAA6C,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;CAEpE,MAAM,mBAAA,GAAA,MAAA,YAAA,EACH,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,gBAAA,GAAA,MAAA,YAAA,EAdC,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-list.cjs","names":["reorderErrors","reorderPath","changeErrorIndices","removePath","insertPath","replacePath"],"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,kBAAA,GAAA,MAAA,
|
|
1
|
+
{"version":3,"file":"use-form-list.cjs","names":["reorderErrors","reorderPath","changeErrorIndices","removePath","insertPath","replacePath"],"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,kBAAA,GAAA,MAAA,YAAA,EA3CqD,MAAM,YAAY;GAC9E,MAAM,iBAAiB,QAAQ,UAAU;GACzC,QAAQ,gBAAgB,IAAI;GAC5B,QAAQ,WAAW,SAASA,uBAAAA,cAAc,MAAM,SAAS,IAAI,CAAC;GAC9D,QAAQ,UAAU;IAChB,QAAQC,qBAAAA,YAAY,MAAM,SAAS,QAAQ,UAAU,OAAO;IAC5D,aAAa;GACf,CAAC;GACD,OAAO,uBAAuB,cAAc;EAC9C,GAAG,CAAC,CAkCmB;EAAG,iBAAA,GAAA,MAAA,YAAA,EAhCkC,MAAM,UAAU;GAC1E,MAAM,iBAAiB,QAAQ,UAAU;GACzC,QAAQ,gBAAgB,IAAI;GAC5B,QAAQ,WAAW,SAASC,6BAAAA,mBAAmB,MAAM,OAAO,MAAM,EAAE,CAAC;GACrE,QAAQ,UAAU;IAChB,QAAQC,oBAAAA,WAAW,MAAM,OAAO,QAAQ,UAAU,OAAO;IACzD,aAAa;GACf,CAAC;GACD,OAAO,uBAAuB,cAAc;EAC9C,GAAG,CAAC,CAuBmC;EAAG,iBAAA,GAAA,MAAA,YAAA,EArBkB,MAAM,MAAM,UAAU;GAChF,MAAM,iBAAiB,QAAQ,UAAU;GACzC,QAAQ,gBAAgB,IAAI;GAC5B,QAAQ,WAAW,SAASD,6BAAAA,mBAAmB,MAAM,OAAO,MAAM,CAAC,CAAC;GACpE,QAAQ,UAAU;IAChB,QAAQE,oBAAAA,WAAW,MAAM,MAAM,OAAO,QAAQ,UAAU,OAAO;IAC/D,aAAa;GACf,CAAC;GACD,OAAO,uBAAuB,cAAc;EAC9C,GAAG,CAAC,CAYmD;EAAG,kBAAA,GAAA,MAAA,YAAA,EAVI,MAAM,OAAO,SAAS;GAClF,MAAM,iBAAiB,QAAQ,UAAU;GACzC,QAAQ,gBAAgB,IAAI;GAC5B,QAAQ,UAAU;IAChB,QAAQC,qBAAAA,YAAY,MAAM,MAAM,OAAO,QAAQ,UAAU,OAAO;IAChE,aAAa;GACf,CAAC;GACD,OAAO,uBAAuB,cAAc;EAC9C,GAAG,CAAC,CAEoE;CAAE;AAC5E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-status.cjs","names":["getStatus","getPath","clearListState"],"sources":["../../../src/hooks/use-form-status/use-form-status.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport isEqual from 'fast-deep-equal';\nimport { getStatus } from '../../get-status';\nimport { clearListState } from '../../lists';\nimport { getPath } from '../../paths';\nimport {\n ClearFieldDirty,\n FormMode,\n FormStatus,\n GetFieldStatus,\n ResetDirty,\n ResetStatus,\n SetCalculatedFieldDirty,\n SetFieldDirty,\n SetFieldTouched,\n} from '../../types';\nimport type { $FormValues } from '../use-form-values/use-form-values';\n\nexport interface $FormStatus<out Values extends Record<string, any>> {\n touchedState: FormStatus;\n dirtyState: FormStatus;\n touchedRef: React.RefObject<FormStatus>;\n dirtyRef: React.RefObject<FormStatus>;\n setTouched: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirty: React.Dispatch<React.SetStateAction<FormStatus>>;\n resetDirty: ResetStatus;\n resetTouched: ResetStatus;\n isTouched: GetFieldStatus<Values>;\n setFieldTouched: SetFieldTouched<Values>;\n setFieldDirty: SetFieldDirty<Values>;\n setTouchedState: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirtyState: React.Dispatch<React.SetStateAction<FormStatus>>;\n clearFieldDirty: ClearFieldDirty;\n isDirty: GetFieldStatus<Values>;\n getDirty: () => FormStatus;\n getTouched: () => FormStatus;\n setCalculatedFieldDirty: SetCalculatedFieldDirty<Values>;\n}\n\ninterface UseFormStatusInput<out Values extends Record<string, any>> {\n initialDirty: FormStatus;\n initialTouched: FormStatus;\n mode: FormMode;\n $values: $FormValues<Values>;\n}\n\nexport function useFormStatus<Values extends Record<string, any>>({\n initialDirty,\n initialTouched,\n mode,\n $values,\n}: UseFormStatusInput<Values>): $FormStatus<Values> {\n const [touchedState, setTouchedState] = useState(initialTouched);\n const [dirtyState, setDirtyState] = useState(initialDirty);\n\n const touchedRef = useRef(initialTouched);\n const dirtyRef = useRef(initialDirty);\n\n const setTouched = useCallback((values: FormStatus | ((current: FormStatus) => FormStatus)) => {\n const resolvedValues = typeof values === 'function' ? values(touchedRef.current) : values;\n touchedRef.current = resolvedValues;\n\n if (mode === 'controlled') {\n setTouchedState(resolvedValues);\n }\n }, []);\n\n const setDirty = useCallback(\n (values: FormStatus | ((current: FormStatus) => FormStatus), forceUpdate = false) => {\n const resolvedValues = typeof values === 'function' ? values(dirtyRef.current) : values;\n dirtyRef.current = resolvedValues;\n\n if (mode === 'controlled' || forceUpdate) {\n setDirtyState(resolvedValues);\n }\n },\n []\n );\n\n const resetTouched: ResetStatus = useCallback(() => setTouched({}), []);\n\n const resetDirty: ResetDirty<Values> = useCallback((values) => {\n const newSnapshot = values\n ? { ...$values.refValues.current, ...values }\n : $values.refValues.current;\n $values.setValuesSnapshot(newSnapshot);\n setDirty({});\n }, []);\n\n const setFieldTouched: SetFieldTouched<Values> = useCallback((path, touched) => {\n setTouched((currentTouched) => {\n if (getStatus(currentTouched, path) === touched) {\n return currentTouched;\n }\n\n return { ...currentTouched, [path]: touched };\n });\n }, []);\n\n const setFieldDirty: SetFieldDirty<Values> = useCallback((path, dirty, forceUpdate) => {\n setDirty((currentDirty) => {\n if (getStatus(currentDirty, path) === dirty) {\n return currentDirty;\n }\n\n return { ...currentDirty, [path]: dirty };\n }, forceUpdate);\n }, []);\n\n const setCalculatedFieldDirty: SetCalculatedFieldDirty<Values> = useCallback((path, value) => {\n const currentDirty = getStatus(dirtyRef.current, path);\n const dirty = !isEqual(getPath(path, $values.getValuesSnapshot()), value);\n const clearedState = clearListState(path, dirtyRef.current);\n clearedState[path as string] = dirty;\n setDirty(clearedState, currentDirty !== dirty);\n }, []);\n\n const isTouched: GetFieldStatus<Values> = useCallback(\n (path) => getStatus(touchedRef.current, path),\n []\n );\n\n const clearFieldDirty: ClearFieldDirty = useCallback(\n (path) =>\n setDirty((current) => {\n if (typeof path !== 'string') {\n return current;\n }\n\n const result = clearListState(path, current);\n delete result[path];\n\n if (isEqual(result, current)) {\n return current;\n }\n\n return result;\n }),\n []\n );\n\n const isDirty: GetFieldStatus<Values> = useCallback((path) => {\n if (path) {\n const overriddenValue = getPath(path, dirtyRef.current);\n if (typeof overriddenValue === 'boolean') {\n return overriddenValue;\n }\n\n const sliceOfValues = getPath(path, $values.refValues.current);\n const sliceOfInitialValues = getPath(path, $values.valuesSnapshot.current);\n return !isEqual(sliceOfValues, sliceOfInitialValues);\n }\n\n const isOverridden = Object.keys(dirtyRef.current).length > 0;\n if (isOverridden) {\n return getStatus(dirtyRef.current);\n }\n\n return !isEqual($values.refValues.current, $values.valuesSnapshot.current);\n }, []);\n\n const getDirty = useCallback(() => dirtyRef.current, []);\n const getTouched = useCallback(() => touchedRef.current, []);\n\n return {\n touchedState,\n dirtyState,\n touchedRef,\n dirtyRef,\n setTouched,\n setDirty,\n resetDirty,\n resetTouched,\n isTouched,\n setFieldTouched,\n setFieldDirty,\n setTouchedState,\n setDirtyState,\n clearFieldDirty,\n isDirty,\n getDirty,\n getTouched,\n setCalculatedFieldDirty,\n };\n}\n"],"mappings":";;;;;;;;;AA8CA,SAAgB,cAAkD,EAChE,cACA,gBACA,MACA,WACkD;CAClD,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,
|
|
1
|
+
{"version":3,"file":"use-form-status.cjs","names":["getStatus","getPath","clearListState"],"sources":["../../../src/hooks/use-form-status/use-form-status.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport isEqual from 'fast-deep-equal';\nimport { getStatus } from '../../get-status';\nimport { clearListState } from '../../lists';\nimport { getPath } from '../../paths';\nimport {\n ClearFieldDirty,\n FormMode,\n FormStatus,\n GetFieldStatus,\n ResetDirty,\n ResetStatus,\n SetCalculatedFieldDirty,\n SetFieldDirty,\n SetFieldTouched,\n} from '../../types';\nimport type { $FormValues } from '../use-form-values/use-form-values';\n\nexport interface $FormStatus<out Values extends Record<string, any>> {\n touchedState: FormStatus;\n dirtyState: FormStatus;\n touchedRef: React.RefObject<FormStatus>;\n dirtyRef: React.RefObject<FormStatus>;\n setTouched: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirty: React.Dispatch<React.SetStateAction<FormStatus>>;\n resetDirty: ResetStatus;\n resetTouched: ResetStatus;\n isTouched: GetFieldStatus<Values>;\n setFieldTouched: SetFieldTouched<Values>;\n setFieldDirty: SetFieldDirty<Values>;\n setTouchedState: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirtyState: React.Dispatch<React.SetStateAction<FormStatus>>;\n clearFieldDirty: ClearFieldDirty;\n isDirty: GetFieldStatus<Values>;\n getDirty: () => FormStatus;\n getTouched: () => FormStatus;\n setCalculatedFieldDirty: SetCalculatedFieldDirty<Values>;\n}\n\ninterface UseFormStatusInput<out Values extends Record<string, any>> {\n initialDirty: FormStatus;\n initialTouched: FormStatus;\n mode: FormMode;\n $values: $FormValues<Values>;\n}\n\nexport function useFormStatus<Values extends Record<string, any>>({\n initialDirty,\n initialTouched,\n mode,\n $values,\n}: UseFormStatusInput<Values>): $FormStatus<Values> {\n const [touchedState, setTouchedState] = useState(initialTouched);\n const [dirtyState, setDirtyState] = useState(initialDirty);\n\n const touchedRef = useRef(initialTouched);\n const dirtyRef = useRef(initialDirty);\n\n const setTouched = useCallback((values: FormStatus | ((current: FormStatus) => FormStatus)) => {\n const resolvedValues = typeof values === 'function' ? values(touchedRef.current) : values;\n touchedRef.current = resolvedValues;\n\n if (mode === 'controlled') {\n setTouchedState(resolvedValues);\n }\n }, []);\n\n const setDirty = useCallback(\n (values: FormStatus | ((current: FormStatus) => FormStatus), forceUpdate = false) => {\n const resolvedValues = typeof values === 'function' ? values(dirtyRef.current) : values;\n dirtyRef.current = resolvedValues;\n\n if (mode === 'controlled' || forceUpdate) {\n setDirtyState(resolvedValues);\n }\n },\n []\n );\n\n const resetTouched: ResetStatus = useCallback(() => setTouched({}), []);\n\n const resetDirty: ResetDirty<Values> = useCallback((values) => {\n const newSnapshot = values\n ? { ...$values.refValues.current, ...values }\n : $values.refValues.current;\n $values.setValuesSnapshot(newSnapshot);\n setDirty({});\n }, []);\n\n const setFieldTouched: SetFieldTouched<Values> = useCallback((path, touched) => {\n setTouched((currentTouched) => {\n if (getStatus(currentTouched, path) === touched) {\n return currentTouched;\n }\n\n return { ...currentTouched, [path]: touched };\n });\n }, []);\n\n const setFieldDirty: SetFieldDirty<Values> = useCallback((path, dirty, forceUpdate) => {\n setDirty((currentDirty) => {\n if (getStatus(currentDirty, path) === dirty) {\n return currentDirty;\n }\n\n return { ...currentDirty, [path]: dirty };\n }, forceUpdate);\n }, []);\n\n const setCalculatedFieldDirty: SetCalculatedFieldDirty<Values> = useCallback((path, value) => {\n const currentDirty = getStatus(dirtyRef.current, path);\n const dirty = !isEqual(getPath(path, $values.getValuesSnapshot()), value);\n const clearedState = clearListState(path, dirtyRef.current);\n clearedState[path as string] = dirty;\n setDirty(clearedState, currentDirty !== dirty);\n }, []);\n\n const isTouched: GetFieldStatus<Values> = useCallback(\n (path) => getStatus(touchedRef.current, path),\n []\n );\n\n const clearFieldDirty: ClearFieldDirty = useCallback(\n (path) =>\n setDirty((current) => {\n if (typeof path !== 'string') {\n return current;\n }\n\n const result = clearListState(path, current);\n delete result[path];\n\n if (isEqual(result, current)) {\n return current;\n }\n\n return result;\n }),\n []\n );\n\n const isDirty: GetFieldStatus<Values> = useCallback((path) => {\n if (path) {\n const overriddenValue = getPath(path, dirtyRef.current);\n if (typeof overriddenValue === 'boolean') {\n return overriddenValue;\n }\n\n const sliceOfValues = getPath(path, $values.refValues.current);\n const sliceOfInitialValues = getPath(path, $values.valuesSnapshot.current);\n return !isEqual(sliceOfValues, sliceOfInitialValues);\n }\n\n const isOverridden = Object.keys(dirtyRef.current).length > 0;\n if (isOverridden) {\n return getStatus(dirtyRef.current);\n }\n\n return !isEqual($values.refValues.current, $values.valuesSnapshot.current);\n }, []);\n\n const getDirty = useCallback(() => dirtyRef.current, []);\n const getTouched = useCallback(() => touchedRef.current, []);\n\n return {\n touchedState,\n dirtyState,\n touchedRef,\n dirtyRef,\n setTouched,\n setDirty,\n resetDirty,\n resetTouched,\n isTouched,\n setFieldTouched,\n setFieldDirty,\n setTouchedState,\n setDirtyState,\n clearFieldDirty,\n isDirty,\n getDirty,\n getTouched,\n setCalculatedFieldDirty,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-validating.cjs","names":[],"sources":["../../../src/hooks/use-form-validating/use-form-validating.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface $FormValidating {\n validating: boolean;\n isValidating: (path?: string) => boolean;\n setFieldValidating: (path: string, validating: boolean) => void;\n setFormValidating: (validating: boolean) => void;\n getAbortSignal: (path: string) => AbortSignal;\n clearValidating: () => void;\n}\n\nexport function useFormValidating(): $FormValidating {\n const [validatingFields, setValidatingFields] = useState<Record<string, boolean>>({});\n const [formValidating, setFormValidatingState] = useState(false);\n const validatingRef = useRef<Record<string, boolean>>({});\n const formValidatingRef = useRef(false);\n const abortControllers = useRef<Record<string, AbortController>>({});\n\n const setFieldValidating = useCallback((path: string, value: boolean) => {\n validatingRef.current = { ...validatingRef.current, [path]: value };\n setValidatingFields({ ...validatingRef.current });\n }, []);\n\n const setFormValidating = useCallback((value: boolean) => {\n formValidatingRef.current = value;\n setFormValidatingState(value);\n }, []);\n\n const isValidating = useCallback((path?: string) => {\n if (path) {\n return !!validatingRef.current[path];\n }\n if (formValidatingRef.current) {\n return true;\n }\n return Object.values(validatingRef.current).some(Boolean);\n }, []);\n\n const getAbortSignal = useCallback((path: string) => {\n abortControllers.current[path]?.abort();\n abortControllers.current[path] = new AbortController();\n return abortControllers.current[path].signal;\n }, []);\n\n const clearValidating = useCallback(() => {\n validatingRef.current = {};\n setValidatingFields({});\n formValidatingRef.current = false;\n setFormValidatingState(false);\n Object.values(abortControllers.current).forEach((c) => c.abort());\n abortControllers.current = {};\n }, []);\n\n const validating = formValidating || Object.values(validatingFields).some(Boolean);\n\n return {\n validating,\n isValidating,\n setFieldValidating,\n setFormValidating,\n getAbortSignal,\n clearValidating,\n };\n}\n"],"mappings":";;;AAWA,SAAgB,oBAAqC;CACnD,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,
|
|
1
|
+
{"version":3,"file":"use-form-validating.cjs","names":[],"sources":["../../../src/hooks/use-form-validating/use-form-validating.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface $FormValidating {\n validating: boolean;\n isValidating: (path?: string) => boolean;\n setFieldValidating: (path: string, validating: boolean) => void;\n setFormValidating: (validating: boolean) => void;\n getAbortSignal: (path: string) => AbortSignal;\n clearValidating: () => void;\n}\n\nexport function useFormValidating(): $FormValidating {\n const [validatingFields, setValidatingFields] = useState<Record<string, boolean>>({});\n const [formValidating, setFormValidatingState] = useState(false);\n const validatingRef = useRef<Record<string, boolean>>({});\n const formValidatingRef = useRef(false);\n const abortControllers = useRef<Record<string, AbortController>>({});\n\n const setFieldValidating = useCallback((path: string, value: boolean) => {\n validatingRef.current = { ...validatingRef.current, [path]: value };\n setValidatingFields({ ...validatingRef.current });\n }, []);\n\n const setFormValidating = useCallback((value: boolean) => {\n formValidatingRef.current = value;\n setFormValidatingState(value);\n }, []);\n\n const isValidating = useCallback((path?: string) => {\n if (path) {\n return !!validatingRef.current[path];\n }\n if (formValidatingRef.current) {\n return true;\n }\n return Object.values(validatingRef.current).some(Boolean);\n }, []);\n\n const getAbortSignal = useCallback((path: string) => {\n abortControllers.current[path]?.abort();\n abortControllers.current[path] = new AbortController();\n return abortControllers.current[path].signal;\n }, []);\n\n const clearValidating = useCallback(() => {\n validatingRef.current = {};\n setValidatingFields({});\n formValidatingRef.current = false;\n setFormValidatingState(false);\n Object.values(abortControllers.current).forEach((c) => c.abort());\n abortControllers.current = {};\n }, []);\n\n const validating = formValidating || Object.values(validatingFields).some(Boolean);\n\n return {\n validating,\n isValidating,\n setFieldValidating,\n setFormValidating,\n getAbortSignal,\n clearValidating,\n };\n}\n"],"mappings":";;;AAWA,SAAgB,oBAAqC;CACnD,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,SAAA,CAAyD,CAAC,CAAC;CACpF,MAAM,CAAC,gBAAgB,2BAAA,GAAA,MAAA,SAAA,CAAmC,KAAK;CAC/D,MAAM,iBAAA,GAAA,MAAA,OAAA,CAAgD,CAAC,CAAC;CACxD,MAAM,qBAAA,GAAA,MAAA,OAAA,CAA2B,KAAK;CACtC,MAAM,oBAAA,GAAA,MAAA,OAAA,CAA2D,CAAC,CAAC;CAEnE,MAAM,sBAAA,GAAA,MAAA,YAAA,EAAkC,MAAc,UAAmB;EACvE,cAAc,UAAU;GAAE,GAAG,cAAc;IAAU,OAAO;EAAM;EAClE,oBAAoB,EAAE,GAAG,cAAc,QAAQ,CAAC;CAClD,GAAG,CAAC,CAAC;CAEL,MAAM,qBAAA,GAAA,MAAA,YAAA,EAAiC,UAAmB;EACxD,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;CAC9B,GAAG,CAAC,CAAC;CAEL,MAAM,gBAAA,GAAA,MAAA,YAAA,EAA4B,SAAkB;EAClD,IAAI,MACF,OAAO,CAAC,CAAC,cAAc,QAAQ;EAEjC,IAAI,kBAAkB,SACpB,OAAO;EAET,OAAO,OAAO,OAAO,cAAc,OAAO,CAAC,CAAC,KAAK,OAAO;CAC1D,GAAG,CAAC,CAAC;CAEL,MAAM,kBAAA,GAAA,MAAA,YAAA,EAA8B,SAAiB;EACnD,iBAAiB,QAAQ,KAAK,EAAE,MAAM;EACtC,iBAAiB,QAAQ,QAAQ,IAAI,gBAAgB;EACrD,OAAO,iBAAiB,QAAQ,KAAK,CAAC;CACxC,GAAG,CAAC,CAAC;CAEL,MAAM,mBAAA,GAAA,MAAA,YAAA,OAAoC;EACxC,cAAc,UAAU,CAAC;EACzB,oBAAoB,CAAC,CAAC;EACtB,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;EAC5B,OAAO,OAAO,iBAAiB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC;EAChE,iBAAiB,UAAU,CAAC;CAC9B,GAAG,CAAC,CAAC;CAIL,OAAO;EACL,YAHiB,kBAAkB,OAAO,OAAO,gBAAgB,CAAC,CAAC,KAAK,OAAO;EAI/E;EACA;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-values.cjs","names":["getPath","setPath"],"sources":["../../../src/hooks/use-form-values/use-form-values.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { getPath, setPath } from '../../paths';\nimport { FormMode } from '../../types';\n\nexport interface $FormValues<out Values extends Record<PropertyKey, any>> {\n initialized: React.RefObject<boolean>;\n stateValues: Values;\n refValues: React.RefObject<Values>;\n valuesSnapshot: React.RefObject<Values>;\n setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;\n setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;\n resetValues: () => void;\n setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;\n initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;\n getValues: () => Values;\n getValuesSnapshot: () => Values;\n resetField: <TValues extends Values>(\n path: PropertyKey,\n subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]\n ) => void;\n}\n\nexport interface SetValuesSubscriberPayload<Values> {\n path?: PropertyKey;\n updatedValues: Values;\n previousValues: Values;\n}\n\nexport interface SetValuesInput<out Values = Record<string, any>> {\n values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);\n mergeWithPreviousValues?: boolean;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\nexport type SetFieldValueSubscriber<out Values> = <TValues extends Values>(\n payload: SetValuesSubscriberPayload<TValues>\n) => void;\n\nexport interface SetFieldValueInput<Values> {\n path: PropertyKey;\n value: any;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\ninterface UseFormValuesInput<Values extends Record<PropertyKey, any>> {\n initialValues: Values | undefined;\n mode: FormMode;\n onValuesChange?: ((values: Values, previousValues: Values) => void) | undefined;\n}\n\nexport function useFormValues<Values extends Record<PropertyKey, any>>({\n initialValues,\n onValuesChange,\n mode,\n}: UseFormValuesInput<Values>): $FormValues<Values> {\n const initialized = useRef(false);\n const [stateValues, setStateValues] = useState<Values>(initialValues || ({} as Values));\n const refValues = useRef(stateValues);\n const valuesSnapshot = useRef(stateValues);\n\n const setValues = useCallback(\n ({\n values,\n subscribers,\n updateState = true,\n mergeWithPreviousValues = true,\n }: SetValuesInput<Values>) => {\n const previousValues = refValues.current;\n const resolvedValues = values instanceof Function ? values(refValues.current) : values;\n const updatedValues = mergeWithPreviousValues\n ? { ...previousValues, ...resolvedValues }\n : (resolvedValues as Values);\n refValues.current = updatedValues;\n if (updateState) {\n setStateValues(updatedValues);\n if (mode === 'uncontrolled') {\n refValues.current = updatedValues;\n }\n }\n onValuesChange?.(updatedValues, previousValues);\n subscribers\n ?.filter(Boolean)\n .forEach((subscriber) => subscriber!({ updatedValues, previousValues }));\n },\n [onValuesChange]\n );\n\n const setFieldValue = useCallback(\n (payload: SetFieldValueInput<Values>) => {\n const currentValue = getPath(payload.path, refValues.current);\n const updatedValue =\n payload.value instanceof Function ? payload.value(currentValue) : payload.value;\n\n if (currentValue !== updatedValue) {\n const previousValues = refValues.current;\n const updatedValues = setPath(payload.path, updatedValue, refValues.current);\n setValues({ values: updatedValues, updateState: payload.updateState });\n\n payload.subscribers\n ?.filter(Boolean)\n .forEach((subscriber) =>\n subscriber!({ path: payload.path, updatedValues, previousValues })\n );\n }\n },\n [setValues]\n );\n\n const setValuesSnapshot = useCallback((payload: Values) => {\n valuesSnapshot.current = payload;\n }, []);\n\n const initialize = useCallback(\n (values: Values, onInitialize: () => void) => {\n if (!initialized.current) {\n initialized.current = true;\n setValues({ values, updateState: mode === 'controlled' });\n setValuesSnapshot(values);\n onInitialize();\n }\n },\n [setValues]\n );\n\n const resetValues = useCallback(() => {\n setValues({\n values: valuesSnapshot.current,\n updateState: true,\n mergeWithPreviousValues: false,\n });\n }, [setValues]);\n\n const getValues = useCallback(() => refValues.current, []);\n const getValuesSnapshot = useCallback(() => valuesSnapshot.current, []);\n\n const resetField = useCallback(\n (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[]) => {\n const snapshotValue = getPath(path, valuesSnapshot.current);\n if (typeof snapshotValue === 'undefined') {\n return;\n }\n setFieldValue({\n path,\n value: snapshotValue,\n updateState: mode === 'controlled',\n subscribers,\n });\n },\n [setFieldValue, mode]\n );\n\n return {\n initialized,\n stateValues,\n refValues,\n valuesSnapshot,\n setValues,\n setFieldValue,\n resetValues,\n setValuesSnapshot,\n initialize,\n getValues,\n getValuesSnapshot,\n resetField,\n };\n}\n"],"mappings":";;;;;AAoDA,SAAgB,cAAuD,EACrE,eACA,gBACA,QACkD;CAClD,MAAM,eAAA,GAAA,MAAA,
|
|
1
|
+
{"version":3,"file":"use-form-values.cjs","names":["getPath","setPath"],"sources":["../../../src/hooks/use-form-values/use-form-values.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { getPath, setPath } from '../../paths';\nimport { FormMode } from '../../types';\n\nexport interface $FormValues<out Values extends Record<PropertyKey, any>> {\n initialized: React.RefObject<boolean>;\n stateValues: Values;\n refValues: React.RefObject<Values>;\n valuesSnapshot: React.RefObject<Values>;\n setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;\n setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;\n resetValues: () => void;\n setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;\n initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;\n getValues: () => Values;\n getValuesSnapshot: () => Values;\n resetField: <TValues extends Values>(\n path: PropertyKey,\n subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]\n ) => void;\n}\n\nexport interface SetValuesSubscriberPayload<Values> {\n path?: PropertyKey;\n updatedValues: Values;\n previousValues: Values;\n}\n\nexport interface SetValuesInput<out Values = Record<string, any>> {\n values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);\n mergeWithPreviousValues?: boolean;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\nexport type SetFieldValueSubscriber<out Values> = <TValues extends Values>(\n payload: SetValuesSubscriberPayload<TValues>\n) => void;\n\nexport interface SetFieldValueInput<Values> {\n path: PropertyKey;\n value: any;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\ninterface UseFormValuesInput<Values extends Record<PropertyKey, any>> {\n initialValues: Values | undefined;\n mode: FormMode;\n onValuesChange?: ((values: Values, previousValues: Values) => void) | undefined;\n}\n\nexport function useFormValues<Values extends Record<PropertyKey, any>>({\n initialValues,\n onValuesChange,\n mode,\n}: UseFormValuesInput<Values>): $FormValues<Values> {\n const initialized = useRef(false);\n const [stateValues, setStateValues] = useState<Values>(initialValues || ({} as Values));\n const refValues = useRef(stateValues);\n const valuesSnapshot = useRef(stateValues);\n\n const setValues = useCallback(\n ({\n values,\n subscribers,\n updateState = true,\n mergeWithPreviousValues = true,\n }: SetValuesInput<Values>) => {\n const previousValues = refValues.current;\n const resolvedValues = values instanceof Function ? values(refValues.current) : values;\n const updatedValues = mergeWithPreviousValues\n ? { ...previousValues, ...resolvedValues }\n : (resolvedValues as Values);\n refValues.current = updatedValues;\n if (updateState) {\n setStateValues(updatedValues);\n if (mode === 'uncontrolled') {\n refValues.current = updatedValues;\n }\n }\n onValuesChange?.(updatedValues, previousValues);\n subscribers\n ?.filter(Boolean)\n .forEach((subscriber) => subscriber!({ updatedValues, previousValues }));\n },\n [onValuesChange]\n );\n\n const setFieldValue = useCallback(\n (payload: SetFieldValueInput<Values>) => {\n const currentValue = getPath(payload.path, refValues.current);\n const updatedValue =\n payload.value instanceof Function ? payload.value(currentValue) : payload.value;\n\n if (currentValue !== updatedValue) {\n const previousValues = refValues.current;\n const updatedValues = setPath(payload.path, updatedValue, refValues.current);\n setValues({ values: updatedValues, updateState: payload.updateState });\n\n payload.subscribers\n ?.filter(Boolean)\n .forEach((subscriber) =>\n subscriber!({ path: payload.path, updatedValues, previousValues })\n );\n }\n },\n [setValues]\n );\n\n const setValuesSnapshot = useCallback((payload: Values) => {\n valuesSnapshot.current = payload;\n }, []);\n\n const initialize = useCallback(\n (values: Values, onInitialize: () => void) => {\n if (!initialized.current) {\n initialized.current = true;\n setValues({ values, updateState: mode === 'controlled' });\n setValuesSnapshot(values);\n onInitialize();\n }\n },\n [setValues]\n );\n\n const resetValues = useCallback(() => {\n setValues({\n values: valuesSnapshot.current,\n updateState: true,\n mergeWithPreviousValues: false,\n });\n }, [setValues]);\n\n const getValues = useCallback(() => refValues.current, []);\n const getValuesSnapshot = useCallback(() => valuesSnapshot.current, []);\n\n const resetField = useCallback(\n (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[]) => {\n const snapshotValue = getPath(path, valuesSnapshot.current);\n if (typeof snapshotValue === 'undefined') {\n return;\n }\n setFieldValue({\n path,\n value: snapshotValue,\n updateState: mode === 'controlled',\n subscribers,\n });\n },\n [setFieldValue, mode]\n );\n\n return {\n initialized,\n stateValues,\n refValues,\n valuesSnapshot,\n setValues,\n setFieldValue,\n resetValues,\n setValuesSnapshot,\n initialize,\n getValues,\n getValuesSnapshot,\n resetField,\n };\n}\n"],"mappings":";;;;;AAoDA,SAAgB,cAAuD,EACrE,eACA,gBACA,QACkD;CAClD,MAAM,eAAA,GAAA,MAAA,OAAA,CAAqB,KAAK;CAChC,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAAmC,iBAAkB,CAAC,CAAY;CACtF,MAAM,aAAA,GAAA,MAAA,OAAA,CAAmB,WAAW;CACpC,MAAM,kBAAA,GAAA,MAAA,OAAA,CAAwB,WAAW;CAEzC,MAAM,aAAA,GAAA,MAAA,YAAA,EACH,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,OAAO,IAAI;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;EAAe,IACtC;EACL,UAAU,UAAU;EACpB,IAAI,aAAa;GACf,eAAe,aAAa;GAC5B,IAAI,SAAS,gBACX,UAAU,UAAU;EAExB;EACA,iBAAiB,eAAe,cAAc;EAC9C,aACI,OAAO,OAAO,CAAC,CAChB,SAAS,eAAe,WAAY;GAAE;GAAe;EAAe,CAAC,CAAC;CAC3E,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,iBAAA,GAAA,MAAA,YAAA,EACH,YAAwC;EACvC,MAAM,eAAeA,iBAAAA,QAAQ,QAAQ,MAAM,UAAU,OAAO;EAC5D,MAAM,eACJ,QAAQ,iBAAiB,WAAW,QAAQ,MAAM,YAAY,IAAI,QAAQ;EAE5E,IAAI,iBAAiB,cAAc;GACjC,MAAM,iBAAiB,UAAU;GACjC,MAAM,gBAAgBC,iBAAAA,QAAQ,QAAQ,MAAM,cAAc,UAAU,OAAO;GAC3E,UAAU;IAAE,QAAQ;IAAe,aAAa,QAAQ;GAAY,CAAC;GAErE,QAAQ,aACJ,OAAO,OAAO,CAAC,CAChB,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;GAAe,CAAC,CACnE;EACJ;CACF,GACA,CAAC,SAAS,CACZ;CAEA,MAAM,qBAAA,GAAA,MAAA,YAAA,EAAiC,YAAoB;EACzD,eAAe,UAAU;CAC3B,GAAG,CAAC,CAAC;CAEL,MAAM,cAAA,GAAA,MAAA,YAAA,EACH,QAAgB,iBAA6B;EAC5C,IAAI,CAAC,YAAY,SAAS;GACxB,YAAY,UAAU;GACtB,UAAU;IAAE;IAAQ,aAAa,SAAS;GAAa,CAAC;GACxD,kBAAkB,MAAM;GACxB,aAAa;EACf;CACF,GACA,CAAC,SAAS,CACZ;CA6BA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,cAAA,GAAA,MAAA,YAAA,OAlCoC;GACpC,UAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;GAC3B,CAAC;EACH,GAAG,CAAC,SAAS,CA4BD;EACV;EACA;EACA,YAAA,GAAA,MAAA,YAAA,OA7BkC,UAAU,SAAS,CAAC,CA6B9C;EACR,oBAAA,GAAA,MAAA,YAAA,OA7B0C,eAAe,SAAS,CAAC,CA6BnD;EAChB,aAAA,GAAA,MAAA,YAAA,EA3BC,MAAmB,gBAAyE;GAC3F,MAAM,gBAAgBD,iBAAAA,QAAQ,MAAM,eAAe,OAAO;GAC1D,IAAI,OAAO,kBAAkB,aAC3B;GAEF,cAAc;IACZ;IACA,OAAO;IACP,aAAa,SAAS;IACtB;GACF,CAAC;EACH,GACA,CAAC,eAAe,IAAI,CAeX;CACX;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-watch.cjs","names":["getPath"],"sources":["../../../src/hooks/use-form-watch/use-form-watch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { getPath } from '../../paths';\nimport { FormPathValue, LooseKeys } from '../../paths.types';\nimport { FormFieldSubscriber, Watch } from '../../types';\nimport { $FormStatus } from '../use-form-status/use-form-status';\nimport { $FormValues, SetValuesSubscriberPayload } from '../use-form-values/use-form-values';\n\ninterface UseFormWatchInput<out Values extends Record<PropertyKey, any>> {\n $values: $FormValues<Values>;\n $status: $FormStatus<Values>;\n cascadeUpdates?: boolean;\n}\n\nexport interface $FormWatch<Values extends Record<PropertyKey, any>> {\n subscribers: React.RefObject<Record<string, FormFieldSubscriber<Values, any>[]>>;\n watch: Watch<Values, any>;\n getFieldSubscribers: (path: any) => ((input: SetValuesSubscriberPayload<Values>) => void)[];\n notifyWatchSubscribers: (previousValues: Values) => void;\n}\n\nexport function useFormWatch<\n Values extends Record<PropertyKey, any>,\n Field extends LooseKeys<Values> = LooseKeys<Values>,\n>({ $values, $status, cascadeUpdates }: UseFormWatchInput<Values>) {\n const subscribers = useRef<Record<Field, FormFieldSubscriber<Values, Field>[]>>({} as any);\n\n const watch: Watch<Values, Field> = useCallback((path, callback) => {\n useEffect(() => {\n subscribers.current[path] = subscribers.current[path] || [];\n subscribers.current[path].push(callback);\n\n return () => {\n subscribers.current[path] = subscribers.current[path].filter((cb) => cb !== callback);\n };\n }, [callback]);\n }, []);\n\n const getFieldSubscribers = useCallback((path: Field) => {\n const result: ((input: SetValuesSubscriberPayload<Values>) => void)[] =\n subscribers.current[path]?.map(\n (callback) => (input: SetValuesSubscriberPayload<Values>) =>\n callback({\n previousValue: getPath(path, input.previousValues) as any,\n value: getPath(path, input.updatedValues) as any,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n ) ?? [];\n\n for (const subscriptionKey in subscribers.current) {\n const isParent = String(path).startsWith(`${subscriptionKey}.`);\n const isChild = String(subscriptionKey).startsWith(`${path}.`);\n\n if (isParent || (cascadeUpdates && isChild)) {\n result.push(\n ...subscribers.current[subscriptionKey].map(\n (cb) => (input: SetValuesSubscriberPayload<Values>) =>\n cb({\n previousValue: getPath(subscriptionKey, input.previousValues) as any,\n value: getPath(subscriptionKey, input.updatedValues) as any,\n touched: $status.isTouched(subscriptionKey),\n dirty: $status.isDirty(subscriptionKey),\n })\n )\n );\n }\n }\n\n return result;\n }, []);\n\n const notifyWatchSubscribers = useCallback((previousValues: Values) => {\n Object.keys(subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n subscribers.current[path as Field]?.forEach((cb) =>\n cb({\n previousValue: getPath(path, previousValues) as FormPathValue<Values, Field>,\n value: getPath(path, $values.refValues.current) as FormPathValue<Values, Field>,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n );\n }\n });\n }, []);\n\n return {\n subscribers,\n watch,\n getFieldSubscribers,\n notifyWatchSubscribers,\n };\n}\n"],"mappings":";;;;AAoBA,SAAgB,aAGd,EAAE,SAAS,SAAS,kBAA6C;CACjE,MAAM,eAAA,GAAA,MAAA,
|
|
1
|
+
{"version":3,"file":"use-form-watch.cjs","names":["getPath"],"sources":["../../../src/hooks/use-form-watch/use-form-watch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { getPath } from '../../paths';\nimport { FormPathValue, LooseKeys } from '../../paths.types';\nimport { FormFieldSubscriber, Watch } from '../../types';\nimport { $FormStatus } from '../use-form-status/use-form-status';\nimport { $FormValues, SetValuesSubscriberPayload } from '../use-form-values/use-form-values';\n\ninterface UseFormWatchInput<out Values extends Record<PropertyKey, any>> {\n $values: $FormValues<Values>;\n $status: $FormStatus<Values>;\n cascadeUpdates?: boolean;\n}\n\nexport interface $FormWatch<Values extends Record<PropertyKey, any>> {\n subscribers: React.RefObject<Record<string, FormFieldSubscriber<Values, any>[]>>;\n watch: Watch<Values, any>;\n getFieldSubscribers: (path: any) => ((input: SetValuesSubscriberPayload<Values>) => void)[];\n notifyWatchSubscribers: (previousValues: Values) => void;\n}\n\nexport function useFormWatch<\n Values extends Record<PropertyKey, any>,\n Field extends LooseKeys<Values> = LooseKeys<Values>,\n>({ $values, $status, cascadeUpdates }: UseFormWatchInput<Values>) {\n const subscribers = useRef<Record<Field, FormFieldSubscriber<Values, Field>[]>>({} as any);\n\n const watch: Watch<Values, Field> = useCallback((path, callback) => {\n useEffect(() => {\n subscribers.current[path] = subscribers.current[path] || [];\n subscribers.current[path].push(callback);\n\n return () => {\n subscribers.current[path] = subscribers.current[path].filter((cb) => cb !== callback);\n };\n }, [callback]);\n }, []);\n\n const getFieldSubscribers = useCallback((path: Field) => {\n const result: ((input: SetValuesSubscriberPayload<Values>) => void)[] =\n subscribers.current[path]?.map(\n (callback) => (input: SetValuesSubscriberPayload<Values>) =>\n callback({\n previousValue: getPath(path, input.previousValues) as any,\n value: getPath(path, input.updatedValues) as any,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n ) ?? [];\n\n for (const subscriptionKey in subscribers.current) {\n const isParent = String(path).startsWith(`${subscriptionKey}.`);\n const isChild = String(subscriptionKey).startsWith(`${path}.`);\n\n if (isParent || (cascadeUpdates && isChild)) {\n result.push(\n ...subscribers.current[subscriptionKey].map(\n (cb) => (input: SetValuesSubscriberPayload<Values>) =>\n cb({\n previousValue: getPath(subscriptionKey, input.previousValues) as any,\n value: getPath(subscriptionKey, input.updatedValues) as any,\n touched: $status.isTouched(subscriptionKey),\n dirty: $status.isDirty(subscriptionKey),\n })\n )\n );\n }\n }\n\n return result;\n }, []);\n\n const notifyWatchSubscribers = useCallback((previousValues: Values) => {\n Object.keys(subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n subscribers.current[path as Field]?.forEach((cb) =>\n cb({\n previousValue: getPath(path, previousValues) as FormPathValue<Values, Field>,\n value: getPath(path, $values.refValues.current) as FormPathValue<Values, Field>,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n );\n }\n });\n }, []);\n\n return {\n subscribers,\n watch,\n getFieldSubscribers,\n notifyWatchSubscribers,\n };\n}\n"],"mappings":";;;;AAoBA,SAAgB,aAGd,EAAE,SAAS,SAAS,kBAA6C;CACjE,MAAM,eAAA,GAAA,MAAA,OAAA,CAA0E,CAAC,CAAQ;CAiEzF,OAAO;EACL;EACA,QAAA,GAAA,MAAA,YAAA,EAjE+C,MAAM,aAAa;GAClE,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,YAAY,QAAQ,QAAQ,YAAY,QAAQ,SAAS,CAAC;IAC1D,YAAY,QAAQ,KAAK,CAAC,KAAK,QAAQ;IAEvC,aAAa;KACX,YAAY,QAAQ,QAAQ,YAAY,QAAQ,KAAK,CAAC,QAAQ,OAAO,OAAO,QAAQ;IACtF;GACF,GAAG,CAAC,QAAQ,CAAC;EACf,GAAG,CAAC,CAwDE;EACJ,sBAAA,GAAA,MAAA,YAAA,EAvDuC,SAAgB;GACvD,MAAM,SACJ,YAAY,QAAQ,KAAK,EAAE,KACxB,cAAc,UACb,SAAS;IACP,eAAeA,iBAAAA,QAAQ,MAAM,MAAM,cAAc;IACjD,OAAOA,iBAAAA,QAAQ,MAAM,MAAM,aAAa;IACxC,SAAS,QAAQ,UAAU,IAAI;IAC/B,OAAO,QAAQ,QAAQ,IAAI;GAC7B,CAAC,CACL,KAAK,CAAC;GAER,KAAK,MAAM,mBAAmB,YAAY,SAAS;IACjD,MAAM,WAAW,OAAO,IAAI,CAAC,CAAC,WAAW,GAAG,gBAAgB,EAAE;IAC9D,MAAM,UAAU,OAAO,eAAe,CAAC,CAAC,WAAW,GAAG,KAAK,EAAE;IAE7D,IAAI,YAAa,kBAAkB,SACjC,OAAO,KACL,GAAG,YAAY,QAAQ,gBAAgB,CAAC,KACrC,QAAQ,UACP,GAAG;KACD,eAAeA,iBAAAA,QAAQ,iBAAiB,MAAM,cAAc;KAC5D,OAAOA,iBAAAA,QAAQ,iBAAiB,MAAM,aAAa;KACnD,SAAS,QAAQ,UAAU,eAAe;KAC1C,OAAO,QAAQ,QAAQ,eAAe;IACxC,CAAC,CACL,CACF;GAEJ;GAEA,OAAO;EACT,GAAG,CAAC,CAuBgB;EAClB,yBAAA,GAAA,MAAA,YAAA,EAtB0C,mBAA2B;GACrE,OAAO,KAAK,YAAY,OAAO,CAAC,CAAC,SAAS,SAAS;IAIjD,IAHcA,iBAAAA,QAAQ,MAAM,QAAQ,UAAU,OAGtC,MAFcA,iBAAAA,QAAQ,MAAM,cAEV,GACxB,YAAY,QAAQ,KAAc,EAAE,SAAS,OAC3C,GAAG;KACD,eAAeA,iBAAAA,QAAQ,MAAM,cAAc;KAC3C,OAAOA,iBAAAA,QAAQ,MAAM,QAAQ,UAAU,OAAO;KAC9C,SAAS,QAAQ,UAAU,IAAI;KAC/B,OAAO,QAAQ,QAAQ,IAAI;IAC7B,CAAC,CACH;GAEJ,CAAC;EACH,GAAG,CAAC,CAMmB;CACvB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-error-indices.cjs","names":["clearListState"],"sources":["../../src/lists/change-error-indices.ts"],"sourcesContent":["import { clearListState } from './clear-list-state';\n\n/**\n * Gets the part of the key after the path which can be an index\n */\nfunction getIndexFromKeyAfterPath(key: string, path: string): number {\n const split = key.substring(path.length + 1).split('.')[0];\n return parseInt(split, 10);\n}\n\n/**\n * Changes the indices of every error that is after the given `index` with the given `change` at the given `path`.\n * This requires that the errors are in the format of `path.index` and that the index is a number.\n */\nexport function changeErrorIndices<T extends Record<PropertyKey, any>>(\n path: PropertyKey,\n index: number | undefined,\n errors: T,\n change: 1 | -1\n): T {\n if (index === undefined) {\n return errors;\n }\n const pathString = `${String(path)}`;\n let clearedErrors = errors;\n // Remove all errors if the corresponding item was removed\n if (change === -1) {\n clearedErrors = clearListState(`${pathString}.${index}`, clearedErrors);\n }\n\n const cloned = { ...clearedErrors };\n const changedKeys = new Set<string>();\n Object.entries(clearedErrors)\n .filter(([key]) => {\n if (!key.startsWith(`${pathString}.`)) {\n return false;\n }\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n if (Number.isNaN(currIndex)) {\n return false;\n }\n return currIndex >= index;\n })\n .forEach(([key, value]) => {\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n\n const newKey: keyof T = key.replace(\n `${pathString}.${currIndex}`,\n `${pathString}.${currIndex + change}`\n );\n cloned[newKey] = value;\n changedKeys.add(newKey);\n if (!changedKeys.has(key)) {\n delete cloned[key];\n }\n });\n\n return cloned;\n}\n"],"mappings":";;;;;;AAKA,SAAS,yBAAyB,KAAa,MAAsB;CACnE,MAAM,QAAQ,IAAI,UAAU,KAAK,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"change-error-indices.cjs","names":["clearListState"],"sources":["../../src/lists/change-error-indices.ts"],"sourcesContent":["import { clearListState } from './clear-list-state';\n\n/**\n * Gets the part of the key after the path which can be an index\n */\nfunction getIndexFromKeyAfterPath(key: string, path: string): number {\n const split = key.substring(path.length + 1).split('.')[0];\n return parseInt(split, 10);\n}\n\n/**\n * Changes the indices of every error that is after the given `index` with the given `change` at the given `path`.\n * This requires that the errors are in the format of `path.index` and that the index is a number.\n */\nexport function changeErrorIndices<T extends Record<PropertyKey, any>>(\n path: PropertyKey,\n index: number | undefined,\n errors: T,\n change: 1 | -1\n): T {\n if (index === undefined) {\n return errors;\n }\n const pathString = `${String(path)}`;\n let clearedErrors = errors;\n // Remove all errors if the corresponding item was removed\n if (change === -1) {\n clearedErrors = clearListState(`${pathString}.${index}`, clearedErrors);\n }\n\n const cloned = { ...clearedErrors };\n const changedKeys = new Set<string>();\n Object.entries(clearedErrors)\n .filter(([key]) => {\n if (!key.startsWith(`${pathString}.`)) {\n return false;\n }\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n if (Number.isNaN(currIndex)) {\n return false;\n }\n return currIndex >= index;\n })\n .forEach(([key, value]) => {\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n\n const newKey: keyof T = key.replace(\n `${pathString}.${currIndex}`,\n `${pathString}.${currIndex + change}`\n );\n cloned[newKey] = value;\n changedKeys.add(newKey);\n if (!changedKeys.has(key)) {\n delete cloned[key];\n }\n });\n\n return cloned;\n}\n"],"mappings":";;;;;;AAKA,SAAS,yBAAyB,KAAa,MAAsB;CACnE,MAAM,QAAQ,IAAI,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;CACxD,OAAO,SAAS,OAAO,EAAE;AAC3B;;;;;AAMA,SAAgB,mBACd,MACA,OACA,QACA,QACG;CACH,IAAI,UAAU,KAAA,GACZ,OAAO;CAET,MAAM,aAAa,GAAG,OAAO,IAAI;CACjC,IAAI,gBAAgB;CAEpB,IAAI,WAAW,IACb,gBAAgBA,yBAAAA,eAAe,GAAG,WAAW,GAAG,SAAS,aAAa;CAGxE,MAAM,SAAS,EAAE,GAAG,cAAc;CAClC,MAAM,8BAAc,IAAI,IAAY;CACpC,OAAO,QAAQ,aAAa,CAAC,CAC1B,QAAQ,CAAC,SAAS;EACjB,IAAI,CAAC,IAAI,WAAW,GAAG,WAAW,EAAE,GAClC,OAAO;EAET,MAAM,YAAY,yBAAyB,KAAK,UAAU;EAC1D,IAAI,OAAO,MAAM,SAAS,GACxB,OAAO;EAET,OAAO,aAAa;CACtB,CAAC,CAAC,CACD,SAAS,CAAC,KAAK,WAAW;EACzB,MAAM,YAAY,yBAAyB,KAAK,UAAU;EAE1D,MAAM,SAAkB,IAAI,QAC1B,GAAG,WAAW,GAAG,aACjB,GAAG,WAAW,GAAG,YAAY,QAC/B;EACA,OAAO,UAAU;EACjB,YAAY,IAAI,MAAM;EACtB,IAAI,CAAC,YAAY,IAAI,GAAG,GACtB,OAAO,OAAO;CAElB,CAAC;CAEH,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear-list-state.cjs","names":[],"sources":["../../src/lists/clear-list-state.ts"],"sourcesContent":["export function clearListState<T extends Record<PropertyKey, any>>(\n field: PropertyKey,\n state: T\n): T {\n if (state === null || typeof state !== 'object') {\n return {} as T;\n }\n\n const clone = { ...state };\n Object.keys(state).forEach((errorKey) => {\n if (errorKey.includes(`${String(field)}.`)) {\n delete clone[errorKey];\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAAA,SAAgB,eACd,OACA,OACG;CACH,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OAAO,CAAC;CAGV,MAAM,QAAQ,EAAE,GAAG,MAAM;CACzB,OAAO,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"clear-list-state.cjs","names":[],"sources":["../../src/lists/clear-list-state.ts"],"sourcesContent":["export function clearListState<T extends Record<PropertyKey, any>>(\n field: PropertyKey,\n state: T\n): T {\n if (state === null || typeof state !== 'object') {\n return {} as T;\n }\n\n const clone = { ...state };\n Object.keys(state).forEach((errorKey) => {\n if (errorKey.includes(`${String(field)}.`)) {\n delete clone[errorKey];\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAAA,SAAgB,eACd,OACA,OACG;CACH,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OAAO,CAAC;CAGV,MAAM,QAAQ,EAAE,GAAG,MAAM;CACzB,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,aAAa;EACvC,IAAI,SAAS,SAAS,GAAG,OAAO,KAAK,EAAE,EAAE,GACvC,OAAO,MAAM;CAEjB,CAAC;CAED,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reorder-errors.cjs","names":[],"sources":["../../src/lists/reorder-errors.ts"],"sourcesContent":["import { ReorderPayload } from '../types';\n\nexport function reorderErrors<T>(path: unknown, { from, to }: ReorderPayload, errors: T): T {\n const oldKeyStart = `${path}.${from}`;\n const newKeyStart = `${path}.${to}`;\n\n const clone: any = { ...errors };\n const processedKeys = new Set<string>();\n\n Object.keys(errors as any).forEach((key) => {\n if (processedKeys.has(key)) {\n return;\n }\n\n let oldKey;\n let newKey;\n\n if (key.startsWith(oldKeyStart)) {\n oldKey = key;\n newKey = key.replace(oldKeyStart, newKeyStart);\n } else if (key.startsWith(newKeyStart)) {\n oldKey = key.replace(newKeyStart, oldKeyStart);\n newKey = key;\n }\n\n if (oldKey && newKey) {\n const value1 = clone[oldKey];\n const value2 = clone[newKey];\n\n value2 === undefined ? delete clone[oldKey] : (clone[oldKey] = value2);\n value1 === undefined ? delete clone[newKey] : (clone[newKey] = value1);\n\n processedKeys.add(oldKey);\n processedKeys.add(newKey);\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAEA,SAAgB,cAAiB,MAAe,EAAE,MAAM,MAAsB,QAAc;CAC1F,MAAM,cAAc,GAAG,KAAK,GAAG;CAC/B,MAAM,cAAc,GAAG,KAAK,GAAG;CAE/B,MAAM,QAAa,EAAE,GAAG,OAAO;CAC/B,MAAM,gCAAgB,IAAI,IAAY;CAEtC,OAAO,KAAK,MAAa,
|
|
1
|
+
{"version":3,"file":"reorder-errors.cjs","names":[],"sources":["../../src/lists/reorder-errors.ts"],"sourcesContent":["import { ReorderPayload } from '../types';\n\nexport function reorderErrors<T>(path: unknown, { from, to }: ReorderPayload, errors: T): T {\n const oldKeyStart = `${path}.${from}`;\n const newKeyStart = `${path}.${to}`;\n\n const clone: any = { ...errors };\n const processedKeys = new Set<string>();\n\n Object.keys(errors as any).forEach((key) => {\n if (processedKeys.has(key)) {\n return;\n }\n\n let oldKey;\n let newKey;\n\n if (key.startsWith(oldKeyStart)) {\n oldKey = key;\n newKey = key.replace(oldKeyStart, newKeyStart);\n } else if (key.startsWith(newKeyStart)) {\n oldKey = key.replace(newKeyStart, oldKeyStart);\n newKey = key;\n }\n\n if (oldKey && newKey) {\n const value1 = clone[oldKey];\n const value2 = clone[newKey];\n\n value2 === undefined ? delete clone[oldKey] : (clone[oldKey] = value2);\n value1 === undefined ? delete clone[newKey] : (clone[newKey] = value1);\n\n processedKeys.add(oldKey);\n processedKeys.add(newKey);\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAEA,SAAgB,cAAiB,MAAe,EAAE,MAAM,MAAsB,QAAc;CAC1F,MAAM,cAAc,GAAG,KAAK,GAAG;CAC/B,MAAM,cAAc,GAAG,KAAK,GAAG;CAE/B,MAAM,QAAa,EAAE,GAAG,OAAO;CAC/B,MAAM,gCAAgB,IAAI,IAAY;CAEtC,OAAO,KAAK,MAAa,CAAC,CAAC,SAAS,QAAQ;EAC1C,IAAI,cAAc,IAAI,GAAG,GACvB;EAGF,IAAI;EACJ,IAAI;EAEJ,IAAI,IAAI,WAAW,WAAW,GAAG;GAC/B,SAAS;GACT,SAAS,IAAI,QAAQ,aAAa,WAAW;EAC/C,OAAO,IAAI,IAAI,WAAW,WAAW,GAAG;GACtC,SAAS,IAAI,QAAQ,aAAa,WAAW;GAC7C,SAAS;EACX;EAEA,IAAI,UAAU,QAAQ;GACpB,MAAM,SAAS,MAAM;GACrB,MAAM,SAAS,MAAM;GAErB,WAAW,KAAA,IAAY,OAAO,MAAM,UAAW,MAAM,UAAU;GAC/D,WAAW,KAAA,IAAY,OAAO,MAAM,UAAW,MAAM,UAAU;GAE/D,cAAc,IAAI,MAAM;GACxB,cAAc,IAAI,MAAM;EAC1B;CACF,CAAC;CAED,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-path.cjs","names":["getSplittedPath"],"sources":["../../src/paths/set-path.ts"],"sourcesContent":["import { klona } from 'klona/full';\nimport { getSplittedPath } from './get-splitted-path';\n\nexport function setPath<T>(path: unknown, value: unknown, values: T): T {\n const splittedPath = getSplittedPath(path);\n\n if (splittedPath.length === 0) {\n return values;\n }\n\n const cloned: any = klona(values);\n\n if (splittedPath.length === 1) {\n cloned[splittedPath[0]] = value;\n return cloned;\n }\n\n let val = cloned[splittedPath[0]];\n\n for (let i = 1; i < splittedPath.length - 1; i += 1) {\n if (val === undefined) {\n return cloned;\n }\n\n val = val[splittedPath[i]];\n }\n\n val[splittedPath[splittedPath.length - 1]] = value;\n\n return cloned;\n}\n"],"mappings":";;;;AAGA,SAAgB,QAAW,MAAe,OAAgB,QAAc;CACtE,MAAM,eAAeA,0BAAAA,gBAAgB,IAAI;CAEzC,IAAI,aAAa,WAAW,GAC1B,OAAO;CAGT,MAAM,UAAA,GAAA,WAAA,
|
|
1
|
+
{"version":3,"file":"set-path.cjs","names":["getSplittedPath"],"sources":["../../src/paths/set-path.ts"],"sourcesContent":["import { klona } from 'klona/full';\nimport { getSplittedPath } from './get-splitted-path';\n\nexport function setPath<T>(path: unknown, value: unknown, values: T): T {\n const splittedPath = getSplittedPath(path);\n\n if (splittedPath.length === 0) {\n return values;\n }\n\n const cloned: any = klona(values);\n\n if (splittedPath.length === 1) {\n cloned[splittedPath[0]] = value;\n return cloned;\n }\n\n let val = cloned[splittedPath[0]];\n\n for (let i = 1; i < splittedPath.length - 1; i += 1) {\n if (val === undefined) {\n return cloned;\n }\n\n val = val[splittedPath[i]];\n }\n\n val[splittedPath[splittedPath.length - 1]] = value;\n\n return cloned;\n}\n"],"mappings":";;;;AAGA,SAAgB,QAAW,MAAe,OAAgB,QAAc;CACtE,MAAM,eAAeA,0BAAAA,gBAAgB,IAAI;CAEzC,IAAI,aAAa,WAAW,GAC1B,OAAO;CAGT,MAAM,UAAA,GAAA,WAAA,MAAA,CAAoB,MAAM;CAEhC,IAAI,aAAa,WAAW,GAAG;EAC7B,OAAO,aAAa,MAAM;EAC1B,OAAO;CACT;CAEA,IAAI,MAAM,OAAO,aAAa;CAE9B,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG;EACnD,IAAI,QAAQ,KAAA,GACV,OAAO;EAGT,MAAM,IAAI,aAAa;CACzB;CAEA,IAAI,aAAa,aAAa,SAAS,MAAM;CAE7C,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-resolver.cjs","names":["filterErrors"],"sources":["../src/schema-resolver.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { filterErrors } from './hooks/use-form-errors/filter-errors/filter-errors';\nimport type { FormErrors } from './types';\n\nfunction issuesToFormErrors(issues: ReadonlyArray<StandardSchemaV1.Issue>): FormErrors {\n const errors: FormErrors = {};\n for (const issue of issues) {\n const path = issue.path\n ? issue.path.map((segment) => (typeof segment === 'object' ? segment.key : segment)).join('.')\n : '';\n if (!errors[path]) {\n errors[path] = issue.message;\n }\n }\n return filterErrors(errors);\n}\n\nexport function schemaResolver<Sync extends boolean = false>(\n schema: StandardSchemaV1,\n _options?: { sync?: Sync }\n): Sync extends true ? (values: any) => FormErrors : (values: any) => Promise<FormErrors> {\n const sync = _options?.sync ?? false;\n return ((values: any) => {\n const result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n return result.then((resolved) =>\n resolved.issues ? issuesToFormErrors(resolved.issues) : {}\n );\n }\n const errors = result.issues ? issuesToFormErrors(result.issues) : {};\n return sync ? errors : Promise.resolve(errors);\n }) as any;\n}\n"],"mappings":";;;AAIA,SAAS,mBAAmB,QAA2D;CACrF,MAAM,SAAqB,CAAC;CAC5B,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,MAAM,OACf,MAAM,KAAK,KAAK,YAAa,OAAO,YAAY,WAAW,QAAQ,MAAM,OAAQ,
|
|
1
|
+
{"version":3,"file":"schema-resolver.cjs","names":["filterErrors"],"sources":["../src/schema-resolver.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { filterErrors } from './hooks/use-form-errors/filter-errors/filter-errors';\nimport type { FormErrors } from './types';\n\nfunction issuesToFormErrors(issues: ReadonlyArray<StandardSchemaV1.Issue>): FormErrors {\n const errors: FormErrors = {};\n for (const issue of issues) {\n const path = issue.path\n ? issue.path.map((segment) => (typeof segment === 'object' ? segment.key : segment)).join('.')\n : '';\n if (!errors[path]) {\n errors[path] = issue.message;\n }\n }\n return filterErrors(errors);\n}\n\nexport function schemaResolver<Sync extends boolean = false>(\n schema: StandardSchemaV1,\n _options?: { sync?: Sync }\n): Sync extends true ? (values: any) => FormErrors : (values: any) => Promise<FormErrors> {\n const sync = _options?.sync ?? false;\n return ((values: any) => {\n const result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n return result.then((resolved) =>\n resolved.issues ? issuesToFormErrors(resolved.issues) : {}\n );\n }\n const errors = result.issues ? issuesToFormErrors(result.issues) : {};\n return sync ? errors : Promise.resolve(errors);\n }) as any;\n}\n"],"mappings":";;;AAIA,SAAS,mBAAmB,QAA2D;CACrF,MAAM,SAAqB,CAAC;CAC5B,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,MAAM,OACf,MAAM,KAAK,KAAK,YAAa,OAAO,YAAY,WAAW,QAAQ,MAAM,OAAQ,CAAC,CAAC,KAAK,GAAG,IAC3F;EACJ,IAAI,CAAC,OAAO,OACV,OAAO,QAAQ,MAAM;CAEzB;CACA,OAAOA,sBAAAA,aAAa,MAAM;AAC5B;AAEA,SAAgB,eACd,QACA,UACwF;CACxF,MAAM,OAAO,UAAU,QAAQ;CAC/B,SAAS,WAAgB;EACvB,MAAM,SAAS,OAAO,YAAY,CAAC,SAAS,MAAM;EAClD,IAAI,kBAAkB,SACpB,OAAO,OAAO,MAAM,aAClB,SAAS,SAAS,mBAAmB,SAAS,MAAM,IAAI,CAAC,CAC3D;EAEF,MAAM,SAAS,OAAO,SAAS,mBAAmB,OAAO,MAAM,IAAI,CAAC;EACpE,OAAO,OAAO,SAAS,QAAQ,QAAQ,MAAM;CAC/C;AACF"}
|
package/cjs/use-field.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-field.cjs","names":["getInputOnChange","shouldValidateOnChange"],"sources":["../src/use-field.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { getInputOnChange } from './get-input-on-change';\nimport { FormMode, GetInputPropsType } from './types';\nimport { shouldValidateOnChange } from './validate';\n\ntype UseFieldErrorResolver = (error: unknown) => React.ReactNode;\n\nexport interface UseFieldInput<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Field mode, controlled by default */\n mode?: Mode;\n\n /** Initial field value */\n initialValue: T;\n\n /** Initial touched value */\n initialTouched?: boolean;\n\n /** Initial field error message */\n initialError?: React.ReactNode;\n\n /** Called with updated value when the field value changes */\n onValueChange?: (value: T) => void;\n\n /** Determines whether the field should be validated when value changes, false by default */\n validateOnChange?: boolean;\n\n /** Determines whether the field should be validated when it loses focus, false by default */\n validateOnBlur?: boolean;\n\n /** Determines whether the field should clear error message when value changes, true by default */\n clearErrorOnChange?: boolean;\n\n /** A function to validate field value, can be sync or async */\n validate?: (value: T) => React.ReactNode | Promise<React.ReactNode>;\n\n /** Field type, input by default */\n type?: FieldType;\n\n /** A function to resolve validation error from the result returned from validate function, should return react node */\n resolveValidationError?: UseFieldErrorResolver;\n}\n\ninterface SetValueOptions {\n updateState?: boolean;\n updateKey?: boolean;\n}\n\ninterface GetInputPropsOptions {\n withError?: boolean;\n withFocus?: boolean;\n [key: string]: any;\n}\n\ninterface GetInputPropsSharedReturn {\n error?: React.ReactNode;\n onFocus?: () => void;\n onBlur: () => void;\n onChange: (value: any) => void;\n}\n\ntype GetInputPropsTypeValue<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = FieldType extends 'checkbox'\n ? Mode extends 'controlled'\n ? { checked: boolean }\n : { defaultChecked: boolean }\n : FieldType extends 'radio'\n ? Mode extends 'controlled'\n ? { checked: boolean; value: T }\n : { defaultChecked: boolean; value: T }\n : Mode extends 'controlled'\n ? { value: T }\n : { defaultValue: T };\n\ntype GetInputPropsReturnType<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = GetInputPropsSharedReturn & GetInputPropsTypeValue<T, FieldType, Mode>;\n\nexport interface UseFieldReturnType<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Returns props to pass to the input element */\n getInputProps: (options?: GetInputPropsOptions) => GetInputPropsReturnType<T, FieldType, Mode>;\n\n /** Returns current input value */\n getValue: () => T;\n\n /** Sets input value to the given value */\n setValue: (value: T) => void;\n\n /** Resets field value to initial state, sets touched state to false, sets error to null */\n reset: () => void;\n\n /** Validates current input value when called */\n validate: () => Promise<React.ReactNode | void>;\n\n /** Set to true when async validate function is called, stays true until the returned promise resolves */\n isValidating: boolean;\n\n /** Current error message */\n error: React.ReactNode;\n\n /** Sets error message to the given react node */\n setError: (error: React.ReactNode) => void;\n\n /** Returns true if the input has been focused at least once */\n isTouched: () => boolean;\n\n /** Returns true if input value is different from the initial value */\n isDirty: () => boolean;\n\n /** Resets touched state to false */\n resetTouched: () => void;\n\n /** Key that should be added to the input when mode is uncontrolled */\n key: number;\n}\n\nexport function useField<\n T,\n Mode extends FormMode = 'controlled',\n FieldType extends GetInputPropsType = 'input',\n>({\n mode = 'controlled' as Mode,\n clearErrorOnChange = true,\n initialValue,\n initialError = null,\n initialTouched = false,\n onValueChange,\n validateOnChange = false,\n validateOnBlur = false,\n validate,\n resolveValidationError,\n type = 'input' as FieldType,\n}: UseFieldInput<T, FieldType, Mode>): UseFieldReturnType<T, FieldType, Mode> {\n const [valueState, setValueState] = useState(initialValue);\n const valueRef = useRef(valueState);\n const [key, setKey] = useState(0);\n const [error, setError] = useState<React.ReactNode>(initialError || null);\n const touchedRef = useRef(initialTouched || false);\n const [, setTouchedState] = useState(touchedRef.current);\n const [isValidating, setIsValidating] = useState(false);\n const errorResolver: UseFieldErrorResolver = useMemo(\n () => resolveValidationError || ((err) => err as React.ReactNode),\n [resolveValidationError]\n );\n\n const setTouched = useCallback((val: boolean, { updateState = mode === 'controlled' } = {}) => {\n touchedRef.current = val;\n updateState && setTouchedState(val);\n }, []);\n\n const setValue = useCallback(\n (\n value: T,\n {\n updateKey = mode === 'uncontrolled',\n updateState = mode === 'controlled',\n }: SetValueOptions = {}\n ) => {\n if (valueRef.current === value) {\n return;\n }\n\n valueRef.current = value;\n\n onValueChange?.(value);\n\n if (clearErrorOnChange && error !== null) {\n setError(null);\n }\n\n if (updateState) {\n setValueState(value);\n }\n\n if (updateKey) {\n setKey((currentKey) => currentKey + 1);\n }\n\n if (validateOnChange) {\n _validate();\n }\n },\n [error, clearErrorOnChange, onValueChange]\n );\n\n const reset = useCallback(() => {\n setValue(initialValue);\n setError(null);\n setTouched(false);\n }, [initialValue]);\n\n const getValue = useCallback(() => valueRef.current, []);\n\n const isTouched = useCallback(() => touchedRef.current, []);\n\n const isDirty = useCallback(() => valueRef.current !== initialValue, [initialValue]);\n\n const _validate = useCallback(async () => {\n const validationResult = validate?.(valueRef.current);\n\n if (validationResult instanceof Promise) {\n setIsValidating(true);\n try {\n const result = await validationResult;\n setIsValidating(false);\n setError(result);\n } catch (err) {\n setIsValidating(false);\n const resolvedError = errorResolver(err);\n setError(resolvedError);\n return resolvedError;\n }\n } else {\n setError(validationResult);\n return validationResult;\n }\n }, []);\n\n const getInputProps = ({ withError = true, withFocus = true, ...otherOptions }: any = {}) => {\n const onChange = getInputOnChange<T>((val) => setValue(val as any, { updateKey: false }));\n\n const payload: any = { onChange };\n\n if (withError) {\n payload.error = error;\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = valueRef.current;\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n valueRef.current === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = valueRef.current;\n }\n\n if (withFocus) {\n payload.onFocus = () => {\n setTouched(true);\n };\n\n payload.onBlur = () => {\n if (shouldValidateOnChange('', !!validateOnBlur)) {\n _validate();\n }\n };\n }\n\n return payload;\n };\n\n const resetTouched = useCallback(() => setTouched(false), []);\n\n return {\n key,\n getValue,\n setValue,\n reset,\n getInputProps,\n\n isValidating,\n validate: _validate,\n\n error,\n setError,\n\n isTouched,\n isDirty,\n resetTouched,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-field.cjs","names":["getInputOnChange","shouldValidateOnChange"],"sources":["../src/use-field.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { getInputOnChange } from './get-input-on-change';\nimport { FormMode, GetInputPropsType } from './types';\nimport { shouldValidateOnChange } from './validate';\n\ntype UseFieldErrorResolver = (error: unknown) => React.ReactNode;\n\nexport interface UseFieldInput<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Field mode, controlled by default */\n mode?: Mode;\n\n /** Initial field value */\n initialValue: T;\n\n /** Initial touched value */\n initialTouched?: boolean;\n\n /** Initial field error message */\n initialError?: React.ReactNode;\n\n /** Called with updated value when the field value changes */\n onValueChange?: (value: T) => void;\n\n /** Determines whether the field should be validated when value changes, false by default */\n validateOnChange?: boolean;\n\n /** Determines whether the field should be validated when it loses focus, false by default */\n validateOnBlur?: boolean;\n\n /** Determines whether the field should clear error message when value changes, true by default */\n clearErrorOnChange?: boolean;\n\n /** A function to validate field value, can be sync or async */\n validate?: (value: T) => React.ReactNode | Promise<React.ReactNode>;\n\n /** Field type, input by default */\n type?: FieldType;\n\n /** A function to resolve validation error from the result returned from validate function, should return react node */\n resolveValidationError?: UseFieldErrorResolver;\n}\n\ninterface SetValueOptions {\n updateState?: boolean;\n updateKey?: boolean;\n}\n\ninterface GetInputPropsOptions {\n withError?: boolean;\n withFocus?: boolean;\n [key: string]: any;\n}\n\ninterface GetInputPropsSharedReturn {\n error?: React.ReactNode;\n onFocus?: () => void;\n onBlur: () => void;\n onChange: (value: any) => void;\n}\n\ntype GetInputPropsTypeValue<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = FieldType extends 'checkbox'\n ? Mode extends 'controlled'\n ? { checked: boolean }\n : { defaultChecked: boolean }\n : FieldType extends 'radio'\n ? Mode extends 'controlled'\n ? { checked: boolean; value: T }\n : { defaultChecked: boolean; value: T }\n : Mode extends 'controlled'\n ? { value: T }\n : { defaultValue: T };\n\ntype GetInputPropsReturnType<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = GetInputPropsSharedReturn & GetInputPropsTypeValue<T, FieldType, Mode>;\n\nexport interface UseFieldReturnType<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Returns props to pass to the input element */\n getInputProps: (options?: GetInputPropsOptions) => GetInputPropsReturnType<T, FieldType, Mode>;\n\n /** Returns current input value */\n getValue: () => T;\n\n /** Sets input value to the given value */\n setValue: (value: T) => void;\n\n /** Resets field value to initial state, sets touched state to false, sets error to null */\n reset: () => void;\n\n /** Validates current input value when called */\n validate: () => Promise<React.ReactNode | void>;\n\n /** Set to true when async validate function is called, stays true until the returned promise resolves */\n isValidating: boolean;\n\n /** Current error message */\n error: React.ReactNode;\n\n /** Sets error message to the given react node */\n setError: (error: React.ReactNode) => void;\n\n /** Returns true if the input has been focused at least once */\n isTouched: () => boolean;\n\n /** Returns true if input value is different from the initial value */\n isDirty: () => boolean;\n\n /** Resets touched state to false */\n resetTouched: () => void;\n\n /** Key that should be added to the input when mode is uncontrolled */\n key: number;\n}\n\nexport function useField<\n T,\n Mode extends FormMode = 'controlled',\n FieldType extends GetInputPropsType = 'input',\n>({\n mode = 'controlled' as Mode,\n clearErrorOnChange = true,\n initialValue,\n initialError = null,\n initialTouched = false,\n onValueChange,\n validateOnChange = false,\n validateOnBlur = false,\n validate,\n resolveValidationError,\n type = 'input' as FieldType,\n}: UseFieldInput<T, FieldType, Mode>): UseFieldReturnType<T, FieldType, Mode> {\n const [valueState, setValueState] = useState(initialValue);\n const valueRef = useRef(valueState);\n const [key, setKey] = useState(0);\n const [error, setError] = useState<React.ReactNode>(initialError || null);\n const touchedRef = useRef(initialTouched || false);\n const [, setTouchedState] = useState(touchedRef.current);\n const [isValidating, setIsValidating] = useState(false);\n const errorResolver: UseFieldErrorResolver = useMemo(\n () => resolveValidationError || ((err) => err as React.ReactNode),\n [resolveValidationError]\n );\n\n const setTouched = useCallback((val: boolean, { updateState = mode === 'controlled' } = {}) => {\n touchedRef.current = val;\n updateState && setTouchedState(val);\n }, []);\n\n const setValue = useCallback(\n (\n value: T,\n {\n updateKey = mode === 'uncontrolled',\n updateState = mode === 'controlled',\n }: SetValueOptions = {}\n ) => {\n if (valueRef.current === value) {\n return;\n }\n\n valueRef.current = value;\n\n onValueChange?.(value);\n\n if (clearErrorOnChange && error !== null) {\n setError(null);\n }\n\n if (updateState) {\n setValueState(value);\n }\n\n if (updateKey) {\n setKey((currentKey) => currentKey + 1);\n }\n\n if (validateOnChange) {\n _validate();\n }\n },\n [error, clearErrorOnChange, onValueChange]\n );\n\n const reset = useCallback(() => {\n setValue(initialValue);\n setError(null);\n setTouched(false);\n }, [initialValue]);\n\n const getValue = useCallback(() => valueRef.current, []);\n\n const isTouched = useCallback(() => touchedRef.current, []);\n\n const isDirty = useCallback(() => valueRef.current !== initialValue, [initialValue]);\n\n const _validate = useCallback(async () => {\n const validationResult = validate?.(valueRef.current);\n\n if (validationResult instanceof Promise) {\n setIsValidating(true);\n try {\n const result = await validationResult;\n setIsValidating(false);\n setError(result);\n } catch (err) {\n setIsValidating(false);\n const resolvedError = errorResolver(err);\n setError(resolvedError);\n return resolvedError;\n }\n } else {\n setError(validationResult);\n return validationResult;\n }\n }, []);\n\n const getInputProps = ({ withError = true, withFocus = true, ...otherOptions }: any = {}) => {\n const onChange = getInputOnChange<T>((val) => setValue(val as any, { updateKey: false }));\n\n const payload: any = { onChange };\n\n if (withError) {\n payload.error = error;\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = valueRef.current;\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n valueRef.current === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = valueRef.current;\n }\n\n if (withFocus) {\n payload.onFocus = () => {\n setTouched(true);\n };\n\n payload.onBlur = () => {\n if (shouldValidateOnChange('', !!validateOnBlur)) {\n _validate();\n }\n };\n }\n\n return payload;\n };\n\n const resetTouched = useCallback(() => setTouched(false), []);\n\n return {\n key,\n getValue,\n setValue,\n reset,\n getInputProps,\n\n isValidating,\n validate: _validate,\n\n error,\n setError,\n\n isTouched,\n isDirty,\n resetTouched,\n };\n}\n"],"mappings":"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"}
|
package/cjs/use-form.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":";;;;;;;;;;;;;;;;AA6BA,MAAM,iCAAiC,QACrC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAyBjD,SAAgB,QAGd,EACA,MACA,OAAO,cACP,eACA,gBAAgB,CAAC,GACjB,eAAe,CAAC,GAChB,iBAAiB,CAAC,GAClB,0BAA0B,MAC1B,wBAAwB,OACxB,sBAAsB,OACtB,gBACA,oBAAoB,WAAmB,SACvC,sBACA,UAAU,OACV,yBAAyB,UACzB,eAAe,UACf,iBAAiB,OACjB,mBAAmB,GACnB,yBAAyB,kCACkB,CAAC,GAAiD;CAC7F,MAAM,UAAUA,wBAAAA,cAAsB,aAAa;CACnD,MAAM,UAAUC,wBAAAA,cAAsB;EAAE;EAAe;EAAgB;CAAK,CAAC;CAC7E,MAAM,UAAUC,wBAAAA,cAAsB;EAAE;EAAc;EAAgB;EAAS;CAAK,CAAC;CACrF,MAAM,SAASC,uBAAAA,aAAqB;EAAE;EAAS;EAAS;CAAe,CAAC;CACxE,MAAM,QAAQC,sBAAAA,YAAoB;EAAE;EAAS;EAAS;EAAS;CAAO,CAAC;CACvE,MAAM,cAAcC,4BAAAA,kBAAkB;CACtC,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,UAAuB,CAAC;CACxC,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,UAAiD,CAAC,CAAC;CACrE,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,UAA0B,KAAK;CAClD,MAAM,sBAAA,GAAA,MAAA,QAA4B,CAAC;CAEnC,MAAM,SAAA,GAAA,MAAA,mBAAiC;EACrC,QAAQ,YAAY;EACpB,QAAQ,YAAY;EACpB,QAAQ,WAAW;EACnB,QAAQ,aAAa;EACrB,YAAY,gBAAgB;EAC5B,SAAS,kBAAkB,YAAY,QAAQ,MAAM,CAAC;CACxD,GAAG,CAAC,CAAC;CAEL,MAAM,uBAAA,GAAA,MAAA,cACH,mBAA2B;EAC1B,2BAA2B,QAAQ,YAAY;EAC/C,SAAS,kBAAkB,YAAY,QAAQ,MAAM,CAAC;EACtD,OAAO,uBAAuB,cAAc;CAC9C,GACA,CAAC,uBAAuB,CAC1B;CAEA,MAAM,cAAA,GAAA,MAAA,cACH,WAAW;EACV,MAAM,iBAAiB,QAAQ,UAAU;EACzC,QAAQ,WAAW,cAAc,SAAS,kBAAkB,YAAY,QAAQ,MAAM,CAAC,CAAC;EACxF,oBAAoB,cAAc;CACpC,GACA,CAAC,mBAAmB,CACtB;CAEA,MAAM,0BAAA,GAAA,MAAA,eAAuC;EAC3C,MAAM,SAAwD,CAAC;EAE/D,MAAM,oBAAoB,SAAiB;GACzC,MAAM,SAAS,YAAY,eAAe,IAAI;GAC9C,MAAM,SAASC,6BAAAA,mBACb,MACA,OACA,QAAQ,UAAU,SAClB,wBACA,MACF;GAEA,MAAM,eAAe,YAA2D;IAC9E,IAAI,OAAO,SACT;IAEF,IAAI,QAAQ,UACV,QAAQ,cAAc,MAAa,QAAQ,KAAK;SAEhD,QAAQ,gBAAgB,IAAI;GAEhC;GAEA,MAAM,gBAAgB;IACpB,IAAI,CAAC,OAAO,SACV,YAAY,mBAAmB,MAAM,KAAK;GAE9C;GAEA,IAAI,kBAAkB,SAAS;IAC7B,YAAY,mBAAmB,MAAM,IAAI;IACzC,OAAO,KAAK,WAAW,EAAE,QAAQ,OAAO;GAC1C,OACE,YAAY,MAAM;EAEtB;EAEA,QAAQ,SAAiB;GACvB,aAAa,OAAO,KAAK;GACzB,IAAI,mBAAmB,GACrB,OAAO,QAAQ,iBAAiB,iBAAiB,IAAI,GAAG,gBAAgB;QAExE,iBAAiB,IAAI;EAEzB;CACF,GAAG;EAAC;EAAkB;EAAO;CAAsB,CAAC;CAEpD,MAAM,iBAAA,GAAA,MAAA,cACH,MAAM,OAAO,YAAY;EACxB,MAAM,iBAAiBC,kCAAAA,uBAAuB,MAAM,qBAAqB;EACzE,MAAM,gBACJ,iBAAiB,WAAW,MAAMC,iBAAAA,QAAQ,MAAM,QAAQ,UAAU,OAAO,CAAQ,IAAI;EAEvF,QAAQ,wBAAwB,MAAM,aAAa;EACnD,iBAAiB,YAAY,QAAQ,gBAAgB,MAAM,IAAI;EAC/D,CAAC,kBAAkB,2BAA2B,QAAQ,gBAAgB,IAAI;EAE1E,QAAQ,cAAc;GACpB;GACA;GACA,aAAa,SAAS;GACtB,aAAa;IACX,GAAG,OAAO,oBAAoB,IAAI;IAClC,uBAAuB,uBAAuB,OAAO,IAAI,CAAC,IAAI;IAC9D,SAAS,gBAAgB,SAAS,SAAS,qBAErC,cAAc,UAAU;KACtB,GAAG;MACF,QAAkB,KAAK,SAAmB,KAAK;IAClD,EAAE,IACJ;GACN;EACF,CAAC;CACH,GACA;EAAC;EAAgB;EAAO;CAAsB,CAChD;CAEA,MAAM,aAAA,GAAA,MAAA,cACH,WAAW;EACV,MAAM,iBAAiB,QAAQ,UAAU;EACzC,QAAQ,UAAU;GAAE;GAAQ,aAAa,SAAS;EAAa,CAAC;EAChE,oBAAoB,cAAc;CACpC,GACA,CAAC,gBAAgB,mBAAmB,CACtC;CAEA,MAAM,YAAA,GAAA,MAAA,mBAA6B;EACjC,MAAM,aAAa,EAAE,mBAAmB;EACxC,MAAM,SAAS,YAAY,eAAe,UAAU;EAEpD,MAAM,gBAAgB,YAAiE;GACrF,IAAI,eAAe,mBAAmB,SACpC,OAAO;IAAE,WAAW;IAAO,QAAQ,CAAC;GAAE;GAExC,QAAQ,UAAU,QAAQ,MAAM;GAChC,OAAO;EACT;EAEA,MAAM,gBAAgB;GACpB,IAAI,eAAe,mBAAmB,SACpC,YAAY,kBAAkB,KAAK;EAEvC;EAEA,MAAM,SAASC,wBAAAA,eAAe,OAAO,QAAQ,UAAU,SAAS,wBAAwB,MAAM;EAE9F,IAAI,kBAAkB,SAAS;GAC7B,YAAY,kBAAkB,IAAI;GAClC,OAAO,OAAO,KAAK,YAAY,EAAE,QAAQ,OAAO;EAClD;EAEA,OAAO,aAAa,MAAM;CAC5B,GAAG,CAAC,OAAO,sBAAsB,CAAC;CAElC,MAAM,iBAAA,GAAA,MAAA,cACH,SAAiB;EAChB,MAAM,SAAS,YAAY,eAAe,OAAO,IAAI,CAAC;EAEtD,MAAM,eAAe,YAA2D;GAC9E,IAAI,OAAO,SACT,OAAO;IAAE,UAAU;IAAO,OAAO;GAAK;GAExC,IAAI,QAAQ,UACV,QAAQ,cAAc,MAAM,QAAQ,KAAK;QAEzC,QAAQ,gBAAgB,IAAI;GAE9B,OAAO;EACT;EAEA,MAAM,gBAAgB;GACpB,IAAI,CAAC,OAAO,SACV,YAAY,mBAAmB,OAAO,IAAI,GAAG,KAAK;EAEtD;EAEA,MAAM,SAASH,6BAAAA,mBACb,MACA,OACA,QAAQ,UAAU,SAClB,wBACA,MACF;EAEA,IAAI,kBAAkB,SAAS;GAC7B,YAAY,mBAAmB,OAAO,IAAI,GAAG,IAAI;GACjD,OAAO,OAAO,KAAK,WAAW,EAAE,QAAQ,OAAO;EACjD;EAEA,OAAO,YAAY,MAAM;CAC3B,GACA,CAAC,OAAO,sBAAsB,CAChC;CAEA,MAAM,iBACJ,MACA,EAAE,OAAO,SAAS,YAAY,MAAM,WAAW,GAAG,iBAAiB,CAAC,MACjE;EACH,MAAM,aAAa,aAAa,SAAS;EAKzC,MAAM,UAAe;GAAE,UAJNI,4BAAAA,kBAAkB,UACjC,cAAc,MAAM,OAAc,EAAE,aAAa,MAAM,CAAC,CAG5B;GAAG,aAAaC,sBAAAA,YAAY,MAAM,IAAI;EAAE;EAEtE,IAAI,WACF,QAAQ,QAAQ,QAAQ,YAAY;EAGtC,IAAI,SAAS,YACX,QAAQ,SAAS,eAAe,YAAY,oBAAoBH,iBAAAA,QAC9D,MACA,QAAQ,UAAU,OACpB;OACK,IAAI,SAAS,SAAS;GAC3B,QAAQ,SAAS,eAAe,YAAY,oBAC1CA,iBAAAA,QAAQ,MAAM,QAAQ,UAAU,OAAO,MAAM,aAAa;GAC5D,QAAQ,QAAQ,aAAa;EAC/B,OACE,QAAQ,SAAS,eAAe,UAAU,kBAAkBA,iBAAAA,QAC1D,MACA,QAAQ,UAAU,OACpB;EAGF,IAAI,YAAY;GACd,QAAQ,gBAAgB,QAAQ,gBAAgB,MAAM,IAAI;GAC1D,QAAQ,eAAe;IACrB,IAAID,kCAAAA,uBAAuB,MAAM,mBAAmB,GAClD,uBAAuB,OAAO,IAAI,CAAC;GAEvC;EACF;EAEA,OAAO,OAAO,OACZ,SACA,uBAAuB;GACrB,YAAY;GACZ,OAAO;GACP,SAAS;IAAE;IAAM;IAAW,WAAW;IAAY,GAAG;GAAa;GAC7D;EACR,CAAC,CACH;CACF;CAEA,MAAM,YACH,cAAc,6BAA6B,UAAU;EACpD,IAAI,2BAA2B,UAC7B,OAAO,eAAe;EAGxB,cAAc,IAAI;EAElB,MAAM,oBAAoB,YAAiE;GACzF,IAAI,QAAQ,WAAW;IACrB,IAAI,2BAA2B,qBAC7B,OAAO,eAAe;IAGxB,0BAA0B,QAAQ,QAAQ,QAAQ,UAAU,SAAS,KAAK;IAC1E,cAAc,KAAK;GACrB,OAAO;IACL,MAAM,eAAe,eACnB,gBAAgB,QAAQ,UAAU,OAAO,GACzC,KACF;IAEA,IAAI,wBAAwB,SAC1B,aAAa,cAAc,cAAc,KAAK,CAAC;SAE/C,cAAc,KAAK;GAEvB;EACF;EAEA,MAAM,SAAS,SAAS;EACxB,IAAI,kBAAkB,SACpB,OAAO,KAAK,gBAAgB,EAAE,YAAY;GACxC,cAAc,KAAK;EACrB,CAAC;OAED,iBAAiB,MAAM;CAE3B;CAEF,MAAM,wBAAyE,UAC5E,gBAAwB,SAAS,QAAQ,UAAU,OAAO;CAE7D,MAAM,WAAA,GAAA,MAAA,cAAgC,UAAU;EAC9C,MAAM,eAAe;EACrB,MAAM;CACR,GAAG,CAAC,CAAC;CAEL,MAAM,WAAA,GAAA,MAAA,cACH,SAAkB;EACjB,MAAM,SAAS,IAAI,gBAAgB,EAAE;EACrC,IAAI,MAAM;GACR,MAAM,SAASD,6BAAAA,mBACb,MACA,OACA,QAAQ,UAAU,SAClB,wBACA,MACF;GACA,IAAI,kBAAkB,SACpB,OAAO,OAAO,MAAM,MAAM,CAAC,EAAE,QAAQ;GAEvC,OAAO,CAAC,OAAO;EACjB;EACA,MAAM,SAASG,wBAAAA,eACb,OACA,QAAQ,UAAU,SAClB,wBACA,MACF;EACA,IAAI,kBAAkB,SACpB,OAAO,OAAO,MAAM,MAAM,CAAC,EAAE,SAAS;EAExC,OAAO,CAAC,OAAO;CACjB,GACA,CAAC,OAAO,sBAAsB,CAChC;CAEA,MAAM,OAAoB,SAAS,GAAG,QAAQ,GAAG,OAAO,IAAI,EAAE,GAAG,UAAU,OAAO,IAAI,MAAM;CAE5F,MAAM,gBAAA,GAAA,MAAA,cACH,SAAS,SAAS,cAAc,eAAeE,sBAAAA,YAAY,MAAM,IAAI,EAAE,GAAG,GAC3E,CAAC,CACH;CAEA,MAAM,cAAA,GAAA,MAAA,cACH,SAAsB;EACrB,QAAQ,WAAW,MAAM,CACvB,SAAS,qBAEH,cAAc,UAAU;GACtB,GAAG;IACF,QAAkB,KAAK,SAAmB,KAAK;EAClD,EAAE,IACJ,IACN,CAAC;CACH,GACA;EAAC,QAAQ;EAAY;EAAM;CAAY,CACzC;CAEA,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,iBAAiB,MAAM;EACvB,gBAAgB,MAAM;EACtB,gBAAgB,MAAM;EACtB,iBAAiB,MAAM;EAEvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;CACF;CAEA,gBAAA,eAAe,MAAM,IAAW;CAEhC,OAAO;AACT"}
|
|
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":"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,
|
|
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,CAAC,CAAC,MAAM,aAC5C,KAAK,MAAM,GAAG,CAAC,CAAC,OAAO,UAAU,MAAM,aAAa,SAAS,MAAM,GAAG,CAAC,CAAC,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,CAAC,CAAC,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,WAAW;AAE9C,SAAS,qBAAqB,QAA0C;CACtE,MAAM,iBAAiBA,sBAAAA,aAAa,MAAM;CAC1C,OAAO;EAAE,WAAW,OAAO,KAAK,cAAc,
|
|
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":"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,
|
|
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,CAAC,CAAC,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":["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,
|
|
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,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,OAAO;EAG1D,OAAO;CACT;AACF"}
|
|
@@ -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;CAC3D,IAAI,WAAW,QAAQ,OAAO,WAAW,UACvC,OAAO,CAAC;CAGV,OAAO,OAAO,KAAK,MAAM,
|
|
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,CAAC,CAAC,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-status.mjs","names":[],"sources":["../../../src/hooks/use-form-status/use-form-status.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport isEqual from 'fast-deep-equal';\nimport { getStatus } from '../../get-status';\nimport { clearListState } from '../../lists';\nimport { getPath } from '../../paths';\nimport {\n ClearFieldDirty,\n FormMode,\n FormStatus,\n GetFieldStatus,\n ResetDirty,\n ResetStatus,\n SetCalculatedFieldDirty,\n SetFieldDirty,\n SetFieldTouched,\n} from '../../types';\nimport type { $FormValues } from '../use-form-values/use-form-values';\n\nexport interface $FormStatus<out Values extends Record<string, any>> {\n touchedState: FormStatus;\n dirtyState: FormStatus;\n touchedRef: React.RefObject<FormStatus>;\n dirtyRef: React.RefObject<FormStatus>;\n setTouched: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirty: React.Dispatch<React.SetStateAction<FormStatus>>;\n resetDirty: ResetStatus;\n resetTouched: ResetStatus;\n isTouched: GetFieldStatus<Values>;\n setFieldTouched: SetFieldTouched<Values>;\n setFieldDirty: SetFieldDirty<Values>;\n setTouchedState: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirtyState: React.Dispatch<React.SetStateAction<FormStatus>>;\n clearFieldDirty: ClearFieldDirty;\n isDirty: GetFieldStatus<Values>;\n getDirty: () => FormStatus;\n getTouched: () => FormStatus;\n setCalculatedFieldDirty: SetCalculatedFieldDirty<Values>;\n}\n\ninterface UseFormStatusInput<out Values extends Record<string, any>> {\n initialDirty: FormStatus;\n initialTouched: FormStatus;\n mode: FormMode;\n $values: $FormValues<Values>;\n}\n\nexport function useFormStatus<Values extends Record<string, any>>({\n initialDirty,\n initialTouched,\n mode,\n $values,\n}: UseFormStatusInput<Values>): $FormStatus<Values> {\n const [touchedState, setTouchedState] = useState(initialTouched);\n const [dirtyState, setDirtyState] = useState(initialDirty);\n\n const touchedRef = useRef(initialTouched);\n const dirtyRef = useRef(initialDirty);\n\n const setTouched = useCallback((values: FormStatus | ((current: FormStatus) => FormStatus)) => {\n const resolvedValues = typeof values === 'function' ? values(touchedRef.current) : values;\n touchedRef.current = resolvedValues;\n\n if (mode === 'controlled') {\n setTouchedState(resolvedValues);\n }\n }, []);\n\n const setDirty = useCallback(\n (values: FormStatus | ((current: FormStatus) => FormStatus), forceUpdate = false) => {\n const resolvedValues = typeof values === 'function' ? values(dirtyRef.current) : values;\n dirtyRef.current = resolvedValues;\n\n if (mode === 'controlled' || forceUpdate) {\n setDirtyState(resolvedValues);\n }\n },\n []\n );\n\n const resetTouched: ResetStatus = useCallback(() => setTouched({}), []);\n\n const resetDirty: ResetDirty<Values> = useCallback((values) => {\n const newSnapshot = values\n ? { ...$values.refValues.current, ...values }\n : $values.refValues.current;\n $values.setValuesSnapshot(newSnapshot);\n setDirty({});\n }, []);\n\n const setFieldTouched: SetFieldTouched<Values> = useCallback((path, touched) => {\n setTouched((currentTouched) => {\n if (getStatus(currentTouched, path) === touched) {\n return currentTouched;\n }\n\n return { ...currentTouched, [path]: touched };\n });\n }, []);\n\n const setFieldDirty: SetFieldDirty<Values> = useCallback((path, dirty, forceUpdate) => {\n setDirty((currentDirty) => {\n if (getStatus(currentDirty, path) === dirty) {\n return currentDirty;\n }\n\n return { ...currentDirty, [path]: dirty };\n }, forceUpdate);\n }, []);\n\n const setCalculatedFieldDirty: SetCalculatedFieldDirty<Values> = useCallback((path, value) => {\n const currentDirty = getStatus(dirtyRef.current, path);\n const dirty = !isEqual(getPath(path, $values.getValuesSnapshot()), value);\n const clearedState = clearListState(path, dirtyRef.current);\n clearedState[path as string] = dirty;\n setDirty(clearedState, currentDirty !== dirty);\n }, []);\n\n const isTouched: GetFieldStatus<Values> = useCallback(\n (path) => getStatus(touchedRef.current, path),\n []\n );\n\n const clearFieldDirty: ClearFieldDirty = useCallback(\n (path) =>\n setDirty((current) => {\n if (typeof path !== 'string') {\n return current;\n }\n\n const result = clearListState(path, current);\n delete result[path];\n\n if (isEqual(result, current)) {\n return current;\n }\n\n return result;\n }),\n []\n );\n\n const isDirty: GetFieldStatus<Values> = useCallback((path) => {\n if (path) {\n const overriddenValue = getPath(path, dirtyRef.current);\n if (typeof overriddenValue === 'boolean') {\n return overriddenValue;\n }\n\n const sliceOfValues = getPath(path, $values.refValues.current);\n const sliceOfInitialValues = getPath(path, $values.valuesSnapshot.current);\n return !isEqual(sliceOfValues, sliceOfInitialValues);\n }\n\n const isOverridden = Object.keys(dirtyRef.current).length > 0;\n if (isOverridden) {\n return getStatus(dirtyRef.current);\n }\n\n return !isEqual($values.refValues.current, $values.valuesSnapshot.current);\n }, []);\n\n const getDirty = useCallback(() => dirtyRef.current, []);\n const getTouched = useCallback(() => touchedRef.current, []);\n\n return {\n touchedState,\n dirtyState,\n touchedRef,\n dirtyRef,\n setTouched,\n setDirty,\n resetDirty,\n resetTouched,\n isTouched,\n setFieldTouched,\n setFieldDirty,\n setTouchedState,\n setDirtyState,\n clearFieldDirty,\n isDirty,\n getDirty,\n getTouched,\n setCalculatedFieldDirty,\n };\n}\n"],"mappings":";;;;;;;AA8CA,SAAgB,cAAkD,EAChE,cACA,gBACA,MACA,WACkD;CAClD,MAAM,CAAC,cAAc,mBAAmB,SAAS,cAAc;CAC/D,MAAM,CAAC,YAAY,iBAAiB,SAAS,YAAY;CAEzD,MAAM,aAAa,OAAO,cAAc;CACxC,MAAM,WAAW,OAAO,YAAY;CAEpC,MAAM,aAAa,aAAa,WAA+D;EAC7F,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,WAAW,OAAO,IAAI;EACnF,WAAW,UAAU;EAErB,IAAI,SAAS,cACX,gBAAgB,cAAc;CAElC,GAAG,CAAC,CAAC;CAEL,MAAM,WAAW,aACd,QAA4D,cAAc,UAAU;EACnF,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,SAAS,OAAO,IAAI;EACjF,SAAS,UAAU;EAEnB,IAAI,SAAS,gBAAgB,aAC3B,cAAc,cAAc;CAEhC,GACA,CAAC,CACH;CAEA,MAAM,eAA4B,kBAAkB,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC;CAEtE,MAAM,aAAiC,aAAa,WAAW;EAC7D,MAAM,cAAc,SAChB;GAAE,GAAG,QAAQ,UAAU;GAAS,GAAG;EAAO,IAC1C,QAAQ,UAAU;EACtB,QAAQ,kBAAkB,WAAW;EACrC,SAAS,CAAC,CAAC;CACb,GAAG,CAAC,CAAC;CAEL,MAAM,kBAA2C,aAAa,MAAM,YAAY;EAC9E,YAAY,mBAAmB;GAC7B,IAAI,UAAU,gBAAgB,IAAI,MAAM,SACtC,OAAO;GAGT,OAAO;IAAE,GAAG;KAAiB,OAAO;GAAQ;EAC9C,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,MAAM,gBAAuC,aAAa,MAAM,OAAO,gBAAgB;EACrF,UAAU,iBAAiB;GACzB,IAAI,UAAU,cAAc,IAAI,MAAM,OACpC,OAAO;GAGT,OAAO;IAAE,GAAG;KAAe,OAAO;GAAM;EAC1C,GAAG,WAAW;CAChB,GAAG,CAAC,CAAC;CAEL,MAAM,0BAA2D,aAAa,MAAM,UAAU;EAC5F,MAAM,eAAe,UAAU,SAAS,SAAS,IAAI;EACrD,MAAM,QAAQ,CAAC,QAAQ,QAAQ,MAAM,QAAQ,kBAAkB,CAAC,GAAG,KAAK;EACxE,MAAM,eAAe,eAAe,MAAM,SAAS,OAAO;EAC1D,aAAa,QAAkB;EAC/B,SAAS,cAAc,iBAAiB,KAAK;CAC/C,GAAG,CAAC,CAAC;CAiDL,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAxDwC,aACvC,SAAS,UAAU,WAAW,SAAS,IAAI,GAC5C,CAAC,CAsDO;EACR;EACA;EACA;EACA;EACA,iBAxDuC,aACtC,SACC,UAAU,YAAY;GACpB,IAAI,OAAO,SAAS,UAClB,OAAO;GAGT,MAAM,SAAS,eAAe,MAAM,OAAO;GAC3C,OAAO,OAAO;GAEd,IAAI,QAAQ,QAAQ,OAAO,GACzB,OAAO;GAGT,OAAO;EACT,CAAC,GACH,CAAC,CAwCa;EACd,SAtCsC,aAAa,SAAS;GAC5D,IAAI,MAAM;IACR,MAAM,kBAAkB,QAAQ,MAAM,SAAS,OAAO;IACtD,IAAI,OAAO,oBAAoB,WAC7B,OAAO;IAKT,OAAO,CAAC,QAFc,QAAQ,MAAM,QAAQ,UAAU,OAE1B,GADC,QAAQ,MAAM,QAAQ,eAAe,OAChB,CAAC;GACrD;GAGA,IADqB,OAAO,KAAK,SAAS,OAAO,
|
|
1
|
+
{"version":3,"file":"use-form-status.mjs","names":[],"sources":["../../../src/hooks/use-form-status/use-form-status.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport isEqual from 'fast-deep-equal';\nimport { getStatus } from '../../get-status';\nimport { clearListState } from '../../lists';\nimport { getPath } from '../../paths';\nimport {\n ClearFieldDirty,\n FormMode,\n FormStatus,\n GetFieldStatus,\n ResetDirty,\n ResetStatus,\n SetCalculatedFieldDirty,\n SetFieldDirty,\n SetFieldTouched,\n} from '../../types';\nimport type { $FormValues } from '../use-form-values/use-form-values';\n\nexport interface $FormStatus<out Values extends Record<string, any>> {\n touchedState: FormStatus;\n dirtyState: FormStatus;\n touchedRef: React.RefObject<FormStatus>;\n dirtyRef: React.RefObject<FormStatus>;\n setTouched: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirty: React.Dispatch<React.SetStateAction<FormStatus>>;\n resetDirty: ResetStatus;\n resetTouched: ResetStatus;\n isTouched: GetFieldStatus<Values>;\n setFieldTouched: SetFieldTouched<Values>;\n setFieldDirty: SetFieldDirty<Values>;\n setTouchedState: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirtyState: React.Dispatch<React.SetStateAction<FormStatus>>;\n clearFieldDirty: ClearFieldDirty;\n isDirty: GetFieldStatus<Values>;\n getDirty: () => FormStatus;\n getTouched: () => FormStatus;\n setCalculatedFieldDirty: SetCalculatedFieldDirty<Values>;\n}\n\ninterface UseFormStatusInput<out Values extends Record<string, any>> {\n initialDirty: FormStatus;\n initialTouched: FormStatus;\n mode: FormMode;\n $values: $FormValues<Values>;\n}\n\nexport function useFormStatus<Values extends Record<string, any>>({\n initialDirty,\n initialTouched,\n mode,\n $values,\n}: UseFormStatusInput<Values>): $FormStatus<Values> {\n const [touchedState, setTouchedState] = useState(initialTouched);\n const [dirtyState, setDirtyState] = useState(initialDirty);\n\n const touchedRef = useRef(initialTouched);\n const dirtyRef = useRef(initialDirty);\n\n const setTouched = useCallback((values: FormStatus | ((current: FormStatus) => FormStatus)) => {\n const resolvedValues = typeof values === 'function' ? values(touchedRef.current) : values;\n touchedRef.current = resolvedValues;\n\n if (mode === 'controlled') {\n setTouchedState(resolvedValues);\n }\n }, []);\n\n const setDirty = useCallback(\n (values: FormStatus | ((current: FormStatus) => FormStatus), forceUpdate = false) => {\n const resolvedValues = typeof values === 'function' ? values(dirtyRef.current) : values;\n dirtyRef.current = resolvedValues;\n\n if (mode === 'controlled' || forceUpdate) {\n setDirtyState(resolvedValues);\n }\n },\n []\n );\n\n const resetTouched: ResetStatus = useCallback(() => setTouched({}), []);\n\n const resetDirty: ResetDirty<Values> = useCallback((values) => {\n const newSnapshot = values\n ? { ...$values.refValues.current, ...values }\n : $values.refValues.current;\n $values.setValuesSnapshot(newSnapshot);\n setDirty({});\n }, []);\n\n const setFieldTouched: SetFieldTouched<Values> = useCallback((path, touched) => {\n setTouched((currentTouched) => {\n if (getStatus(currentTouched, path) === touched) {\n return currentTouched;\n }\n\n return { ...currentTouched, [path]: touched };\n });\n }, []);\n\n const setFieldDirty: SetFieldDirty<Values> = useCallback((path, dirty, forceUpdate) => {\n setDirty((currentDirty) => {\n if (getStatus(currentDirty, path) === dirty) {\n return currentDirty;\n }\n\n return { ...currentDirty, [path]: dirty };\n }, forceUpdate);\n }, []);\n\n const setCalculatedFieldDirty: SetCalculatedFieldDirty<Values> = useCallback((path, value) => {\n const currentDirty = getStatus(dirtyRef.current, path);\n const dirty = !isEqual(getPath(path, $values.getValuesSnapshot()), value);\n const clearedState = clearListState(path, dirtyRef.current);\n clearedState[path as string] = dirty;\n setDirty(clearedState, currentDirty !== dirty);\n }, []);\n\n const isTouched: GetFieldStatus<Values> = useCallback(\n (path) => getStatus(touchedRef.current, path),\n []\n );\n\n const clearFieldDirty: ClearFieldDirty = useCallback(\n (path) =>\n setDirty((current) => {\n if (typeof path !== 'string') {\n return current;\n }\n\n const result = clearListState(path, current);\n delete result[path];\n\n if (isEqual(result, current)) {\n return current;\n }\n\n return result;\n }),\n []\n );\n\n const isDirty: GetFieldStatus<Values> = useCallback((path) => {\n if (path) {\n const overriddenValue = getPath(path, dirtyRef.current);\n if (typeof overriddenValue === 'boolean') {\n return overriddenValue;\n }\n\n const sliceOfValues = getPath(path, $values.refValues.current);\n const sliceOfInitialValues = getPath(path, $values.valuesSnapshot.current);\n return !isEqual(sliceOfValues, sliceOfInitialValues);\n }\n\n const isOverridden = Object.keys(dirtyRef.current).length > 0;\n if (isOverridden) {\n return getStatus(dirtyRef.current);\n }\n\n return !isEqual($values.refValues.current, $values.valuesSnapshot.current);\n }, []);\n\n const getDirty = useCallback(() => dirtyRef.current, []);\n const getTouched = useCallback(() => touchedRef.current, []);\n\n return {\n touchedState,\n dirtyState,\n touchedRef,\n dirtyRef,\n setTouched,\n setDirty,\n resetDirty,\n resetTouched,\n isTouched,\n setFieldTouched,\n setFieldDirty,\n setTouchedState,\n setDirtyState,\n clearFieldDirty,\n isDirty,\n getDirty,\n getTouched,\n setCalculatedFieldDirty,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-validating.mjs","names":[],"sources":["../../../src/hooks/use-form-validating/use-form-validating.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface $FormValidating {\n validating: boolean;\n isValidating: (path?: string) => boolean;\n setFieldValidating: (path: string, validating: boolean) => void;\n setFormValidating: (validating: boolean) => void;\n getAbortSignal: (path: string) => AbortSignal;\n clearValidating: () => void;\n}\n\nexport function useFormValidating(): $FormValidating {\n const [validatingFields, setValidatingFields] = useState<Record<string, boolean>>({});\n const [formValidating, setFormValidatingState] = useState(false);\n const validatingRef = useRef<Record<string, boolean>>({});\n const formValidatingRef = useRef(false);\n const abortControllers = useRef<Record<string, AbortController>>({});\n\n const setFieldValidating = useCallback((path: string, value: boolean) => {\n validatingRef.current = { ...validatingRef.current, [path]: value };\n setValidatingFields({ ...validatingRef.current });\n }, []);\n\n const setFormValidating = useCallback((value: boolean) => {\n formValidatingRef.current = value;\n setFormValidatingState(value);\n }, []);\n\n const isValidating = useCallback((path?: string) => {\n if (path) {\n return !!validatingRef.current[path];\n }\n if (formValidatingRef.current) {\n return true;\n }\n return Object.values(validatingRef.current).some(Boolean);\n }, []);\n\n const getAbortSignal = useCallback((path: string) => {\n abortControllers.current[path]?.abort();\n abortControllers.current[path] = new AbortController();\n return abortControllers.current[path].signal;\n }, []);\n\n const clearValidating = useCallback(() => {\n validatingRef.current = {};\n setValidatingFields({});\n formValidatingRef.current = false;\n setFormValidatingState(false);\n Object.values(abortControllers.current).forEach((c) => c.abort());\n abortControllers.current = {};\n }, []);\n\n const validating = formValidating || Object.values(validatingFields).some(Boolean);\n\n return {\n validating,\n isValidating,\n setFieldValidating,\n setFormValidating,\n getAbortSignal,\n clearValidating,\n };\n}\n"],"mappings":";;;AAWA,SAAgB,oBAAqC;CACnD,MAAM,CAAC,kBAAkB,uBAAuB,SAAkC,CAAC,CAAC;CACpF,MAAM,CAAC,gBAAgB,0BAA0B,SAAS,KAAK;CAC/D,MAAM,gBAAgB,OAAgC,CAAC,CAAC;CACxD,MAAM,oBAAoB,OAAO,KAAK;CACtC,MAAM,mBAAmB,OAAwC,CAAC,CAAC;CAEnE,MAAM,qBAAqB,aAAa,MAAc,UAAmB;EACvE,cAAc,UAAU;GAAE,GAAG,cAAc;IAAU,OAAO;EAAM;EAClE,oBAAoB,EAAE,GAAG,cAAc,QAAQ,CAAC;CAClD,GAAG,CAAC,CAAC;CAEL,MAAM,oBAAoB,aAAa,UAAmB;EACxD,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;CAC9B,GAAG,CAAC,CAAC;CAEL,MAAM,eAAe,aAAa,SAAkB;EAClD,IAAI,MACF,OAAO,CAAC,CAAC,cAAc,QAAQ;EAEjC,IAAI,kBAAkB,SACpB,OAAO;EAET,OAAO,OAAO,OAAO,cAAc,OAAO,
|
|
1
|
+
{"version":3,"file":"use-form-validating.mjs","names":[],"sources":["../../../src/hooks/use-form-validating/use-form-validating.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface $FormValidating {\n validating: boolean;\n isValidating: (path?: string) => boolean;\n setFieldValidating: (path: string, validating: boolean) => void;\n setFormValidating: (validating: boolean) => void;\n getAbortSignal: (path: string) => AbortSignal;\n clearValidating: () => void;\n}\n\nexport function useFormValidating(): $FormValidating {\n const [validatingFields, setValidatingFields] = useState<Record<string, boolean>>({});\n const [formValidating, setFormValidatingState] = useState(false);\n const validatingRef = useRef<Record<string, boolean>>({});\n const formValidatingRef = useRef(false);\n const abortControllers = useRef<Record<string, AbortController>>({});\n\n const setFieldValidating = useCallback((path: string, value: boolean) => {\n validatingRef.current = { ...validatingRef.current, [path]: value };\n setValidatingFields({ ...validatingRef.current });\n }, []);\n\n const setFormValidating = useCallback((value: boolean) => {\n formValidatingRef.current = value;\n setFormValidatingState(value);\n }, []);\n\n const isValidating = useCallback((path?: string) => {\n if (path) {\n return !!validatingRef.current[path];\n }\n if (formValidatingRef.current) {\n return true;\n }\n return Object.values(validatingRef.current).some(Boolean);\n }, []);\n\n const getAbortSignal = useCallback((path: string) => {\n abortControllers.current[path]?.abort();\n abortControllers.current[path] = new AbortController();\n return abortControllers.current[path].signal;\n }, []);\n\n const clearValidating = useCallback(() => {\n validatingRef.current = {};\n setValidatingFields({});\n formValidatingRef.current = false;\n setFormValidatingState(false);\n Object.values(abortControllers.current).forEach((c) => c.abort());\n abortControllers.current = {};\n }, []);\n\n const validating = formValidating || Object.values(validatingFields).some(Boolean);\n\n return {\n validating,\n isValidating,\n setFieldValidating,\n setFormValidating,\n getAbortSignal,\n clearValidating,\n };\n}\n"],"mappings":";;;AAWA,SAAgB,oBAAqC;CACnD,MAAM,CAAC,kBAAkB,uBAAuB,SAAkC,CAAC,CAAC;CACpF,MAAM,CAAC,gBAAgB,0BAA0B,SAAS,KAAK;CAC/D,MAAM,gBAAgB,OAAgC,CAAC,CAAC;CACxD,MAAM,oBAAoB,OAAO,KAAK;CACtC,MAAM,mBAAmB,OAAwC,CAAC,CAAC;CAEnE,MAAM,qBAAqB,aAAa,MAAc,UAAmB;EACvE,cAAc,UAAU;GAAE,GAAG,cAAc;IAAU,OAAO;EAAM;EAClE,oBAAoB,EAAE,GAAG,cAAc,QAAQ,CAAC;CAClD,GAAG,CAAC,CAAC;CAEL,MAAM,oBAAoB,aAAa,UAAmB;EACxD,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;CAC9B,GAAG,CAAC,CAAC;CAEL,MAAM,eAAe,aAAa,SAAkB;EAClD,IAAI,MACF,OAAO,CAAC,CAAC,cAAc,QAAQ;EAEjC,IAAI,kBAAkB,SACpB,OAAO;EAET,OAAO,OAAO,OAAO,cAAc,OAAO,CAAC,CAAC,KAAK,OAAO;CAC1D,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,aAAa,SAAiB;EACnD,iBAAiB,QAAQ,KAAK,EAAE,MAAM;EACtC,iBAAiB,QAAQ,QAAQ,IAAI,gBAAgB;EACrD,OAAO,iBAAiB,QAAQ,KAAK,CAAC;CACxC,GAAG,CAAC,CAAC;CAEL,MAAM,kBAAkB,kBAAkB;EACxC,cAAc,UAAU,CAAC;EACzB,oBAAoB,CAAC,CAAC;EACtB,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;EAC5B,OAAO,OAAO,iBAAiB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC;EAChE,iBAAiB,UAAU,CAAC;CAC9B,GAAG,CAAC,CAAC;CAIL,OAAO;EACL,YAHiB,kBAAkB,OAAO,OAAO,gBAAgB,CAAC,CAAC,KAAK,OAAO;EAI/E;EACA;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-values.mjs","names":[],"sources":["../../../src/hooks/use-form-values/use-form-values.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { getPath, setPath } from '../../paths';\nimport { FormMode } from '../../types';\n\nexport interface $FormValues<out Values extends Record<PropertyKey, any>> {\n initialized: React.RefObject<boolean>;\n stateValues: Values;\n refValues: React.RefObject<Values>;\n valuesSnapshot: React.RefObject<Values>;\n setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;\n setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;\n resetValues: () => void;\n setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;\n initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;\n getValues: () => Values;\n getValuesSnapshot: () => Values;\n resetField: <TValues extends Values>(\n path: PropertyKey,\n subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]\n ) => void;\n}\n\nexport interface SetValuesSubscriberPayload<Values> {\n path?: PropertyKey;\n updatedValues: Values;\n previousValues: Values;\n}\n\nexport interface SetValuesInput<out Values = Record<string, any>> {\n values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);\n mergeWithPreviousValues?: boolean;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\nexport type SetFieldValueSubscriber<out Values> = <TValues extends Values>(\n payload: SetValuesSubscriberPayload<TValues>\n) => void;\n\nexport interface SetFieldValueInput<Values> {\n path: PropertyKey;\n value: any;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\ninterface UseFormValuesInput<Values extends Record<PropertyKey, any>> {\n initialValues: Values | undefined;\n mode: FormMode;\n onValuesChange?: ((values: Values, previousValues: Values) => void) | undefined;\n}\n\nexport function useFormValues<Values extends Record<PropertyKey, any>>({\n initialValues,\n onValuesChange,\n mode,\n}: UseFormValuesInput<Values>): $FormValues<Values> {\n const initialized = useRef(false);\n const [stateValues, setStateValues] = useState<Values>(initialValues || ({} as Values));\n const refValues = useRef(stateValues);\n const valuesSnapshot = useRef(stateValues);\n\n const setValues = useCallback(\n ({\n values,\n subscribers,\n updateState = true,\n mergeWithPreviousValues = true,\n }: SetValuesInput<Values>) => {\n const previousValues = refValues.current;\n const resolvedValues = values instanceof Function ? values(refValues.current) : values;\n const updatedValues = mergeWithPreviousValues\n ? { ...previousValues, ...resolvedValues }\n : (resolvedValues as Values);\n refValues.current = updatedValues;\n if (updateState) {\n setStateValues(updatedValues);\n if (mode === 'uncontrolled') {\n refValues.current = updatedValues;\n }\n }\n onValuesChange?.(updatedValues, previousValues);\n subscribers\n ?.filter(Boolean)\n .forEach((subscriber) => subscriber!({ updatedValues, previousValues }));\n },\n [onValuesChange]\n );\n\n const setFieldValue = useCallback(\n (payload: SetFieldValueInput<Values>) => {\n const currentValue = getPath(payload.path, refValues.current);\n const updatedValue =\n payload.value instanceof Function ? payload.value(currentValue) : payload.value;\n\n if (currentValue !== updatedValue) {\n const previousValues = refValues.current;\n const updatedValues = setPath(payload.path, updatedValue, refValues.current);\n setValues({ values: updatedValues, updateState: payload.updateState });\n\n payload.subscribers\n ?.filter(Boolean)\n .forEach((subscriber) =>\n subscriber!({ path: payload.path, updatedValues, previousValues })\n );\n }\n },\n [setValues]\n );\n\n const setValuesSnapshot = useCallback((payload: Values) => {\n valuesSnapshot.current = payload;\n }, []);\n\n const initialize = useCallback(\n (values: Values, onInitialize: () => void) => {\n if (!initialized.current) {\n initialized.current = true;\n setValues({ values, updateState: mode === 'controlled' });\n setValuesSnapshot(values);\n onInitialize();\n }\n },\n [setValues]\n );\n\n const resetValues = useCallback(() => {\n setValues({\n values: valuesSnapshot.current,\n updateState: true,\n mergeWithPreviousValues: false,\n });\n }, [setValues]);\n\n const getValues = useCallback(() => refValues.current, []);\n const getValuesSnapshot = useCallback(() => valuesSnapshot.current, []);\n\n const resetField = useCallback(\n (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[]) => {\n const snapshotValue = getPath(path, valuesSnapshot.current);\n if (typeof snapshotValue === 'undefined') {\n return;\n }\n setFieldValue({\n path,\n value: snapshotValue,\n updateState: mode === 'controlled',\n subscribers,\n });\n },\n [setFieldValue, mode]\n );\n\n return {\n initialized,\n stateValues,\n refValues,\n valuesSnapshot,\n setValues,\n setFieldValue,\n resetValues,\n setValuesSnapshot,\n initialize,\n getValues,\n getValuesSnapshot,\n resetField,\n };\n}\n"],"mappings":";;;;;AAoDA,SAAgB,cAAuD,EACrE,eACA,gBACA,QACkD;CAClD,MAAM,cAAc,OAAO,KAAK;CAChC,MAAM,CAAC,aAAa,kBAAkB,SAAiB,iBAAkB,CAAC,CAAY;CACtF,MAAM,YAAY,OAAO,WAAW;CACpC,MAAM,iBAAiB,OAAO,WAAW;CAEzC,MAAM,YAAY,aACf,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,OAAO,IAAI;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;EAAe,IACtC;EACL,UAAU,UAAU;EACpB,IAAI,aAAa;GACf,eAAe,aAAa;GAC5B,IAAI,SAAS,gBACX,UAAU,UAAU;EAExB;EACA,iBAAiB,eAAe,cAAc;EAC9C,aACI,OAAO,OAAO,
|
|
1
|
+
{"version":3,"file":"use-form-values.mjs","names":[],"sources":["../../../src/hooks/use-form-values/use-form-values.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { getPath, setPath } from '../../paths';\nimport { FormMode } from '../../types';\n\nexport interface $FormValues<out Values extends Record<PropertyKey, any>> {\n initialized: React.RefObject<boolean>;\n stateValues: Values;\n refValues: React.RefObject<Values>;\n valuesSnapshot: React.RefObject<Values>;\n setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;\n setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;\n resetValues: () => void;\n setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;\n initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;\n getValues: () => Values;\n getValuesSnapshot: () => Values;\n resetField: <TValues extends Values>(\n path: PropertyKey,\n subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]\n ) => void;\n}\n\nexport interface SetValuesSubscriberPayload<Values> {\n path?: PropertyKey;\n updatedValues: Values;\n previousValues: Values;\n}\n\nexport interface SetValuesInput<out Values = Record<string, any>> {\n values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);\n mergeWithPreviousValues?: boolean;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\nexport type SetFieldValueSubscriber<out Values> = <TValues extends Values>(\n payload: SetValuesSubscriberPayload<TValues>\n) => void;\n\nexport interface SetFieldValueInput<Values> {\n path: PropertyKey;\n value: any;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\ninterface UseFormValuesInput<Values extends Record<PropertyKey, any>> {\n initialValues: Values | undefined;\n mode: FormMode;\n onValuesChange?: ((values: Values, previousValues: Values) => void) | undefined;\n}\n\nexport function useFormValues<Values extends Record<PropertyKey, any>>({\n initialValues,\n onValuesChange,\n mode,\n}: UseFormValuesInput<Values>): $FormValues<Values> {\n const initialized = useRef(false);\n const [stateValues, setStateValues] = useState<Values>(initialValues || ({} as Values));\n const refValues = useRef(stateValues);\n const valuesSnapshot = useRef(stateValues);\n\n const setValues = useCallback(\n ({\n values,\n subscribers,\n updateState = true,\n mergeWithPreviousValues = true,\n }: SetValuesInput<Values>) => {\n const previousValues = refValues.current;\n const resolvedValues = values instanceof Function ? values(refValues.current) : values;\n const updatedValues = mergeWithPreviousValues\n ? { ...previousValues, ...resolvedValues }\n : (resolvedValues as Values);\n refValues.current = updatedValues;\n if (updateState) {\n setStateValues(updatedValues);\n if (mode === 'uncontrolled') {\n refValues.current = updatedValues;\n }\n }\n onValuesChange?.(updatedValues, previousValues);\n subscribers\n ?.filter(Boolean)\n .forEach((subscriber) => subscriber!({ updatedValues, previousValues }));\n },\n [onValuesChange]\n );\n\n const setFieldValue = useCallback(\n (payload: SetFieldValueInput<Values>) => {\n const currentValue = getPath(payload.path, refValues.current);\n const updatedValue =\n payload.value instanceof Function ? payload.value(currentValue) : payload.value;\n\n if (currentValue !== updatedValue) {\n const previousValues = refValues.current;\n const updatedValues = setPath(payload.path, updatedValue, refValues.current);\n setValues({ values: updatedValues, updateState: payload.updateState });\n\n payload.subscribers\n ?.filter(Boolean)\n .forEach((subscriber) =>\n subscriber!({ path: payload.path, updatedValues, previousValues })\n );\n }\n },\n [setValues]\n );\n\n const setValuesSnapshot = useCallback((payload: Values) => {\n valuesSnapshot.current = payload;\n }, []);\n\n const initialize = useCallback(\n (values: Values, onInitialize: () => void) => {\n if (!initialized.current) {\n initialized.current = true;\n setValues({ values, updateState: mode === 'controlled' });\n setValuesSnapshot(values);\n onInitialize();\n }\n },\n [setValues]\n );\n\n const resetValues = useCallback(() => {\n setValues({\n values: valuesSnapshot.current,\n updateState: true,\n mergeWithPreviousValues: false,\n });\n }, [setValues]);\n\n const getValues = useCallback(() => refValues.current, []);\n const getValuesSnapshot = useCallback(() => valuesSnapshot.current, []);\n\n const resetField = useCallback(\n (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[]) => {\n const snapshotValue = getPath(path, valuesSnapshot.current);\n if (typeof snapshotValue === 'undefined') {\n return;\n }\n setFieldValue({\n path,\n value: snapshotValue,\n updateState: mode === 'controlled',\n subscribers,\n });\n },\n [setFieldValue, mode]\n );\n\n return {\n initialized,\n stateValues,\n refValues,\n valuesSnapshot,\n setValues,\n setFieldValue,\n resetValues,\n setValuesSnapshot,\n initialize,\n getValues,\n getValuesSnapshot,\n resetField,\n };\n}\n"],"mappings":";;;;;AAoDA,SAAgB,cAAuD,EACrE,eACA,gBACA,QACkD;CAClD,MAAM,cAAc,OAAO,KAAK;CAChC,MAAM,CAAC,aAAa,kBAAkB,SAAiB,iBAAkB,CAAC,CAAY;CACtF,MAAM,YAAY,OAAO,WAAW;CACpC,MAAM,iBAAiB,OAAO,WAAW;CAEzC,MAAM,YAAY,aACf,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,OAAO,IAAI;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;EAAe,IACtC;EACL,UAAU,UAAU;EACpB,IAAI,aAAa;GACf,eAAe,aAAa;GAC5B,IAAI,SAAS,gBACX,UAAU,UAAU;EAExB;EACA,iBAAiB,eAAe,cAAc;EAC9C,aACI,OAAO,OAAO,CAAC,CAChB,SAAS,eAAe,WAAY;GAAE;GAAe;EAAe,CAAC,CAAC;CAC3E,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,gBAAgB,aACnB,YAAwC;EACvC,MAAM,eAAe,QAAQ,QAAQ,MAAM,UAAU,OAAO;EAC5D,MAAM,eACJ,QAAQ,iBAAiB,WAAW,QAAQ,MAAM,YAAY,IAAI,QAAQ;EAE5E,IAAI,iBAAiB,cAAc;GACjC,MAAM,iBAAiB,UAAU;GACjC,MAAM,gBAAgB,QAAQ,QAAQ,MAAM,cAAc,UAAU,OAAO;GAC3E,UAAU;IAAE,QAAQ;IAAe,aAAa,QAAQ;GAAY,CAAC;GAErE,QAAQ,aACJ,OAAO,OAAO,CAAC,CAChB,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;GAAe,CAAC,CACnE;EACJ;CACF,GACA,CAAC,SAAS,CACZ;CAEA,MAAM,oBAAoB,aAAa,YAAoB;EACzD,eAAe,UAAU;CAC3B,GAAG,CAAC,CAAC;CAEL,MAAM,aAAa,aAChB,QAAgB,iBAA6B;EAC5C,IAAI,CAAC,YAAY,SAAS;GACxB,YAAY,UAAU;GACtB,UAAU;IAAE;IAAQ,aAAa,SAAS;GAAa,CAAC;GACxD,kBAAkB,MAAM;GACxB,aAAa;EACf;CACF,GACA,CAAC,SAAS,CACZ;CA6BA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,aAlCkB,kBAAkB;GACpC,UAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;GAC3B,CAAC;EACH,GAAG,CAAC,SAAS,CA4BD;EACV;EACA;EACA,WA7BgB,kBAAkB,UAAU,SAAS,CAAC,CA6B9C;EACR,mBA7BwB,kBAAkB,eAAe,SAAS,CAAC,CA6BnD;EAChB,YA5BiB,aAChB,MAAmB,gBAAyE;GAC3F,MAAM,gBAAgB,QAAQ,MAAM,eAAe,OAAO;GAC1D,IAAI,OAAO,kBAAkB,aAC3B;GAEF,cAAc;IACZ;IACA,OAAO;IACP,aAAa,SAAS;IACtB;GACF,CAAC;EACH,GACA,CAAC,eAAe,IAAI,CAeX;CACX;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-watch.mjs","names":[],"sources":["../../../src/hooks/use-form-watch/use-form-watch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { getPath } from '../../paths';\nimport { FormPathValue, LooseKeys } from '../../paths.types';\nimport { FormFieldSubscriber, Watch } from '../../types';\nimport { $FormStatus } from '../use-form-status/use-form-status';\nimport { $FormValues, SetValuesSubscriberPayload } from '../use-form-values/use-form-values';\n\ninterface UseFormWatchInput<out Values extends Record<PropertyKey, any>> {\n $values: $FormValues<Values>;\n $status: $FormStatus<Values>;\n cascadeUpdates?: boolean;\n}\n\nexport interface $FormWatch<Values extends Record<PropertyKey, any>> {\n subscribers: React.RefObject<Record<string, FormFieldSubscriber<Values, any>[]>>;\n watch: Watch<Values, any>;\n getFieldSubscribers: (path: any) => ((input: SetValuesSubscriberPayload<Values>) => void)[];\n notifyWatchSubscribers: (previousValues: Values) => void;\n}\n\nexport function useFormWatch<\n Values extends Record<PropertyKey, any>,\n Field extends LooseKeys<Values> = LooseKeys<Values>,\n>({ $values, $status, cascadeUpdates }: UseFormWatchInput<Values>) {\n const subscribers = useRef<Record<Field, FormFieldSubscriber<Values, Field>[]>>({} as any);\n\n const watch: Watch<Values, Field> = useCallback((path, callback) => {\n useEffect(() => {\n subscribers.current[path] = subscribers.current[path] || [];\n subscribers.current[path].push(callback);\n\n return () => {\n subscribers.current[path] = subscribers.current[path].filter((cb) => cb !== callback);\n };\n }, [callback]);\n }, []);\n\n const getFieldSubscribers = useCallback((path: Field) => {\n const result: ((input: SetValuesSubscriberPayload<Values>) => void)[] =\n subscribers.current[path]?.map(\n (callback) => (input: SetValuesSubscriberPayload<Values>) =>\n callback({\n previousValue: getPath(path, input.previousValues) as any,\n value: getPath(path, input.updatedValues) as any,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n ) ?? [];\n\n for (const subscriptionKey in subscribers.current) {\n const isParent = String(path).startsWith(`${subscriptionKey}.`);\n const isChild = String(subscriptionKey).startsWith(`${path}.`);\n\n if (isParent || (cascadeUpdates && isChild)) {\n result.push(\n ...subscribers.current[subscriptionKey].map(\n (cb) => (input: SetValuesSubscriberPayload<Values>) =>\n cb({\n previousValue: getPath(subscriptionKey, input.previousValues) as any,\n value: getPath(subscriptionKey, input.updatedValues) as any,\n touched: $status.isTouched(subscriptionKey),\n dirty: $status.isDirty(subscriptionKey),\n })\n )\n );\n }\n }\n\n return result;\n }, []);\n\n const notifyWatchSubscribers = useCallback((previousValues: Values) => {\n Object.keys(subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n subscribers.current[path as Field]?.forEach((cb) =>\n cb({\n previousValue: getPath(path, previousValues) as FormPathValue<Values, Field>,\n value: getPath(path, $values.refValues.current) as FormPathValue<Values, Field>,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n );\n }\n });\n }, []);\n\n return {\n subscribers,\n watch,\n getFieldSubscribers,\n notifyWatchSubscribers,\n };\n}\n"],"mappings":";;;;AAoBA,SAAgB,aAGd,EAAE,SAAS,SAAS,kBAA6C;CACjE,MAAM,cAAc,OAA4D,CAAC,CAAQ;CAiEzF,OAAO;EACL;EACA,OAjEkC,aAAa,MAAM,aAAa;GAClE,gBAAgB;IACd,YAAY,QAAQ,QAAQ,YAAY,QAAQ,SAAS,CAAC;IAC1D,YAAY,QAAQ,
|
|
1
|
+
{"version":3,"file":"use-form-watch.mjs","names":[],"sources":["../../../src/hooks/use-form-watch/use-form-watch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { getPath } from '../../paths';\nimport { FormPathValue, LooseKeys } from '../../paths.types';\nimport { FormFieldSubscriber, Watch } from '../../types';\nimport { $FormStatus } from '../use-form-status/use-form-status';\nimport { $FormValues, SetValuesSubscriberPayload } from '../use-form-values/use-form-values';\n\ninterface UseFormWatchInput<out Values extends Record<PropertyKey, any>> {\n $values: $FormValues<Values>;\n $status: $FormStatus<Values>;\n cascadeUpdates?: boolean;\n}\n\nexport interface $FormWatch<Values extends Record<PropertyKey, any>> {\n subscribers: React.RefObject<Record<string, FormFieldSubscriber<Values, any>[]>>;\n watch: Watch<Values, any>;\n getFieldSubscribers: (path: any) => ((input: SetValuesSubscriberPayload<Values>) => void)[];\n notifyWatchSubscribers: (previousValues: Values) => void;\n}\n\nexport function useFormWatch<\n Values extends Record<PropertyKey, any>,\n Field extends LooseKeys<Values> = LooseKeys<Values>,\n>({ $values, $status, cascadeUpdates }: UseFormWatchInput<Values>) {\n const subscribers = useRef<Record<Field, FormFieldSubscriber<Values, Field>[]>>({} as any);\n\n const watch: Watch<Values, Field> = useCallback((path, callback) => {\n useEffect(() => {\n subscribers.current[path] = subscribers.current[path] || [];\n subscribers.current[path].push(callback);\n\n return () => {\n subscribers.current[path] = subscribers.current[path].filter((cb) => cb !== callback);\n };\n }, [callback]);\n }, []);\n\n const getFieldSubscribers = useCallback((path: Field) => {\n const result: ((input: SetValuesSubscriberPayload<Values>) => void)[] =\n subscribers.current[path]?.map(\n (callback) => (input: SetValuesSubscriberPayload<Values>) =>\n callback({\n previousValue: getPath(path, input.previousValues) as any,\n value: getPath(path, input.updatedValues) as any,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n ) ?? [];\n\n for (const subscriptionKey in subscribers.current) {\n const isParent = String(path).startsWith(`${subscriptionKey}.`);\n const isChild = String(subscriptionKey).startsWith(`${path}.`);\n\n if (isParent || (cascadeUpdates && isChild)) {\n result.push(\n ...subscribers.current[subscriptionKey].map(\n (cb) => (input: SetValuesSubscriberPayload<Values>) =>\n cb({\n previousValue: getPath(subscriptionKey, input.previousValues) as any,\n value: getPath(subscriptionKey, input.updatedValues) as any,\n touched: $status.isTouched(subscriptionKey),\n dirty: $status.isDirty(subscriptionKey),\n })\n )\n );\n }\n }\n\n return result;\n }, []);\n\n const notifyWatchSubscribers = useCallback((previousValues: Values) => {\n Object.keys(subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n subscribers.current[path as Field]?.forEach((cb) =>\n cb({\n previousValue: getPath(path, previousValues) as FormPathValue<Values, Field>,\n value: getPath(path, $values.refValues.current) as FormPathValue<Values, Field>,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n );\n }\n });\n }, []);\n\n return {\n subscribers,\n watch,\n getFieldSubscribers,\n notifyWatchSubscribers,\n };\n}\n"],"mappings":";;;;AAoBA,SAAgB,aAGd,EAAE,SAAS,SAAS,kBAA6C;CACjE,MAAM,cAAc,OAA4D,CAAC,CAAQ;CAiEzF,OAAO;EACL;EACA,OAjEkC,aAAa,MAAM,aAAa;GAClE,gBAAgB;IACd,YAAY,QAAQ,QAAQ,YAAY,QAAQ,SAAS,CAAC;IAC1D,YAAY,QAAQ,KAAK,CAAC,KAAK,QAAQ;IAEvC,aAAa;KACX,YAAY,QAAQ,QAAQ,YAAY,QAAQ,KAAK,CAAC,QAAQ,OAAO,OAAO,QAAQ;IACtF;GACF,GAAG,CAAC,QAAQ,CAAC;EACf,GAAG,CAAC,CAwDE;EACJ,qBAvD0B,aAAa,SAAgB;GACvD,MAAM,SACJ,YAAY,QAAQ,KAAK,EAAE,KACxB,cAAc,UACb,SAAS;IACP,eAAe,QAAQ,MAAM,MAAM,cAAc;IACjD,OAAO,QAAQ,MAAM,MAAM,aAAa;IACxC,SAAS,QAAQ,UAAU,IAAI;IAC/B,OAAO,QAAQ,QAAQ,IAAI;GAC7B,CAAC,CACL,KAAK,CAAC;GAER,KAAK,MAAM,mBAAmB,YAAY,SAAS;IACjD,MAAM,WAAW,OAAO,IAAI,CAAC,CAAC,WAAW,GAAG,gBAAgB,EAAE;IAC9D,MAAM,UAAU,OAAO,eAAe,CAAC,CAAC,WAAW,GAAG,KAAK,EAAE;IAE7D,IAAI,YAAa,kBAAkB,SACjC,OAAO,KACL,GAAG,YAAY,QAAQ,gBAAgB,CAAC,KACrC,QAAQ,UACP,GAAG;KACD,eAAe,QAAQ,iBAAiB,MAAM,cAAc;KAC5D,OAAO,QAAQ,iBAAiB,MAAM,aAAa;KACnD,SAAS,QAAQ,UAAU,eAAe;KAC1C,OAAO,QAAQ,QAAQ,eAAe;IACxC,CAAC,CACL,CACF;GAEJ;GAEA,OAAO;EACT,GAAG,CAAC,CAuBgB;EAClB,wBAtB6B,aAAa,mBAA2B;GACrE,OAAO,KAAK,YAAY,OAAO,CAAC,CAAC,SAAS,SAAS;IAIjD,IAHc,QAAQ,MAAM,QAAQ,UAAU,OAGtC,MAFc,QAAQ,MAAM,cAEV,GACxB,YAAY,QAAQ,KAAc,EAAE,SAAS,OAC3C,GAAG;KACD,eAAe,QAAQ,MAAM,cAAc;KAC3C,OAAO,QAAQ,MAAM,QAAQ,UAAU,OAAO;KAC9C,SAAS,QAAQ,UAAU,IAAI;KAC/B,OAAO,QAAQ,QAAQ,IAAI;IAC7B,CAAC,CACH;GAEJ,CAAC;EACH,GAAG,CAAC,CAMmB;CACvB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-error-indices.mjs","names":[],"sources":["../../src/lists/change-error-indices.ts"],"sourcesContent":["import { clearListState } from './clear-list-state';\n\n/**\n * Gets the part of the key after the path which can be an index\n */\nfunction getIndexFromKeyAfterPath(key: string, path: string): number {\n const split = key.substring(path.length + 1).split('.')[0];\n return parseInt(split, 10);\n}\n\n/**\n * Changes the indices of every error that is after the given `index` with the given `change` at the given `path`.\n * This requires that the errors are in the format of `path.index` and that the index is a number.\n */\nexport function changeErrorIndices<T extends Record<PropertyKey, any>>(\n path: PropertyKey,\n index: number | undefined,\n errors: T,\n change: 1 | -1\n): T {\n if (index === undefined) {\n return errors;\n }\n const pathString = `${String(path)}`;\n let clearedErrors = errors;\n // Remove all errors if the corresponding item was removed\n if (change === -1) {\n clearedErrors = clearListState(`${pathString}.${index}`, clearedErrors);\n }\n\n const cloned = { ...clearedErrors };\n const changedKeys = new Set<string>();\n Object.entries(clearedErrors)\n .filter(([key]) => {\n if (!key.startsWith(`${pathString}.`)) {\n return false;\n }\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n if (Number.isNaN(currIndex)) {\n return false;\n }\n return currIndex >= index;\n })\n .forEach(([key, value]) => {\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n\n const newKey: keyof T = key.replace(\n `${pathString}.${currIndex}`,\n `${pathString}.${currIndex + change}`\n );\n cloned[newKey] = value;\n changedKeys.add(newKey);\n if (!changedKeys.has(key)) {\n delete cloned[key];\n }\n });\n\n return cloned;\n}\n"],"mappings":";;;;;;AAKA,SAAS,yBAAyB,KAAa,MAAsB;CACnE,MAAM,QAAQ,IAAI,UAAU,KAAK,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"change-error-indices.mjs","names":[],"sources":["../../src/lists/change-error-indices.ts"],"sourcesContent":["import { clearListState } from './clear-list-state';\n\n/**\n * Gets the part of the key after the path which can be an index\n */\nfunction getIndexFromKeyAfterPath(key: string, path: string): number {\n const split = key.substring(path.length + 1).split('.')[0];\n return parseInt(split, 10);\n}\n\n/**\n * Changes the indices of every error that is after the given `index` with the given `change` at the given `path`.\n * This requires that the errors are in the format of `path.index` and that the index is a number.\n */\nexport function changeErrorIndices<T extends Record<PropertyKey, any>>(\n path: PropertyKey,\n index: number | undefined,\n errors: T,\n change: 1 | -1\n): T {\n if (index === undefined) {\n return errors;\n }\n const pathString = `${String(path)}`;\n let clearedErrors = errors;\n // Remove all errors if the corresponding item was removed\n if (change === -1) {\n clearedErrors = clearListState(`${pathString}.${index}`, clearedErrors);\n }\n\n const cloned = { ...clearedErrors };\n const changedKeys = new Set<string>();\n Object.entries(clearedErrors)\n .filter(([key]) => {\n if (!key.startsWith(`${pathString}.`)) {\n return false;\n }\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n if (Number.isNaN(currIndex)) {\n return false;\n }\n return currIndex >= index;\n })\n .forEach(([key, value]) => {\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n\n const newKey: keyof T = key.replace(\n `${pathString}.${currIndex}`,\n `${pathString}.${currIndex + change}`\n );\n cloned[newKey] = value;\n changedKeys.add(newKey);\n if (!changedKeys.has(key)) {\n delete cloned[key];\n }\n });\n\n return cloned;\n}\n"],"mappings":";;;;;;AAKA,SAAS,yBAAyB,KAAa,MAAsB;CACnE,MAAM,QAAQ,IAAI,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;CACxD,OAAO,SAAS,OAAO,EAAE;AAC3B;;;;;AAMA,SAAgB,mBACd,MACA,OACA,QACA,QACG;CACH,IAAI,UAAU,KAAA,GACZ,OAAO;CAET,MAAM,aAAa,GAAG,OAAO,IAAI;CACjC,IAAI,gBAAgB;CAEpB,IAAI,WAAW,IACb,gBAAgB,eAAe,GAAG,WAAW,GAAG,SAAS,aAAa;CAGxE,MAAM,SAAS,EAAE,GAAG,cAAc;CAClC,MAAM,8BAAc,IAAI,IAAY;CACpC,OAAO,QAAQ,aAAa,CAAC,CAC1B,QAAQ,CAAC,SAAS;EACjB,IAAI,CAAC,IAAI,WAAW,GAAG,WAAW,EAAE,GAClC,OAAO;EAET,MAAM,YAAY,yBAAyB,KAAK,UAAU;EAC1D,IAAI,OAAO,MAAM,SAAS,GACxB,OAAO;EAET,OAAO,aAAa;CACtB,CAAC,CAAC,CACD,SAAS,CAAC,KAAK,WAAW;EACzB,MAAM,YAAY,yBAAyB,KAAK,UAAU;EAE1D,MAAM,SAAkB,IAAI,QAC1B,GAAG,WAAW,GAAG,aACjB,GAAG,WAAW,GAAG,YAAY,QAC/B;EACA,OAAO,UAAU;EACjB,YAAY,IAAI,MAAM;EACtB,IAAI,CAAC,YAAY,IAAI,GAAG,GACtB,OAAO,OAAO;CAElB,CAAC;CAEH,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear-list-state.mjs","names":[],"sources":["../../src/lists/clear-list-state.ts"],"sourcesContent":["export function clearListState<T extends Record<PropertyKey, any>>(\n field: PropertyKey,\n state: T\n): T {\n if (state === null || typeof state !== 'object') {\n return {} as T;\n }\n\n const clone = { ...state };\n Object.keys(state).forEach((errorKey) => {\n if (errorKey.includes(`${String(field)}.`)) {\n delete clone[errorKey];\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAAA,SAAgB,eACd,OACA,OACG;CACH,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OAAO,CAAC;CAGV,MAAM,QAAQ,EAAE,GAAG,MAAM;CACzB,OAAO,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"clear-list-state.mjs","names":[],"sources":["../../src/lists/clear-list-state.ts"],"sourcesContent":["export function clearListState<T extends Record<PropertyKey, any>>(\n field: PropertyKey,\n state: T\n): T {\n if (state === null || typeof state !== 'object') {\n return {} as T;\n }\n\n const clone = { ...state };\n Object.keys(state).forEach((errorKey) => {\n if (errorKey.includes(`${String(field)}.`)) {\n delete clone[errorKey];\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAAA,SAAgB,eACd,OACA,OACG;CACH,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OAAO,CAAC;CAGV,MAAM,QAAQ,EAAE,GAAG,MAAM;CACzB,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,aAAa;EACvC,IAAI,SAAS,SAAS,GAAG,OAAO,KAAK,EAAE,EAAE,GACvC,OAAO,MAAM;CAEjB,CAAC;CAED,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reorder-errors.mjs","names":[],"sources":["../../src/lists/reorder-errors.ts"],"sourcesContent":["import { ReorderPayload } from '../types';\n\nexport function reorderErrors<T>(path: unknown, { from, to }: ReorderPayload, errors: T): T {\n const oldKeyStart = `${path}.${from}`;\n const newKeyStart = `${path}.${to}`;\n\n const clone: any = { ...errors };\n const processedKeys = new Set<string>();\n\n Object.keys(errors as any).forEach((key) => {\n if (processedKeys.has(key)) {\n return;\n }\n\n let oldKey;\n let newKey;\n\n if (key.startsWith(oldKeyStart)) {\n oldKey = key;\n newKey = key.replace(oldKeyStart, newKeyStart);\n } else if (key.startsWith(newKeyStart)) {\n oldKey = key.replace(newKeyStart, oldKeyStart);\n newKey = key;\n }\n\n if (oldKey && newKey) {\n const value1 = clone[oldKey];\n const value2 = clone[newKey];\n\n value2 === undefined ? delete clone[oldKey] : (clone[oldKey] = value2);\n value1 === undefined ? delete clone[newKey] : (clone[newKey] = value1);\n\n processedKeys.add(oldKey);\n processedKeys.add(newKey);\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAEA,SAAgB,cAAiB,MAAe,EAAE,MAAM,MAAsB,QAAc;CAC1F,MAAM,cAAc,GAAG,KAAK,GAAG;CAC/B,MAAM,cAAc,GAAG,KAAK,GAAG;CAE/B,MAAM,QAAa,EAAE,GAAG,OAAO;CAC/B,MAAM,gCAAgB,IAAI,IAAY;CAEtC,OAAO,KAAK,MAAa,
|
|
1
|
+
{"version":3,"file":"reorder-errors.mjs","names":[],"sources":["../../src/lists/reorder-errors.ts"],"sourcesContent":["import { ReorderPayload } from '../types';\n\nexport function reorderErrors<T>(path: unknown, { from, to }: ReorderPayload, errors: T): T {\n const oldKeyStart = `${path}.${from}`;\n const newKeyStart = `${path}.${to}`;\n\n const clone: any = { ...errors };\n const processedKeys = new Set<string>();\n\n Object.keys(errors as any).forEach((key) => {\n if (processedKeys.has(key)) {\n return;\n }\n\n let oldKey;\n let newKey;\n\n if (key.startsWith(oldKeyStart)) {\n oldKey = key;\n newKey = key.replace(oldKeyStart, newKeyStart);\n } else if (key.startsWith(newKeyStart)) {\n oldKey = key.replace(newKeyStart, oldKeyStart);\n newKey = key;\n }\n\n if (oldKey && newKey) {\n const value1 = clone[oldKey];\n const value2 = clone[newKey];\n\n value2 === undefined ? delete clone[oldKey] : (clone[oldKey] = value2);\n value1 === undefined ? delete clone[newKey] : (clone[newKey] = value1);\n\n processedKeys.add(oldKey);\n processedKeys.add(newKey);\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAEA,SAAgB,cAAiB,MAAe,EAAE,MAAM,MAAsB,QAAc;CAC1F,MAAM,cAAc,GAAG,KAAK,GAAG;CAC/B,MAAM,cAAc,GAAG,KAAK,GAAG;CAE/B,MAAM,QAAa,EAAE,GAAG,OAAO;CAC/B,MAAM,gCAAgB,IAAI,IAAY;CAEtC,OAAO,KAAK,MAAa,CAAC,CAAC,SAAS,QAAQ;EAC1C,IAAI,cAAc,IAAI,GAAG,GACvB;EAGF,IAAI;EACJ,IAAI;EAEJ,IAAI,IAAI,WAAW,WAAW,GAAG;GAC/B,SAAS;GACT,SAAS,IAAI,QAAQ,aAAa,WAAW;EAC/C,OAAO,IAAI,IAAI,WAAW,WAAW,GAAG;GACtC,SAAS,IAAI,QAAQ,aAAa,WAAW;GAC7C,SAAS;EACX;EAEA,IAAI,UAAU,QAAQ;GACpB,MAAM,SAAS,MAAM;GACrB,MAAM,SAAS,MAAM;GAErB,WAAW,KAAA,IAAY,OAAO,MAAM,UAAW,MAAM,UAAU;GAC/D,WAAW,KAAA,IAAY,OAAO,MAAM,UAAW,MAAM,UAAU;GAE/D,cAAc,IAAI,MAAM;GACxB,cAAc,IAAI,MAAM;EAC1B;CACF,CAAC;CAED,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-resolver.mjs","names":[],"sources":["../src/schema-resolver.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { filterErrors } from './hooks/use-form-errors/filter-errors/filter-errors';\nimport type { FormErrors } from './types';\n\nfunction issuesToFormErrors(issues: ReadonlyArray<StandardSchemaV1.Issue>): FormErrors {\n const errors: FormErrors = {};\n for (const issue of issues) {\n const path = issue.path\n ? issue.path.map((segment) => (typeof segment === 'object' ? segment.key : segment)).join('.')\n : '';\n if (!errors[path]) {\n errors[path] = issue.message;\n }\n }\n return filterErrors(errors);\n}\n\nexport function schemaResolver<Sync extends boolean = false>(\n schema: StandardSchemaV1,\n _options?: { sync?: Sync }\n): Sync extends true ? (values: any) => FormErrors : (values: any) => Promise<FormErrors> {\n const sync = _options?.sync ?? false;\n return ((values: any) => {\n const result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n return result.then((resolved) =>\n resolved.issues ? issuesToFormErrors(resolved.issues) : {}\n );\n }\n const errors = result.issues ? issuesToFormErrors(result.issues) : {};\n return sync ? errors : Promise.resolve(errors);\n }) as any;\n}\n"],"mappings":";;;AAIA,SAAS,mBAAmB,QAA2D;CACrF,MAAM,SAAqB,CAAC;CAC5B,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,MAAM,OACf,MAAM,KAAK,KAAK,YAAa,OAAO,YAAY,WAAW,QAAQ,MAAM,OAAQ,
|
|
1
|
+
{"version":3,"file":"schema-resolver.mjs","names":[],"sources":["../src/schema-resolver.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { filterErrors } from './hooks/use-form-errors/filter-errors/filter-errors';\nimport type { FormErrors } from './types';\n\nfunction issuesToFormErrors(issues: ReadonlyArray<StandardSchemaV1.Issue>): FormErrors {\n const errors: FormErrors = {};\n for (const issue of issues) {\n const path = issue.path\n ? issue.path.map((segment) => (typeof segment === 'object' ? segment.key : segment)).join('.')\n : '';\n if (!errors[path]) {\n errors[path] = issue.message;\n }\n }\n return filterErrors(errors);\n}\n\nexport function schemaResolver<Sync extends boolean = false>(\n schema: StandardSchemaV1,\n _options?: { sync?: Sync }\n): Sync extends true ? (values: any) => FormErrors : (values: any) => Promise<FormErrors> {\n const sync = _options?.sync ?? false;\n return ((values: any) => {\n const result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n return result.then((resolved) =>\n resolved.issues ? issuesToFormErrors(resolved.issues) : {}\n );\n }\n const errors = result.issues ? issuesToFormErrors(result.issues) : {};\n return sync ? errors : Promise.resolve(errors);\n }) as any;\n}\n"],"mappings":";;;AAIA,SAAS,mBAAmB,QAA2D;CACrF,MAAM,SAAqB,CAAC;CAC5B,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,MAAM,OACf,MAAM,KAAK,KAAK,YAAa,OAAO,YAAY,WAAW,QAAQ,MAAM,OAAQ,CAAC,CAAC,KAAK,GAAG,IAC3F;EACJ,IAAI,CAAC,OAAO,OACV,OAAO,QAAQ,MAAM;CAEzB;CACA,OAAO,aAAa,MAAM;AAC5B;AAEA,SAAgB,eACd,QACA,UACwF;CACxF,MAAM,OAAO,UAAU,QAAQ;CAC/B,SAAS,WAAgB;EACvB,MAAM,SAAS,OAAO,YAAY,CAAC,SAAS,MAAM;EAClD,IAAI,kBAAkB,SACpB,OAAO,OAAO,MAAM,aAClB,SAAS,SAAS,mBAAmB,SAAS,MAAM,IAAI,CAAC,CAC3D;EAEF,MAAM,SAAS,OAAO,SAAS,mBAAmB,OAAO,MAAM,IAAI,CAAC;EACpE,OAAO,OAAO,SAAS,QAAQ,QAAQ,MAAM;CAC/C;AACF"}
|
package/esm/use-form.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form.mjs","names":[],"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
|
+
{"version":3,"file":"use-form.mjs","names":[],"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":"validate-field-value.mjs","names":[],"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,
|
|
1
|
+
{"version":3,"file":"validate-field-value.mjs","names":[],"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,CAAC,CAAC,MAAM,aAC5C,KAAK,MAAM,GAAG,CAAC,CAAC,OAAO,UAAU,MAAM,aAAa,SAAS,MAAM,GAAG,CAAC,CAAC,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,CAAC,CAAC,QACoB;CAChE,IAAI,OAAO,SAAS,UAClB,OAAO;EAAE,UAAU;EAAO,OAAO;CAAK;CAGxC,IAAI,OAAO,UAAU,YAAY;EAC/B,MAAM,UAAU,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,OAAO,eAAe,MAAM,KAAK;CAEvC,IAAI,MAAM;EACR,MAAM,QAAQ,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,UAAU,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.mjs","names":[],"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,WAAW;AAE9C,SAAS,qBAAqB,QAA0C;CACtE,MAAM,iBAAiB,aAAa,MAAM;CAC1C,OAAO;EAAE,WAAW,OAAO,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"validate-values.mjs","names":[],"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":"is-not-empty.mjs","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,
|
|
1
|
+
{"version":3,"file":"is-not-empty.mjs","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,CAAC,CAAC,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.mjs","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,
|
|
1
|
+
{"version":3,"file":"is-not-empty-html.mjs","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,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,OAAO;EAG1D,OAAO;CACT;AACF"}
|