@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.
Files changed (98) hide show
  1. package/cjs/FormProvider/FormProvider.cjs.map +1 -1
  2. package/cjs/actions/actions.cjs.map +1 -1
  3. package/cjs/get-input-on-change/get-input-on-change.cjs.map +1 -1
  4. package/cjs/get-status/get-status.cjs.map +1 -1
  5. package/cjs/hooks/use-form-errors/filter-errors/filter-errors.cjs.map +1 -1
  6. package/cjs/hooks/use-form-errors/use-form-errors.cjs.map +1 -1
  7. package/cjs/hooks/use-form-list/use-form-list.cjs +9 -1
  8. package/cjs/hooks/use-form-list/use-form-list.cjs.map +1 -1
  9. package/cjs/hooks/use-form-status/use-form-status.cjs.map +1 -1
  10. package/cjs/hooks/use-form-validating/use-form-validating.cjs.map +1 -1
  11. package/cjs/hooks/use-form-values/use-form-values.cjs.map +1 -1
  12. package/cjs/hooks/use-form-watch/use-form-watch.cjs +11 -1
  13. package/cjs/hooks/use-form-watch/use-form-watch.cjs.map +1 -1
  14. package/cjs/lists/change-error-indices.cjs.map +1 -1
  15. package/cjs/lists/clear-list-state.cjs.map +1 -1
  16. package/cjs/lists/reorder-errors.cjs.map +1 -1
  17. package/cjs/paths/get-data-path.cjs.map +1 -1
  18. package/cjs/paths/get-path.cjs.map +1 -1
  19. package/cjs/paths/get-splitted-path.cjs.map +1 -1
  20. package/cjs/paths/insert-path.cjs.map +1 -1
  21. package/cjs/paths/remove-path.cjs.map +1 -1
  22. package/cjs/paths/reorder-path.cjs.map +1 -1
  23. package/cjs/paths/replace-path.cjs.map +1 -1
  24. package/cjs/paths/set-path.cjs.map +1 -1
  25. package/cjs/schema-resolver.cjs.map +1 -1
  26. package/cjs/use-field.cjs.map +1 -1
  27. package/cjs/use-form.cjs +14 -37
  28. package/cjs/use-form.cjs.map +1 -1
  29. package/cjs/validate/get-rule-for-path.cjs.map +1 -1
  30. package/cjs/validate/should-validate-on-change.cjs.map +1 -1
  31. package/cjs/validate/validate-field-value.cjs.map +1 -1
  32. package/cjs/validate/validate-values.cjs.map +1 -1
  33. package/cjs/validators/has-length/has-length.cjs.map +1 -1
  34. package/cjs/validators/is-email/is-email.cjs.map +1 -1
  35. package/cjs/validators/is-in-range/is-in-range.cjs.map +1 -1
  36. package/cjs/validators/is-json-string/is-json-string.cjs.map +1 -1
  37. package/cjs/validators/is-not-empty/is-not-empty.cjs.map +1 -1
  38. package/cjs/validators/is-not-empty-html/is-not-empty-html.cjs.map +1 -1
  39. package/cjs/validators/is-one-of/is-one-of.cjs.map +1 -1
  40. package/cjs/validators/is-url/is-url.cjs.map +1 -1
  41. package/cjs/validators/matches/matches.cjs.map +1 -1
  42. package/cjs/validators/matches-field/matches-field.cjs.map +1 -1
  43. package/esm/FormProvider/FormProvider.mjs.map +1 -1
  44. package/esm/actions/actions.mjs.map +1 -1
  45. package/esm/get-input-on-change/get-input-on-change.mjs.map +1 -1
  46. package/esm/get-status/get-status.mjs.map +1 -1
  47. package/esm/hooks/use-form-errors/filter-errors/filter-errors.mjs.map +1 -1
  48. package/esm/hooks/use-form-errors/use-form-errors.mjs.map +1 -1
  49. package/esm/hooks/use-form-list/use-form-list.mjs +9 -1
  50. package/esm/hooks/use-form-list/use-form-list.mjs.map +1 -1
  51. package/esm/hooks/use-form-status/use-form-status.mjs.map +1 -1
  52. package/esm/hooks/use-form-validating/use-form-validating.mjs.map +1 -1
  53. package/esm/hooks/use-form-values/use-form-values.mjs.map +1 -1
  54. package/esm/hooks/use-form-watch/use-form-watch.mjs +11 -1
  55. package/esm/hooks/use-form-watch/use-form-watch.mjs.map +1 -1
  56. package/esm/lists/change-error-indices.mjs.map +1 -1
  57. package/esm/lists/clear-list-state.mjs.map +1 -1
  58. package/esm/lists/reorder-errors.mjs.map +1 -1
  59. package/esm/paths/get-data-path.mjs.map +1 -1
  60. package/esm/paths/get-path.mjs.map +1 -1
  61. package/esm/paths/get-splitted-path.mjs.map +1 -1
  62. package/esm/paths/insert-path.mjs.map +1 -1
  63. package/esm/paths/remove-path.mjs.map +1 -1
  64. package/esm/paths/reorder-path.mjs.map +1 -1
  65. package/esm/paths/replace-path.mjs.map +1 -1
  66. package/esm/paths/set-path.mjs.map +1 -1
  67. package/esm/schema-resolver.mjs.map +1 -1
  68. package/esm/use-field.mjs.map +1 -1
  69. package/esm/use-form.mjs +14 -37
  70. package/esm/use-form.mjs.map +1 -1
  71. package/esm/validate/get-rule-for-path.mjs.map +1 -1
  72. package/esm/validate/should-validate-on-change.mjs.map +1 -1
  73. package/esm/validate/validate-field-value.mjs.map +1 -1
  74. package/esm/validate/validate-values.mjs.map +1 -1
  75. package/esm/validators/has-length/has-length.mjs.map +1 -1
  76. package/esm/validators/is-email/is-email.mjs.map +1 -1
  77. package/esm/validators/is-in-range/is-in-range.mjs.map +1 -1
  78. package/esm/validators/is-json-string/is-json-string.mjs.map +1 -1
  79. package/esm/validators/is-not-empty/is-not-empty.mjs.map +1 -1
  80. package/esm/validators/is-not-empty-html/is-not-empty-html.mjs.map +1 -1
  81. package/esm/validators/is-one-of/is-one-of.mjs.map +1 -1
  82. package/esm/validators/is-url/is-url.mjs.map +1 -1
  83. package/esm/validators/matches/matches.mjs.map +1 -1
  84. package/esm/validators/matches-field/matches-field.mjs.map +1 -1
  85. package/lib/hooks/use-form-list/use-form-list.d.ts +3 -1
  86. package/lib/hooks/use-form-watch/use-form-watch.d.ts +10 -2
  87. package/lib/validators/has-length/has-length.d.ts +2 -1
  88. package/lib/validators/is-email/is-email.d.ts +2 -1
  89. package/lib/validators/is-in-range/is-in-range.d.ts +2 -1
  90. package/lib/validators/is-json-string/is-json-string.d.ts +2 -1
  91. package/lib/validators/is-not-empty/is-not-empty.d.ts +2 -1
  92. package/lib/validators/is-not-empty-html/is-not-empty-html.d.ts +2 -1
  93. package/lib/validators/is-one-of/is-one-of.d.ts +2 -1
  94. package/lib/validators/is-url/is-url.d.ts +3 -2
  95. package/lib/validators/matches/matches.d.ts +2 -1
  96. package/lib/validators/matches-field/matches-field.d.ts +2 -1
  97. package/lib/validators/types.d.ts +1 -0
  98. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"use-form-status.mjs","names":[],"sources":["../../../src/hooks/use-form-status/use-form-status.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport isEqual from 'fast-deep-equal';\nimport { getStatus } from '../../get-status';\nimport { clearListState } from '../../lists';\nimport { getPath } from '../../paths';\nimport {\n ClearFieldDirty,\n FormMode,\n FormStatus,\n GetFieldStatus,\n ResetDirty,\n ResetStatus,\n SetCalculatedFieldDirty,\n SetFieldDirty,\n SetFieldTouched,\n} from '../../types';\nimport type { $FormValues } from '../use-form-values/use-form-values';\n\nexport interface $FormStatus<out Values extends Record<string, any>> {\n touchedState: FormStatus;\n dirtyState: FormStatus;\n touchedRef: React.RefObject<FormStatus>;\n dirtyRef: React.RefObject<FormStatus>;\n setTouched: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirty: React.Dispatch<React.SetStateAction<FormStatus>>;\n resetDirty: ResetStatus;\n resetTouched: ResetStatus;\n isTouched: GetFieldStatus<Values>;\n setFieldTouched: SetFieldTouched<Values>;\n setFieldDirty: SetFieldDirty<Values>;\n setTouchedState: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirtyState: React.Dispatch<React.SetStateAction<FormStatus>>;\n clearFieldDirty: ClearFieldDirty;\n isDirty: GetFieldStatus<Values>;\n getDirty: () => FormStatus;\n getTouched: () => FormStatus;\n setCalculatedFieldDirty: SetCalculatedFieldDirty<Values>;\n}\n\ninterface UseFormStatusInput<out Values extends Record<string, any>> {\n initialDirty: FormStatus;\n initialTouched: FormStatus;\n mode: FormMode;\n $values: $FormValues<Values>;\n}\n\nexport function useFormStatus<Values extends Record<string, any>>({\n initialDirty,\n initialTouched,\n mode,\n $values,\n}: UseFormStatusInput<Values>): $FormStatus<Values> {\n const [touchedState, setTouchedState] = useState(initialTouched);\n const [dirtyState, setDirtyState] = useState(initialDirty);\n\n const touchedRef = useRef(initialTouched);\n const dirtyRef = useRef(initialDirty);\n\n const setTouched = useCallback((values: FormStatus | ((current: FormStatus) => FormStatus)) => {\n const resolvedValues = typeof values === 'function' ? values(touchedRef.current) : values;\n touchedRef.current = resolvedValues;\n\n if (mode === 'controlled') {\n setTouchedState(resolvedValues);\n }\n }, []);\n\n const setDirty = useCallback(\n (values: FormStatus | ((current: FormStatus) => FormStatus), forceUpdate = false) => {\n const resolvedValues = typeof values === 'function' ? values(dirtyRef.current) : values;\n dirtyRef.current = resolvedValues;\n\n if (mode === 'controlled' || forceUpdate) {\n setDirtyState(resolvedValues);\n }\n },\n []\n );\n\n const resetTouched: ResetStatus = useCallback(() => setTouched({}), []);\n\n const resetDirty: ResetDirty<Values> = useCallback((values) => {\n const newSnapshot = values\n ? { ...$values.refValues.current, ...values }\n : $values.refValues.current;\n $values.setValuesSnapshot(newSnapshot);\n setDirty({});\n }, []);\n\n const setFieldTouched: SetFieldTouched<Values> = useCallback((path, touched) => {\n setTouched((currentTouched) => {\n if (getStatus(currentTouched, path) === touched) {\n return currentTouched;\n }\n\n return { ...currentTouched, [path]: touched };\n });\n }, []);\n\n const setFieldDirty: SetFieldDirty<Values> = useCallback((path, dirty, forceUpdate) => {\n setDirty((currentDirty) => {\n if (getStatus(currentDirty, path) === dirty) {\n return currentDirty;\n }\n\n return { ...currentDirty, [path]: dirty };\n }, forceUpdate);\n }, []);\n\n const setCalculatedFieldDirty: SetCalculatedFieldDirty<Values> = useCallback((path, value) => {\n const currentDirty = getStatus(dirtyRef.current, path);\n const dirty = !isEqual(getPath(path, $values.getValuesSnapshot()), value);\n const clearedState = clearListState(path, dirtyRef.current);\n clearedState[path as string] = dirty;\n setDirty(clearedState, currentDirty !== dirty);\n }, []);\n\n const isTouched: GetFieldStatus<Values> = useCallback(\n (path) => getStatus(touchedRef.current, path),\n []\n );\n\n const clearFieldDirty: ClearFieldDirty = useCallback(\n (path) =>\n setDirty((current) => {\n if (typeof path !== 'string') {\n return current;\n }\n\n const result = clearListState(path, current);\n delete result[path];\n\n if (isEqual(result, current)) {\n return current;\n }\n\n return result;\n }),\n []\n );\n\n const isDirty: GetFieldStatus<Values> = useCallback((path) => {\n if (path) {\n const overriddenValue = getPath(path, dirtyRef.current);\n if (typeof overriddenValue === 'boolean') {\n return overriddenValue;\n }\n\n const sliceOfValues = getPath(path, $values.refValues.current);\n const sliceOfInitialValues = getPath(path, $values.valuesSnapshot.current);\n return !isEqual(sliceOfValues, sliceOfInitialValues);\n }\n\n const isOverridden = Object.keys(dirtyRef.current).length > 0;\n if (isOverridden) {\n return getStatus(dirtyRef.current);\n }\n\n return !isEqual($values.refValues.current, $values.valuesSnapshot.current);\n }, []);\n\n const getDirty = useCallback(() => dirtyRef.current, []);\n const getTouched = useCallback(() => touchedRef.current, []);\n\n return {\n touchedState,\n dirtyState,\n touchedRef,\n dirtyRef,\n setTouched,\n setDirty,\n resetDirty,\n resetTouched,\n isTouched,\n setFieldTouched,\n setFieldDirty,\n setTouchedState,\n setDirtyState,\n clearFieldDirty,\n isDirty,\n getDirty,\n getTouched,\n setCalculatedFieldDirty,\n };\n}\n"],"mappings":";;;;;;;AA8CA,SAAgB,cAAkD,EAChE,cACA,gBACA,MACA,WACkD;CAClD,MAAM,CAAC,cAAc,mBAAmB,SAAS,eAAe;CAChE,MAAM,CAAC,YAAY,iBAAiB,SAAS,aAAa;CAE1D,MAAM,aAAa,OAAO,eAAe;CACzC,MAAM,WAAW,OAAO,aAAa;CAErC,MAAM,aAAa,aAAa,WAA+D;EAC7F,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,WAAW,QAAQ,GAAG;AACnF,aAAW,UAAU;AAErB,MAAI,SAAS,aACX,iBAAgB,eAAe;IAEhC,EAAE,CAAC;CAEN,MAAM,WAAW,aACd,QAA4D,cAAc,UAAU;EACnF,MAAM,iBAAiB,OAAO,WAAW,aAAa,OAAO,SAAS,QAAQ,GAAG;AACjF,WAAS,UAAU;AAEnB,MAAI,SAAS,gBAAgB,YAC3B,eAAc,eAAe;IAGjC,EAAE,CACH;CAED,MAAM,eAA4B,kBAAkB,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;CAEvE,MAAM,aAAiC,aAAa,WAAW;EAC7D,MAAM,cAAc,SAChB;GAAE,GAAG,QAAQ,UAAU;GAAS,GAAG;GAAQ,GAC3C,QAAQ,UAAU;AACtB,UAAQ,kBAAkB,YAAY;AACtC,WAAS,EAAE,CAAC;IACX,EAAE,CAAC;CAEN,MAAM,kBAA2C,aAAa,MAAM,YAAY;AAC9E,cAAY,mBAAmB;AAC7B,OAAI,UAAU,gBAAgB,KAAK,KAAK,QACtC,QAAO;AAGT,UAAO;IAAE,GAAG;KAAiB,OAAO;IAAS;IAC7C;IACD,EAAE,CAAC;CAEN,MAAM,gBAAuC,aAAa,MAAM,OAAO,gBAAgB;AACrF,YAAU,iBAAiB;AACzB,OAAI,UAAU,cAAc,KAAK,KAAK,MACpC,QAAO;AAGT,UAAO;IAAE,GAAG;KAAe,OAAO;IAAO;KACxC,YAAY;IACd,EAAE,CAAC;CAEN,MAAM,0BAA2D,aAAa,MAAM,UAAU;EAC5F,MAAM,eAAe,UAAU,SAAS,SAAS,KAAK;EACtD,MAAM,QAAQ,CAAC,QAAQ,QAAQ,MAAM,QAAQ,mBAAmB,CAAC,EAAE,MAAM;EACzE,MAAM,eAAe,eAAe,MAAM,SAAS,QAAQ;AAC3D,eAAa,QAAkB;AAC/B,WAAS,cAAc,iBAAiB,MAAM;IAC7C,EAAE,CAAC;AAiDN,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAxDwC,aACvC,SAAS,UAAU,WAAW,SAAS,KAAK,EAC7C,EAAE,CACH;EAsDC;EACA;EACA;EACA;EACA,iBAxDuC,aACtC,SACC,UAAU,YAAY;AACpB,OAAI,OAAO,SAAS,SAClB,QAAO;GAGT,MAAM,SAAS,eAAe,MAAM,QAAQ;AAC5C,UAAO,OAAO;AAEd,OAAI,QAAQ,QAAQ,QAAQ,CAC1B,QAAO;AAGT,UAAO;IACP,EACJ,EAAE,CACH;EAwCC,SAtCsC,aAAa,SAAS;AAC5D,OAAI,MAAM;IACR,MAAM,kBAAkB,QAAQ,MAAM,SAAS,QAAQ;AACvD,QAAI,OAAO,oBAAoB,UAC7B,QAAO;AAKT,WAAO,CAAC,QAFc,QAAQ,MAAM,QAAQ,UAAU,QAAQ,EACjC,QAAQ,MAAM,QAAQ,eAAe,QAAQ,CACtB;;AAItD,OADqB,OAAO,KAAK,SAAS,QAAQ,CAAC,SAAS,EAE1D,QAAO,UAAU,SAAS,QAAQ;AAGpC,UAAO,CAAC,QAAQ,QAAQ,UAAU,SAAS,QAAQ,eAAe,QAAQ;KACzE,EAAE,CAAC;EAqBJ,UAnBe,kBAAkB,SAAS,SAAS,EAAE,CAAC;EAoBtD,YAnBiB,kBAAkB,WAAW,SAAS,EAAE,CAAC;EAoB1D;EACD"}
