@mantine/form 9.1.1 → 9.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/FormProvider/FormProvider.cjs.map +1 -1
- package/cjs/actions/actions.cjs.map +1 -1
- package/cjs/get-input-on-change/get-input-on-change.cjs.map +1 -1
- package/cjs/get-status/get-status.cjs.map +1 -1
- package/cjs/hooks/use-form-errors/filter-errors/filter-errors.cjs.map +1 -1
- package/cjs/hooks/use-form-errors/use-form-errors.cjs.map +1 -1
- package/cjs/hooks/use-form-list/use-form-list.cjs +9 -1
- package/cjs/hooks/use-form-list/use-form-list.cjs.map +1 -1
- package/cjs/hooks/use-form-status/use-form-status.cjs.map +1 -1
- package/cjs/hooks/use-form-validating/use-form-validating.cjs.map +1 -1
- package/cjs/hooks/use-form-values/use-form-values.cjs.map +1 -1
- package/cjs/hooks/use-form-watch/use-form-watch.cjs +11 -1
- package/cjs/hooks/use-form-watch/use-form-watch.cjs.map +1 -1
- package/cjs/lists/change-error-indices.cjs.map +1 -1
- package/cjs/lists/clear-list-state.cjs.map +1 -1
- package/cjs/lists/reorder-errors.cjs.map +1 -1
- package/cjs/paths/get-data-path.cjs.map +1 -1
- package/cjs/paths/get-path.cjs.map +1 -1
- package/cjs/paths/get-splitted-path.cjs.map +1 -1
- package/cjs/paths/insert-path.cjs.map +1 -1
- package/cjs/paths/remove-path.cjs.map +1 -1
- package/cjs/paths/reorder-path.cjs.map +1 -1
- package/cjs/paths/replace-path.cjs.map +1 -1
- package/cjs/paths/set-path.cjs.map +1 -1
- package/cjs/schema-resolver.cjs.map +1 -1
- package/cjs/use-field.cjs.map +1 -1
- package/cjs/use-form.cjs +14 -37
- package/cjs/use-form.cjs.map +1 -1
- package/cjs/validate/get-rule-for-path.cjs.map +1 -1
- package/cjs/validate/should-validate-on-change.cjs.map +1 -1
- package/cjs/validate/validate-field-value.cjs.map +1 -1
- package/cjs/validate/validate-values.cjs.map +1 -1
- package/cjs/validators/has-length/has-length.cjs.map +1 -1
- package/cjs/validators/is-email/is-email.cjs.map +1 -1
- package/cjs/validators/is-in-range/is-in-range.cjs.map +1 -1
- package/cjs/validators/is-json-string/is-json-string.cjs.map +1 -1
- package/cjs/validators/is-not-empty/is-not-empty.cjs.map +1 -1
- package/cjs/validators/is-not-empty-html/is-not-empty-html.cjs.map +1 -1
- package/cjs/validators/is-one-of/is-one-of.cjs.map +1 -1
- package/cjs/validators/is-url/is-url.cjs.map +1 -1
- package/cjs/validators/matches/matches.cjs.map +1 -1
- package/cjs/validators/matches-field/matches-field.cjs.map +1 -1
- package/esm/FormProvider/FormProvider.mjs.map +1 -1
- package/esm/actions/actions.mjs.map +1 -1
- package/esm/get-input-on-change/get-input-on-change.mjs.map +1 -1
- package/esm/get-status/get-status.mjs.map +1 -1
- package/esm/hooks/use-form-errors/filter-errors/filter-errors.mjs.map +1 -1
- package/esm/hooks/use-form-errors/use-form-errors.mjs.map +1 -1
- package/esm/hooks/use-form-list/use-form-list.mjs +9 -1
- package/esm/hooks/use-form-list/use-form-list.mjs.map +1 -1
- package/esm/hooks/use-form-status/use-form-status.mjs.map +1 -1
- package/esm/hooks/use-form-validating/use-form-validating.mjs.map +1 -1
- package/esm/hooks/use-form-values/use-form-values.mjs.map +1 -1
- package/esm/hooks/use-form-watch/use-form-watch.mjs +11 -1
- package/esm/hooks/use-form-watch/use-form-watch.mjs.map +1 -1
- package/esm/lists/change-error-indices.mjs.map +1 -1
- package/esm/lists/clear-list-state.mjs.map +1 -1
- package/esm/lists/reorder-errors.mjs.map +1 -1
- package/esm/paths/get-data-path.mjs.map +1 -1
- package/esm/paths/get-path.mjs.map +1 -1
- package/esm/paths/get-splitted-path.mjs.map +1 -1
- package/esm/paths/insert-path.mjs.map +1 -1
- package/esm/paths/remove-path.mjs.map +1 -1
- package/esm/paths/reorder-path.mjs.map +1 -1
- package/esm/paths/replace-path.mjs.map +1 -1
- package/esm/paths/set-path.mjs.map +1 -1
- package/esm/schema-resolver.mjs.map +1 -1
- package/esm/use-field.mjs.map +1 -1
- package/esm/use-form.mjs +14 -37
- package/esm/use-form.mjs.map +1 -1
- package/esm/validate/get-rule-for-path.mjs.map +1 -1
- package/esm/validate/should-validate-on-change.mjs.map +1 -1
- package/esm/validate/validate-field-value.mjs.map +1 -1
- package/esm/validate/validate-values.mjs.map +1 -1
- package/esm/validators/has-length/has-length.mjs.map +1 -1
- package/esm/validators/is-email/is-email.mjs.map +1 -1
- package/esm/validators/is-in-range/is-in-range.mjs.map +1 -1
- package/esm/validators/is-json-string/is-json-string.mjs.map +1 -1
- package/esm/validators/is-not-empty/is-not-empty.mjs.map +1 -1
- package/esm/validators/is-not-empty-html/is-not-empty-html.mjs.map +1 -1
- package/esm/validators/is-one-of/is-one-of.mjs.map +1 -1
- package/esm/validators/is-url/is-url.mjs.map +1 -1
- package/esm/validators/matches/matches.mjs.map +1 -1
- package/esm/validators/matches-field/matches-field.mjs.map +1 -1
- package/lib/hooks/use-form-list/use-form-list.d.ts +3 -1
- package/lib/hooks/use-form-watch/use-form-watch.d.ts +10 -2
- package/lib/validators/has-length/has-length.d.ts +2 -1
- package/lib/validators/is-email/is-email.d.ts +2 -1
- package/lib/validators/is-in-range/is-in-range.d.ts +2 -1
- package/lib/validators/is-json-string/is-json-string.d.ts +2 -1
- package/lib/validators/is-not-empty/is-not-empty.d.ts +2 -1
- package/lib/validators/is-not-empty-html/is-not-empty-html.d.ts +2 -1
- package/lib/validators/is-one-of/is-one-of.d.ts +2 -1
- package/lib/validators/is-url/is-url.d.ts +3 -2
- package/lib/validators/matches/matches.d.ts +2 -1
- package/lib/validators/matches-field/matches-field.d.ts +2 -1
- package/lib/validators/types.d.ts +1 -0
- package/package.json +2 -2
|
@@ -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,eAAyC,
|
|
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,eAAyC,IAAI;CAEnD,SAAS,aAAa,EAAE,MAAM,YAAqC;EACjE,OAAO,iBAAA,GAAA,kBAAA,KAAC,aAAD;GAAa,OAAO;GAAO;EAAsB,CAAA;CAC1D;CAEA,SAAS,iBAAiB;EACxB,MAAM,OAAA,GAAA,MAAA,KAAU,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":"actions.cjs","names":["useLayoutEffect","useEffect"],"sources":["../../src/actions/actions.ts"],"sourcesContent":["import { useEffect, useLayoutEffect } from 'react';\nimport type {\n ClearErrors,\n ClearFieldError,\n InsertListItem,\n RemoveListItem,\n ReorderListItem,\n Reset,\n ResetDirty,\n ResetStatus,\n SetErrors,\n SetFieldError,\n SetFieldValue,\n SetFormStatus,\n SetInitialValues,\n SetValues,\n UseFormReturnType,\n} from '../types';\n\nfunction dispatchEvent(type: string, detail?: any): any {\n window.dispatchEvent(new CustomEvent(type, { detail }));\n}\n\nfunction validateFormName(name: string) {\n if (!/^[0-9a-zA-Z-]+$/.test(name)) {\n throw new Error(\n `[@mantine/use-form] Form name \"${name}\" is invalid, it should contain only letters, numbers and dashes`\n );\n }\n}\n\nexport const useIsomorphicEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport function createFormActions<FormValues extends Record<string, any> = Record<string, any>>(\n name: string\n) {\n validateFormName(name);\n\n const setFieldValue: SetFieldValue<FormValues> = (path, value) =>\n dispatchEvent(`mantine-form:${name}:set-field-value`, { path, value });\n\n const setValues: SetValues<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:set-values`, values);\n\n const setInitialValues: SetInitialValues<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:set-initial-values`, values);\n\n const setErrors: SetErrors = (errors) => dispatchEvent(`mantine-form:${name}:set-errors`, errors);\n\n const setFieldError: SetFieldError<FormValues> = (path, error) =>\n dispatchEvent(`mantine-form:${name}:set-field-error`, { path, error });\n\n const clearFieldError: ClearFieldError = (path) =>\n dispatchEvent(`mantine-form:${name}:clear-field-error`, path);\n\n const clearErrors: ClearErrors = () => dispatchEvent(`mantine-form:${name}:clear-errors`);\n\n const reset: Reset = () => dispatchEvent(`mantine-form:${name}:reset`);\n\n const validate: () => void = () => dispatchEvent(`mantine-form:${name}:validate`);\n\n const validateField: (path: any) => void = (path) =>\n dispatchEvent(`mantine-form:${name}:validate-field`, path);\n\n const reorderListItem: ReorderListItem<FormValues> = (path, payload) =>\n dispatchEvent(`mantine-form:${name}:reorder-list-item`, { path, payload });\n\n const removeListItem: RemoveListItem<FormValues> = (path, index) =>\n dispatchEvent(`mantine-form:${name}:remove-list-item`, { path, index });\n\n const insertListItem: InsertListItem<FormValues> = (path, item, index) =>\n dispatchEvent(`mantine-form:${name}:insert-list-item`, { path, index, item });\n\n const setDirty: SetFormStatus = (value) => dispatchEvent(`mantine-form:${name}:set-dirty`, value);\n\n const setTouched: SetFormStatus = (value) =>\n dispatchEvent(`mantine-form:${name}:set-touched`, value);\n\n const resetDirty: ResetDirty<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:reset-dirty`, values);\n\n const resetTouched: ResetStatus = () => dispatchEvent(`mantine-form:${name}:reset-touched`);\n\n return {\n setFieldValue,\n setValues,\n setInitialValues,\n setErrors,\n setFieldError,\n clearFieldError,\n clearErrors,\n reset,\n validate,\n validateField,\n reorderListItem,\n removeListItem,\n insertListItem,\n setDirty,\n setTouched,\n resetDirty,\n resetTouched,\n };\n}\n\nfunction useFormEvent(eventKey: string | undefined, handler: (event: any) => void) {\n useIsomorphicEffect(() => {\n if (eventKey) {\n window.addEventListener(eventKey, handler);\n return () => window.removeEventListener(eventKey, handler);\n }\n return undefined;\n }, [eventKey]);\n}\n\nexport function useFormActions<Values = Record<string, unknown>, TransformedValues = Values>(\n name: string | undefined,\n form: UseFormReturnType<Values, TransformedValues, any>\n) {\n if (name) {\n validateFormName(name);\n }\n\n useFormEvent(`mantine-form:${name}:set-field-value`, (event: CustomEvent) =>\n form.setFieldValue(event.detail.path, event.detail.value)\n );\n\n useFormEvent(`mantine-form:${name}:set-values`, (event: CustomEvent) =>\n form.setValues(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-initial-values`, (event: CustomEvent) =>\n form.setInitialValues(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-errors`, (event: CustomEvent) =>\n form.setErrors(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-field-error`, (event: CustomEvent) =>\n form.setFieldError(event.detail.path, event.detail.error)\n );\n\n useFormEvent(`mantine-form:${name}:clear-field-error`, (event: CustomEvent) =>\n form.clearFieldError(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:clear-errors`, form.clearErrors);\n useFormEvent(`mantine-form:${name}:reset`, form.reset);\n useFormEvent(`mantine-form:${name}:validate`, form.validate);\n\n useFormEvent(`mantine-form:${name}:validate-field`, (event: CustomEvent) =>\n form.validateField(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reorder-list-item`, (event: CustomEvent) =>\n form.reorderListItem(event.detail.path, event.detail.payload)\n );\n\n useFormEvent(`mantine-form:${name}:remove-list-item`, (event: CustomEvent) =>\n form.removeListItem(event.detail.path, event.detail.index)\n );\n\n useFormEvent(`mantine-form:${name}:insert-list-item`, (event: CustomEvent) =>\n form.insertListItem(event.detail.path, event.detail.item, event.detail.index)\n );\n\n useFormEvent(`mantine-form:${name}:set-dirty`, (event: CustomEvent) =>\n form.setDirty(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-touched`, (event: CustomEvent) =>\n form.setTouched(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reset-dirty`, (event: CustomEvent) =>\n form.resetDirty(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reset-touched`, form.resetTouched);\n}\n"],"mappings":";;;;AAmBA,SAAS,cAAc,MAAc,QAAmB;
|
|
1
|
+
{"version":3,"file":"actions.cjs","names":["useLayoutEffect","useEffect"],"sources":["../../src/actions/actions.ts"],"sourcesContent":["import { useEffect, useLayoutEffect } from 'react';\nimport type {\n ClearErrors,\n ClearFieldError,\n InsertListItem,\n RemoveListItem,\n ReorderListItem,\n Reset,\n ResetDirty,\n ResetStatus,\n SetErrors,\n SetFieldError,\n SetFieldValue,\n SetFormStatus,\n SetInitialValues,\n SetValues,\n UseFormReturnType,\n} from '../types';\n\nfunction dispatchEvent(type: string, detail?: any): any {\n window.dispatchEvent(new CustomEvent(type, { detail }));\n}\n\nfunction validateFormName(name: string) {\n if (!/^[0-9a-zA-Z-]+$/.test(name)) {\n throw new Error(\n `[@mantine/use-form] Form name \"${name}\" is invalid, it should contain only letters, numbers and dashes`\n );\n }\n}\n\nexport const useIsomorphicEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport function createFormActions<FormValues extends Record<string, any> = Record<string, any>>(\n name: string\n) {\n validateFormName(name);\n\n const setFieldValue: SetFieldValue<FormValues> = (path, value) =>\n dispatchEvent(`mantine-form:${name}:set-field-value`, { path, value });\n\n const setValues: SetValues<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:set-values`, values);\n\n const setInitialValues: SetInitialValues<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:set-initial-values`, values);\n\n const setErrors: SetErrors = (errors) => dispatchEvent(`mantine-form:${name}:set-errors`, errors);\n\n const setFieldError: SetFieldError<FormValues> = (path, error) =>\n dispatchEvent(`mantine-form:${name}:set-field-error`, { path, error });\n\n const clearFieldError: ClearFieldError = (path) =>\n dispatchEvent(`mantine-form:${name}:clear-field-error`, path);\n\n const clearErrors: ClearErrors = () => dispatchEvent(`mantine-form:${name}:clear-errors`);\n\n const reset: Reset = () => dispatchEvent(`mantine-form:${name}:reset`);\n\n const validate: () => void = () => dispatchEvent(`mantine-form:${name}:validate`);\n\n const validateField: (path: any) => void = (path) =>\n dispatchEvent(`mantine-form:${name}:validate-field`, path);\n\n const reorderListItem: ReorderListItem<FormValues> = (path, payload) =>\n dispatchEvent(`mantine-form:${name}:reorder-list-item`, { path, payload });\n\n const removeListItem: RemoveListItem<FormValues> = (path, index) =>\n dispatchEvent(`mantine-form:${name}:remove-list-item`, { path, index });\n\n const insertListItem: InsertListItem<FormValues> = (path, item, index) =>\n dispatchEvent(`mantine-form:${name}:insert-list-item`, { path, index, item });\n\n const setDirty: SetFormStatus = (value) => dispatchEvent(`mantine-form:${name}:set-dirty`, value);\n\n const setTouched: SetFormStatus = (value) =>\n dispatchEvent(`mantine-form:${name}:set-touched`, value);\n\n const resetDirty: ResetDirty<FormValues> = (values) =>\n dispatchEvent(`mantine-form:${name}:reset-dirty`, values);\n\n const resetTouched: ResetStatus = () => dispatchEvent(`mantine-form:${name}:reset-touched`);\n\n return {\n setFieldValue,\n setValues,\n setInitialValues,\n setErrors,\n setFieldError,\n clearFieldError,\n clearErrors,\n reset,\n validate,\n validateField,\n reorderListItem,\n removeListItem,\n insertListItem,\n setDirty,\n setTouched,\n resetDirty,\n resetTouched,\n };\n}\n\nfunction useFormEvent(eventKey: string | undefined, handler: (event: any) => void) {\n useIsomorphicEffect(() => {\n if (eventKey) {\n window.addEventListener(eventKey, handler);\n return () => window.removeEventListener(eventKey, handler);\n }\n return undefined;\n }, [eventKey]);\n}\n\nexport function useFormActions<Values = Record<string, unknown>, TransformedValues = Values>(\n name: string | undefined,\n form: UseFormReturnType<Values, TransformedValues, any>\n) {\n if (name) {\n validateFormName(name);\n }\n\n useFormEvent(`mantine-form:${name}:set-field-value`, (event: CustomEvent) =>\n form.setFieldValue(event.detail.path, event.detail.value)\n );\n\n useFormEvent(`mantine-form:${name}:set-values`, (event: CustomEvent) =>\n form.setValues(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-initial-values`, (event: CustomEvent) =>\n form.setInitialValues(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-errors`, (event: CustomEvent) =>\n form.setErrors(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-field-error`, (event: CustomEvent) =>\n form.setFieldError(event.detail.path, event.detail.error)\n );\n\n useFormEvent(`mantine-form:${name}:clear-field-error`, (event: CustomEvent) =>\n form.clearFieldError(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:clear-errors`, form.clearErrors);\n useFormEvent(`mantine-form:${name}:reset`, form.reset);\n useFormEvent(`mantine-form:${name}:validate`, form.validate);\n\n useFormEvent(`mantine-form:${name}:validate-field`, (event: CustomEvent) =>\n form.validateField(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reorder-list-item`, (event: CustomEvent) =>\n form.reorderListItem(event.detail.path, event.detail.payload)\n );\n\n useFormEvent(`mantine-form:${name}:remove-list-item`, (event: CustomEvent) =>\n form.removeListItem(event.detail.path, event.detail.index)\n );\n\n useFormEvent(`mantine-form:${name}:insert-list-item`, (event: CustomEvent) =>\n form.insertListItem(event.detail.path, event.detail.item, event.detail.index)\n );\n\n useFormEvent(`mantine-form:${name}:set-dirty`, (event: CustomEvent) =>\n form.setDirty(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:set-touched`, (event: CustomEvent) =>\n form.setTouched(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reset-dirty`, (event: CustomEvent) =>\n form.resetDirty(event.detail)\n );\n\n useFormEvent(`mantine-form:${name}:reset-touched`, form.resetTouched);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-input-on-change.cjs","names":[],"sources":["../../src/get-input-on-change/get-input-on-change.ts"],"sourcesContent":["export function getInputOnChange<Value>(\n setValue: (value: Value | ((current: Value) => Value)) => void\n) {\n return (val: Value | React.ChangeEvent<unknown> | ((current: Value) => Value)) => {\n if (!val) {\n setValue(val as Value);\n } else if (typeof val === 'function') {\n setValue(val);\n } else if (typeof val === 'object' && 'nativeEvent' in val) {\n const { currentTarget } = val;\n if (currentTarget instanceof HTMLInputElement) {\n if (currentTarget.type === 'checkbox') {\n setValue(currentTarget.checked as any);\n } else {\n setValue(currentTarget.value as any);\n }\n } else if (\n currentTarget instanceof HTMLTextAreaElement ||\n currentTarget instanceof HTMLSelectElement\n ) {\n setValue(currentTarget.value as any);\n }\n } else {\n setValue(val);\n }\n };\n}\n"],"mappings":";;AAAA,SAAgB,iBACd,UACA;
|
|
1
|
+
{"version":3,"file":"get-input-on-change.cjs","names":[],"sources":["../../src/get-input-on-change/get-input-on-change.ts"],"sourcesContent":["export function getInputOnChange<Value>(\n setValue: (value: Value | ((current: Value) => Value)) => void\n) {\n return (val: Value | React.ChangeEvent<unknown> | ((current: Value) => Value)) => {\n if (!val) {\n setValue(val as Value);\n } else if (typeof val === 'function') {\n setValue(val);\n } else if (typeof val === 'object' && 'nativeEvent' in val) {\n const { currentTarget } = val;\n if (currentTarget instanceof HTMLInputElement) {\n if (currentTarget.type === 'checkbox') {\n setValue(currentTarget.checked as any);\n } else {\n setValue(currentTarget.value as any);\n }\n } else if (\n currentTarget instanceof HTMLTextAreaElement ||\n currentTarget instanceof HTMLSelectElement\n ) {\n setValue(currentTarget.value as any);\n }\n } else {\n setValue(val);\n }\n };\n}\n"],"mappings":";;AAAA,SAAgB,iBACd,UACA;CACA,QAAQ,QAA0E;EAChF,IAAI,CAAC,KACH,SAAS,GAAY;OAChB,IAAI,OAAO,QAAQ,YACxB,SAAS,GAAG;OACP,IAAI,OAAO,QAAQ,YAAY,iBAAiB,KAAK;GAC1D,MAAM,EAAE,kBAAkB;GAC1B,IAAI,yBAAyB,kBAC3B,IAAI,cAAc,SAAS,YACzB,SAAS,cAAc,OAAc;QAErC,SAAS,cAAc,KAAY;QAEhC,IACL,yBAAyB,uBACzB,yBAAyB,mBAEzB,SAAS,cAAc,KAAY;EAEvC,OACE,SAAS,GAAG;CAEhB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-status.cjs","names":[],"sources":["../../src/get-status/get-status.ts"],"sourcesContent":["import { FormStatus } from '../types';\n\nexport function getStatus(status: FormStatus, path?: unknown) {\n const paths = Object.keys(status);\n\n if (typeof path === 'string') {\n const nestedPaths = paths.filter((statusPath) => statusPath.startsWith(`${path}.`));\n return status[path] || nestedPaths.some((statusPath) => status[statusPath]) || false;\n }\n\n return paths.some((statusPath) => status[statusPath]);\n}\n"],"mappings":";;AAEA,SAAgB,UAAU,QAAoB,MAAgB;CAC5D,MAAM,QAAQ,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"get-status.cjs","names":[],"sources":["../../src/get-status/get-status.ts"],"sourcesContent":["import { FormStatus } from '../types';\n\nexport function getStatus(status: FormStatus, path?: unknown) {\n const paths = Object.keys(status);\n\n if (typeof path === 'string') {\n const nestedPaths = paths.filter((statusPath) => statusPath.startsWith(`${path}.`));\n return status[path] || nestedPaths.some((statusPath) => status[statusPath]) || false;\n }\n\n return paths.some((statusPath) => status[statusPath]);\n}\n"],"mappings":";;AAEA,SAAgB,UAAU,QAAoB,MAAgB;CAC5D,MAAM,QAAQ,OAAO,KAAK,MAAM;CAEhC,IAAI,OAAO,SAAS,UAAU;EAC5B,MAAM,cAAc,MAAM,QAAQ,eAAe,WAAW,WAAW,GAAG,KAAK,EAAE,CAAC;EAClF,OAAO,OAAO,SAAS,YAAY,MAAM,eAAe,OAAO,WAAW,KAAK;CACjF;CAEA,OAAO,MAAM,MAAM,eAAe,OAAO,WAAW;AACtD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-errors.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;
|
|
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,EAAE,QAAoB,KAAK,QAAQ;EAC1D,MAAM,aAAa,OAAO;EAE1B,IAAI,eAAe,KAAA,KAAa,eAAe,QAAQ,eAAe,OACpE,IAAI,OAAO;EAGb,OAAO;CACT,GAAG,CAAC,CAAC;AACP"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-errors.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,UAA2BA,sBAAAA,aAAa,
|
|
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,UAA2BA,sBAAAA,aAAa,aAAa,CAAC;CAC1E,MAAM,aAAA,GAAA,MAAA,QAAmB,WAAW;CAEpC,MAAM,aAAA,GAAA,MAAA,cAAoC,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,mBAA6C,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;CAEpE,MAAM,mBAAA,GAAA,MAAA,cACH,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,cAdC,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"}
|
|
@@ -8,38 +8,46 @@ const require_remove_path = require("../../paths/remove-path.cjs");
|
|
|
8
8
|
const require_replace_path = require("../../paths/replace-path.cjs");
|
|
9
9
|
let react = require("react");
|
|
10
10
|
//#region packages/@mantine/form/src/hooks/use-form-list/use-form-list.ts
|
|
11
|
-
function useFormList({ $values, $errors, $status }) {
|
|
11
|
+
function useFormList({ $values, $errors, $status, $watch }) {
|
|
12
12
|
return {
|
|
13
13
|
reorderListItem: (0, react.useCallback)((path, payload) => {
|
|
14
|
+
const previousValues = $values.refValues.current;
|
|
14
15
|
$status.clearFieldDirty(path);
|
|
15
16
|
$errors.setErrors((errs) => require_reorder_errors.reorderErrors(path, payload, errs));
|
|
16
17
|
$values.setValues({
|
|
17
18
|
values: require_reorder_path.reorderPath(path, payload, $values.refValues.current),
|
|
18
19
|
updateState: true
|
|
19
20
|
});
|
|
21
|
+
$watch.notifyWatchSubscribers(previousValues);
|
|
20
22
|
}, []),
|
|
21
23
|
removeListItem: (0, react.useCallback)((path, index) => {
|
|
24
|
+
const previousValues = $values.refValues.current;
|
|
22
25
|
$status.clearFieldDirty(path);
|
|
23
26
|
$errors.setErrors((errs) => require_change_error_indices.changeErrorIndices(path, index, errs, -1));
|
|
24
27
|
$values.setValues({
|
|
25
28
|
values: require_remove_path.removePath(path, index, $values.refValues.current),
|
|
26
29
|
updateState: true
|
|
27
30
|
});
|
|
31
|
+
$watch.notifyWatchSubscribers(previousValues);
|
|
28
32
|
}, []),
|
|
29
33
|
insertListItem: (0, react.useCallback)((path, item, index) => {
|
|
34
|
+
const previousValues = $values.refValues.current;
|
|
30
35
|
$status.clearFieldDirty(path);
|
|
31
36
|
$errors.setErrors((errs) => require_change_error_indices.changeErrorIndices(path, index, errs, 1));
|
|
32
37
|
$values.setValues({
|
|
33
38
|
values: require_insert_path.insertPath(path, item, index, $values.refValues.current),
|
|
34
39
|
updateState: true
|
|
35
40
|
});
|
|
41
|
+
$watch.notifyWatchSubscribers(previousValues);
|
|
36
42
|
}, []),
|
|
37
43
|
replaceListItem: (0, react.useCallback)((path, index, item) => {
|
|
44
|
+
const previousValues = $values.refValues.current;
|
|
38
45
|
$status.clearFieldDirty(path);
|
|
39
46
|
$values.setValues({
|
|
40
47
|
values: require_replace_path.replacePath(path, item, index, $values.refValues.current),
|
|
41
48
|
updateState: true
|
|
42
49
|
});
|
|
50
|
+
$watch.notifyWatchSubscribers(previousValues);
|
|
43
51
|
}, [])
|
|
44
52
|
};
|
|
45
53
|
}
|
|
@@ -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';\n\ninterface UseFormListInput<Values extends Record<string, any>> {\n $values: $FormValues<Values>;\n $errors: $FormErrors<Values>;\n $status: $FormStatus<Values>;\n}\n\nexport function useFormList<Values extends Record<string, any>>({\n $values,\n $errors,\n $status,\n}: UseFormListInput<Values>) {\n const reorderListItem: ReorderListItem<Values> = useCallback((path, payload) => {\n $status.clearFieldDirty(path);\n $errors.setErrors((errs) => reorderErrors(path, payload, errs));\n $values.setValues({\n values: reorderPath(path, payload, $values.refValues.current),\n updateState: true,\n });\n }, []);\n\n const removeListItem: RemoveListItem<Values> = useCallback((path, index) => {\n $status.clearFieldDirty(path);\n $errors.setErrors((errs) => changeErrorIndices(path, index, errs, -1));\n $values.setValues({\n values: removePath(path, index, $values.refValues.current),\n updateState: true,\n });\n }, []);\n\n const insertListItem: InsertListItem<Values> = useCallback((path, item, index) => {\n $status.clearFieldDirty(path);\n $errors.setErrors((errs) => changeErrorIndices(path, index, errs, 1));\n $values.setValues({\n values: insertPath(path, item, index, $values.refValues.current),\n updateState: true,\n });\n }, []);\n\n const replaceListItem: ReplaceListItem<Values> = useCallback((path, index, item) => {\n $status.clearFieldDirty(path);\n $values.setValues({\n values: replacePath(path, item, index, $values.refValues.current),\n updateState: true,\n });\n }, []);\n\n return { reorderListItem, removeListItem, insertListItem, replaceListItem };\n}\n"],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"use-form-list.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,cA3CqD,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,cAhCkC,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,cArBkB,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,cAVI,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,UAA4B,
|
|
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,UAAyD,
|
|
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,UAAyD,CAAC,CAAC;CACpF,MAAM,CAAC,gBAAgB,2BAAA,GAAA,MAAA,UAAmC,KAAK;CAC/D,MAAM,iBAAA,GAAA,MAAA,QAAgD,CAAC,CAAC;CACxD,MAAM,qBAAA,GAAA,MAAA,QAA2B,KAAK;CACtC,MAAM,oBAAA,GAAA,MAAA,QAA2D,CAAC,CAAC;CAEnE,MAAM,sBAAA,GAAA,MAAA,cAAkC,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,cAAiC,UAAmB;EACxD,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;CAC9B,GAAG,CAAC,CAAC;CAEL,MAAM,gBAAA,GAAA,MAAA,cAA4B,SAAkB;EAClD,IAAI,MACF,OAAO,CAAC,CAAC,cAAc,QAAQ;EAEjC,IAAI,kBAAkB,SACpB,OAAO;EAET,OAAO,OAAO,OAAO,cAAc,OAAO,EAAE,KAAK,OAAO;CAC1D,GAAG,CAAC,CAAC;CAEL,MAAM,kBAAA,GAAA,MAAA,cAA8B,SAAiB;EACnD,iBAAiB,QAAQ,OAAO,MAAM;EACtC,iBAAiB,QAAQ,QAAQ,IAAI,gBAAgB;EACrD,OAAO,iBAAiB,QAAQ,MAAM;CACxC,GAAG,CAAC,CAAC;CAEL,MAAM,mBAAA,GAAA,MAAA,mBAAoC;EACxC,cAAc,UAAU,CAAC;EACzB,oBAAoB,CAAC,CAAC;EACtB,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;EAC5B,OAAO,OAAO,iBAAiB,OAAO,EAAE,SAAS,MAAM,EAAE,MAAM,CAAC;EAChE,iBAAiB,UAAU,CAAC;CAC9B,GAAG,CAAC,CAAC;CAIL,OAAO;EACL,YAHiB,kBAAkB,OAAO,OAAO,gBAAgB,EAAE,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,QAAqB,
|
|
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,QAAqB,KAAK;CAChC,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAAmC,iBAAkB,CAAC,CAAY;CACtF,MAAM,aAAA,GAAA,MAAA,QAAmB,WAAW;CACpC,MAAM,kBAAA,GAAA,MAAA,QAAwB,WAAW;CAEzC,MAAM,aAAA,GAAA,MAAA,cACH,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,EACf,SAAS,eAAe,WAAY;GAAE;GAAe;EAAe,CAAC,CAAC;CAC3E,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,iBAAA,GAAA,MAAA,cACH,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,EACf,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;GAAe,CAAC,CACnE;EACJ;CACF,GACA,CAAC,SAAS,CACZ;CAEA,MAAM,qBAAA,GAAA,MAAA,cAAiC,YAAoB;EACzD,eAAe,UAAU;CAC3B,GAAG,CAAC,CAAC;CAEL,MAAM,cAAA,GAAA,MAAA,cACH,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,mBAlCoC;GACpC,UAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;GAC3B,CAAC;EACH,GAAG,CAAC,SAAS,CA4BD;EACV;EACA;EACA,YAAA,GAAA,MAAA,mBA7BkC,UAAU,SAAS,CAAC,CA6B9C;EACR,oBAAA,GAAA,MAAA,mBA7B0C,eAAe,SAAS,CAAC,CA6BnD;EAChB,aAAA,GAAA,MAAA,cA3BC,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"}
|
|
@@ -3,7 +3,7 @@ require("../../_virtual/_rolldown/runtime.cjs");
|
|
|
3
3
|
const require_get_path = require("../../paths/get-path.cjs");
|
|
4
4
|
let react = require("react");
|
|
5
5
|
//#region packages/@mantine/form/src/hooks/use-form-watch/use-form-watch.ts
|
|
6
|
-
function useFormWatch({ $status, cascadeUpdates }) {
|
|
6
|
+
function useFormWatch({ $values, $status, cascadeUpdates }) {
|
|
7
7
|
const subscribers = (0, react.useRef)({});
|
|
8
8
|
return {
|
|
9
9
|
subscribers,
|
|
@@ -34,6 +34,16 @@ function useFormWatch({ $status, cascadeUpdates }) {
|
|
|
34
34
|
})));
|
|
35
35
|
}
|
|
36
36
|
return result;
|
|
37
|
+
}, []),
|
|
38
|
+
notifyWatchSubscribers: (0, react.useCallback)((previousValues) => {
|
|
39
|
+
Object.keys(subscribers.current).forEach((path) => {
|
|
40
|
+
if (require_get_path.getPath(path, $values.refValues.current) !== require_get_path.getPath(path, previousValues)) subscribers.current[path]?.forEach((cb) => cb({
|
|
41
|
+
previousValue: require_get_path.getPath(path, previousValues),
|
|
42
|
+
value: require_get_path.getPath(path, $values.refValues.current),
|
|
43
|
+
touched: $status.isTouched(path),
|
|
44
|
+
dirty: $status.isDirty(path)
|
|
45
|
+
}));
|
|
46
|
+
});
|
|
37
47
|
}, [])
|
|
38
48
|
};
|
|
39
49
|
}
|
|
@@ -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 { LooseKeys } from '../../paths.types';\nimport { FormFieldSubscriber, Watch } from '../../types';\nimport { $FormStatus } from '../use-form-status/use-form-status';\nimport { SetValuesSubscriberPayload } from '../use-form-values/use-form-values';\n\ninterface UseFormWatchInput<out Values extends Record<PropertyKey, any>> {\n $status: $FormStatus<Values>;\n cascadeUpdates?: boolean;\n}\n\nexport function useFormWatch<\n Values extends Record<PropertyKey, any>,\n Field extends LooseKeys<Values> = LooseKeys<Values>,\n>({ $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 return {\n subscribers,\n watch,\n getFieldSubscribers,\n };\n}\n"],"mappings":";;;;;
|
|
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,QAA0E,CAAC,CAAQ;CAiEzF,OAAO;EACL;EACA,QAAA,GAAA,MAAA,cAjE+C,MAAM,aAAa;GAClE,CAAA,GAAA,MAAA,iBAAgB;IACd,YAAY,QAAQ,QAAQ,YAAY,QAAQ,SAAS,CAAC;IAC1D,YAAY,QAAQ,MAAM,KAAK,QAAQ;IAEvC,aAAa;KACX,YAAY,QAAQ,QAAQ,YAAY,QAAQ,MAAM,QAAQ,OAAO,OAAO,QAAQ;IACtF;GACF,GAAG,CAAC,QAAQ,CAAC;EACf,GAAG,CAAC,CAwDE;EACJ,sBAAA,GAAA,MAAA,cAvDuC,SAAgB;GACvD,MAAM,SACJ,YAAY,QAAQ,OAAO,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,EAAE,WAAW,GAAG,gBAAgB,EAAE;IAC9D,MAAM,UAAU,OAAO,eAAe,EAAE,WAAW,GAAG,KAAK,EAAE;IAE7D,IAAI,YAAa,kBAAkB,SACjC,OAAO,KACL,GAAG,YAAY,QAAQ,iBAAiB,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,cAtB0C,mBAA2B;GACrE,OAAO,KAAK,YAAY,OAAO,EAAE,SAAS,SAAS;IAIjD,IAHcA,iBAAAA,QAAQ,MAAM,QAAQ,UAAU,OAGtC,MAFcA,iBAAAA,QAAQ,MAAM,cAEV,GACxB,YAAY,QAAQ,OAAgB,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,EAAE,
|
|
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,EAAE,MAAM,GAAG,EAAE;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,EACzB,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,EACA,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;
|
|
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,EAAE,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,
|
|
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,EAAE,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":"get-data-path.cjs","names":[],"sources":["../../src/paths/get-data-path.ts"],"sourcesContent":["export function getDataPath(formName: string | undefined, fieldPath: PropertyKey) {\n return formName ? `${formName}-${fieldPath.toString()}` : fieldPath.toString();\n}\n"],"mappings":";;AAAA,SAAgB,YAAY,UAA8B,WAAwB;
|
|
1
|
+
{"version":3,"file":"get-data-path.cjs","names":[],"sources":["../../src/paths/get-data-path.ts"],"sourcesContent":["export function getDataPath(formName: string | undefined, fieldPath: PropertyKey) {\n return formName ? `${formName}-${fieldPath.toString()}` : fieldPath.toString();\n}\n"],"mappings":";;AAAA,SAAgB,YAAY,UAA8B,WAAwB;CAChF,OAAO,WAAW,GAAG,SAAS,GAAG,UAAU,SAAS,MAAM,UAAU,SAAS;AAC/E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-path.cjs","names":["getSplittedPath"],"sources":["../../src/paths/get-path.ts"],"sourcesContent":["import { getSplittedPath } from './get-splitted-path';\n\nexport function getPath(path: unknown, values: unknown): unknown {\n const splittedPath = getSplittedPath(path);\n\n if (splittedPath.length === 0 || typeof values !== 'object' || values === null) {\n return undefined;\n }\n\n let value = values[splittedPath[0] as keyof typeof values];\n for (let i = 1; i < splittedPath.length; i += 1) {\n if (value == null) {\n break;\n }\n\n value = value[splittedPath[i]];\n }\n\n return value;\n}\n"],"mappings":";;;AAEA,SAAgB,QAAQ,MAAe,QAA0B;CAC/D,MAAM,eAAeA,0BAAAA,gBAAgB,
|
|
1
|
+
{"version":3,"file":"get-path.cjs","names":["getSplittedPath"],"sources":["../../src/paths/get-path.ts"],"sourcesContent":["import { getSplittedPath } from './get-splitted-path';\n\nexport function getPath(path: unknown, values: unknown): unknown {\n const splittedPath = getSplittedPath(path);\n\n if (splittedPath.length === 0 || typeof values !== 'object' || values === null) {\n return undefined;\n }\n\n let value = values[splittedPath[0] as keyof typeof values];\n for (let i = 1; i < splittedPath.length; i += 1) {\n if (value == null) {\n break;\n }\n\n value = value[splittedPath[i]];\n }\n\n return value;\n}\n"],"mappings":";;;AAEA,SAAgB,QAAQ,MAAe,QAA0B;CAC/D,MAAM,eAAeA,0BAAAA,gBAAgB,IAAI;CAEzC,IAAI,aAAa,WAAW,KAAK,OAAO,WAAW,YAAY,WAAW,MACxE;CAGF,IAAI,QAAQ,OAAO,aAAa;CAChC,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,GAAG;EAC/C,IAAI,SAAS,MACX;EAGF,QAAQ,MAAM,aAAa;CAC7B;CAEA,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-splitted-path.cjs","names":[],"sources":["../../src/paths/get-splitted-path.ts"],"sourcesContent":["export function getSplittedPath(path: unknown) {\n if (typeof path !== 'string') {\n return [];\n }\n\n return path.split('.');\n}\n"],"mappings":";;AAAA,SAAgB,gBAAgB,MAAe;
|
|
1
|
+
{"version":3,"file":"get-splitted-path.cjs","names":[],"sources":["../../src/paths/get-splitted-path.ts"],"sourcesContent":["export function getSplittedPath(path: unknown) {\n if (typeof path !== 'string') {\n return [];\n }\n\n return path.split('.');\n}\n"],"mappings":";;AAAA,SAAgB,gBAAgB,MAAe;CAC7C,IAAI,OAAO,SAAS,UAClB,OAAO,CAAC;CAGV,OAAO,KAAK,MAAM,GAAG;AACvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insert-path.cjs","names":["getPath","setPath"],"sources":["../../src/paths/insert-path.ts"],"sourcesContent":["import { getPath } from './get-path';\nimport { setPath } from './set-path';\n\nexport function insertPath<T>(path: unknown, value: unknown, index: number | undefined, values: T) {\n const currentValue = getPath(path, values);\n\n if (!Array.isArray(currentValue)) {\n return values;\n }\n\n const cloned = [...currentValue];\n cloned.splice(typeof index === 'number' ? index : cloned.length, 0, value);\n\n return setPath(path, cloned, values);\n}\n"],"mappings":";;;;AAGA,SAAgB,WAAc,MAAe,OAAgB,OAA2B,QAAW;CACjG,MAAM,eAAeA,iBAAAA,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"insert-path.cjs","names":["getPath","setPath"],"sources":["../../src/paths/insert-path.ts"],"sourcesContent":["import { getPath } from './get-path';\nimport { setPath } from './set-path';\n\nexport function insertPath<T>(path: unknown, value: unknown, index: number | undefined, values: T) {\n const currentValue = getPath(path, values);\n\n if (!Array.isArray(currentValue)) {\n return values;\n }\n\n const cloned = [...currentValue];\n cloned.splice(typeof index === 'number' ? index : cloned.length, 0, value);\n\n return setPath(path, cloned, values);\n}\n"],"mappings":";;;;AAGA,SAAgB,WAAc,MAAe,OAAgB,OAA2B,QAAW;CACjG,MAAM,eAAeA,iBAAAA,QAAQ,MAAM,MAAM;CAEzC,IAAI,CAAC,MAAM,QAAQ,YAAY,GAC7B,OAAO;CAGT,MAAM,SAAS,CAAC,GAAG,YAAY;CAC/B,OAAO,OAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,QAAQ,GAAG,KAAK;CAEzE,OAAOC,iBAAAA,QAAQ,MAAM,QAAQ,MAAM;AACrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-path.cjs","names":["getPath","setPath"],"sources":["../../src/paths/remove-path.ts"],"sourcesContent":["import { getPath } from './get-path';\nimport { setPath } from './set-path';\n\nexport function removePath<T>(path: unknown, index: number, values: T) {\n const currentValue = getPath(path, values);\n\n if (!Array.isArray(currentValue)) {\n return values;\n }\n\n return setPath(\n path,\n currentValue.filter((_, itemIndex) => itemIndex !== index),\n values\n );\n}\n"],"mappings":";;;;AAGA,SAAgB,WAAc,MAAe,OAAe,QAAW;CACrE,MAAM,eAAeA,iBAAAA,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"remove-path.cjs","names":["getPath","setPath"],"sources":["../../src/paths/remove-path.ts"],"sourcesContent":["import { getPath } from './get-path';\nimport { setPath } from './set-path';\n\nexport function removePath<T>(path: unknown, index: number, values: T) {\n const currentValue = getPath(path, values);\n\n if (!Array.isArray(currentValue)) {\n return values;\n }\n\n return setPath(\n path,\n currentValue.filter((_, itemIndex) => itemIndex !== index),\n values\n );\n}\n"],"mappings":";;;;AAGA,SAAgB,WAAc,MAAe,OAAe,QAAW;CACrE,MAAM,eAAeA,iBAAAA,QAAQ,MAAM,MAAM;CAEzC,IAAI,CAAC,MAAM,QAAQ,YAAY,GAC7B,OAAO;CAGT,OAAOC,iBAAAA,QACL,MACA,aAAa,QAAQ,GAAG,cAAc,cAAc,KAAK,GACzD,MACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reorder-path.cjs","names":["getPath","setPath"],"sources":["../../src/paths/reorder-path.ts"],"sourcesContent":["import { ReorderPayload } from '../types';\nimport { getPath } from './get-path';\nimport { setPath } from './set-path';\n\nexport function reorderPath<T>(path: unknown, { from, to }: ReorderPayload, values: T) {\n const currentValue = getPath(path, values);\n\n if (!Array.isArray(currentValue)) {\n return values;\n }\n\n const cloned = [...currentValue];\n const item = currentValue[from];\n cloned.splice(from, 1);\n cloned.splice(to, 0, item);\n\n return setPath(path, cloned, values);\n}\n"],"mappings":";;;;AAIA,SAAgB,YAAe,MAAe,EAAE,MAAM,MAAsB,QAAW;CACrF,MAAM,eAAeA,iBAAAA,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"reorder-path.cjs","names":["getPath","setPath"],"sources":["../../src/paths/reorder-path.ts"],"sourcesContent":["import { ReorderPayload } from '../types';\nimport { getPath } from './get-path';\nimport { setPath } from './set-path';\n\nexport function reorderPath<T>(path: unknown, { from, to }: ReorderPayload, values: T) {\n const currentValue = getPath(path, values);\n\n if (!Array.isArray(currentValue)) {\n return values;\n }\n\n const cloned = [...currentValue];\n const item = currentValue[from];\n cloned.splice(from, 1);\n cloned.splice(to, 0, item);\n\n return setPath(path, cloned, values);\n}\n"],"mappings":";;;;AAIA,SAAgB,YAAe,MAAe,EAAE,MAAM,MAAsB,QAAW;CACrF,MAAM,eAAeA,iBAAAA,QAAQ,MAAM,MAAM;CAEzC,IAAI,CAAC,MAAM,QAAQ,YAAY,GAC7B,OAAO;CAGT,MAAM,SAAS,CAAC,GAAG,YAAY;CAC/B,MAAM,OAAO,aAAa;CAC1B,OAAO,OAAO,MAAM,CAAC;CACrB,OAAO,OAAO,IAAI,GAAG,IAAI;CAEzB,OAAOC,iBAAAA,QAAQ,MAAM,QAAQ,MAAM;AACrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replace-path.cjs","names":["getPath","setPath"],"sources":["../../src/paths/replace-path.ts"],"sourcesContent":["import { getPath } from './get-path';\nimport { setPath } from './set-path';\n\nexport function replacePath<T>(path: unknown, item: unknown, index: number, values: T) {\n const currentValue = getPath(path, values);\n\n if (!Array.isArray(currentValue)) {\n return values;\n }\n\n if (currentValue.length <= index) {\n return values;\n }\n\n const cloned = [...currentValue];\n cloned[index] = item;\n\n return setPath(path, cloned, values);\n}\n"],"mappings":";;;;AAGA,SAAgB,YAAe,MAAe,MAAe,OAAe,QAAW;CACrF,MAAM,eAAeA,iBAAAA,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"replace-path.cjs","names":["getPath","setPath"],"sources":["../../src/paths/replace-path.ts"],"sourcesContent":["import { getPath } from './get-path';\nimport { setPath } from './set-path';\n\nexport function replacePath<T>(path: unknown, item: unknown, index: number, values: T) {\n const currentValue = getPath(path, values);\n\n if (!Array.isArray(currentValue)) {\n return values;\n }\n\n if (currentValue.length <= index) {\n return values;\n }\n\n const cloned = [...currentValue];\n cloned[index] = item;\n\n return setPath(path, cloned, values);\n}\n"],"mappings":";;;;AAGA,SAAgB,YAAe,MAAe,MAAe,OAAe,QAAW;CACrF,MAAM,eAAeA,iBAAAA,QAAQ,MAAM,MAAM;CAEzC,IAAI,CAAC,MAAM,QAAQ,YAAY,GAC7B,OAAO;CAGT,IAAI,aAAa,UAAU,OACzB,OAAO;CAGT,MAAM,SAAS,CAAC,GAAG,YAAY;CAC/B,OAAO,SAAS;CAEhB,OAAOC,iBAAAA,QAAQ,MAAM,QAAQ,MAAM;AACrC"}
|
|
@@ -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,
|
|
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,OAAoB,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,
|
|
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,EAAE,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,aAAa,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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"}
|