1
+ {"version":3,"file":"use-form-status.mjs","names":[],"sources":["../../../src/hooks/use-form-status/use-form-status.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport isEqual from 'fast-deep-equal';\nimport { getStatus } from '../../get-status';\nimport { clearListState } from '../../lists';\nimport { getPath } from '../../paths';\nimport {\n ClearFieldDirty,\n FormMode,\n FormStatus,\n GetFieldStatus,\n ResetDirty,\n ResetStatus,\n SetCalculatedFieldDirty,\n SetFieldDirty,\n SetFieldTouched,\n} from '../../types';\nimport type { $FormValues } from '../use-form-values/use-form-values';\n\nexport interface $FormStatus<out Values extends Record<string, any>> {\n touchedState: FormStatus;\n dirtyState: FormStatus;\n touchedRef: React.RefObject<FormStatus>;\n dirtyRef: React.RefObject<FormStatus>;\n setTouched: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirty: React.Dispatch<React.SetStateAction<FormStatus>>;\n resetDirty: ResetStatus;\n resetTouched: ResetStatus;\n isTouched: GetFieldStatus<Values>;\n setFieldTouched: SetFieldTouched<Values>;\n setFieldDirty: SetFieldDirty<Values>;\n setTouchedState: React.Dispatch<React.SetStateAction<FormStatus>>;\n setDirtyState: React.Dispatch<React.SetStateAction<FormStatus>>;\n clearFieldDirty: ClearFieldDirty;\n isDirty: GetFieldStatus<Values>;\n getDirty: () => FormStatus;\n getTouched: () => FormStatus;\n setCalculatedFieldDirty: SetCalculatedFieldDirty<Values>;\n}\n\ninterface UseFormStatusInput<out Values extends Record<string, any>> {\n initialDirty: FormStatus;\n initialTouched: FormStatus;\n mode: FormMode;\n $values: $FormValues<Values>;\n}\n\nexport function useFormStatus<Values extends Record<string, any>>({\n initialDirty,\n initialTouched,\n mode,\n $values,\n}: UseFormStatusInput<Values>): $FormStatus<Values> {\n const [touchedState, setTouchedState] = useState(initialTouched);\n const [dirtyState, setDirtyState] = useState(initialDirty);\n\n const touchedRef = useRef(initialTouched);\n const dirtyRef = useRef(initialDirty);\n\n const setTouched = useCallback((values: FormStatus | ((current: FormStatus) => FormStatus)) => {\n const resolvedValues = typeof values === 'function' ? values(touchedRef.current) : values;\n touchedRef.current = resolvedValues;\n\n if (mode === 'controlled') {\n setTouchedState(resolvedValues);\n }\n }, []);\n\n const setDirty = useCallback(\n (values: FormStatus | ((current: FormStatus) => FormStatus), forceUpdate = false) => {\n const resolvedValues = typeof values === 'function' ? values(dirtyRef.current) : values;\n dirtyRef.current = resolvedValues;\n\n if (mode === 'controlled' || forceUpdate) {\n setDirtyState(resolvedValues);\n }\n },\n []\n );\n\n const resetTouched: ResetStatus = useCallback(() => setTouched({}), []);\n\n const resetDirty: ResetDirty<Values> = useCallback((values) => {\n const newSnapshot = values\n ? { ...$values.refValues.current, ...values }\n : $values.refValues.current;\n $values.setValuesSnapshot(newSnapshot);\n setDirty({});\n }, []);\n\n const setFieldTouched: SetFieldTouched<Values> = useCallback((path, touched) => {\n setTouched((currentTouched) => {\n if (getStatus(currentTouched, path) === touched) {\n return currentTouched;\n }\n\n return { ...currentTouched, [path]: touched };\n });\n }, []);\n\n const setFieldDirty: SetFieldDirty<Values> = useCallback((path, dirty, forceUpdate) => {\n setDirty((currentDirty) => {\n if (getStatus(currentDirty, path) === dirty) {\n return currentDirty;\n }\n\n return { ...currentDirty, [path]: dirty };\n }, forceUpdate);\n }, []);\n\n const setCalculatedFieldDirty: SetCalculatedFieldDirty<Values> = useCallback((path, value) => {\n const currentDirty = getStatus(dirtyRef.current, path);\n const dirty = !isEqual(getPath(path, $values.getValuesSnapshot()), value);\n const clearedState = clearListState(path, dirtyRef.current);\n clearedState[path as string] = dirty;\n setDirty(clearedState, currentDirty !== dirty);\n }, []);\n\n const isTouched: GetFieldStatus<Values> = useCallback(\n (path) => getStatus(touchedRef.current, path),\n []\n );\n\n const clearFieldDirty: ClearFieldDirty = useCallback(\n (path) =>\n setDirty((current) => {\n if (typeof path !== 'string') {\n return current;\n }\n\n const result = clearListState(path, current);\n delete result[path];\n\n if (isEqual(result, current)) {\n return current;\n }\n\n return result;\n }),\n []\n );\n\n const isDirty: GetFieldStatus<Values> = useCallback((path) => {\n if (path) {\n const overriddenValue = getPath(path, dirtyRef.current);\n if (typeof overriddenValue === 'boolean') {\n return overriddenValue;\n }\n\n const sliceOfValues = getPath(path, $values.refValues.current);\n const sliceOfInitialValues = getPath(path, $values.valuesSnapshot.current);\n return !isEqual(sliceOfValues, sliceOfInitialValues);\n }\n\n const isOverridden = Object.keys(dirtyRef.current).length > 0;\n if (isOverridden) {\n return getStatus(dirtyRef.current);\n }\n\n return !isEqual($values.refValues.current, $values.valuesSnapshot.current);\n }, []);\n\n const getDirty = useCallback(() => dirtyRef.current, []);\n const getTouched = useCallback(() => touchedRef.current, []);\n\n return {\n touchedState,\n dirtyState,\n touchedRef,\n dirtyRef,\n setTouched,\n setDirty,\n resetDirty,\n resetTouched,\n isTouched,\n setFieldTouched,\n setFieldDirty,\n setTouchedState,\n setDirtyState,\n clearFieldDirty,\n isDirty,\n getDirty,\n getTouched,\n setCalculatedFieldDirty,\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-form-validating.mjs","names":[],"sources":["../../../src/hooks/use-form-validating/use-form-validating.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface $FormValidating {\n validating: boolean;\n isValidating: (path?: string) => boolean;\n setFieldValidating: (path: string, validating: boolean) => void;\n setFormValidating: (validating: boolean) => void;\n getAbortSignal: (path: string) => AbortSignal;\n clearValidating: () => void;\n}\n\nexport function useFormValidating(): $FormValidating {\n const [validatingFields, setValidatingFields] = useState<Record<string, boolean>>({});\n const [formValidating, setFormValidatingState] = useState(false);\n const validatingRef = useRef<Record<string, boolean>>({});\n const formValidatingRef = useRef(false);\n const abortControllers = useRef<Record<string, AbortController>>({});\n\n const setFieldValidating = useCallback((path: string, value: boolean) => {\n validatingRef.current = { ...validatingRef.current, [path]: value };\n setValidatingFields({ ...validatingRef.current });\n }, []);\n\n const setFormValidating = useCallback((value: boolean) => {\n formValidatingRef.current = value;\n setFormValidatingState(value);\n }, []);\n\n const isValidating = useCallback((path?: string) => {\n if (path) {\n return !!validatingRef.current[path];\n }\n if (formValidatingRef.current) {\n return true;\n }\n return Object.values(validatingRef.current).some(Boolean);\n }, []);\n\n const getAbortSignal = useCallback((path: string) => {\n abortControllers.current[path]?.abort();\n abortControllers.current[path] = new AbortController();\n return abortControllers.current[path].signal;\n }, []);\n\n const clearValidating = useCallback(() => {\n validatingRef.current = {};\n setValidatingFields({});\n formValidatingRef.current = false;\n setFormValidatingState(false);\n Object.values(abortControllers.current).forEach((c) => c.abort());\n abortControllers.current = {};\n }, []);\n\n const validating = formValidating || Object.values(validatingFields).some(Boolean);\n\n return {\n validating,\n isValidating,\n setFieldValidating,\n setFormValidating,\n getAbortSignal,\n clearValidating,\n };\n}\n"],"mappings":";;;AAWA,SAAgB,oBAAqC;CACnD,MAAM,CAAC,kBAAkB,uBAAuB,SAAkC,EAAE,CAAC;CACrF,MAAM,CAAC,gBAAgB,0BAA0B,SAAS,MAAM;CAChE,MAAM,gBAAgB,OAAgC,EAAE,CAAC;CACzD,MAAM,oBAAoB,OAAO,MAAM;CACvC,MAAM,mBAAmB,OAAwC,EAAE,CAAC;CAEpE,MAAM,qBAAqB,aAAa,MAAc,UAAmB;AACvE,gBAAc,UAAU;GAAE,GAAG,cAAc;IAAU,OAAO;GAAO;AACnE,sBAAoB,EAAE,GAAG,cAAc,SAAS,CAAC;IAChD,EAAE,CAAC;CAEN,MAAM,oBAAoB,aAAa,UAAmB;AACxD,oBAAkB,UAAU;AAC5B,yBAAuB,MAAM;IAC5B,EAAE,CAAC;CAEN,MAAM,eAAe,aAAa,SAAkB;AAClD,MAAI,KACF,QAAO,CAAC,CAAC,cAAc,QAAQ;AAEjC,MAAI,kBAAkB,QACpB,QAAO;AAET,SAAO,OAAO,OAAO,cAAc,QAAQ,CAAC,KAAK,QAAQ;IACxD,EAAE,CAAC;CAEN,MAAM,iBAAiB,aAAa,SAAiB;AACnD,mBAAiB,QAAQ,OAAO,OAAO;AACvC,mBAAiB,QAAQ,QAAQ,IAAI,iBAAiB;AACtD,SAAO,iBAAiB,QAAQ,MAAM;IACrC,EAAE,CAAC;CAEN,MAAM,kBAAkB,kBAAkB;AACxC,gBAAc,UAAU,EAAE;AAC1B,sBAAoB,EAAE,CAAC;AACvB,oBAAkB,UAAU;AAC5B,yBAAuB,MAAM;AAC7B,SAAO,OAAO,iBAAiB,QAAQ,CAAC,SAAS,MAAM,EAAE,OAAO,CAAC;AACjE,mBAAiB,UAAU,EAAE;IAC5B,EAAE,CAAC;AAIN,QAAO;EACL,YAHiB,kBAAkB,OAAO,OAAO,iBAAiB,CAAC,KAAK,QAAQ;EAIhF;EACA;EACA;EACA;EACA;EACD"}
1
+ {"version":3,"file":"use-form-validating.mjs","names":[],"sources":["../../../src/hooks/use-form-validating/use-form-validating.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface $FormValidating {\n validating: boolean;\n isValidating: (path?: string) => boolean;\n setFieldValidating: (path: string, validating: boolean) => void;\n setFormValidating: (validating: boolean) => void;\n getAbortSignal: (path: string) => AbortSignal;\n clearValidating: () => void;\n}\n\nexport function useFormValidating(): $FormValidating {\n const [validatingFields, setValidatingFields] = useState<Record<string, boolean>>({});\n const [formValidating, setFormValidatingState] = useState(false);\n const validatingRef = useRef<Record<string, boolean>>({});\n const formValidatingRef = useRef(false);\n const abortControllers = useRef<Record<string, AbortController>>({});\n\n const setFieldValidating = useCallback((path: string, value: boolean) => {\n validatingRef.current = { ...validatingRef.current, [path]: value };\n setValidatingFields({ ...validatingRef.current });\n }, []);\n\n const setFormValidating = useCallback((value: boolean) => {\n formValidatingRef.current = value;\n setFormValidatingState(value);\n }, []);\n\n const isValidating = useCallback((path?: string) => {\n if (path) {\n return !!validatingRef.current[path];\n }\n if (formValidatingRef.current) {\n return true;\n }\n return Object.values(validatingRef.current).some(Boolean);\n }, []);\n\n const getAbortSignal = useCallback((path: string) => {\n abortControllers.current[path]?.abort();\n abortControllers.current[path] = new AbortController();\n return abortControllers.current[path].signal;\n }, []);\n\n const clearValidating = useCallback(() => {\n validatingRef.current = {};\n setValidatingFields({});\n formValidatingRef.current = false;\n setFormValidatingState(false);\n Object.values(abortControllers.current).forEach((c) => c.abort());\n abortControllers.current = {};\n }, []);\n\n const validating = formValidating || Object.values(validatingFields).some(Boolean);\n\n return {\n validating,\n isValidating,\n setFieldValidating,\n setFormValidating,\n getAbortSignal,\n clearValidating,\n };\n}\n"],"mappings":";;;AAWA,SAAgB,oBAAqC;CACnD,MAAM,CAAC,kBAAkB,uBAAuB,SAAkC,CAAC,CAAC;CACpF,MAAM,CAAC,gBAAgB,0BAA0B,SAAS,KAAK;CAC/D,MAAM,gBAAgB,OAAgC,CAAC,CAAC;CACxD,MAAM,oBAAoB,OAAO,KAAK;CACtC,MAAM,mBAAmB,OAAwC,CAAC,CAAC;CAEnE,MAAM,qBAAqB,aAAa,MAAc,UAAmB;EACvE,cAAc,UAAU;GAAE,GAAG,cAAc;IAAU,OAAO;EAAM;EAClE,oBAAoB,EAAE,GAAG,cAAc,QAAQ,CAAC;CAClD,GAAG,CAAC,CAAC;CAEL,MAAM,oBAAoB,aAAa,UAAmB;EACxD,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;CAC9B,GAAG,CAAC,CAAC;CAEL,MAAM,eAAe,aAAa,SAAkB;EAClD,IAAI,MACF,OAAO,CAAC,CAAC,cAAc,QAAQ;EAEjC,IAAI,kBAAkB,SACpB,OAAO;EAET,OAAO,OAAO,OAAO,cAAc,OAAO,EAAE,KAAK,OAAO;CAC1D,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,aAAa,SAAiB;EACnD,iBAAiB,QAAQ,OAAO,MAAM;EACtC,iBAAiB,QAAQ,QAAQ,IAAI,gBAAgB;EACrD,OAAO,iBAAiB,QAAQ,MAAM;CACxC,GAAG,CAAC,CAAC;CAEL,MAAM,kBAAkB,kBAAkB;EACxC,cAAc,UAAU,CAAC;EACzB,oBAAoB,CAAC,CAAC;EACtB,kBAAkB,UAAU;EAC5B,uBAAuB,KAAK;EAC5B,OAAO,OAAO,iBAAiB,OAAO,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.mjs","names":[],"sources":["../../../src/hooks/use-form-values/use-form-values.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { getPath, setPath } from '../../paths';\nimport { FormMode } from '../../types';\n\nexport interface $FormValues<out Values extends Record<PropertyKey, any>> {\n initialized: React.RefObject<boolean>;\n stateValues: Values;\n refValues: React.RefObject<Values>;\n valuesSnapshot: React.RefObject<Values>;\n setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;\n setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;\n resetValues: () => void;\n setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;\n initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;\n getValues: () => Values;\n getValuesSnapshot: () => Values;\n resetField: <TValues extends Values>(\n path: PropertyKey,\n subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]\n ) => void;\n}\n\nexport interface SetValuesSubscriberPayload<Values> {\n path?: PropertyKey;\n updatedValues: Values;\n previousValues: Values;\n}\n\nexport interface SetValuesInput<out Values = Record<string, any>> {\n values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);\n mergeWithPreviousValues?: boolean;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\nexport type SetFieldValueSubscriber<out Values> = <TValues extends Values>(\n payload: SetValuesSubscriberPayload<TValues>\n) => void;\n\nexport interface SetFieldValueInput<Values> {\n path: PropertyKey;\n value: any;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\ninterface UseFormValuesInput<Values extends Record<PropertyKey, any>> {\n initialValues: Values | undefined;\n mode: FormMode;\n onValuesChange?: ((values: Values, previousValues: Values) => void) | undefined;\n}\n\nexport function useFormValues<Values extends Record<PropertyKey, any>>({\n initialValues,\n onValuesChange,\n mode,\n}: UseFormValuesInput<Values>): $FormValues<Values> {\n const initialized = useRef(false);\n const [stateValues, setStateValues] = useState<Values>(initialValues || ({} as Values));\n const refValues = useRef(stateValues);\n const valuesSnapshot = useRef(stateValues);\n\n const setValues = useCallback(\n ({\n values,\n subscribers,\n updateState = true,\n mergeWithPreviousValues = true,\n }: SetValuesInput<Values>) => {\n const previousValues = refValues.current;\n const resolvedValues = values instanceof Function ? values(refValues.current) : values;\n const updatedValues = mergeWithPreviousValues\n ? { ...previousValues, ...resolvedValues }\n : (resolvedValues as Values);\n refValues.current = updatedValues;\n if (updateState) {\n setStateValues(updatedValues);\n if (mode === 'uncontrolled') {\n refValues.current = updatedValues;\n }\n }\n onValuesChange?.(updatedValues, previousValues);\n subscribers\n ?.filter(Boolean)\n .forEach((subscriber) => subscriber!({ updatedValues, previousValues }));\n },\n [onValuesChange]\n );\n\n const setFieldValue = useCallback(\n (payload: SetFieldValueInput<Values>) => {\n const currentValue = getPath(payload.path, refValues.current);\n const updatedValue =\n payload.value instanceof Function ? payload.value(currentValue) : payload.value;\n\n if (currentValue !== updatedValue) {\n const previousValues = refValues.current;\n const updatedValues = setPath(payload.path, updatedValue, refValues.current);\n setValues({ values: updatedValues, updateState: payload.updateState });\n\n payload.subscribers\n ?.filter(Boolean)\n .forEach((subscriber) =>\n subscriber!({ path: payload.path, updatedValues, previousValues })\n );\n }\n },\n [setValues]\n );\n\n const setValuesSnapshot = useCallback((payload: Values) => {\n valuesSnapshot.current = payload;\n }, []);\n\n const initialize = useCallback(\n (values: Values, onInitialize: () => void) => {\n if (!initialized.current) {\n initialized.current = true;\n setValues({ values, updateState: mode === 'controlled' });\n setValuesSnapshot(values);\n onInitialize();\n }\n },\n [setValues]\n );\n\n const resetValues = useCallback(() => {\n setValues({\n values: valuesSnapshot.current,\n updateState: true,\n mergeWithPreviousValues: false,\n });\n }, [setValues]);\n\n const getValues = useCallback(() => refValues.current, []);\n const getValuesSnapshot = useCallback(() => valuesSnapshot.current, []);\n\n const resetField = useCallback(\n (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[]) => {\n const snapshotValue = getPath(path, valuesSnapshot.current);\n if (typeof snapshotValue === 'undefined') {\n return;\n }\n setFieldValue({\n path,\n value: snapshotValue,\n updateState: mode === 'controlled',\n subscribers,\n });\n },\n [setFieldValue, mode]\n );\n\n return {\n initialized,\n stateValues,\n refValues,\n valuesSnapshot,\n setValues,\n setFieldValue,\n resetValues,\n setValuesSnapshot,\n initialize,\n getValues,\n getValuesSnapshot,\n resetField,\n };\n}\n"],"mappings":";;;;;AAoDA,SAAgB,cAAuD,EACrE,eACA,gBACA,QACkD;CAClD,MAAM,cAAc,OAAO,MAAM;CACjC,MAAM,CAAC,aAAa,kBAAkB,SAAiB,iBAAkB,EAAE,CAAY;CACvF,MAAM,YAAY,OAAO,YAAY;CACrC,MAAM,iBAAiB,OAAO,YAAY;CAE1C,MAAM,YAAY,aACf,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,QAAQ,GAAG;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;GAAgB,GACvC;AACL,YAAU,UAAU;AACpB,MAAI,aAAa;AACf,kBAAe,cAAc;AAC7B,OAAI,SAAS,eACX,WAAU,UAAU;;AAGxB,mBAAiB,eAAe,eAAe;AAC/C,eACI,OAAO,QAAQ,CAChB,SAAS,eAAe,WAAY;GAAE;GAAe;GAAgB,CAAC,CAAC;IAE5E,CAAC,eAAe,CACjB;CAED,MAAM,gBAAgB,aACnB,YAAwC;EACvC,MAAM,eAAe,QAAQ,QAAQ,MAAM,UAAU,QAAQ;EAC7D,MAAM,eACJ,QAAQ,iBAAiB,WAAW,QAAQ,MAAM,aAAa,GAAG,QAAQ;AAE5E,MAAI,iBAAiB,cAAc;GACjC,MAAM,iBAAiB,UAAU;GACjC,MAAM,gBAAgB,QAAQ,QAAQ,MAAM,cAAc,UAAU,QAAQ;AAC5E,aAAU;IAAE,QAAQ;IAAe,aAAa,QAAQ;IAAa,CAAC;AAEtE,WAAQ,aACJ,OAAO,QAAQ,CAChB,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;IAAgB,CAAC,CACnE;;IAGP,CAAC,UAAU,CACZ;CAED,MAAM,oBAAoB,aAAa,YAAoB;AACzD,iBAAe,UAAU;IACxB,EAAE,CAAC;CAEN,MAAM,aAAa,aAChB,QAAgB,iBAA6B;AAC5C,MAAI,CAAC,YAAY,SAAS;AACxB,eAAY,UAAU;AACtB,aAAU;IAAE;IAAQ,aAAa,SAAS;IAAc,CAAC;AACzD,qBAAkB,OAAO;AACzB,iBAAc;;IAGlB,CAAC,UAAU,CACZ;AA6BD,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,aAlCkB,kBAAkB;AACpC,aAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;IAC1B,CAAC;KACD,CAAC,UAAU,CAAC;EA6Bb;EACA;EACA,WA7BgB,kBAAkB,UAAU,SAAS,EAAE,CAAC;EA8BxD,mBA7BwB,kBAAkB,eAAe,SAAS,EAAE,CAAC;EA8BrE,YA5BiB,aAChB,MAAmB,gBAAyE;GAC3F,MAAM,gBAAgB,QAAQ,MAAM,eAAe,QAAQ;AAC3D,OAAI,OAAO,kBAAkB,YAC3B;AAEF,iBAAc;IACZ;IACA,OAAO;IACP,aAAa,SAAS;IACtB;IACD,CAAC;KAEJ,CAAC,eAAe,KAAK,CACtB;EAeA"}
1
+ {"version":3,"file":"use-form-values.mjs","names":[],"sources":["../../../src/hooks/use-form-values/use-form-values.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport { getPath, setPath } from '../../paths';\nimport { FormMode } from '../../types';\n\nexport interface $FormValues<out Values extends Record<PropertyKey, any>> {\n initialized: React.RefObject<boolean>;\n stateValues: Values;\n refValues: React.RefObject<Values>;\n valuesSnapshot: React.RefObject<Values>;\n setValues: <TValues extends Values>(payload: SetValuesInput<TValues>) => void;\n setFieldValue: <TValues extends Values>(payload: SetFieldValueInput<TValues>) => void;\n resetValues: () => void;\n setValuesSnapshot: <TValues extends Values>(payload: TValues) => void;\n initialize: <TValues extends Values>(values: TValues, onInitialize: () => void) => void;\n getValues: () => Values;\n getValuesSnapshot: () => Values;\n resetField: <TValues extends Values>(\n path: PropertyKey,\n subscribers?: (SetFieldValueSubscriber<TValues> | null | undefined)[]\n ) => void;\n}\n\nexport interface SetValuesSubscriberPayload<Values> {\n path?: PropertyKey;\n updatedValues: Values;\n previousValues: Values;\n}\n\nexport interface SetValuesInput<out Values = Record<string, any>> {\n values: Partial<Values> | (<TValues extends Values>(values: TValues) => Partial<TValues>);\n mergeWithPreviousValues?: boolean;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\nexport type SetFieldValueSubscriber<out Values> = <TValues extends Values>(\n payload: SetValuesSubscriberPayload<TValues>\n) => void;\n\nexport interface SetFieldValueInput<Values> {\n path: PropertyKey;\n value: any;\n updateState?: boolean;\n subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[];\n}\n\ninterface UseFormValuesInput<Values extends Record<PropertyKey, any>> {\n initialValues: Values | undefined;\n mode: FormMode;\n onValuesChange?: ((values: Values, previousValues: Values) => void) | undefined;\n}\n\nexport function useFormValues<Values extends Record<PropertyKey, any>>({\n initialValues,\n onValuesChange,\n mode,\n}: UseFormValuesInput<Values>): $FormValues<Values> {\n const initialized = useRef(false);\n const [stateValues, setStateValues] = useState<Values>(initialValues || ({} as Values));\n const refValues = useRef(stateValues);\n const valuesSnapshot = useRef(stateValues);\n\n const setValues = useCallback(\n ({\n values,\n subscribers,\n updateState = true,\n mergeWithPreviousValues = true,\n }: SetValuesInput<Values>) => {\n const previousValues = refValues.current;\n const resolvedValues = values instanceof Function ? values(refValues.current) : values;\n const updatedValues = mergeWithPreviousValues\n ? { ...previousValues, ...resolvedValues }\n : (resolvedValues as Values);\n refValues.current = updatedValues;\n if (updateState) {\n setStateValues(updatedValues);\n if (mode === 'uncontrolled') {\n refValues.current = updatedValues;\n }\n }\n onValuesChange?.(updatedValues, previousValues);\n subscribers\n ?.filter(Boolean)\n .forEach((subscriber) => subscriber!({ updatedValues, previousValues }));\n },\n [onValuesChange]\n );\n\n const setFieldValue = useCallback(\n (payload: SetFieldValueInput<Values>) => {\n const currentValue = getPath(payload.path, refValues.current);\n const updatedValue =\n payload.value instanceof Function ? payload.value(currentValue) : payload.value;\n\n if (currentValue !== updatedValue) {\n const previousValues = refValues.current;\n const updatedValues = setPath(payload.path, updatedValue, refValues.current);\n setValues({ values: updatedValues, updateState: payload.updateState });\n\n payload.subscribers\n ?.filter(Boolean)\n .forEach((subscriber) =>\n subscriber!({ path: payload.path, updatedValues, previousValues })\n );\n }\n },\n [setValues]\n );\n\n const setValuesSnapshot = useCallback((payload: Values) => {\n valuesSnapshot.current = payload;\n }, []);\n\n const initialize = useCallback(\n (values: Values, onInitialize: () => void) => {\n if (!initialized.current) {\n initialized.current = true;\n setValues({ values, updateState: mode === 'controlled' });\n setValuesSnapshot(values);\n onInitialize();\n }\n },\n [setValues]\n );\n\n const resetValues = useCallback(() => {\n setValues({\n values: valuesSnapshot.current,\n updateState: true,\n mergeWithPreviousValues: false,\n });\n }, [setValues]);\n\n const getValues = useCallback(() => refValues.current, []);\n const getValuesSnapshot = useCallback(() => valuesSnapshot.current, []);\n\n const resetField = useCallback(\n (path: PropertyKey, subscribers?: (SetFieldValueSubscriber<Values> | null | undefined)[]) => {\n const snapshotValue = getPath(path, valuesSnapshot.current);\n if (typeof snapshotValue === 'undefined') {\n return;\n }\n setFieldValue({\n path,\n value: snapshotValue,\n updateState: mode === 'controlled',\n subscribers,\n });\n },\n [setFieldValue, mode]\n );\n\n return {\n initialized,\n stateValues,\n refValues,\n valuesSnapshot,\n setValues,\n setFieldValue,\n resetValues,\n setValuesSnapshot,\n initialize,\n getValues,\n getValuesSnapshot,\n resetField,\n };\n}\n"],"mappings":";;;;;AAoDA,SAAgB,cAAuD,EACrE,eACA,gBACA,QACkD;CAClD,MAAM,cAAc,OAAO,KAAK;CAChC,MAAM,CAAC,aAAa,kBAAkB,SAAiB,iBAAkB,CAAC,CAAY;CACtF,MAAM,YAAY,OAAO,WAAW;CACpC,MAAM,iBAAiB,OAAO,WAAW;CAEzC,MAAM,YAAY,aACf,EACC,QACA,aACA,cAAc,MACd,0BAA0B,WACE;EAC5B,MAAM,iBAAiB,UAAU;EACjC,MAAM,iBAAiB,kBAAkB,WAAW,OAAO,UAAU,OAAO,IAAI;EAChF,MAAM,gBAAgB,0BAClB;GAAE,GAAG;GAAgB,GAAG;EAAe,IACtC;EACL,UAAU,UAAU;EACpB,IAAI,aAAa;GACf,eAAe,aAAa;GAC5B,IAAI,SAAS,gBACX,UAAU,UAAU;EAExB;EACA,iBAAiB,eAAe,cAAc;EAC9C,aACI,OAAO,OAAO,EACf,SAAS,eAAe,WAAY;GAAE;GAAe;EAAe,CAAC,CAAC;CAC3E,GACA,CAAC,cAAc,CACjB;CAEA,MAAM,gBAAgB,aACnB,YAAwC;EACvC,MAAM,eAAe,QAAQ,QAAQ,MAAM,UAAU,OAAO;EAC5D,MAAM,eACJ,QAAQ,iBAAiB,WAAW,QAAQ,MAAM,YAAY,IAAI,QAAQ;EAE5E,IAAI,iBAAiB,cAAc;GACjC,MAAM,iBAAiB,UAAU;GACjC,MAAM,gBAAgB,QAAQ,QAAQ,MAAM,cAAc,UAAU,OAAO;GAC3E,UAAU;IAAE,QAAQ;IAAe,aAAa,QAAQ;GAAY,CAAC;GAErE,QAAQ,aACJ,OAAO,OAAO,EACf,SAAS,eACR,WAAY;IAAE,MAAM,QAAQ;IAAM;IAAe;GAAe,CAAC,CACnE;EACJ;CACF,GACA,CAAC,SAAS,CACZ;CAEA,MAAM,oBAAoB,aAAa,YAAoB;EACzD,eAAe,UAAU;CAC3B,GAAG,CAAC,CAAC;CAEL,MAAM,aAAa,aAChB,QAAgB,iBAA6B;EAC5C,IAAI,CAAC,YAAY,SAAS;GACxB,YAAY,UAAU;GACtB,UAAU;IAAE;IAAQ,aAAa,SAAS;GAAa,CAAC;GACxD,kBAAkB,MAAM;GACxB,aAAa;EACf;CACF,GACA,CAAC,SAAS,CACZ;CA6BA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,aAlCkB,kBAAkB;GACpC,UAAU;IACR,QAAQ,eAAe;IACvB,aAAa;IACb,yBAAyB;GAC3B,CAAC;EACH,GAAG,CAAC,SAAS,CA4BD;EACV;EACA;EACA,WA7BgB,kBAAkB,UAAU,SAAS,CAAC,CA6B9C;EACR,mBA7BwB,kBAAkB,eAAe,SAAS,CAAC,CA6BnD;EAChB,YA5BiB,aAChB,MAAmB,gBAAyE;GAC3F,MAAM,gBAAgB,QAAQ,MAAM,eAAe,OAAO;GAC1D,IAAI,OAAO,kBAAkB,aAC3B;GAEF,cAAc;IACZ;IACA,OAAO;IACP,aAAa,SAAS;IACtB;GACF,CAAC;EACH,GACA,CAAC,eAAe,IAAI,CAeX;CACX;AACF"}
@@ -2,7 +2,7 @@
2
2
  import { getPath } from "../../paths/get-path.mjs";
3
3
  import { useCallback, useEffect, useRef } from "react";
4
4
  //#region packages/@mantine/form/src/hooks/use-form-watch/use-form-watch.ts
5
- function useFormWatch({ $status, cascadeUpdates }) {
5
+ function useFormWatch({ $values, $status, cascadeUpdates }) {
6
6
  const subscribers = useRef({});
7
7
  return {
8
8
  subscribers,
@@ -33,6 +33,16 @@ function useFormWatch({ $status, cascadeUpdates }) {
33
33
  })));
34
34
  }
35
35
  return result;
36
+ }, []),
37
+ notifyWatchSubscribers: useCallback((previousValues) => {
38
+ Object.keys(subscribers.current).forEach((path) => {
39
+ if (getPath(path, $values.refValues.current) !== getPath(path, previousValues)) subscribers.current[path]?.forEach((cb) => cb({
40
+ previousValue: getPath(path, previousValues),
41
+ value: getPath(path, $values.refValues.current),
42
+ touched: $status.isTouched(path),
43
+ dirty: $status.isDirty(path)
44
+ }));
45
+ });
36
46
  }, [])
37
47
  };
38
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-form-watch.mjs","names":[],"sources":["../../../src/hooks/use-form-watch/use-form-watch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { getPath } from '../../paths';\nimport { 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":";;;;AAYA,SAAgB,aAGd,EAAE,SAAS,kBAA6C;CACxD,MAAM,cAAc,OAA4D,EAAE,CAAQ;AA+C1F,QAAO;EACL;EACA,OA/CkC,aAAa,MAAM,aAAa;AAClE,mBAAgB;AACd,gBAAY,QAAQ,QAAQ,YAAY,QAAQ,SAAS,EAAE;AAC3D,gBAAY,QAAQ,MAAM,KAAK,SAAS;AAExC,iBAAa;AACX,iBAAY,QAAQ,QAAQ,YAAY,QAAQ,MAAM,QAAQ,OAAO,OAAO,SAAS;;MAEtF,CAAC,SAAS,CAAC;KACb,EAAE,CAAC;EAuCJ,qBArC0B,aAAa,SAAgB;GACvD,MAAM,SACJ,YAAY,QAAQ,OAAO,KACxB,cAAc,UACb,SAAS;IACP,eAAe,QAAQ,MAAM,MAAM,eAAe;IAClD,OAAO,QAAQ,MAAM,MAAM,cAAc;IACzC,SAAS,QAAQ,UAAU,KAAK;IAChC,OAAO,QAAQ,QAAQ,KAAK;IAC7B,CAAC,CACL,IAAI,EAAE;AAET,QAAK,MAAM,mBAAmB,YAAY,SAAS;IACjD,MAAM,WAAW,OAAO,KAAK,CAAC,WAAW,GAAG,gBAAgB,GAAG;IAC/D,MAAM,UAAU,OAAO,gBAAgB,CAAC,WAAW,GAAG,KAAK,GAAG;AAE9D,QAAI,YAAa,kBAAkB,QACjC,QAAO,KACL,GAAG,YAAY,QAAQ,iBAAiB,KACrC,QAAQ,UACP,GAAG;KACD,eAAe,QAAQ,iBAAiB,MAAM,eAAe;KAC7D,OAAO,QAAQ,iBAAiB,MAAM,cAAc;KACpD,SAAS,QAAQ,UAAU,gBAAgB;KAC3C,OAAO,QAAQ,QAAQ,gBAAgB;KACxC,CAAC,CACL,CACF;;AAIL,UAAO;KACN,EAAE,CAAC;EAML"}
1
+ {"version":3,"file":"use-form-watch.mjs","names":[],"sources":["../../../src/hooks/use-form-watch/use-form-watch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { getPath } from '../../paths';\nimport { FormPathValue, LooseKeys } from '../../paths.types';\nimport { FormFieldSubscriber, Watch } from '../../types';\nimport { $FormStatus } from '../use-form-status/use-form-status';\nimport { $FormValues, SetValuesSubscriberPayload } from '../use-form-values/use-form-values';\n\ninterface UseFormWatchInput<out Values extends Record<PropertyKey, any>> {\n $values: $FormValues<Values>;\n $status: $FormStatus<Values>;\n cascadeUpdates?: boolean;\n}\n\nexport interface $FormWatch<Values extends Record<PropertyKey, any>> {\n subscribers: React.RefObject<Record<string, FormFieldSubscriber<Values, any>[]>>;\n watch: Watch<Values, any>;\n getFieldSubscribers: (path: any) => ((input: SetValuesSubscriberPayload<Values>) => void)[];\n notifyWatchSubscribers: (previousValues: Values) => void;\n}\n\nexport function useFormWatch<\n Values extends Record<PropertyKey, any>,\n Field extends LooseKeys<Values> = LooseKeys<Values>,\n>({ $values, $status, cascadeUpdates }: UseFormWatchInput<Values>) {\n const subscribers = useRef<Record<Field, FormFieldSubscriber<Values, Field>[]>>({} as any);\n\n const watch: Watch<Values, Field> = useCallback((path, callback) => {\n useEffect(() => {\n subscribers.current[path] = subscribers.current[path] || [];\n subscribers.current[path].push(callback);\n\n return () => {\n subscribers.current[path] = subscribers.current[path].filter((cb) => cb !== callback);\n };\n }, [callback]);\n }, []);\n\n const getFieldSubscribers = useCallback((path: Field) => {\n const result: ((input: SetValuesSubscriberPayload<Values>) => void)[] =\n subscribers.current[path]?.map(\n (callback) => (input: SetValuesSubscriberPayload<Values>) =>\n callback({\n previousValue: getPath(path, input.previousValues) as any,\n value: getPath(path, input.updatedValues) as any,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n ) ?? [];\n\n for (const subscriptionKey in subscribers.current) {\n const isParent = String(path).startsWith(`${subscriptionKey}.`);\n const isChild = String(subscriptionKey).startsWith(`${path}.`);\n\n if (isParent || (cascadeUpdates && isChild)) {\n result.push(\n ...subscribers.current[subscriptionKey].map(\n (cb) => (input: SetValuesSubscriberPayload<Values>) =>\n cb({\n previousValue: getPath(subscriptionKey, input.previousValues) as any,\n value: getPath(subscriptionKey, input.updatedValues) as any,\n touched: $status.isTouched(subscriptionKey),\n dirty: $status.isDirty(subscriptionKey),\n })\n )\n );\n }\n }\n\n return result;\n }, []);\n\n const notifyWatchSubscribers = useCallback((previousValues: Values) => {\n Object.keys(subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n subscribers.current[path as Field]?.forEach((cb) =>\n cb({\n previousValue: getPath(path, previousValues) as FormPathValue<Values, Field>,\n value: getPath(path, $values.refValues.current) as FormPathValue<Values, Field>,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n );\n }\n });\n }, []);\n\n return {\n subscribers,\n watch,\n getFieldSubscribers,\n notifyWatchSubscribers,\n };\n}\n"],"mappings":";;;;AAoBA,SAAgB,aAGd,EAAE,SAAS,SAAS,kBAA6C;CACjE,MAAM,cAAc,OAA4D,CAAC,CAAQ;CAiEzF,OAAO;EACL;EACA,OAjEkC,aAAa,MAAM,aAAa;GAClE,gBAAgB;IACd,YAAY,QAAQ,QAAQ,YAAY,QAAQ,SAAS,CAAC;IAC1D,YAAY,QAAQ,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,qBAvD0B,aAAa,SAAgB;GACvD,MAAM,SACJ,YAAY,QAAQ,OAAO,KACxB,cAAc,UACb,SAAS;IACP,eAAe,QAAQ,MAAM,MAAM,cAAc;IACjD,OAAO,QAAQ,MAAM,MAAM,aAAa;IACxC,SAAS,QAAQ,UAAU,IAAI;IAC/B,OAAO,QAAQ,QAAQ,IAAI;GAC7B,CAAC,CACL,KAAK,CAAC;GAER,KAAK,MAAM,mBAAmB,YAAY,SAAS;IACjD,MAAM,WAAW,OAAO,IAAI,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,eAAe,QAAQ,iBAAiB,MAAM,cAAc;KAC5D,OAAO,QAAQ,iBAAiB,MAAM,aAAa;KACnD,SAAS,QAAQ,UAAU,eAAe;KAC1C,OAAO,QAAQ,QAAQ,eAAe;IACxC,CAAC,CACL,CACF;GAEJ;GAEA,OAAO;EACT,GAAG,CAAC,CAuBgB;EAClB,wBAtB6B,aAAa,mBAA2B;GACrE,OAAO,KAAK,YAAY,OAAO,EAAE,SAAS,SAAS;IAIjD,IAHc,QAAQ,MAAM,QAAQ,UAAU,OAGtC,MAFc,QAAQ,MAAM,cAEV,GACxB,YAAY,QAAQ,OAAgB,SAAS,OAC3C,GAAG;KACD,eAAe,QAAQ,MAAM,cAAc;KAC3C,OAAO,QAAQ,MAAM,QAAQ,UAAU,OAAO;KAC9C,SAAS,QAAQ,UAAU,IAAI;KAC/B,OAAO,QAAQ,QAAQ,IAAI;IAC7B,CAAC,CACH;GAEJ,CAAC;EACH,GAAG,CAAC,CAMmB;CACvB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"change-error-indices.mjs","names":[],"sources":["../../src/lists/change-error-indices.ts"],"sourcesContent":["import { clearListState } from './clear-list-state';\n\n/**\n * Gets the part of the key after the path which can be an index\n */\nfunction getIndexFromKeyAfterPath(key: string, path: string): number {\n const split = key.substring(path.length + 1).split('.')[0];\n return parseInt(split, 10);\n}\n\n/**\n * Changes the indices of every error that is after the given `index` with the given `change` at the given `path`.\n * This requires that the errors are in the format of `path.index` and that the index is a number.\n */\nexport function changeErrorIndices<T extends Record<PropertyKey, any>>(\n path: PropertyKey,\n index: number | undefined,\n errors: T,\n change: 1 | -1\n): T {\n if (index === undefined) {\n return errors;\n }\n const pathString = `${String(path)}`;\n let clearedErrors = errors;\n // Remove all errors if the corresponding item was removed\n if (change === -1) {\n clearedErrors = clearListState(`${pathString}.${index}`, clearedErrors);\n }\n\n const cloned = { ...clearedErrors };\n const changedKeys = new Set<string>();\n Object.entries(clearedErrors)\n .filter(([key]) => {\n if (!key.startsWith(`${pathString}.`)) {\n return false;\n }\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n if (Number.isNaN(currIndex)) {\n return false;\n }\n return currIndex >= index;\n })\n .forEach(([key, value]) => {\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n\n const newKey: keyof T = key.replace(\n `${pathString}.${currIndex}`,\n `${pathString}.${currIndex + change}`\n );\n cloned[newKey] = value;\n changedKeys.add(newKey);\n if (!changedKeys.has(key)) {\n delete cloned[key];\n }\n });\n\n return cloned;\n}\n"],"mappings":";;;;;;AAKA,SAAS,yBAAyB,KAAa,MAAsB;CACnE,MAAM,QAAQ,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC;AACxD,QAAO,SAAS,OAAO,GAAG;;;;;;AAO5B,SAAgB,mBACd,MACA,OACA,QACA,QACG;AACH,KAAI,UAAU,KAAA,EACZ,QAAO;CAET,MAAM,aAAa,GAAG,OAAO,KAAK;CAClC,IAAI,gBAAgB;AAEpB,KAAI,WAAW,GACb,iBAAgB,eAAe,GAAG,WAAW,GAAG,SAAS,cAAc;CAGzE,MAAM,SAAS,EAAE,GAAG,eAAe;CACnC,MAAM,8BAAc,IAAI,KAAa;AACrC,QAAO,QAAQ,cAAc,CAC1B,QAAQ,CAAC,SAAS;AACjB,MAAI,CAAC,IAAI,WAAW,GAAG,WAAW,GAAG,CACnC,QAAO;EAET,MAAM,YAAY,yBAAyB,KAAK,WAAW;AAC3D,MAAI,OAAO,MAAM,UAAU,CACzB,QAAO;AAET,SAAO,aAAa;GACpB,CACD,SAAS,CAAC,KAAK,WAAW;EACzB,MAAM,YAAY,yBAAyB,KAAK,WAAW;EAE3D,MAAM,SAAkB,IAAI,QAC1B,GAAG,WAAW,GAAG,aACjB,GAAG,WAAW,GAAG,YAAY,SAC9B;AACD,SAAO,UAAU;AACjB,cAAY,IAAI,OAAO;AACvB,MAAI,CAAC,YAAY,IAAI,IAAI,CACvB,QAAO,OAAO;GAEhB;AAEJ,QAAO"}
1
+ {"version":3,"file":"change-error-indices.mjs","names":[],"sources":["../../src/lists/change-error-indices.ts"],"sourcesContent":["import { clearListState } from './clear-list-state';\n\n/**\n * Gets the part of the key after the path which can be an index\n */\nfunction getIndexFromKeyAfterPath(key: string, path: string): number {\n const split = key.substring(path.length + 1).split('.')[0];\n return parseInt(split, 10);\n}\n\n/**\n * Changes the indices of every error that is after the given `index` with the given `change` at the given `path`.\n * This requires that the errors are in the format of `path.index` and that the index is a number.\n */\nexport function changeErrorIndices<T extends Record<PropertyKey, any>>(\n path: PropertyKey,\n index: number | undefined,\n errors: T,\n change: 1 | -1\n): T {\n if (index === undefined) {\n return errors;\n }\n const pathString = `${String(path)}`;\n let clearedErrors = errors;\n // Remove all errors if the corresponding item was removed\n if (change === -1) {\n clearedErrors = clearListState(`${pathString}.${index}`, clearedErrors);\n }\n\n const cloned = { ...clearedErrors };\n const changedKeys = new Set<string>();\n Object.entries(clearedErrors)\n .filter(([key]) => {\n if (!key.startsWith(`${pathString}.`)) {\n return false;\n }\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n if (Number.isNaN(currIndex)) {\n return false;\n }\n return currIndex >= index;\n })\n .forEach(([key, value]) => {\n const currIndex = getIndexFromKeyAfterPath(key, pathString);\n\n const newKey: keyof T = key.replace(\n `${pathString}.${currIndex}`,\n `${pathString}.${currIndex + change}`\n );\n cloned[newKey] = value;\n changedKeys.add(newKey);\n if (!changedKeys.has(key)) {\n delete cloned[key];\n }\n });\n\n return cloned;\n}\n"],"mappings":";;;;;;AAKA,SAAS,yBAAyB,KAAa,MAAsB;CACnE,MAAM,QAAQ,IAAI,UAAU,KAAK,SAAS,CAAC,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,gBAAgB,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.mjs","names":[],"sources":["../../src/lists/clear-list-state.ts"],"sourcesContent":["export function clearListState<T extends Record<PropertyKey, any>>(\n field: PropertyKey,\n state: T\n): T {\n if (state === null || typeof state !== 'object') {\n return {} as T;\n }\n\n const clone = { ...state };\n Object.keys(state).forEach((errorKey) => {\n if (errorKey.includes(`${String(field)}.`)) {\n delete clone[errorKey];\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAAA,SAAgB,eACd,OACA,OACG;AACH,KAAI,UAAU,QAAQ,OAAO,UAAU,SACrC,QAAO,EAAE;CAGX,MAAM,QAAQ,EAAE,GAAG,OAAO;AAC1B,QAAO,KAAK,MAAM,CAAC,SAAS,aAAa;AACvC,MAAI,SAAS,SAAS,GAAG,OAAO,MAAM,CAAC,GAAG,CACxC,QAAO,MAAM;GAEf;AAEF,QAAO"}
1
+ {"version":3,"file":"clear-list-state.mjs","names":[],"sources":["../../src/lists/clear-list-state.ts"],"sourcesContent":["export function clearListState<T extends Record<PropertyKey, any>>(\n field: PropertyKey,\n state: T\n): T {\n if (state === null || typeof state !== 'object') {\n return {} as T;\n }\n\n const clone = { ...state };\n Object.keys(state).forEach((errorKey) => {\n if (errorKey.includes(`${String(field)}.`)) {\n delete clone[errorKey];\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAAA,SAAgB,eACd,OACA,OACG;CACH,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OAAO,CAAC;CAGV,MAAM,QAAQ,EAAE,GAAG,MAAM;CACzB,OAAO,KAAK,KAAK,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.mjs","names":[],"sources":["../../src/lists/reorder-errors.ts"],"sourcesContent":["import { ReorderPayload } from '../types';\n\nexport function reorderErrors<T>(path: unknown, { from, to }: ReorderPayload, errors: T): T {\n const oldKeyStart = `${path}.${from}`;\n const newKeyStart = `${path}.${to}`;\n\n const clone: any = { ...errors };\n const processedKeys = new Set<string>();\n\n Object.keys(errors as any).forEach((key) => {\n if (processedKeys.has(key)) {\n return;\n }\n\n let oldKey;\n let newKey;\n\n if (key.startsWith(oldKeyStart)) {\n oldKey = key;\n newKey = key.replace(oldKeyStart, newKeyStart);\n } else if (key.startsWith(newKeyStart)) {\n oldKey = key.replace(newKeyStart, oldKeyStart);\n newKey = key;\n }\n\n if (oldKey && newKey) {\n const value1 = clone[oldKey];\n const value2 = clone[newKey];\n\n value2 === undefined ? delete clone[oldKey] : (clone[oldKey] = value2);\n value1 === undefined ? delete clone[newKey] : (clone[newKey] = value1);\n\n processedKeys.add(oldKey);\n processedKeys.add(newKey);\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAEA,SAAgB,cAAiB,MAAe,EAAE,MAAM,MAAsB,QAAc;CAC1F,MAAM,cAAc,GAAG,KAAK,GAAG;CAC/B,MAAM,cAAc,GAAG,KAAK,GAAG;CAE/B,MAAM,QAAa,EAAE,GAAG,QAAQ;CAChC,MAAM,gCAAgB,IAAI,KAAa;AAEvC,QAAO,KAAK,OAAc,CAAC,SAAS,QAAQ;AAC1C,MAAI,cAAc,IAAI,IAAI,CACxB;EAGF,IAAI;EACJ,IAAI;AAEJ,MAAI,IAAI,WAAW,YAAY,EAAE;AAC/B,YAAS;AACT,YAAS,IAAI,QAAQ,aAAa,YAAY;aACrC,IAAI,WAAW,YAAY,EAAE;AACtC,YAAS,IAAI,QAAQ,aAAa,YAAY;AAC9C,YAAS;;AAGX,MAAI,UAAU,QAAQ;GACpB,MAAM,SAAS,MAAM;GACrB,MAAM,SAAS,MAAM;AAErB,cAAW,KAAA,IAAY,OAAO,MAAM,UAAW,MAAM,UAAU;AAC/D,cAAW,KAAA,IAAY,OAAO,MAAM,UAAW,MAAM,UAAU;AAE/D,iBAAc,IAAI,OAAO;AACzB,iBAAc,IAAI,OAAO;;GAE3B;AAEF,QAAO"}
1
+ {"version":3,"file":"reorder-errors.mjs","names":[],"sources":["../../src/lists/reorder-errors.ts"],"sourcesContent":["import { ReorderPayload } from '../types';\n\nexport function reorderErrors<T>(path: unknown, { from, to }: ReorderPayload, errors: T): T {\n const oldKeyStart = `${path}.${from}`;\n const newKeyStart = `${path}.${to}`;\n\n const clone: any = { ...errors };\n const processedKeys = new Set<string>();\n\n Object.keys(errors as any).forEach((key) => {\n if (processedKeys.has(key)) {\n return;\n }\n\n let oldKey;\n let newKey;\n\n if (key.startsWith(oldKeyStart)) {\n oldKey = key;\n newKey = key.replace(oldKeyStart, newKeyStart);\n } else if (key.startsWith(newKeyStart)) {\n oldKey = key.replace(newKeyStart, oldKeyStart);\n newKey = key;\n }\n\n if (oldKey && newKey) {\n const value1 = clone[oldKey];\n const value2 = clone[newKey];\n\n value2 === undefined ? delete clone[oldKey] : (clone[oldKey] = value2);\n value1 === undefined ? delete clone[newKey] : (clone[newKey] = value1);\n\n processedKeys.add(oldKey);\n processedKeys.add(newKey);\n }\n });\n\n return clone;\n}\n"],"mappings":";;AAEA,SAAgB,cAAiB,MAAe,EAAE,MAAM,MAAsB,QAAc;CAC1F,MAAM,cAAc,GAAG,KAAK,GAAG;CAC/B,MAAM,cAAc,GAAG,KAAK,GAAG;CAE/B,MAAM,QAAa,EAAE,GAAG,OAAO;CAC/B,MAAM,gCAAgB,IAAI,IAAY;CAEtC,OAAO,KAAK,MAAa,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.mjs","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;AAChF,QAAO,WAAW,GAAG,SAAS,GAAG,UAAU,UAAU,KAAK,UAAU,UAAU"}
1
+ {"version":3,"file":"get-data-path.mjs","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.mjs","names":[],"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,eAAe,gBAAgB,KAAK;AAE1C,KAAI,aAAa,WAAW,KAAK,OAAO,WAAW,YAAY,WAAW,KACxE;CAGF,IAAI,QAAQ,OAAO,aAAa;AAChC,MAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,GAAG;AAC/C,MAAI,SAAS,KACX;AAGF,UAAQ,MAAM,aAAa;;AAG7B,QAAO"}
1
+ {"version":3,"file":"get-path.mjs","names":[],"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,eAAe,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.mjs","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;AAC7C,KAAI,OAAO,SAAS,SAClB,QAAO,EAAE;AAGX,QAAO,KAAK,MAAM,IAAI"}
1
+ {"version":3,"file":"get-splitted-path.mjs","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.mjs","names":[],"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,eAAe,QAAQ,MAAM,OAAO;AAE1C,KAAI,CAAC,MAAM,QAAQ,aAAa,CAC9B,QAAO;CAGT,MAAM,SAAS,CAAC,GAAG,aAAa;AAChC,QAAO,OAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,QAAQ,GAAG,MAAM;AAE1E,QAAO,QAAQ,MAAM,QAAQ,OAAO"}
1
+ {"version":3,"file":"insert-path.mjs","names":[],"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,eAAe,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,OAAO,QAAQ,MAAM,QAAQ,MAAM;AACrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"remove-path.mjs","names":[],"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,eAAe,QAAQ,MAAM,OAAO;AAE1C,KAAI,CAAC,MAAM,QAAQ,aAAa,CAC9B,QAAO;AAGT,QAAO,QACL,MACA,aAAa,QAAQ,GAAG,cAAc,cAAc,MAAM,EAC1D,OACD"}
1
+ {"version":3,"file":"remove-path.mjs","names":[],"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,eAAe,QAAQ,MAAM,MAAM;CAEzC,IAAI,CAAC,MAAM,QAAQ,YAAY,GAC7B,OAAO;CAGT,OAAO,QACL,MACA,aAAa,QAAQ,GAAG,cAAc,cAAc,KAAK,GACzD,MACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"reorder-path.mjs","names":[],"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,eAAe,QAAQ,MAAM,OAAO;AAE1C,KAAI,CAAC,MAAM,QAAQ,aAAa,CAC9B,QAAO;CAGT,MAAM,SAAS,CAAC,GAAG,aAAa;CAChC,MAAM,OAAO,aAAa;AAC1B,QAAO,OAAO,MAAM,EAAE;AACtB,QAAO,OAAO,IAAI,GAAG,KAAK;AAE1B,QAAO,QAAQ,MAAM,QAAQ,OAAO"}
1
+ {"version":3,"file":"reorder-path.mjs","names":[],"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,eAAe,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,OAAO,QAAQ,MAAM,QAAQ,MAAM;AACrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"replace-path.mjs","names":[],"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,eAAe,QAAQ,MAAM,OAAO;AAE1C,KAAI,CAAC,MAAM,QAAQ,aAAa,CAC9B,QAAO;AAGT,KAAI,aAAa,UAAU,MACzB,QAAO;CAGT,MAAM,SAAS,CAAC,GAAG,aAAa;AAChC,QAAO,SAAS;AAEhB,QAAO,QAAQ,MAAM,QAAQ,OAAO"}
1
+ {"version":3,"file":"replace-path.mjs","names":[],"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,eAAe,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,OAAO,QAAQ,MAAM,QAAQ,MAAM;AACrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"set-path.mjs","names":[],"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,eAAe,gBAAgB,KAAK;AAE1C,KAAI,aAAa,WAAW,EAC1B,QAAO;CAGT,MAAM,SAAc,MAAM,OAAO;AAEjC,KAAI,aAAa,WAAW,GAAG;AAC7B,SAAO,aAAa,MAAM;AAC1B,SAAO;;CAGT,IAAI,MAAM,OAAO,aAAa;AAE9B,MAAK,IAAI,IAAI,GAAG,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG;AACnD,MAAI,QAAQ,KAAA,EACV,QAAO;AAGT,QAAM,IAAI,aAAa;;AAGzB,KAAI,aAAa,aAAa,SAAS,MAAM;AAE7C,QAAO"}
1
+ {"version":3,"file":"set-path.mjs","names":[],"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,eAAe,gBAAgB,IAAI;CAEzC,IAAI,aAAa,WAAW,GAC1B,OAAO;CAGT,MAAM,SAAc,MAAM,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.mjs","names":[],"sources":["../src/schema-resolver.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { filterErrors } from './hooks/use-form-errors/filter-errors/filter-errors';\nimport type { FormErrors } from './types';\n\nfunction issuesToFormErrors(issues: ReadonlyArray<StandardSchemaV1.Issue>): FormErrors {\n const errors: FormErrors = {};\n for (const issue of issues) {\n const path = issue.path\n ? issue.path.map((segment) => (typeof segment === 'object' ? segment.key : segment)).join('.')\n : '';\n if (!errors[path]) {\n errors[path] = issue.message;\n }\n }\n return filterErrors(errors);\n}\n\nexport function schemaResolver<Sync extends boolean = false>(\n schema: StandardSchemaV1,\n _options?: { sync?: Sync }\n): Sync extends true ? (values: any) => FormErrors : (values: any) => Promise<FormErrors> {\n const sync = _options?.sync ?? false;\n return ((values: any) => {\n const result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n return result.then((resolved) =>\n resolved.issues ? issuesToFormErrors(resolved.issues) : {}\n );\n }\n const errors = result.issues ? issuesToFormErrors(result.issues) : {};\n return sync ? errors : Promise.resolve(errors);\n }) as any;\n}\n"],"mappings":";;;AAIA,SAAS,mBAAmB,QAA2D;CACrF,MAAM,SAAqB,EAAE;AAC7B,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,MAAM,OACf,MAAM,KAAK,KAAK,YAAa,OAAO,YAAY,WAAW,QAAQ,MAAM,QAAS,CAAC,KAAK,IAAI,GAC5F;AACJ,MAAI,CAAC,OAAO,MACV,QAAO,QAAQ,MAAM;;AAGzB,QAAO,aAAa,OAAO;;AAG7B,SAAgB,eACd,QACA,UACwF;CACxF,MAAM,OAAO,UAAU,QAAQ;AAC/B,UAAS,WAAgB;EACvB,MAAM,SAAS,OAAO,aAAa,SAAS,OAAO;AACnD,MAAI,kBAAkB,QACpB,QAAO,OAAO,MAAM,aAClB,SAAS,SAAS,mBAAmB,SAAS,OAAO,GAAG,EAAE,CAC3D;EAEH,MAAM,SAAS,OAAO,SAAS,mBAAmB,OAAO,OAAO,GAAG,EAAE;AACrE,SAAO,OAAO,SAAS,QAAQ,QAAQ,OAAO"}
1
+ {"version":3,"file":"schema-resolver.mjs","names":[],"sources":["../src/schema-resolver.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { filterErrors } from './hooks/use-form-errors/filter-errors/filter-errors';\nimport type { FormErrors } from './types';\n\nfunction issuesToFormErrors(issues: ReadonlyArray<StandardSchemaV1.Issue>): FormErrors {\n const errors: FormErrors = {};\n for (const issue of issues) {\n const path = issue.path\n ? issue.path.map((segment) => (typeof segment === 'object' ? segment.key : segment)).join('.')\n : '';\n if (!errors[path]) {\n errors[path] = issue.message;\n }\n }\n return filterErrors(errors);\n}\n\nexport function schemaResolver<Sync extends boolean = false>(\n schema: StandardSchemaV1,\n _options?: { sync?: Sync }\n): Sync extends true ? (values: any) => FormErrors : (values: any) => Promise<FormErrors> {\n const sync = _options?.sync ?? false;\n return ((values: any) => {\n const result = schema['~standard'].validate(values);\n if (result instanceof Promise) {\n return result.then((resolved) =>\n resolved.issues ? issuesToFormErrors(resolved.issues) : {}\n );\n }\n const errors = result.issues ? issuesToFormErrors(result.issues) : {};\n return sync ? errors : Promise.resolve(errors);\n }) as any;\n}\n"],"mappings":";;;AAIA,SAAS,mBAAmB,QAA2D;CACrF,MAAM,SAAqB,CAAC;CAC5B,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAO,MAAM,OACf,MAAM,KAAK,KAAK,YAAa,OAAO,YAAY,WAAW,QAAQ,MAAM,OAAQ,EAAE,KAAK,GAAG,IAC3F;EACJ,IAAI,CAAC,OAAO,OACV,OAAO,QAAQ,MAAM;CAEzB;CACA,OAAO,aAAa,MAAM;AAC5B;AAEA,SAAgB,eACd,QACA,UACwF;CACxF,MAAM,OAAO,UAAU,QAAQ;CAC/B,SAAS,WAAgB;EACvB,MAAM,SAAS,OAAO,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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-field.mjs","names":[],"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":";;;;;AAgIA,SAAgB,SAId,EACA,OAAO,cACP,qBAAqB,MACrB,cACA,eAAe,MACf,iBAAiB,OACjB,eACA,mBAAmB,OACnB,iBAAiB,OACjB,UACA,wBACA,OAAO,WACqE;CAC5E,MAAM,CAAC,YAAY,iBAAiB,SAAS,aAAa;CAC1D,MAAM,WAAW,OAAO,WAAW;CACnC,MAAM,CAAC,KAAK,UAAU,SAAS,EAAE;CACjC,MAAM,CAAC,OAAO,YAAY,SAA0B,gBAAgB,KAAK;CACzE,MAAM,aAAa,OAAO,kBAAkB,MAAM;CAClD,MAAM,GAAG,mBAAmB,SAAS,WAAW,QAAQ;CACxD,MAAM,CAAC,cAAc,mBAAmB,SAAS,MAAM;CACvD,MAAM,gBAAuC,cACrC,4BAA4B,QAAQ,MAC1C,CAAC,uBAAuB,CACzB;CAED,MAAM,aAAa,aAAa,KAAc,EAAE,cAAc,SAAS,iBAAiB,EAAE,KAAK;AAC7F,aAAW,UAAU;AACrB,iBAAe,gBAAgB,IAAI;IAClC,EAAE,CAAC;CAEN,MAAM,WAAW,aAEb,OACA,EACE,YAAY,SAAS,gBACrB,cAAc,SAAS,iBACJ,EAAE,KACpB;AACH,MAAI,SAAS,YAAY,MACvB;AAGF,WAAS,UAAU;AAEnB,kBAAgB,MAAM;AAEtB,MAAI,sBAAsB,UAAU,KAClC,UAAS,KAAK;AAGhB,MAAI,YACF,eAAc,MAAM;AAGtB,MAAI,UACF,SAAQ,eAAe,aAAa,EAAE;AAGxC,MAAI,iBACF,YAAW;IAGf;EAAC;EAAO;EAAoB;EAAc,CAC3C;CAED,MAAM,QAAQ,kBAAkB;AAC9B,WAAS,aAAa;AACtB,WAAS,KAAK;AACd,aAAW,MAAM;IAChB,CAAC,aAAa,CAAC;CAElB,MAAM,WAAW,kBAAkB,SAAS,SAAS,EAAE,CAAC;CAExD,MAAM,YAAY,kBAAkB,WAAW,SAAS,EAAE,CAAC;CAE3D,MAAM,UAAU,kBAAkB,SAAS,YAAY,cAAc,CAAC,aAAa,CAAC;CAEpF,MAAM,YAAY,YAAY,YAAY;EACxC,MAAM,mBAAmB,WAAW,SAAS,QAAQ;AAErD,MAAI,4BAA4B,SAAS;AACvC,mBAAgB,KAAK;AACrB,OAAI;IACF,MAAM,SAAS,MAAM;AACrB,oBAAgB,MAAM;AACtB,aAAS,OAAO;YACT,KAAK;AACZ,oBAAgB,MAAM;IACtB,MAAM,gBAAgB,cAAc,IAAI;AACxC,aAAS,cAAc;AACvB,WAAO;;SAEJ;AACL,YAAS,iBAAiB;AAC1B,UAAO;;IAER,EAAE,CAAC;CAEN,MAAM,iBAAiB,EAAE,YAAY,MAAM,YAAY,MAAM,GAAG,iBAAsB,EAAE,KAAK;EAG3F,MAAM,UAAe,EAAE,UAFN,kBAAqB,QAAQ,SAAS,KAAY,EAAE,WAAW,OAAO,CAAC,CAAC,EAExD;AAEjC,MAAI,UACF,SAAQ,QAAQ;AAGlB,MAAI,SAAS,WACX,SAAQ,SAAS,eAAe,YAAY,oBAAoB,SAAS;WAChE,SAAS,SAAS;AAC3B,WAAQ,SAAS,eAAe,YAAY,oBAC1C,SAAS,YAAY,aAAa;AACpC,WAAQ,QAAQ,aAAa;QAE7B,SAAQ,SAAS,eAAe,UAAU,kBAAkB,SAAS;AAGvE,MAAI,WAAW;AACb,WAAQ,gBAAgB;AACtB,eAAW,KAAK;;AAGlB,WAAQ,eAAe;AACrB,QAAI,uBAAuB,IAAI,CAAC,CAAC,eAAe,CAC9C,YAAW;;;AAKjB,SAAO;;AAKT,QAAO;EACL;EACA;EACA;EACA;EACA;EAEA;EACA,UAAU;EAEV;EACA;EAEA;EACA;EACA,cAjBmB,kBAAkB,WAAW,MAAM,EAAE,EAAE,CAAC;EAkB5D"}
1
+ {"version":3,"file":"use-field.mjs","names":[],"sources":["../src/use-field.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { getInputOnChange } from './get-input-on-change';\nimport { FormMode, GetInputPropsType } from './types';\nimport { shouldValidateOnChange } from './validate';\n\ntype UseFieldErrorResolver = (error: unknown) => React.ReactNode;\n\nexport interface UseFieldInput<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Field mode, controlled by default */\n mode?: Mode;\n\n /** Initial field value */\n initialValue: T;\n\n /** Initial touched value */\n initialTouched?: boolean;\n\n /** Initial field error message */\n initialError?: React.ReactNode;\n\n /** Called with updated value when the field value changes */\n onValueChange?: (value: T) => void;\n\n /** Determines whether the field should be validated when value changes, false by default */\n validateOnChange?: boolean;\n\n /** Determines whether the field should be validated when it loses focus, false by default */\n validateOnBlur?: boolean;\n\n /** Determines whether the field should clear error message when value changes, true by default */\n clearErrorOnChange?: boolean;\n\n /** A function to validate field value, can be sync or async */\n validate?: (value: T) => React.ReactNode | Promise<React.ReactNode>;\n\n /** Field type, input by default */\n type?: FieldType;\n\n /** A function to resolve validation error from the result returned from validate function, should return react node */\n resolveValidationError?: UseFieldErrorResolver;\n}\n\ninterface SetValueOptions {\n updateState?: boolean;\n updateKey?: boolean;\n}\n\ninterface GetInputPropsOptions {\n withError?: boolean;\n withFocus?: boolean;\n [key: string]: any;\n}\n\ninterface GetInputPropsSharedReturn {\n error?: React.ReactNode;\n onFocus?: () => void;\n onBlur: () => void;\n onChange: (value: any) => void;\n}\n\ntype GetInputPropsTypeValue<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = FieldType extends 'checkbox'\n ? Mode extends 'controlled'\n ? { checked: boolean }\n : { defaultChecked: boolean }\n : FieldType extends 'radio'\n ? Mode extends 'controlled'\n ? { checked: boolean; value: T }\n : { defaultChecked: boolean; value: T }\n : Mode extends 'controlled'\n ? { value: T }\n : { defaultValue: T };\n\ntype GetInputPropsReturnType<\n T,\n FieldType extends GetInputPropsType,\n Mode extends FormMode,\n> = GetInputPropsSharedReturn & GetInputPropsTypeValue<T, FieldType, Mode>;\n\nexport interface UseFieldReturnType<\n T,\n FieldType extends GetInputPropsType = 'input',\n Mode extends FormMode = 'controlled',\n> {\n /** Returns props to pass to the input element */\n getInputProps: (options?: GetInputPropsOptions) => GetInputPropsReturnType<T, FieldType, Mode>;\n\n /** Returns current input value */\n getValue: () => T;\n\n /** Sets input value to the given value */\n setValue: (value: T) => void;\n\n /** Resets field value to initial state, sets touched state to false, sets error to null */\n reset: () => void;\n\n /** Validates current input value when called */\n validate: () => Promise<React.ReactNode | void>;\n\n /** Set to true when async validate function is called, stays true until the returned promise resolves */\n isValidating: boolean;\n\n /** Current error message */\n error: React.ReactNode;\n\n /** Sets error message to the given react node */\n setError: (error: React.ReactNode) => void;\n\n /** Returns true if the input has been focused at least once */\n isTouched: () => boolean;\n\n /** Returns true if input value is different from the initial value */\n isDirty: () => boolean;\n\n /** Resets touched state to false */\n resetTouched: () => void;\n\n /** Key that should be added to the input when mode is uncontrolled */\n key: number;\n}\n\nexport function useField<\n T,\n Mode extends FormMode = 'controlled',\n FieldType extends GetInputPropsType = 'input',\n>({\n mode = 'controlled' as Mode,\n clearErrorOnChange = true,\n initialValue,\n initialError = null,\n initialTouched = false,\n onValueChange,\n validateOnChange = false,\n validateOnBlur = false,\n validate,\n resolveValidationError,\n type = 'input' as FieldType,\n}: UseFieldInput<T, FieldType, Mode>): UseFieldReturnType<T, FieldType, Mode> {\n const [valueState, setValueState] = useState(initialValue);\n const valueRef = useRef(valueState);\n const [key, setKey] = useState(0);\n const [error, setError] = useState<React.ReactNode>(initialError || null);\n const touchedRef = useRef(initialTouched || false);\n const [, setTouchedState] = useState(touchedRef.current);\n const [isValidating, setIsValidating] = useState(false);\n const errorResolver: UseFieldErrorResolver = useMemo(\n () => resolveValidationError || ((err) => err as React.ReactNode),\n [resolveValidationError]\n );\n\n const setTouched = useCallback((val: boolean, { updateState = mode === 'controlled' } = {}) => {\n touchedRef.current = val;\n updateState && setTouchedState(val);\n }, []);\n\n const setValue = useCallback(\n (\n value: T,\n {\n updateKey = mode === 'uncontrolled',\n updateState = mode === 'controlled',\n }: SetValueOptions = {}\n ) => {\n if (valueRef.current === value) {\n return;\n }\n\n valueRef.current = value;\n\n onValueChange?.(value);\n\n if (clearErrorOnChange && error !== null) {\n setError(null);\n }\n\n if (updateState) {\n setValueState(value);\n }\n\n if (updateKey) {\n setKey((currentKey) => currentKey + 1);\n }\n\n if (validateOnChange) {\n _validate();\n }\n },\n [error, clearErrorOnChange, onValueChange]\n );\n\n const reset = useCallback(() => {\n setValue(initialValue);\n setError(null);\n setTouched(false);\n }, [initialValue]);\n\n const getValue = useCallback(() => valueRef.current, []);\n\n const isTouched = useCallback(() => touchedRef.current, []);\n\n const isDirty = useCallback(() => valueRef.current !== initialValue, [initialValue]);\n\n const _validate = useCallback(async () => {\n const validationResult = validate?.(valueRef.current);\n\n if (validationResult instanceof Promise) {\n setIsValidating(true);\n try {\n const result = await validationResult;\n setIsValidating(false);\n setError(result);\n } catch (err) {\n setIsValidating(false);\n const resolvedError = errorResolver(err);\n setError(resolvedError);\n return resolvedError;\n }\n } else {\n setError(validationResult);\n return validationResult;\n }\n }, []);\n\n const getInputProps = ({ withError = true, withFocus = true, ...otherOptions }: any = {}) => {\n const onChange = getInputOnChange<T>((val) => setValue(val as any, { updateKey: false }));\n\n const payload: any = { onChange };\n\n if (withError) {\n payload.error = error;\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = valueRef.current;\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n valueRef.current === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = valueRef.current;\n }\n\n if (withFocus) {\n payload.onFocus = () => {\n setTouched(true);\n };\n\n payload.onBlur = () => {\n if (shouldValidateOnChange('', !!validateOnBlur)) {\n _validate();\n }\n };\n }\n\n return payload;\n };\n\n const resetTouched = useCallback(() => setTouched(false), []);\n\n return {\n key,\n getValue,\n setValue,\n reset,\n getInputProps,\n\n isValidating,\n validate: _validate,\n\n error,\n setError,\n\n isTouched,\n isDirty,\n resetTouched,\n };\n}\n"],"mappings":"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"}
package/esm/use-form.mjs CHANGED
@@ -14,7 +14,8 @@ import { validateFieldValue } from "./validate/validate-field-value.mjs";
14
14
  import { shouldValidateOnChange } from "./validate/should-validate-on-change.mjs";
15
15
  import { useCallback, useMemo, useRef, useState } from "react";
16
16
  //#region packages/@mantine/form/src/use-form.ts
17
- function useForm({ name, mode = "controlled", initialValues, initialErrors = {}, initialDirty = {}, initialTouched = {}, clearInputErrorOnChange = true, validateInputOnChange = false, validateInputOnBlur = false, onValuesChange, transformValues = ((values) => values), enhanceGetInputProps, validate: rules, onSubmitPreventDefault = "always", touchTrigger = "change", cascadeUpdates = false, validateDebounce = 0, resolveValidationError = (err) => err instanceof Error ? err.message : String(err) } = {}) {
17
+ const defaultResolveValidationError = (err) => err instanceof Error ? err.message : String(err);
18
+ function useForm({ name, mode = "controlled", initialValues, initialErrors = {}, initialDirty = {}, initialTouched = {}, clearInputErrorOnChange = true, validateInputOnChange = false, validateInputOnBlur = false, onValuesChange, transformValues = ((values) => values), enhanceGetInputProps, validate: rules, onSubmitPreventDefault = "always", touchTrigger = "change", cascadeUpdates = false, validateDebounce = 0, resolveValidationError = defaultResolveValidationError } = {}) {
18
19
  const $errors = useFormErrors(initialErrors);
19
20
  const $values = useFormValues({
20
21
  initialValues,
@@ -27,14 +28,16 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
27
28
  $values,
28
29
  mode
29
30
  });
31
+ const $watch = useFormWatch({
32
+ $values,
33
+ $status,
34
+ cascadeUpdates
35
+ });
30
36
  const $list = useFormList({
31
37
  $values,
32
38
  $errors,
33
- $status
34
- });
35
- const $watch = useFormWatch({
36
39
  $status,
37
- cascadeUpdates
40
+ $watch
38
41
  });
39
42
  const $validating = useFormValidating();
40
43
  const [formKey, setFormKey] = useState(0);
@@ -49,21 +52,11 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
49
52
  $validating.clearValidating();
50
53
  mode === "uncontrolled" && setFormKey((key) => key + 1);
51
54
  }, []);
52
- const notifyWatchSubscribers = useCallback((previousValues) => {
53
- Object.keys($watch.subscribers.current).forEach((path) => {
54
- if (getPath(path, $values.refValues.current) !== getPath(path, previousValues)) $watch.subscribers.current[path]?.forEach((cb) => cb({
55
- previousValue: getPath(path, previousValues),
56
- value: getPath(path, $values.refValues.current),
57
- touched: $status.isTouched(path),
58
- dirty: $status.isDirty(path)
59
- }));
60
- });
61
- }, []);
62
55
  const handleValuesChanges = useCallback((previousValues) => {
63
56
  clearInputErrorOnChange && $errors.clearErrors();
64
57
  mode === "uncontrolled" && setFormKey((key) => key + 1);
65
- notifyWatchSubscribers(previousValues);
66
- }, [clearInputErrorOnChange, notifyWatchSubscribers]);
58
+ $watch.notifyWatchSubscribers(previousValues);
59
+ }, [clearInputErrorOnChange]);
67
60
  const initialize = useCallback((values) => {
68
61
  const previousValues = $values.refValues.current;
69
62
  $values.initialize(values, () => mode === "uncontrolled" && setFormKey((key) => key + 1));
@@ -277,26 +270,10 @@ function useForm({ name, mode = "controlled", initialValues, initialErrors = {},
277
270
  isDirty: $status.isDirty,
278
271
  getTouched: $status.getTouched,
279
272
  getDirty: $status.getDirty,
280
- reorderListItem: ((path, payload) => {
281
- const previousValues = $values.refValues.current;
282
- $list.reorderListItem(path, payload);
283
- notifyWatchSubscribers(previousValues);
284
- }),
285
- insertListItem: ((path, item, index) => {
286
- const previousValues = $values.refValues.current;
287
- $list.insertListItem(path, item, index);
288
- notifyWatchSubscribers(previousValues);
289
- }),
290
- removeListItem: ((path, index) => {
291
- const previousValues = $values.refValues.current;
292
- $list.removeListItem(path, index);
293
- notifyWatchSubscribers(previousValues);
294
- }),
295
- replaceListItem: ((path, index, item) => {
296
- const previousValues = $values.refValues.current;
297
- $list.replaceListItem(path, index, item);
298
- notifyWatchSubscribers(previousValues);
299
- }),
273
+ reorderListItem: $list.reorderListItem,
274
+ insertListItem: $list.insertListItem,
275
+ removeListItem: $list.removeListItem,
276
+ replaceListItem: $list.replaceListItem,
300
277
  reset,
301
278
  validate,
302
279
  validateField,
@@ -1 +1 @@
1
- {"version":3,"file":"use-form.mjs","names":[],"sources":["../src/use-form.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useFormActions } from './actions';\nimport { getInputOnChange } from './get-input-on-change';\nimport { useFormErrors } from './hooks/use-form-errors/use-form-errors';\nimport { useFormList } from './hooks/use-form-list/use-form-list';\nimport { useFormStatus } from './hooks/use-form-status/use-form-status';\nimport { useFormValidating } from './hooks/use-form-validating/use-form-validating';\nimport { useFormValues } from './hooks/use-form-values/use-form-values';\nimport { useFormWatch } from './hooks/use-form-watch/use-form-watch';\nimport { getDataPath, getPath } from './paths';\nimport type { FormPathValue, LooseKeys } from './paths.types';\nimport {\n FormErrors,\n FormRulesRecord,\n GetInputNode,\n GetInputProps,\n GetTransformedValues,\n Initialize,\n IsValidating,\n Key,\n OnReset,\n OnSubmit,\n Reset,\n SetFieldValue,\n SetValues,\n UseFormInput,\n UseFormReturnType,\n} from './types';\nimport { shouldValidateOnChange, validateFieldValue, validateValues } from './validate';\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n R extends FormErrors | Promise<FormErrors> = FormErrors,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: (values: Values) => R }\n): UseFormReturnType<Values, TransformedValues, (values: Values) => R>;\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n Rules extends FormRulesRecord<Values> = FormRulesRecord<Values>,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: Rules }\n): UseFormReturnType<Values, TransformedValues, Rules>;\n\nexport function useForm<\n Values extends Record<string, any> = Record<string, any>,\n TransformedValues = Values,\n>(\n input?: UseFormInput<Values, TransformedValues>\n): UseFormReturnType<Values, TransformedValues, undefined>;\n\nexport function useForm<\n Values extends Record<PropertyKey, any> = Record<string, any>,\n TransformedValues = Values,\n>({\n name,\n mode = 'controlled',\n initialValues,\n initialErrors = {},\n initialDirty = {},\n initialTouched = {},\n clearInputErrorOnChange = true,\n validateInputOnChange = false,\n validateInputOnBlur = false,\n onValuesChange,\n transformValues = ((values: Values) => values) as any,\n enhanceGetInputProps,\n validate: rules,\n onSubmitPreventDefault = 'always',\n touchTrigger = 'change',\n cascadeUpdates = false,\n validateDebounce = 0,\n resolveValidationError = (err: unknown) => (err instanceof Error ? err.message : String(err)),\n}: UseFormInput<Values, TransformedValues> = {}): UseFormReturnType<Values, TransformedValues> {\n const $errors = useFormErrors<Values>(initialErrors);\n const $values = useFormValues<Values>({ initialValues, onValuesChange, mode });\n const $status = useFormStatus<Values>({ initialDirty, initialTouched, $values, mode });\n const $list = useFormList<Values>({ $values, $errors, $status });\n const $watch = useFormWatch<Values>({ $status, cascadeUpdates });\n const $validating = useFormValidating();\n const [formKey, setFormKey] = useState(0);\n const [fieldKeys, setFieldKeys] = useState<Record<string, number>>({});\n const [submitting, setSubmitting] = useState(false);\n const validateGeneration = useRef(0);\n\n const reset: Reset = useCallback(() => {\n $values.resetValues();\n $errors.clearErrors();\n $status.resetDirty();\n $status.resetTouched();\n $validating.clearValidating();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n }, []);\n\n const notifyWatchSubscribers = useCallback((previousValues: Values) => {\n Object.keys($watch.subscribers.current).forEach((path) => {\n const value = getPath(path, $values.refValues.current);\n const previousValue = getPath(path, previousValues);\n\n if (value !== previousValue) {\n $watch.subscribers.current[path]?.forEach((cb) =>\n cb({\n previousValue: getPath(path, previousValues) as FormPathValue<\n Values,\n LooseKeys<Values>\n >,\n value: getPath(path, $values.refValues.current) as FormPathValue<\n Values,\n LooseKeys<Values>\n >,\n touched: $status.isTouched(path),\n dirty: $status.isDirty(path),\n })\n );\n }\n });\n }, []);\n\n const handleValuesChanges = useCallback(\n (previousValues: Values) => {\n clearInputErrorOnChange && $errors.clearErrors();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n notifyWatchSubscribers(previousValues);\n },\n [clearInputErrorOnChange, notifyWatchSubscribers]\n );\n\n const initialize: Initialize<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.initialize(values, () => mode === 'uncontrolled' && setFormKey((key) => key + 1));\n handleValuesChanges(previousValues);\n },\n [handleValuesChanges]\n );\n\n const debouncedValidateField = useMemo(() => {\n const timers: Record<string, ReturnType<typeof setTimeout>> = {};\n\n const handleValidation = (path: string) => {\n const signal = $validating.getAbortSignal(path);\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return;\n }\n if (results.hasError) {\n $errors.setFieldError(path as any, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(path, false);\n }\n };\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(path, true);\n result.then(applyResult).finally(cleanup);\n } else {\n applyResult(result);\n }\n };\n\n return (path: string) => {\n clearTimeout(timers[path]);\n if (validateDebounce > 0) {\n timers[path] = setTimeout(() => handleValidation(path), validateDebounce);\n } else {\n handleValidation(path);\n }\n };\n }, [validateDebounce, rules, resolveValidationError]);\n\n const setFieldValue: SetFieldValue<Values> = useCallback(\n (path, value, options) => {\n const shouldValidate = shouldValidateOnChange(path, validateInputOnChange);\n const resolvedValue =\n value instanceof Function ? value(getPath(path, $values.refValues.current) as any) : value;\n\n $status.setCalculatedFieldDirty(path, resolvedValue);\n touchTrigger === 'change' && $status.setFieldTouched(path, true);\n !shouldValidate && clearInputErrorOnChange && $errors.clearFieldError(path);\n\n $values.setFieldValue({\n path,\n value,\n updateState: mode === 'controlled',\n subscribers: [\n ...$watch.getFieldSubscribers(path),\n shouldValidate ? () => debouncedValidateField(String(path)) : null,\n options?.forceUpdate !== false && mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ],\n });\n },\n [onValuesChange, rules, debouncedValidateField]\n );\n\n const setValues: SetValues<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.setValues({ values, updateState: mode === 'controlled' });\n handleValuesChanges(previousValues);\n },\n [onValuesChange, handleValuesChanges]\n );\n\n const validate = useCallback(() => {\n const generation = ++validateGeneration.current;\n const signal = $validating.getAbortSignal('__form__');\n\n const handleResult = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (generation !== validateGeneration.current) {\n return { hasErrors: false, errors: {} };\n }\n $errors.setErrors(results.errors);\n return results;\n };\n\n const cleanup = () => {\n if (generation === validateGeneration.current) {\n $validating.setFormValidating(false);\n }\n };\n\n const result = validateValues(rules, $values.refValues.current, resolveValidationError, signal);\n\n if (result instanceof Promise) {\n $validating.setFormValidating(true);\n return result.then(handleResult).finally(cleanup);\n }\n\n return handleResult(result);\n }, [rules, resolveValidationError]);\n\n const validateField = useCallback(\n (path: string) => {\n const signal = $validating.getAbortSignal(String(path));\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return { hasError: false, error: null };\n }\n if (results.hasError) {\n $errors.setFieldError(path, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n return results;\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(String(path), false);\n }\n };\n\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(String(path), true);\n return result.then(applyResult).finally(cleanup);\n }\n\n return applyResult(result);\n },\n [rules, resolveValidationError]\n );\n\n const getInputProps: GetInputProps<Values> = (\n path,\n { type = 'input', withError = true, withFocus, ...otherOptions } = {}\n ) => {\n const _withFocus = withFocus ?? type !== 'radio';\n const onChange = getInputOnChange((value) =>\n setFieldValue(path, value as any, { forceUpdate: false })\n );\n\n const payload: any = { onChange, 'data-path': getDataPath(name, path) };\n\n if (withError) {\n payload.error = $errors.errorsState[path];\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = getPath(\n path,\n $values.refValues.current\n );\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n getPath(path, $values.refValues.current) === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = getPath(\n path,\n $values.refValues.current\n );\n }\n\n if (_withFocus) {\n payload.onFocus = () => $status.setFieldTouched(path, true);\n payload.onBlur = () => {\n if (shouldValidateOnChange(path, validateInputOnBlur)) {\n debouncedValidateField(String(path));\n }\n };\n }\n\n return Object.assign(\n payload,\n enhanceGetInputProps?.({\n inputProps: payload,\n field: path,\n options: { type, withError, withFocus: _withFocus, ...otherOptions },\n form: form as any,\n })\n );\n };\n\n const onSubmit: OnSubmit<Values, TransformedValues> =\n (handleSubmit, handleValidationFailure) => (event) => {\n if (onSubmitPreventDefault === 'always') {\n event?.preventDefault();\n }\n\n setSubmitting(true);\n\n const handleValidation = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (results.hasErrors) {\n if (onSubmitPreventDefault === 'validation-failed') {\n event?.preventDefault();\n }\n\n handleValidationFailure?.(results.errors, $values.refValues.current, event);\n setSubmitting(false);\n } else {\n const submitResult = handleSubmit?.(\n transformValues($values.refValues.current) as any,\n event\n );\n\n if (submitResult instanceof Promise) {\n submitResult.finally(() => setSubmitting(false));\n } else {\n setSubmitting(false);\n }\n }\n };\n\n const result = validate();\n if (result instanceof Promise) {\n result.then(handleValidation).catch(() => {\n setSubmitting(false);\n });\n } else {\n handleValidation(result);\n }\n };\n\n const getTransformedValues: GetTransformedValues<Values, TransformedValues> = (input) =>\n (transformValues as any)(input || $values.refValues.current);\n\n const onReset: OnReset = useCallback((event) => {\n event.preventDefault();\n reset();\n }, []);\n\n const isValid = useCallback(\n (path?: string) => {\n const signal = new AbortController().signal;\n if (path) {\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasError);\n }\n return !result.hasError;\n }\n const result = validateValues(\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasErrors);\n }\n return !result.hasErrors;\n },\n [rules, resolveValidationError]\n );\n\n const key: Key<Values> = (path) => `${formKey}-${String(path)}-${fieldKeys[String(path)] || 0}`;\n\n const getInputNode: GetInputNode<Values> = useCallback(\n (path) => document.querySelector(`[data-path=\"${getDataPath(name, path)}\"]`),\n []\n );\n\n const resetField = useCallback(\n (path: PropertyKey) => {\n $values.resetField(path, [\n mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ]);\n },\n [$values.resetField, mode, setFieldKeys]\n );\n\n const form = {\n watch: $watch.watch,\n\n initialized: $values.initialized.current,\n values: mode === 'uncontrolled' ? $values.refValues.current : $values.stateValues,\n getValues: $values.getValues,\n getInitialValues: $values.getValuesSnapshot,\n setInitialValues: $values.setValuesSnapshot,\n resetField,\n initialize,\n setValues,\n setFieldValue,\n\n submitting,\n setSubmitting,\n\n validating: $validating.validating,\n isValidating: $validating.isValidating as IsValidating<Values>,\n\n errors: $errors.errorsState,\n setErrors: $errors.setErrors,\n setFieldError: $errors.setFieldError,\n clearFieldError: $errors.clearFieldError,\n clearErrors: $errors.clearErrors,\n\n resetDirty: $status.resetDirty,\n setTouched: $status.setTouched,\n setDirty: $status.setDirty,\n isTouched: $status.isTouched,\n resetTouched: $status.resetTouched,\n isDirty: $status.isDirty,\n getTouched: $status.getTouched,\n getDirty: $status.getDirty,\n\n reorderListItem: ((path, payload) => {\n const previousValues = $values.refValues.current;\n $list.reorderListItem(path, payload);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.reorderListItem,\n insertListItem: ((path, item, index) => {\n const previousValues = $values.refValues.current;\n $list.insertListItem(path, item, index);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.insertListItem,\n removeListItem: ((path, index) => {\n const previousValues = $values.refValues.current;\n $list.removeListItem(path, index);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.removeListItem,\n replaceListItem: ((path, index, item) => {\n const previousValues = $values.refValues.current;\n $list.replaceListItem(path, index, item);\n notifyWatchSubscribers(previousValues);\n }) as typeof $list.replaceListItem,\n\n reset,\n validate,\n validateField,\n getInputProps,\n onSubmit,\n onReset,\n isValid,\n getTransformedValues,\n key,\n\n getInputNode,\n };\n\n useFormActions(name, form as any);\n\n return form as any;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAqDA,SAAgB,QAGd,EACA,MACA,OAAO,cACP,eACA,gBAAgB,EAAE,EAClB,eAAe,EAAE,EACjB,iBAAiB,EAAE,EACnB,0BAA0B,MAC1B,wBAAwB,OACxB,sBAAsB,OACtB,gBACA,oBAAoB,WAAmB,SACvC,sBACA,UAAU,OACV,yBAAyB,UACzB,eAAe,UACf,iBAAiB,OACjB,mBAAmB,GACnB,0BAA0B,QAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,KACjD,EAAE,EAAgD;CAC7F,MAAM,UAAU,cAAsB,cAAc;CACpD,MAAM,UAAU,cAAsB;EAAE;EAAe;EAAgB;EAAM,CAAC;CAC9E,MAAM,UAAU,cAAsB;EAAE;EAAc;EAAgB;EAAS;EAAM,CAAC;CACtF,MAAM,QAAQ,YAAoB;EAAE;EAAS;EAAS;EAAS,CAAC;CAChE,MAAM,SAAS,aAAqB;EAAE;EAAS;EAAgB,CAAC;CAChE,MAAM,cAAc,mBAAmB;CACvC,MAAM,CAAC,SAAS,cAAc,SAAS,EAAE;CACzC,MAAM,CAAC,WAAW,gBAAgB,SAAiC,EAAE,CAAC;CACtE,MAAM,CAAC,YAAY,iBAAiB,SAAS,MAAM;CACnD,MAAM,qBAAqB,OAAO,EAAE;CAEpC,MAAM,QAAe,kBAAkB;AACrC,UAAQ,aAAa;AACrB,UAAQ,aAAa;AACrB,UAAQ,YAAY;AACpB,UAAQ,cAAc;AACtB,cAAY,iBAAiB;AAC7B,WAAS,kBAAkB,YAAY,QAAQ,MAAM,EAAE;IACtD,EAAE,CAAC;CAEN,MAAM,yBAAyB,aAAa,mBAA2B;AACrE,SAAO,KAAK,OAAO,YAAY,QAAQ,CAAC,SAAS,SAAS;AAIxD,OAHc,QAAQ,MAAM,QAAQ,UAAU,QAAQ,KAChC,QAAQ,MAAM,eAAe,CAGjD,QAAO,YAAY,QAAQ,OAAO,SAAS,OACzC,GAAG;IACD,eAAe,QAAQ,MAAM,eAAe;IAI5C,OAAO,QAAQ,MAAM,QAAQ,UAAU,QAAQ;IAI/C,SAAS,QAAQ,UAAU,KAAK;IAChC,OAAO,QAAQ,QAAQ,KAAK;IAC7B,CAAC,CACH;IAEH;IACD,EAAE,CAAC;CAEN,MAAM,sBAAsB,aACzB,mBAA2B;AAC1B,6BAA2B,QAAQ,aAAa;AAChD,WAAS,kBAAkB,YAAY,QAAQ,MAAM,EAAE;AACvD,yBAAuB,eAAe;IAExC,CAAC,yBAAyB,uBAAuB,CAClD;CAED,MAAM,aAAiC,aACpC,WAAW;EACV,MAAM,iBAAiB,QAAQ,UAAU;AACzC,UAAQ,WAAW,cAAc,SAAS,kBAAkB,YAAY,QAAQ,MAAM,EAAE,CAAC;AACzF,sBAAoB,eAAe;IAErC,CAAC,oBAAoB,CACtB;CAED,MAAM,yBAAyB,cAAc;EAC3C,MAAM,SAAwD,EAAE;EAEhE,MAAM,oBAAoB,SAAiB;GACzC,MAAM,SAAS,YAAY,eAAe,KAAK;GAC/C,MAAM,SAAS,mBACb,MACA,OACA,QAAQ,UAAU,SAClB,wBACA,OACD;GAED,MAAM,eAAe,YAA2D;AAC9E,QAAI,OAAO,QACT;AAEF,QAAI,QAAQ,SACV,SAAQ,cAAc,MAAa,QAAQ,MAAM;QAEjD,SAAQ,gBAAgB,KAAK;;GAIjC,MAAM,gBAAgB;AACpB,QAAI,CAAC,OAAO,QACV,aAAY,mBAAmB,MAAM,MAAM;;AAI/C,OAAI,kBAAkB,SAAS;AAC7B,gBAAY,mBAAmB,MAAM,KAAK;AAC1C,WAAO,KAAK,YAAY,CAAC,QAAQ,QAAQ;SAEzC,aAAY,OAAO;;AAIvB,UAAQ,SAAiB;AACvB,gBAAa,OAAO,MAAM;AAC1B,OAAI,mBAAmB,EACrB,QAAO,QAAQ,iBAAiB,iBAAiB,KAAK,EAAE,iBAAiB;OAEzE,kBAAiB,KAAK;;IAGzB;EAAC;EAAkB;EAAO;EAAuB,CAAC;CAErD,MAAM,gBAAuC,aAC1C,MAAM,OAAO,YAAY;EACxB,MAAM,iBAAiB,uBAAuB,MAAM,sBAAsB;EAC1E,MAAM,gBACJ,iBAAiB,WAAW,MAAM,QAAQ,MAAM,QAAQ,UAAU,QAAQ,CAAQ,GAAG;AAEvF,UAAQ,wBAAwB,MAAM,cAAc;AACpD,mBAAiB,YAAY,QAAQ,gBAAgB,MAAM,KAAK;AAChE,GAAC,kBAAkB,2BAA2B,QAAQ,gBAAgB,KAAK;AAE3E,UAAQ,cAAc;GACpB;GACA;GACA,aAAa,SAAS;GACtB,aAAa;IACX,GAAG,OAAO,oBAAoB,KAAK;IACnC,uBAAuB,uBAAuB,OAAO,KAAK,CAAC,GAAG;IAC9D,SAAS,gBAAgB,SAAS,SAAS,qBAErC,cAAc,UAAU;KACtB,GAAG;MACF,QAAkB,KAAK,SAAmB,KAAK;KACjD,EAAE,GACL;IACL;GACF,CAAC;IAEJ;EAAC;EAAgB;EAAO;EAAuB,CAChD;CAED,MAAM,YAA+B,aAClC,WAAW;EACV,MAAM,iBAAiB,QAAQ,UAAU;AACzC,UAAQ,UAAU;GAAE;GAAQ,aAAa,SAAS;GAAc,CAAC;AACjE,sBAAoB,eAAe;IAErC,CAAC,gBAAgB,oBAAoB,CACtC;CAED,MAAM,WAAW,kBAAkB;EACjC,MAAM,aAAa,EAAE,mBAAmB;EACxC,MAAM,SAAS,YAAY,eAAe,WAAW;EAErD,MAAM,gBAAgB,YAAiE;AACrF,OAAI,eAAe,mBAAmB,QACpC,QAAO;IAAE,WAAW;IAAO,QAAQ,EAAE;IAAE;AAEzC,WAAQ,UAAU,QAAQ,OAAO;AACjC,UAAO;;EAGT,MAAM,gBAAgB;AACpB,OAAI,eAAe,mBAAmB,QACpC,aAAY,kBAAkB,MAAM;;EAIxC,MAAM,SAAS,eAAe,OAAO,QAAQ,UAAU,SAAS,wBAAwB,OAAO;AAE/F,MAAI,kBAAkB,SAAS;AAC7B,eAAY,kBAAkB,KAAK;AACnC,UAAO,OAAO,KAAK,aAAa,CAAC,QAAQ,QAAQ;;AAGnD,SAAO,aAAa,OAAO;IAC1B,CAAC,OAAO,uBAAuB,CAAC;CAEnC,MAAM,gBAAgB,aACnB,SAAiB;EAChB,MAAM,SAAS,YAAY,eAAe,OAAO,KAAK,CAAC;EAEvD,MAAM,eAAe,YAA2D;AAC9E,OAAI,OAAO,QACT,QAAO;IAAE,UAAU;IAAO,OAAO;IAAM;AAEzC,OAAI,QAAQ,SACV,SAAQ,cAAc,MAAM,QAAQ,MAAM;OAE1C,SAAQ,gBAAgB,KAAK;AAE/B,UAAO;;EAGT,MAAM,gBAAgB;AACpB,OAAI,CAAC,OAAO,QACV,aAAY,mBAAmB,OAAO,KAAK,EAAE,MAAM;;EAIvD,MAAM,SAAS,mBACb,MACA,OACA,QAAQ,UAAU,SAClB,wBACA,OACD;AAED,MAAI,kBAAkB,SAAS;AAC7B,eAAY,mBAAmB,OAAO,KAAK,EAAE,KAAK;AAClD,UAAO,OAAO,KAAK,YAAY,CAAC,QAAQ,QAAQ;;AAGlD,SAAO,YAAY,OAAO;IAE5B,CAAC,OAAO,uBAAuB,CAChC;CAED,MAAM,iBACJ,MACA,EAAE,OAAO,SAAS,YAAY,MAAM,WAAW,GAAG,iBAAiB,EAAE,KAClE;EACH,MAAM,aAAa,aAAa,SAAS;EAKzC,MAAM,UAAe;GAAE,UAJN,kBAAkB,UACjC,cAAc,MAAM,OAAc,EAAE,aAAa,OAAO,CAAC,CAC1D;GAEgC,aAAa,YAAY,MAAM,KAAK;GAAE;AAEvE,MAAI,UACF,SAAQ,QAAQ,QAAQ,YAAY;AAGtC,MAAI,SAAS,WACX,SAAQ,SAAS,eAAe,YAAY,oBAAoB,QAC9D,MACA,QAAQ,UAAU,QACnB;WACQ,SAAS,SAAS;AAC3B,WAAQ,SAAS,eAAe,YAAY,oBAC1C,QAAQ,MAAM,QAAQ,UAAU,QAAQ,KAAK,aAAa;AAC5D,WAAQ,QAAQ,aAAa;QAE7B,SAAQ,SAAS,eAAe,UAAU,kBAAkB,QAC1D,MACA,QAAQ,UAAU,QACnB;AAGH,MAAI,YAAY;AACd,WAAQ,gBAAgB,QAAQ,gBAAgB,MAAM,KAAK;AAC3D,WAAQ,eAAe;AACrB,QAAI,uBAAuB,MAAM,oBAAoB,CACnD,wBAAuB,OAAO,KAAK,CAAC;;;AAK1C,SAAO,OAAO,OACZ,SACA,uBAAuB;GACrB,YAAY;GACZ,OAAO;GACP,SAAS;IAAE;IAAM;IAAW,WAAW;IAAY,GAAG;IAAc;GAC9D;GACP,CAAC,CACH;;CAGH,MAAM,YACH,cAAc,6BAA6B,UAAU;AACpD,MAAI,2BAA2B,SAC7B,QAAO,gBAAgB;AAGzB,gBAAc,KAAK;EAEnB,MAAM,oBAAoB,YAAiE;AACzF,OAAI,QAAQ,WAAW;AACrB,QAAI,2BAA2B,oBAC7B,QAAO,gBAAgB;AAGzB,8BAA0B,QAAQ,QAAQ,QAAQ,UAAU,SAAS,MAAM;AAC3E,kBAAc,MAAM;UACf;IACL,MAAM,eAAe,eACnB,gBAAgB,QAAQ,UAAU,QAAQ,EAC1C,MACD;AAED,QAAI,wBAAwB,QAC1B,cAAa,cAAc,cAAc,MAAM,CAAC;QAEhD,eAAc,MAAM;;;EAK1B,MAAM,SAAS,UAAU;AACzB,MAAI,kBAAkB,QACpB,QAAO,KAAK,iBAAiB,CAAC,YAAY;AACxC,iBAAc,MAAM;IACpB;MAEF,kBAAiB,OAAO;;CAI9B,MAAM,wBAAyE,UAC5E,gBAAwB,SAAS,QAAQ,UAAU,QAAQ;CAE9D,MAAM,UAAmB,aAAa,UAAU;AAC9C,QAAM,gBAAgB;AACtB,SAAO;IACN,EAAE,CAAC;CAEN,MAAM,UAAU,aACb,SAAkB;EACjB,MAAM,SAAS,IAAI,iBAAiB,CAAC;AACrC,MAAI,MAAM;GACR,MAAM,SAAS,mBACb,MACA,OACA,QAAQ,UAAU,SAClB,wBACA,OACD;AACD,OAAI,kBAAkB,QACpB,QAAO,OAAO,MAAM,MAAM,CAAC,EAAE,SAAS;AAExC,UAAO,CAAC,OAAO;;EAEjB,MAAM,SAAS,eACb,OACA,QAAQ,UAAU,SAClB,wBACA,OACD;AACD,MAAI,kBAAkB,QACpB,QAAO,OAAO,MAAM,MAAM,CAAC,EAAE,UAAU;AAEzC,SAAO,CAAC,OAAO;IAEjB,CAAC,OAAO,uBAAuB,CAChC;CAED,MAAM,OAAoB,SAAS,GAAG,QAAQ,GAAG,OAAO,KAAK,CAAC,GAAG,UAAU,OAAO,KAAK,KAAK;CAE5F,MAAM,eAAqC,aACxC,SAAS,SAAS,cAAc,eAAe,YAAY,MAAM,KAAK,CAAC,IAAI,EAC5E,EAAE,CACH;CAED,MAAM,aAAa,aAChB,SAAsB;AACrB,UAAQ,WAAW,MAAM,CACvB,SAAS,qBAEH,cAAc,UAAU;GACtB,GAAG;IACF,QAAkB,KAAK,SAAmB,KAAK;GACjD,EAAE,GACL,KACL,CAAC;IAEJ;EAAC,QAAQ;EAAY;EAAM;EAAa,CACzC;CAED,MAAM,OAAO;EACX,OAAO,OAAO;EAEd,aAAa,QAAQ,YAAY;EACjC,QAAQ,SAAS,iBAAiB,QAAQ,UAAU,UAAU,QAAQ;EACtE,WAAW,QAAQ;EACnB,kBAAkB,QAAQ;EAC1B,kBAAkB,QAAQ;EAC1B;EACA;EACA;EACA;EAEA;EACA;EAEA,YAAY,YAAY;EACxB,cAAc,YAAY;EAE1B,QAAQ,QAAQ;EAChB,WAAW,QAAQ;EACnB,eAAe,QAAQ;EACvB,iBAAiB,QAAQ;EACzB,aAAa,QAAQ;EAErB,YAAY,QAAQ;EACpB,YAAY,QAAQ;EACpB,UAAU,QAAQ;EAClB,WAAW,QAAQ;EACnB,cAAc,QAAQ;EACtB,SAAS,QAAQ;EACjB,YAAY,QAAQ;EACpB,UAAU,QAAQ;EAElB,mBAAmB,MAAM,YAAY;GACnC,MAAM,iBAAiB,QAAQ,UAAU;AACzC,SAAM,gBAAgB,MAAM,QAAQ;AACpC,0BAAuB,eAAe;;EAExC,kBAAkB,MAAM,MAAM,UAAU;GACtC,MAAM,iBAAiB,QAAQ,UAAU;AACzC,SAAM,eAAe,MAAM,MAAM,MAAM;AACvC,0BAAuB,eAAe;;EAExC,kBAAkB,MAAM,UAAU;GAChC,MAAM,iBAAiB,QAAQ,UAAU;AACzC,SAAM,eAAe,MAAM,MAAM;AACjC,0BAAuB,eAAe;;EAExC,mBAAmB,MAAM,OAAO,SAAS;GACvC,MAAM,iBAAiB,QAAQ,UAAU;AACzC,SAAM,gBAAgB,MAAM,OAAO,KAAK;AACxC,0BAAuB,eAAe;;EAGxC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACD;AAED,gBAAe,MAAM,KAAY;AAEjC,QAAO"}
1
+ {"version":3,"file":"use-form.mjs","names":[],"sources":["../src/use-form.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useFormActions } from './actions';\nimport { getInputOnChange } from './get-input-on-change';\nimport { useFormErrors } from './hooks/use-form-errors/use-form-errors';\nimport { useFormList } from './hooks/use-form-list/use-form-list';\nimport { useFormStatus } from './hooks/use-form-status/use-form-status';\nimport { useFormValidating } from './hooks/use-form-validating/use-form-validating';\nimport { useFormValues } from './hooks/use-form-values/use-form-values';\nimport { useFormWatch } from './hooks/use-form-watch/use-form-watch';\nimport { getDataPath, getPath } from './paths';\nimport {\n FormErrors,\n FormRulesRecord,\n GetInputNode,\n GetInputProps,\n GetTransformedValues,\n Initialize,\n IsValidating,\n Key,\n OnReset,\n OnSubmit,\n Reset,\n SetFieldValue,\n SetValues,\n UseFormInput,\n UseFormReturnType,\n} from './types';\nimport { shouldValidateOnChange, validateFieldValue, validateValues } from './validate';\n\nconst defaultResolveValidationError = (err: unknown) =>\n err instanceof Error ? err.message : String(err);\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n R extends FormErrors | Promise<FormErrors> = FormErrors,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: (values: Values) => R }\n): UseFormReturnType<Values, TransformedValues, (values: Values) => R>;\n\nexport function useForm<\n Values extends Record<string, any>,\n TransformedValues = Values,\n Rules extends FormRulesRecord<Values> = FormRulesRecord<Values>,\n>(\n input: UseFormInput<Values, TransformedValues> & { validate: Rules }\n): UseFormReturnType<Values, TransformedValues, Rules>;\n\nexport function useForm<\n Values extends Record<string, any> = Record<string, any>,\n TransformedValues = Values,\n>(\n input?: UseFormInput<Values, TransformedValues>\n): UseFormReturnType<Values, TransformedValues, undefined>;\n\nexport function useForm<\n Values extends Record<PropertyKey, any> = Record<string, any>,\n TransformedValues = Values,\n>({\n name,\n mode = 'controlled',\n initialValues,\n initialErrors = {},\n initialDirty = {},\n initialTouched = {},\n clearInputErrorOnChange = true,\n validateInputOnChange = false,\n validateInputOnBlur = false,\n onValuesChange,\n transformValues = ((values: Values) => values) as any,\n enhanceGetInputProps,\n validate: rules,\n onSubmitPreventDefault = 'always',\n touchTrigger = 'change',\n cascadeUpdates = false,\n validateDebounce = 0,\n resolveValidationError = defaultResolveValidationError,\n}: UseFormInput<Values, TransformedValues> = {}): UseFormReturnType<Values, TransformedValues> {\n const $errors = useFormErrors<Values>(initialErrors);\n const $values = useFormValues<Values>({ initialValues, onValuesChange, mode });\n const $status = useFormStatus<Values>({ initialDirty, initialTouched, $values, mode });\n const $watch = useFormWatch<Values>({ $values, $status, cascadeUpdates });\n const $list = useFormList<Values>({ $values, $errors, $status, $watch });\n const $validating = useFormValidating();\n const [formKey, setFormKey] = useState(0);\n const [fieldKeys, setFieldKeys] = useState<Record<string, number>>({});\n const [submitting, setSubmitting] = useState(false);\n const validateGeneration = useRef(0);\n\n const reset: Reset = useCallback(() => {\n $values.resetValues();\n $errors.clearErrors();\n $status.resetDirty();\n $status.resetTouched();\n $validating.clearValidating();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n }, []);\n\n const handleValuesChanges = useCallback(\n (previousValues: Values) => {\n clearInputErrorOnChange && $errors.clearErrors();\n mode === 'uncontrolled' && setFormKey((key) => key + 1);\n $watch.notifyWatchSubscribers(previousValues);\n },\n [clearInputErrorOnChange]\n );\n\n const initialize: Initialize<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.initialize(values, () => mode === 'uncontrolled' && setFormKey((key) => key + 1));\n handleValuesChanges(previousValues);\n },\n [handleValuesChanges]\n );\n\n const debouncedValidateField = useMemo(() => {\n const timers: Record<string, ReturnType<typeof setTimeout>> = {};\n\n const handleValidation = (path: string) => {\n const signal = $validating.getAbortSignal(path);\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return;\n }\n if (results.hasError) {\n $errors.setFieldError(path as any, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(path, false);\n }\n };\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(path, true);\n result.then(applyResult).finally(cleanup);\n } else {\n applyResult(result);\n }\n };\n\n return (path: string) => {\n clearTimeout(timers[path]);\n if (validateDebounce > 0) {\n timers[path] = setTimeout(() => handleValidation(path), validateDebounce);\n } else {\n handleValidation(path);\n }\n };\n }, [validateDebounce, rules, resolveValidationError]);\n\n const setFieldValue: SetFieldValue<Values> = useCallback(\n (path, value, options) => {\n const shouldValidate = shouldValidateOnChange(path, validateInputOnChange);\n const resolvedValue =\n value instanceof Function ? value(getPath(path, $values.refValues.current) as any) : value;\n\n $status.setCalculatedFieldDirty(path, resolvedValue);\n touchTrigger === 'change' && $status.setFieldTouched(path, true);\n !shouldValidate && clearInputErrorOnChange && $errors.clearFieldError(path);\n\n $values.setFieldValue({\n path,\n value,\n updateState: mode === 'controlled',\n subscribers: [\n ...$watch.getFieldSubscribers(path),\n shouldValidate ? () => debouncedValidateField(String(path)) : null,\n options?.forceUpdate !== false && mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ],\n });\n },\n [onValuesChange, rules, debouncedValidateField]\n );\n\n const setValues: SetValues<Values> = useCallback(\n (values) => {\n const previousValues = $values.refValues.current;\n $values.setValues({ values, updateState: mode === 'controlled' });\n handleValuesChanges(previousValues);\n },\n [onValuesChange, handleValuesChanges]\n );\n\n const validate = useCallback(() => {\n const generation = ++validateGeneration.current;\n const signal = $validating.getAbortSignal('__form__');\n\n const handleResult = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (generation !== validateGeneration.current) {\n return { hasErrors: false, errors: {} };\n }\n $errors.setErrors(results.errors);\n return results;\n };\n\n const cleanup = () => {\n if (generation === validateGeneration.current) {\n $validating.setFormValidating(false);\n }\n };\n\n const result = validateValues(rules, $values.refValues.current, resolveValidationError, signal);\n\n if (result instanceof Promise) {\n $validating.setFormValidating(true);\n return result.then(handleResult).finally(cleanup);\n }\n\n return handleResult(result);\n }, [rules, resolveValidationError]);\n\n const validateField = useCallback(\n (path: string) => {\n const signal = $validating.getAbortSignal(String(path));\n\n const applyResult = (results: { hasError: boolean; error: React.ReactNode }) => {\n if (signal.aborted) {\n return { hasError: false, error: null };\n }\n if (results.hasError) {\n $errors.setFieldError(path, results.error);\n } else {\n $errors.clearFieldError(path);\n }\n return results;\n };\n\n const cleanup = () => {\n if (!signal.aborted) {\n $validating.setFieldValidating(String(path), false);\n }\n };\n\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n\n if (result instanceof Promise) {\n $validating.setFieldValidating(String(path), true);\n return result.then(applyResult).finally(cleanup);\n }\n\n return applyResult(result);\n },\n [rules, resolveValidationError]\n );\n\n const getInputProps: GetInputProps<Values> = (\n path,\n { type = 'input', withError = true, withFocus, ...otherOptions } = {}\n ) => {\n const _withFocus = withFocus ?? type !== 'radio';\n const onChange = getInputOnChange((value) =>\n setFieldValue(path, value as any, { forceUpdate: false })\n );\n\n const payload: any = { onChange, 'data-path': getDataPath(name, path) };\n\n if (withError) {\n payload.error = $errors.errorsState[path];\n }\n\n if (type === 'checkbox') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] = getPath(\n path,\n $values.refValues.current\n );\n } else if (type === 'radio') {\n payload[mode === 'controlled' ? 'checked' : 'defaultChecked'] =\n getPath(path, $values.refValues.current) === otherOptions.value;\n payload.value = otherOptions.value;\n } else {\n payload[mode === 'controlled' ? 'value' : 'defaultValue'] = getPath(\n path,\n $values.refValues.current\n );\n }\n\n if (_withFocus) {\n payload.onFocus = () => $status.setFieldTouched(path, true);\n payload.onBlur = () => {\n if (shouldValidateOnChange(path, validateInputOnBlur)) {\n debouncedValidateField(String(path));\n }\n };\n }\n\n return Object.assign(\n payload,\n enhanceGetInputProps?.({\n inputProps: payload,\n field: path,\n options: { type, withError, withFocus: _withFocus, ...otherOptions },\n form: form as any,\n })\n );\n };\n\n const onSubmit: OnSubmit<Values, TransformedValues> =\n (handleSubmit, handleValidationFailure) => (event) => {\n if (onSubmitPreventDefault === 'always') {\n event?.preventDefault();\n }\n\n setSubmitting(true);\n\n const handleValidation = (results: { hasErrors: boolean; errors: Record<string, any> }) => {\n if (results.hasErrors) {\n if (onSubmitPreventDefault === 'validation-failed') {\n event?.preventDefault();\n }\n\n handleValidationFailure?.(results.errors, $values.refValues.current, event);\n setSubmitting(false);\n } else {\n const submitResult = handleSubmit?.(\n transformValues($values.refValues.current) as any,\n event\n );\n\n if (submitResult instanceof Promise) {\n submitResult.finally(() => setSubmitting(false));\n } else {\n setSubmitting(false);\n }\n }\n };\n\n const result = validate();\n if (result instanceof Promise) {\n result.then(handleValidation).catch(() => {\n setSubmitting(false);\n });\n } else {\n handleValidation(result);\n }\n };\n\n const getTransformedValues: GetTransformedValues<Values, TransformedValues> = (input) =>\n (transformValues as any)(input || $values.refValues.current);\n\n const onReset: OnReset = useCallback((event) => {\n event.preventDefault();\n reset();\n }, []);\n\n const isValid = useCallback(\n (path?: string) => {\n const signal = new AbortController().signal;\n if (path) {\n const result = validateFieldValue(\n path,\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasError);\n }\n return !result.hasError;\n }\n const result = validateValues(\n rules,\n $values.refValues.current,\n resolveValidationError,\n signal\n );\n if (result instanceof Promise) {\n return result.then((r) => !r.hasErrors);\n }\n return !result.hasErrors;\n },\n [rules, resolveValidationError]\n );\n\n const key: Key<Values> = (path) => `${formKey}-${String(path)}-${fieldKeys[String(path)] || 0}`;\n\n const getInputNode: GetInputNode<Values> = useCallback(\n (path) => document.querySelector(`[data-path=\"${getDataPath(name, path)}\"]`),\n []\n );\n\n const resetField = useCallback(\n (path: PropertyKey) => {\n $values.resetField(path, [\n mode !== 'controlled'\n ? () =>\n setFieldKeys((keys) => ({\n ...keys,\n [path as string]: (keys[path as string] || 0) + 1,\n }))\n : null,\n ]);\n },\n [$values.resetField, mode, setFieldKeys]\n );\n\n const form = {\n watch: $watch.watch,\n\n initialized: $values.initialized.current,\n values: mode === 'uncontrolled' ? $values.refValues.current : $values.stateValues,\n getValues: $values.getValues,\n getInitialValues: $values.getValuesSnapshot,\n setInitialValues: $values.setValuesSnapshot,\n resetField,\n initialize,\n setValues,\n setFieldValue,\n\n submitting,\n setSubmitting,\n\n validating: $validating.validating,\n isValidating: $validating.isValidating as IsValidating<Values>,\n\n errors: $errors.errorsState,\n setErrors: $errors.setErrors,\n setFieldError: $errors.setFieldError,\n clearFieldError: $errors.clearFieldError,\n clearErrors: $errors.clearErrors,\n\n resetDirty: $status.resetDirty,\n setTouched: $status.setTouched,\n setDirty: $status.setDirty,\n isTouched: $status.isTouched,\n resetTouched: $status.resetTouched,\n isDirty: $status.isDirty,\n getTouched: $status.getTouched,\n getDirty: $status.getDirty,\n\n reorderListItem: $list.reorderListItem,\n insertListItem: $list.insertListItem,\n removeListItem: $list.removeListItem,\n replaceListItem: $list.replaceListItem,\n\n reset,\n validate,\n validateField,\n getInputProps,\n onSubmit,\n onReset,\n isValid,\n getTransformedValues,\n key,\n\n getInputNode,\n };\n\n useFormActions(name, form as any);\n\n return form as any;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-rule-for-path.mjs","names":[],"sources":["../../src/validate/get-rule-for-path.ts"],"sourcesContent":["import type { FormRulesRecord } from '../types';\n\nexport function getRuleForPath<T>(\n path: string,\n rules: FormRulesRecord<T> | undefined\n): ((value: any, values: any, path: string, signal: AbortSignal) => any) | null {\n if (!rules) {\n return null;\n }\n\n const segments = path.split('.');\n let current: any = rules;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n\n if (/^\\d+$/.test(segment)) {\n continue;\n }\n\n if (current == null || typeof current !== 'object') {\n return null;\n }\n\n current = current[segment];\n }\n\n if (typeof current === 'function') {\n return current;\n }\n\n return null;\n}\n"],"mappings":";;AAEA,SAAgB,eACd,MACA,OAC8E;AAC9E,KAAI,CAAC,MACH,QAAO;CAGT,MAAM,WAAW,KAAK,MAAM,IAAI;CAChC,IAAI,UAAe;AAEnB,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,UAAU,SAAS;AAEzB,MAAI,QAAQ,KAAK,QAAQ,CACvB;AAGF,MAAI,WAAW,QAAQ,OAAO,YAAY,SACxC,QAAO;AAGT,YAAU,QAAQ;;AAGpB,KAAI,OAAO,YAAY,WACrB,QAAO;AAGT,QAAO"}
1
+ {"version":3,"file":"get-rule-for-path.mjs","names":[],"sources":["../../src/validate/get-rule-for-path.ts"],"sourcesContent":["import type { FormRulesRecord } from '../types';\n\nexport function getRuleForPath<T>(\n path: string,\n rules: FormRulesRecord<T> | undefined\n): ((value: any, values: any, path: string, signal: AbortSignal) => any) | null {\n if (!rules) {\n return null;\n }\n\n const segments = path.split('.');\n let current: any = rules;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n\n if (/^\\d+$/.test(segment)) {\n continue;\n }\n\n if (current == null || typeof current !== 'object') {\n return null;\n }\n\n current = current[segment];\n }\n\n if (typeof current === 'function') {\n return current;\n }\n\n return null;\n}\n"],"mappings":";;AAEA,SAAgB,eACd,MACA,OAC8E;CAC9E,IAAI,CAAC,OACH,OAAO;CAGT,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,UAAe;CAEnB,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,UAAU,SAAS;EAEzB,IAAI,QAAQ,KAAK,OAAO,GACtB;EAGF,IAAI,WAAW,QAAQ,OAAO,YAAY,UACxC,OAAO;EAGT,UAAU,QAAQ;CACpB;CAEA,IAAI,OAAO,YAAY,YACrB,OAAO;CAGT,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"should-validate-on-change.mjs","names":[],"sources":["../../src/validate/should-validate-on-change.ts"],"sourcesContent":["import { FORM_INDEX } from '../form-index';\n\nexport function shouldValidateOnChange(path: unknown, validateInputOnChange: boolean | unknown[]) {\n if (!validateInputOnChange) {\n return false;\n }\n\n if (typeof validateInputOnChange === 'boolean') {\n return validateInputOnChange;\n }\n\n if (Array.isArray(validateInputOnChange)) {\n return validateInputOnChange.includes((path as string).replace(/[.][0-9]+/g, `.${FORM_INDEX}`));\n }\n\n return false;\n}\n"],"mappings":";;;AAEA,SAAgB,uBAAuB,MAAe,uBAA4C;AAChG,KAAI,CAAC,sBACH,QAAO;AAGT,KAAI,OAAO,0BAA0B,UACnC,QAAO;AAGT,KAAI,MAAM,QAAQ,sBAAsB,CACtC,QAAO,sBAAsB,SAAU,KAAgB,QAAQ,cAAc,IAAI,aAAa,CAAC;AAGjG,QAAO"}
1
+ {"version":3,"file":"should-validate-on-change.mjs","names":[],"sources":["../../src/validate/should-validate-on-change.ts"],"sourcesContent":["import { FORM_INDEX } from '../form-index';\n\nexport function shouldValidateOnChange(path: unknown, validateInputOnChange: boolean | unknown[]) {\n if (!validateInputOnChange) {\n return false;\n }\n\n if (typeof validateInputOnChange === 'boolean') {\n return validateInputOnChange;\n }\n\n if (Array.isArray(validateInputOnChange)) {\n return validateInputOnChange.includes((path as string).replace(/[.][0-9]+/g, `.${FORM_INDEX}`));\n }\n\n return false;\n}\n"],"mappings":";;;AAEA,SAAgB,uBAAuB,MAAe,uBAA4C;CAChG,IAAI,CAAC,uBACH,OAAO;CAGT,IAAI,OAAO,0BAA0B,WACnC,OAAO;CAGT,IAAI,MAAM,QAAQ,qBAAqB,GACrC,OAAO,sBAAsB,SAAU,KAAgB,QAAQ,cAAc,IAAI,YAAY,CAAC;CAGhG,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-field-value.mjs","names":[],"sources":["../../src/validate/validate-field-value.ts"],"sourcesContent":["import { getPath } from '../paths';\nimport { FormFieldValidationResult, FormValidateInput } from '../types';\nimport { getRuleForPath } from './get-rule-for-path';\nimport { validateValues } from './validate-values';\n\nconst defaultResolveError = (err: unknown): React.ReactNode =>\n err instanceof Error ? err.message : String(err);\n\nfunction fieldResultFromErrors(\n path: string,\n errors: Record<string, React.ReactNode>\n): FormFieldValidationResult {\n const pathInError = Object.keys(errors).find((errorKey) =>\n path.split('.').every((pathPart, i) => pathPart === errorKey.split('.')[i])\n );\n return { hasError: !!pathInError, error: pathInError ? errors[pathInError] : null };\n}\n\nexport function validateFieldValue<T>(\n path: unknown,\n rules: FormValidateInput<T> | undefined,\n values: T,\n resolveValidationError: (error: unknown) => React.ReactNode = defaultResolveError,\n signal: AbortSignal = new AbortController().signal\n): FormFieldValidationResult | Promise<FormFieldValidationResult> {\n if (typeof path !== 'string') {\n return { hasError: false, error: null };\n }\n\n if (typeof rules === 'function') {\n const results = validateValues(rules, values, resolveValidationError, signal);\n if (results instanceof Promise) {\n return results.then((r) => fieldResultFromErrors(path, r.errors));\n }\n return fieldResultFromErrors(path, results.errors);\n }\n\n const rule = getRuleForPath(path, rules);\n\n if (rule) {\n const value = getPath(path, values);\n try {\n const result = rule(value, values, path, signal);\n if (result instanceof Promise) {\n return result.then(\n (error) => {\n if (error) {\n return { hasError: true, error };\n }\n return { hasError: false, error: null };\n },\n (err) => ({ hasError: true, error: resolveValidationError(err) })\n );\n }\n if (result) {\n return { hasError: true, error: result };\n }\n return { hasError: false, error: null };\n } catch (err) {\n const error = resolveValidationError(err);\n return { hasError: true, error };\n }\n }\n\n const results = validateValues(rules, values, resolveValidationError, signal);\n if (results instanceof Promise) {\n return results.then((r) => fieldResultFromErrors(path, r.errors));\n }\n return fieldResultFromErrors(path, results.errors);\n}\n"],"mappings":";;;;;AAKA,MAAM,uBAAuB,QAC3B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAElD,SAAS,sBACP,MACA,QAC2B;CAC3B,MAAM,cAAc,OAAO,KAAK,OAAO,CAAC,MAAM,aAC5C,KAAK,MAAM,IAAI,CAAC,OAAO,UAAU,MAAM,aAAa,SAAS,MAAM,IAAI,CAAC,GAAG,CAC5E;AACD,QAAO;EAAE,UAAU,CAAC,CAAC;EAAa,OAAO,cAAc,OAAO,eAAe;EAAM;;AAGrF,SAAgB,mBACd,MACA,OACA,QACA,yBAA8D,qBAC9D,SAAsB,IAAI,iBAAiB,CAAC,QACoB;AAChE,KAAI,OAAO,SAAS,SAClB,QAAO;EAAE,UAAU;EAAO,OAAO;EAAM;AAGzC,KAAI,OAAO,UAAU,YAAY;EAC/B,MAAM,UAAU,eAAe,OAAO,QAAQ,wBAAwB,OAAO;AAC7E,MAAI,mBAAmB,QACrB,QAAO,QAAQ,MAAM,MAAM,sBAAsB,MAAM,EAAE,OAAO,CAAC;AAEnE,SAAO,sBAAsB,MAAM,QAAQ,OAAO;;CAGpD,MAAM,OAAO,eAAe,MAAM,MAAM;AAExC,KAAI,MAAM;EACR,MAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,MAAI;GACF,MAAM,SAAS,KAAK,OAAO,QAAQ,MAAM,OAAO;AAChD,OAAI,kBAAkB,QACpB,QAAO,OAAO,MACX,UAAU;AACT,QAAI,MACF,QAAO;KAAE,UAAU;KAAM;KAAO;AAElC,WAAO;KAAE,UAAU;KAAO,OAAO;KAAM;OAExC,SAAS;IAAE,UAAU;IAAM,OAAO,uBAAuB,IAAI;IAAE,EACjE;AAEH,OAAI,OACF,QAAO;IAAE,UAAU;IAAM,OAAO;IAAQ;AAE1C,UAAO;IAAE,UAAU;IAAO,OAAO;IAAM;WAChC,KAAK;AAEZ,UAAO;IAAE,UAAU;IAAM,OADX,uBAAuB,IAAI;IACT;;;CAIpC,MAAM,UAAU,eAAe,OAAO,QAAQ,wBAAwB,OAAO;AAC7E,KAAI,mBAAmB,QACrB,QAAO,QAAQ,MAAM,MAAM,sBAAsB,MAAM,EAAE,OAAO,CAAC;AAEnE,QAAO,sBAAsB,MAAM,QAAQ,OAAO"}
1
+ {"version":3,"file":"validate-field-value.mjs","names":[],"sources":["../../src/validate/validate-field-value.ts"],"sourcesContent":["import { getPath } from '../paths';\nimport { FormFieldValidationResult, FormValidateInput } from '../types';\nimport { getRuleForPath } from './get-rule-for-path';\nimport { validateValues } from './validate-values';\n\nconst defaultResolveError = (err: unknown): React.ReactNode =>\n err instanceof Error ? err.message : String(err);\n\nfunction fieldResultFromErrors(\n path: string,\n errors: Record<string, React.ReactNode>\n): FormFieldValidationResult {\n const pathInError = Object.keys(errors).find((errorKey) =>\n path.split('.').every((pathPart, i) => pathPart === errorKey.split('.')[i])\n );\n return { hasError: !!pathInError, error: pathInError ? errors[pathInError] : null };\n}\n\nexport function validateFieldValue<T>(\n path: unknown,\n rules: FormValidateInput<T> | undefined,\n values: T,\n resolveValidationError: (error: unknown) => React.ReactNode = defaultResolveError,\n signal: AbortSignal = new AbortController().signal\n): FormFieldValidationResult | Promise<FormFieldValidationResult> {\n if (typeof path !== 'string') {\n return { hasError: false, error: null };\n }\n\n if (typeof rules === 'function') {\n const results = validateValues(rules, values, resolveValidationError, signal);\n if (results instanceof Promise) {\n return results.then((r) => fieldResultFromErrors(path, r.errors));\n }\n return fieldResultFromErrors(path, results.errors);\n }\n\n const rule = getRuleForPath(path, rules);\n\n if (rule) {\n const value = getPath(path, values);\n try {\n const result = rule(value, values, path, signal);\n if (result instanceof Promise) {\n return result.then(\n (error) => {\n if (error) {\n return { hasError: true, error };\n }\n return { hasError: false, error: null };\n },\n (err) => ({ hasError: true, error: resolveValidationError(err) })\n );\n }\n if (result) {\n return { hasError: true, error: result };\n }\n return { hasError: false, error: null };\n } catch (err) {\n const error = resolveValidationError(err);\n return { hasError: true, error };\n }\n }\n\n const results = validateValues(rules, values, resolveValidationError, signal);\n if (results instanceof Promise) {\n return results.then((r) => fieldResultFromErrors(path, r.errors));\n }\n return fieldResultFromErrors(path, results.errors);\n}\n"],"mappings":";;;;;AAKA,MAAM,uBAAuB,QAC3B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAEjD,SAAS,sBACP,MACA,QAC2B;CAC3B,MAAM,cAAc,OAAO,KAAK,MAAM,EAAE,MAAM,aAC5C,KAAK,MAAM,GAAG,EAAE,OAAO,UAAU,MAAM,aAAa,SAAS,MAAM,GAAG,EAAE,EAAE,CAC5E;CACA,OAAO;EAAE,UAAU,CAAC,CAAC;EAAa,OAAO,cAAc,OAAO,eAAe;CAAK;AACpF;AAEA,SAAgB,mBACd,MACA,OACA,QACA,yBAA8D,qBAC9D,SAAsB,IAAI,gBAAgB,EAAE,QACoB;CAChE,IAAI,OAAO,SAAS,UAClB,OAAO;EAAE,UAAU;EAAO,OAAO;CAAK;CAGxC,IAAI,OAAO,UAAU,YAAY;EAC/B,MAAM,UAAU,eAAe,OAAO,QAAQ,wBAAwB,MAAM;EAC5E,IAAI,mBAAmB,SACrB,OAAO,QAAQ,MAAM,MAAM,sBAAsB,MAAM,EAAE,MAAM,CAAC;EAElE,OAAO,sBAAsB,MAAM,QAAQ,MAAM;CACnD;CAEA,MAAM,OAAO,eAAe,MAAM,KAAK;CAEvC,IAAI,MAAM;EACR,MAAM,QAAQ,QAAQ,MAAM,MAAM;EAClC,IAAI;GACF,MAAM,SAAS,KAAK,OAAO,QAAQ,MAAM,MAAM;GAC/C,IAAI,kBAAkB,SACpB,OAAO,OAAO,MACX,UAAU;IACT,IAAI,OACF,OAAO;KAAE,UAAU;KAAM;IAAM;IAEjC,OAAO;KAAE,UAAU;KAAO,OAAO;IAAK;GACxC,IACC,SAAS;IAAE,UAAU;IAAM,OAAO,uBAAuB,GAAG;GAAE,EACjE;GAEF,IAAI,QACF,OAAO;IAAE,UAAU;IAAM,OAAO;GAAO;GAEzC,OAAO;IAAE,UAAU;IAAO,OAAO;GAAK;EACxC,SAAS,KAAK;GAEZ,OAAO;IAAE,UAAU;IAAM,OADX,uBAAuB,GACR;GAAE;EACjC;CACF;CAEA,MAAM,UAAU,eAAe,OAAO,QAAQ,wBAAwB,MAAM;CAC5E,IAAI,mBAAmB,SACrB,OAAO,QAAQ,MAAM,MAAM,sBAAsB,MAAM,EAAE,MAAM,CAAC;CAElE,OAAO,sBAAsB,MAAM,QAAQ,MAAM;AACnD"}