@paragrav/rhf-utils 0.0.67 → 0.0.69

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 (46) hide show
  1. package/dist/esm/client/index.mjs +1 -1
  2. package/dist/esm/errors/context/provider.mjs +5 -5
  3. package/dist/esm/errors/flat/filterFlatFieldErrors.mjs +10 -0
  4. package/dist/esm/errors/flat/useFormFlatFieldErrorsMemo.mjs +6 -0
  5. package/dist/esm/errors/isFieldErrorRefd.mjs +4 -0
  6. package/dist/esm/errors/nonfield/FormNonFieldErrorMarker.utils.mjs +2 -2
  7. package/dist/esm/errors/orphan/getIsOrphanFormErrorWithParentElement.mjs +5 -0
  8. package/dist/esm/errors/orphan/getOrphansFromFieldErrors.mjs +3 -6
  9. package/dist/esm/errors/orphan/getOrphansFromFlatFieldErrors.mjs +6 -7
  10. package/dist/esm/errors/orphan/isOrphanFormError.mjs +6 -6
  11. package/dist/esm/errors/orphan/useFormHasOnlyOrphanFieldErrorsMemo.mjs +10 -0
  12. package/dist/esm/errors/orphan/useOrphanFormErrorsMemo.mjs +6 -6
  13. package/dist/esm/errors/root/getRootsFromFieldErrors.mjs +3 -6
  14. package/dist/esm/errors/root/getRootsFromFlatFieldErrors.mjs +5 -4
  15. package/dist/esm/errors/root/isFlatFieldErrorEntryPathRoot.mjs +5 -0
  16. package/dist/esm/errors/root/useRootFormFieldErrorsMemo.mjs +1 -1
  17. package/dist/esm/errors/{useFormErrorsMemo.mjs → useFormErrorsTransformMemo.mjs} +4 -1
  18. package/dist/esm/exports.mjs +16 -16
  19. package/dist/esm/form/_Form.mjs +47 -46
  20. package/dist/esm/form/useForm.mjs +11 -9
  21. package/dist/types/client/config.d.ts +18 -0
  22. package/dist/types/client/index.d.ts +0 -1
  23. package/dist/types/errors/flat/filterFlatFieldErrors.d.ts +9 -0
  24. package/dist/types/errors/flat/types.d.ts +4 -0
  25. package/dist/types/errors/flat/useFormFlatFieldErrorsMemo.d.ts +3 -1
  26. package/dist/types/errors/flat/useRefdFieldErrorsMemo.d.ts +1 -1
  27. package/dist/types/errors/isFieldErrorRefd.d.ts +7 -0
  28. package/dist/types/errors/isFlatFieldErrorEntryRefd.d.ts +7 -0
  29. package/dist/types/errors/nonfield/FormNonFieldErrorMarker.utils.d.ts +1 -1
  30. package/dist/types/errors/orphan/getIsOrphanFormErrorWithParentElement.d.ts +7 -0
  31. package/dist/types/errors/orphan/useFormHasOnlyOrphanFieldErrorsMemo.d.ts +6 -0
  32. package/dist/types/errors/root/getRootsFromFlatFieldErrors.d.ts +1 -3
  33. package/dist/types/errors/root/isFlatFieldErrorEntryPathRoot.d.ts +7 -0
  34. package/dist/types/errors/root/isFormErrorPathRoot.d.ts +1 -0
  35. package/dist/types/errors/useFormErrorsTransformMemo.d.ts +7 -0
  36. package/dist/types/exports.d.ts +2 -2
  37. package/dist/types/form/_Form.d.ts +2 -2
  38. package/dist/types/form/useForm.d.ts +3 -1
  39. package/dist/types/form/useFormOptions.d.ts +0 -14
  40. package/package.json +24 -27
  41. package/dist/esm/errors/flat/useRefdFieldErrorsMemo.mjs +0 -13
  42. package/dist/esm/errors/isFieldError.mjs +0 -4
  43. package/dist/esm/errors/orphan/useFormHasOrphanAndNoFieldErrors.mjs +0 -10
  44. package/dist/types/errors/isFieldError.d.ts +0 -7
  45. package/dist/types/errors/orphan/useFormHasOrphanAndNoFieldErrors.d.ts +0 -9
  46. package/dist/types/errors/useFormErrorsMemo.d.ts +0 -7
@@ -7,7 +7,6 @@ const p = (t) => (r) => {
7
7
  r
8
8
  );
9
9
  return {
10
- config: r,
11
10
  useForm: (o, s) => F(
12
11
  e(o, s)
13
12
  ),
@@ -30,6 +29,7 @@ const p = (t) => (r) => {
30
29
  var s, m, i, n, f, a, h;
31
30
  return {
32
31
  ...o,
32
+ config: r,
33
33
  rhf: {
34
34
  ...(s = r.defaultOptions) == null ? void 0 : s.rhf,
35
35
  ...o.rhf,
@@ -1,8 +1,8 @@
1
1
  import { jsx as F } from "react/jsx-runtime";
2
- import i from "../flat/getFlatFieldErrors.mjs";
3
- import l from "../orphan/getOrphansFromFlatFieldErrors.mjs";
4
- import a from "../root/getRootsFromFlatFieldErrors.mjs";
5
- import p from "../useFormErrorsMemo.mjs";
2
+ import a from "../flat/getFlatFieldErrors.mjs";
3
+ import i from "../orphan/getOrphansFromFlatFieldErrors.mjs";
4
+ import l from "../root/getRootsFromFlatFieldErrors.mjs";
5
+ import p from "../useFormErrorsTransformMemo.mjs";
6
6
  import { _FormErrorsFlatContextProvider as c } from "./index.mjs";
7
7
  const u = ({
8
8
  formRef: o,
@@ -11,7 +11,7 @@ const u = ({
11
11
  const e = p((s) => {
12
12
  if (!o.current)
13
13
  return;
14
- const r = i(s), m = a(r), n = l(r, o.current);
14
+ const r = a(s), m = l(r), n = i(r, o.current);
15
15
  return { all: r, roots: m, orphans: n };
16
16
  });
17
17
  return /* @__PURE__ */ F(c, { value: e, children: t });
@@ -0,0 +1,10 @@
1
+ const r = (e) => (t) => (
2
+ // re-create object from entries
3
+ Object.fromEntries(
4
+ // break down to entries
5
+ Object.entries(t).filter(e)
6
+ )
7
+ );
8
+ export {
9
+ r as default
10
+ };
@@ -0,0 +1,6 @@
1
+ import r from "../useFormErrorsTransformMemo.mjs";
2
+ import o from "./getFlatFieldErrors.mjs";
3
+ const s = () => r(o);
4
+ export {
5
+ s as default
6
+ };
@@ -0,0 +1,4 @@
1
+ const r = (e) => !!e.ref;
2
+ export {
3
+ r as default
4
+ };
@@ -1,6 +1,6 @@
1
1
  import o from "./FormNonFieldErrorMarkerHtmlAttribute.mjs";
2
- const t = (r) => `[role="alert"][${o}="${r}"]`, n = (r, e) => !!e.querySelector(t(r));
2
+ const t = (r) => `[role="alert"][${o}="${r}"]`, i = (r, e) => !!e.querySelector(t(r));
3
3
  export {
4
4
  t as getFormNonFieldErrorMarkerQuerySelector,
5
- n as hasNonFieldErrorMarkerInDOM
5
+ i as isNonFieldErrorMarkerInDOM
6
6
  };
@@ -0,0 +1,5 @@
1
+ import o from "./isOrphanFormError.mjs";
2
+ const n = (r) => ([t, e]) => o(t, e, r);
3
+ export {
4
+ n as default
5
+ };
@@ -1,9 +1,6 @@
1
- import e from "../flat/getFlatFieldErrors.mjs";
2
- import s from "./getOrphansFromFlatFieldErrors.mjs";
3
- const a = (r, o) => {
4
- const t = e(r);
5
- return s(t, o);
6
- };
1
+ import t from "../flat/getFlatFieldErrors.mjs";
2
+ import e from "./getOrphansFromFlatFieldErrors.mjs";
3
+ const a = (r, o) => e(t(r), o);
7
4
  export {
8
5
  a as default
9
6
  };
@@ -1,9 +1,8 @@
1
- import s from "./isOrphanFormError.mjs";
2
- const a = (r, t) => Object.fromEntries(
3
- Object.entries(r).filter(
4
- ([e, o]) => s(e, o, t)
5
- )
6
- );
1
+ import e from "../flat/filterFlatFieldErrors.mjs";
2
+ import o from "./getIsOrphanFormErrorWithParentElement.mjs";
3
+ const F = (r, t) => e(
4
+ o(t)
5
+ )(r);
7
6
  export {
8
- a as default
7
+ F as default
9
8
  };
@@ -1,12 +1,12 @@
1
- import m from "../isFieldError.mjs";
2
- import { hasNonFieldErrorMarkerInDOM as t } from "../nonfield/FormNonFieldErrorMarker.utils.mjs";
3
- import s from "../root/isFormErrorPathRoot.mjs";
4
- const n = (r, o, i) => (
1
+ import m from "../isFieldErrorRefd.mjs";
2
+ import { isNonFieldErrorMarkerInDOM as t } from "../nonfield/FormNonFieldErrorMarker.utils.mjs";
3
+ import e from "../root/isFormErrorPathRoot.mjs";
4
+ const d = (r, o, i) => (
5
5
  // not root path
6
- !s(r) && // non-field
6
+ !e(r) && // non-field
7
7
  !m(o) && // does not have marker
8
8
  !t(r, i)
9
9
  );
10
10
  export {
11
- n as default
11
+ d as default
12
12
  };
@@ -0,0 +1,10 @@
1
+ import s from "../../utils/isEmptyObject.mjs";
2
+ import t from "../flat/useFormFlatFieldErrorsMemo.mjs";
3
+ import m from "./useOrphanFormErrorsMemo.mjs";
4
+ const n = (o) => {
5
+ const e = t(), r = m(o);
6
+ return s(r) ? !1 : Object.keys(e).length !== Object.keys(r).length;
7
+ }, i = n;
8
+ export {
9
+ i as default
10
+ };
@@ -1,14 +1,14 @@
1
1
  import "react";
2
2
  import t from "../../utils/isEmptyObject.mjs";
3
- import e from "../useFormErrorsMemo.mjs";
4
- import m from "./getOrphansFromFieldErrors.mjs";
5
- const s = (r) => e((o) => {
3
+ import m from "../useFormErrorsTransformMemo.mjs";
4
+ import e from "./getOrphansFromFieldErrors.mjs";
5
+ const s = (r) => m((o) => {
6
6
  if (t(o))
7
7
  return {};
8
8
  if (!r.current)
9
9
  throw new Error();
10
- return m(o, r.current);
11
- }), E = s;
10
+ return e(o, r.current);
11
+ }), a = s;
12
12
  export {
13
- E as default
13
+ a as default
14
14
  };
@@ -1,9 +1,6 @@
1
- import t from "../flat/getFlatFieldErrors.mjs";
2
- import e from "./getRootsFromFlatFieldErrors.mjs";
3
- const F = (r) => {
4
- const o = t(r);
5
- return e(o);
6
- };
1
+ import o from "../flat/getFlatFieldErrors.mjs";
2
+ import t from "./getRootsFromFlatFieldErrors.mjs";
3
+ const F = (r) => t(o(r));
7
4
  export {
8
5
  F as default
9
6
  };
@@ -1,7 +1,8 @@
1
- import o from "./isFormErrorPathRoot.mjs";
2
- const s = (r) => Object.fromEntries(
3
- Object.entries(r).filter(([t]) => o(t))
1
+ import r from "../flat/filterFlatFieldErrors.mjs";
2
+ import o from "./isFlatFieldErrorEntryPathRoot.mjs";
3
+ const l = r(
4
+ o
4
5
  );
5
6
  export {
6
- s as default
7
+ l as default
7
8
  };
@@ -0,0 +1,5 @@
1
+ import r from "./isFormErrorPathRoot.mjs";
2
+ const a = ([o]) => r(o);
3
+ export {
4
+ a as default
5
+ };
@@ -1,4 +1,4 @@
1
- import o from "../useFormErrorsMemo.mjs";
1
+ import o from "../useFormErrorsTransformMemo.mjs";
2
2
  import r from "./getRootsFromFieldErrors.mjs";
3
3
  const e = () => o(r), t = e;
4
4
  export {
@@ -2,7 +2,10 @@ import e from "react";
2
2
  import { useFormState as t } from "react-hook-form";
3
3
  const u = (r) => {
4
4
  const { errors: o } = t();
5
- return e.useMemo(() => r(o), [r, o]);
5
+ return e.useMemo(
6
+ () => r(o),
7
+ [r, o]
8
+ );
6
9
  };
7
10
  export {
8
11
  u as default
@@ -1,22 +1,22 @@
1
1
  import { createZodRhfUtilsClient as e } from "./client/zod/index.mjs";
2
2
  import { default as s } from "./client/zod/context/index.mjs";
3
3
  import { default as u } from "./client/zod/context/provider.mjs";
4
- import { default as m } from "./devtool/LazyDevTool.mjs";
4
+ import { default as f } from "./devtool/LazyDevTool.mjs";
5
5
  import { default as d } from "./errors/context/index.mjs";
6
6
  import { default as x } from "./errors/context/provider.mjs";
7
7
  import { default as n } from "./errors/message/FormErrorMessage.mjs";
8
8
  import { default as E } from "./errors/message/FormErrorMessageByPath.mjs";
9
9
  import { default as c } from "./errors/nonfield/FormNonFieldErrorMarker.mjs";
10
10
  import { default as S } from "./errors/nonfield/FormNonFieldErrorMarkerHtmlAttribute.mjs";
11
- import { default as y } from "./errors/orphan/useFormHasOrphanAndNoFieldErrors.mjs";
12
- import { default as M } from "./errors/orphan/useOrphanFormErrorsMemo.mjs";
11
+ import { default as y } from "./errors/orphan/useFormHasOnlyOrphanFieldErrorsMemo.mjs";
12
+ import { default as O } from "./errors/orphan/useOrphanFormErrorsMemo.mjs";
13
13
  import { default as P } from "./errors/orphan/useOrphanFormErrorsToConsole.mjs";
14
14
  import { default as I } from "./errors/root/useRootFormFieldErrorsMemo.mjs";
15
- import { default as k } from "./errors/useFormErrorConsoleDebug.mjs";
15
+ import { default as g } from "./errors/useFormErrorConsoleDebug.mjs";
16
16
  import { default as B } from "./errors/useFormErrorsEffect.mjs";
17
- import { default as v } from "./errors/useFormErrorsIfAny.mjs";
18
- import { default as D } from "./errors/useFormErrorsMemo.mjs";
19
- import { default as Z } from "./errors/useFormRequestSubmit.mjs";
17
+ import { default as A } from "./errors/useFormErrorsIfAny.mjs";
18
+ import { default as D } from "./errors/useFormErrorsTransformMemo.mjs";
19
+ import { default as H } from "./errors/useFormRequestSubmit.mjs";
20
20
  import { default as q } from "./form/useForm.mjs";
21
21
  import { default as L } from "./form/context/utils/FormUtilsContextProvider.mjs";
22
22
  import { default as w } from "./form/context/utils/useFormUtilsContext.mjs";
@@ -28,7 +28,7 @@ import { default as rr } from "./form/context/group/useFormGroupIsAnyBusy.mjs";
28
28
  import { default as er } from "./form/context/group/useFormGroupIsChildBusy.mjs";
29
29
  import { default as sr } from "./form/context/group/useFormGroupIsParentBusy.mjs";
30
30
  import { default as ur } from "./form/context/group/useFormGroupParentTracker.mjs";
31
- import { default as mr } from "./form/context/group/useFormOrParentIsBusy.mjs";
31
+ import { default as fr } from "./form/context/group/useFormOrParentIsBusy.mjs";
32
32
  import { default as dr } from "./form/utils/getSubmitterButtonData.mjs";
33
33
  import { FormSubmitError as xr } from "./submit/error/FormSubmitError.mjs";
34
34
  import { default as nr } from "./submit/useFormOnSubmitSuccessful.mjs";
@@ -45,16 +45,16 @@ export {
45
45
  S as FormNonFieldErrorMarkerHtmlAttribute,
46
46
  xr as FormSubmitError,
47
47
  L as FormUtilsContextProvider,
48
- m as LazyDevTool,
48
+ f as LazyDevTool,
49
49
  u as RhfUtilsZodContextProvider,
50
50
  e as createZodRhfUtilsClient,
51
51
  dr as getSubmitterButtonData,
52
52
  q as useForm,
53
- k as useFormErrorConsoleDebug,
53
+ g as useFormErrorConsoleDebug,
54
54
  B as useFormErrorsEffect,
55
55
  d as useFormErrorsFlatContext,
56
- v as useFormErrorsIfAny,
57
- D as useFormErrorsMemo,
56
+ A as useFormErrorsIfAny,
57
+ D as useFormErrorsTransformMemo,
58
58
  V as useFormGroupChildIsMountedTracker,
59
59
  X as useFormGroupChildIsSubmittingTracker,
60
60
  _ as useFormGroupChildTracker,
@@ -62,13 +62,13 @@ export {
62
62
  er as useFormGroupIsChildBusy,
63
63
  sr as useFormGroupIsParentBusy,
64
64
  ur as useFormGroupParentTracker,
65
- y as useFormHasOrphanAndNoFieldErrors,
65
+ y as useFormHasOnlyOrphanFieldErrorsMemo,
66
66
  nr as useFormOnSubmitSuccessful,
67
67
  Er as useFormOnSubmitSuccessfulAndReset,
68
- mr as useFormOrParentIsBusy,
69
- Z as useFormRequestSubmit,
68
+ fr as useFormOrParentIsBusy,
69
+ H as useFormRequestSubmit,
70
70
  w as useFormUtilsContext,
71
- M as useOrphanFormErrorsMemo,
71
+ O as useOrphanFormErrorsMemo,
72
72
  P as useOrphanFormErrorsToConsole,
73
73
  Sr as useResetFormAfterSubmitSuccessful,
74
74
  cr as useResetFormOnSubmitError,
@@ -1,89 +1,90 @@
1
- import { jsxs as v, jsx as p } from "react/jsx-runtime";
1
+ import { jsxs as B, jsx as p } from "react/jsx-runtime";
2
2
  import "react";
3
- import { useFormContext as B } from "react-hook-form";
4
- import N from "../devtool/LazyDevTool.mjs";
5
- import { FormSubmitError as P } from "../submit/error/FormSubmitError.mjs";
6
- import T from "../submit/error/setCtxErrorsByFormSubmitError.mjs";
7
- import V from "../submit/useResetFormOnSubmitError.mjs";
8
- import _ from "./_FormBase.mjs";
9
- function A({
10
- formId: x,
3
+ import { useFormContext as N } from "react-hook-form";
4
+ import P from "../devtool/LazyDevTool.mjs";
5
+ import { FormSubmitError as T } from "../submit/error/FormSubmitError.mjs";
6
+ import V from "../submit/error/setCtxErrorsByFormSubmitError.mjs";
7
+ import _ from "../submit/useResetFormOnSubmitError.mjs";
8
+ import O from "./_FormBase.mjs";
9
+ function G({
10
+ formId: c,
11
11
  formRef: l,
12
12
  form: t,
13
- children: y
13
+ config: n,
14
+ children: o
14
15
  }) {
15
- var c, b, S, o, h;
16
- const a = B();
17
- V({
18
- disabled: !((c = t == null ? void 0 : t.options) != null && c.resetValuesOnSubmitError)
16
+ var b, S, h, E, F;
17
+ const a = N();
18
+ _({
19
+ disabled: !((b = t == null ? void 0 : t.options) != null && b.resetValuesOnSubmitError)
19
20
  });
20
- const C = async (i) => {
21
- var n;
22
- (n = t == null ? void 0 : t.options) != null && n.stopSubmitPropagation && i.stopPropagation();
21
+ const y = async (s) => {
22
+ var e;
23
+ (e = t == null ? void 0 : t.options) != null && e.stopSubmitPropagation && s.stopPropagation();
23
24
  try {
24
25
  await a.handleSubmit(
25
- g,
26
+ j,
26
27
  t == null ? void 0 : t.onSubmitInvalid
27
- )(i);
28
- } catch (s) {
29
- j(s, i);
28
+ )(s);
29
+ } catch (i) {
30
+ v(i, s);
30
31
  }
31
- }, g = (i, n) => {
32
- var s;
33
- return (s = t == null ? void 0 : t.onSubmit) == null ? void 0 : s.call(
32
+ }, j = (s, e) => {
33
+ var i;
34
+ return (i = t == null ? void 0 : t.onSubmit) == null ? void 0 : i.call(
34
35
  t,
35
- i,
36
+ s,
36
37
  a,
37
- n
38
+ e
38
39
  );
39
- }, j = (i, n) => {
40
- var e, E, F;
41
- const s = i instanceof P ? (
40
+ }, v = (s, e) => {
41
+ var x, C;
42
+ const i = s instanceof T ? (
42
43
  // consumer can manually throw FormSubmitError (e.g., manual validation)
43
- i
44
+ s
44
45
  ) : (
45
46
  // if error is not FormSubmitError, consumer can provide global handler
46
- (E = (e = t == null ? void 0 : t.options) == null ? void 0 : e.onSubmitError) == null ? void 0 : E.call(e, i)
47
+ (x = n == null ? void 0 : n.onSubmitError) == null ? void 0 : x.call(n, s)
47
48
  );
48
- s && T(a, s), (F = t == null ? void 0 : t.onSubmitError) == null || F.call(
49
+ i && V(a, i), (C = t == null ? void 0 : t.onSubmitError) == null || C.call(
49
50
  t,
50
- i,
51
+ s,
51
52
  a,
52
- n
53
+ e
53
54
  );
54
55
  }, u = {
55
- formId: x,
56
+ formId: c,
56
57
  formRef: l,
57
58
  ctx: a,
58
59
  options: t == null ? void 0 : t.options
59
- }, d = (i) => {
60
- var s, e;
61
- const n = (e = (s = t == null ? void 0 : t.options) == null ? void 0 : s.Children) == null ? void 0 : e[i];
62
- return n && /* @__PURE__ */ p(n, { ...u });
60
+ }, d = (s) => {
61
+ var i;
62
+ const e = (i = n == null ? void 0 : n.Children) == null ? void 0 : i[s];
63
+ return e && /* @__PURE__ */ p(e, { ...u });
63
64
  };
64
- return /* @__PURE__ */ v(
65
- _,
65
+ return /* @__PURE__ */ B(
66
+ O,
66
67
  {
67
68
  noValidate: !0,
68
69
  style: {
69
70
  position: "relative"
70
71
  },
71
72
  ...t == null ? void 0 : t.props,
72
- className: [(b = t == null ? void 0 : t.options) == null ? void 0 : b.classNames, ((S = t == null ? void 0 : t.props) == null ? void 0 : S.className) ?? ""].join(
73
+ className: [(S = t == null ? void 0 : t.options) == null ? void 0 : S.classNames, ((h = t == null ? void 0 : t.props) == null ? void 0 : h.className) ?? ""].join(
73
74
  " "
74
75
  ),
75
- onSubmit: C,
76
+ onSubmit: y,
76
77
  formRef: l,
77
78
  children: [
78
79
  d("top"),
79
- ((o = t == null ? void 0 : t.options) == null ? void 0 : o.devTool) !== "disabled" && /* @__PURE__ */ p(N, { placement: "top-right", ...(h = t == null ? void 0 : t.options) == null ? void 0 : h.devTool }),
80
+ ((E = t == null ? void 0 : t.options) == null ? void 0 : E.devTool) !== "disabled" && /* @__PURE__ */ p(P, { placement: "top-right", ...(F = t == null ? void 0 : t.options) == null ? void 0 : F.devTool }),
80
81
  (t == null ? void 0 : t.Fields) && /* @__PURE__ */ p(t.Fields, { ...u }),
81
- y,
82
+ o,
82
83
  d("bottom")
83
84
  ]
84
85
  }
85
86
  );
86
87
  }
87
88
  export {
88
- A as default
89
+ G as default
89
90
  };
@@ -1,14 +1,15 @@
1
1
  import n from "react";
2
- import { useForm as u } from "react-hook-form";
3
- import i from "../submit/useSubmitFormOnChange.mjs";
4
- const l = ({
5
- rhf: m,
2
+ import { useForm as i } from "react-hook-form";
3
+ import c from "../submit/useSubmitFormOnChange.mjs";
4
+ const P = ({
5
+ config: m,
6
+ rhf: p,
6
7
  form: o,
7
- utils: p
8
+ utils: u
8
9
  }) => {
9
10
  var t;
10
- const s = n.useId(), e = u(m), r = n.useRef(null);
11
- return i(r, {
11
+ const s = n.useId(), e = i(p), r = n.useRef(null);
12
+ return c(r, {
12
13
  disabled: !((t = o == null ? void 0 : o.options) != null && t.submitOnChange)
13
14
  }), {
14
15
  id: s,
@@ -18,15 +19,16 @@ const l = ({
18
19
  formId: s,
19
20
  formRef: r,
20
21
  rhfForm: e,
21
- utils: p
22
+ utils: u
22
23
  },
23
24
  formProps: {
24
25
  formId: s,
25
26
  formRef: r,
27
+ config: m,
26
28
  form: o
27
29
  }
28
30
  };
29
31
  };
30
32
  export {
31
- l as default
33
+ P as default
32
34
  };
@@ -1,7 +1,13 @@
1
+ import { FormSubmitError } from '../submit/error/FormSubmitError';
1
2
  import { UseFormOptions } from '../form/useFormOptions';
3
+ import { UseFormFieldsProps } from '../form/useForm';
4
+ import { _FormSlots } from '../form/_Form';
2
5
  import { UseFormProps } from 'react-hook-form';
3
6
 
4
7
  export type ClientConfig = {
8
+ /**
9
+ * Default options for all forms. (Are overridden by form-specific options.)
10
+ */
5
11
  defaultOptions?: {
6
12
  /**
7
13
  * Default RHF `useForm` settings.
@@ -16,4 +22,16 @@ export type ClientConfig = {
16
22
  */
17
23
  form?: UseFormOptions;
18
24
  };
25
+ /**
26
+ * Components injected by slot across all forms.
27
+ * (Per-form injection can be done via Fields prop.)
28
+ *
29
+ * top: e.g., block navigation on dirty form.
30
+ * bottom: e.g., root errors list.
31
+ */
32
+ Children?: Partial<Record<_FormSlots, React.FC<UseFormFieldsProps>>>;
33
+ /**
34
+ * Handle non-{@link FormSubmitError} errors. Optionally, return {@link FormSubmitError} to merge into context errors.
35
+ */
36
+ onSubmitError?: (error: unknown) => FormSubmitError | undefined;
19
37
  };
@@ -13,7 +13,6 @@ export type ObjectSchema<TInputKey extends string, TOutputKey extends string> =
13
13
  [key in TOutputKey]: SafeFieldValues;
14
14
  };
15
15
  export type CreateRhfUtilsClient<TObjectSchema extends ObjectSchema<TObjectSchemaInputKey, TObjectSchemaOutputKey>, TObjectSchemaInputKey extends string, TObjectSchemaOutputKey extends string> = {
16
- config: ClientConfig;
17
16
  useForm: <TSchema extends TObjectSchema, TSchemaInput extends SafeFieldValues = TSchema[TObjectSchemaInputKey], TSchemaOutput extends SafeFieldValues = TSchema[TObjectSchemaOutputKey]>(schema: TSchema, props: UseFormProps<TSchemaInput, TSchemaOutput>) => UseFormReturn<TSchemaInput, TSchemaOutput>;
18
17
  FormWithProviders: <TSchema extends TObjectSchema, TSchemaInput extends SafeFieldValues = TSchema[TObjectSchemaInputKey], TSchemaOutput extends SafeFieldValues = TSchema[TObjectSchemaOutputKey]>(props: {
19
18
  schema: TSchema;
@@ -0,0 +1,9 @@
1
+ import { FlatFieldErrorEntry, FlatFieldErrors } from './types';
2
+
3
+ /**
4
+ * Filter {@link FlatFieldErrors} by a predicate.
5
+ *
6
+ * (Encapsulates to and from Object entries.)
7
+ */
8
+ declare const makeFlatFieldErrorsFilter: (predicate: (entry: FlatFieldErrorEntry, index: number) => boolean) => (errors: FlatFieldErrors) => FlatFieldErrors;
9
+ export default makeFlatFieldErrorsFilter;
@@ -11,3 +11,7 @@ import { FieldError } from 'react-hook-form';
11
11
  * ```
12
12
  */
13
13
  export type FlatFieldErrors = Record<string, FieldError>;
14
+ /**
15
+ * Return from `Object.entries` on {@link FlatFieldErrors}.
16
+ */
17
+ export type FlatFieldErrorEntry = [path: string, error: FieldError];
@@ -1,5 +1,7 @@
1
+ import { FlatFieldErrors } from './types';
2
+
1
3
  /**
2
4
  * Use {@link FieldErrors} as {@link FlatFieldErrors}.
3
5
  */
4
- declare const useFormFlatFieldErrorsMemo: () => import('./types').FlatFieldErrors;
6
+ declare const useFormFlatFieldErrorsMemo: () => FlatFieldErrors;
5
7
  export default useFormFlatFieldErrorsMemo;
@@ -2,7 +2,7 @@ import { FlatFieldErrors } from './types';
2
2
  import { FieldErrors } from 'react-hook-form';
3
3
 
4
4
  /**
5
- * Use errors with refs.
5
+ * Use {@link FieldErrors} with `ref`s as {@link FlatFieldErrors}.
6
6
  */
7
7
  declare const useRefdFieldErrorsMemo: () => FlatFieldErrors;
8
8
  export default useRefdFieldErrorsMemo;
@@ -0,0 +1,7 @@
1
+ import { FieldError } from 'react-hook-form';
2
+
3
+ /**
4
+ * Determine if {@link FieldError} is a `ref`'d field error.
5
+ */
6
+ declare const isFieldErrorRefd: (error: FieldError) => boolean;
7
+ export default isFieldErrorRefd;
@@ -0,0 +1,7 @@
1
+ import { FlatFieldErrorEntry } from './flat/types';
2
+
3
+ /**
4
+ * Util wrapper for {@link isFieldErrorRefd} for usage with {@link FlatFieldErrorEntry}.
5
+ */
6
+ declare const isFlatFieldErrorEntryRefd: ([, error]: FlatFieldErrorEntry) => boolean;
7
+ export default isFlatFieldErrorEntryRefd;
@@ -1,2 +1,2 @@
1
1
  export declare const getFormNonFieldErrorMarkerQuerySelector: (path: string) => string;
2
- export declare const hasNonFieldErrorMarkerInDOM: (path: string, parentElement: Pick<HTMLElement, 'querySelector'>) => boolean;
2
+ export declare const isNonFieldErrorMarkerInDOM: (path: string, parentElement: Pick<HTMLElement, 'querySelector'>) => boolean;
@@ -0,0 +1,7 @@
1
+ import { FlatFieldErrorEntry } from '../flat/types';
2
+
3
+ /**
4
+ * Util wrapper for {@link isOrphanFormError} for usage with {@link FlatFieldErrorEntry}.
5
+ */
6
+ declare const getIsFlatFieldErrorEntryOrphanByParentElement: (parentElement: Pick<HTMLElement, 'querySelector'>) => ([path, error]: FlatFieldErrorEntry) => boolean;
7
+ export default getIsFlatFieldErrorEntryOrphanByParentElement;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Determined if there are orphan errors and no field errors.
3
+ * (May be useful when reporting or displaying a specific message to user.)
4
+ */
5
+ declare const useFormHasOnlyOrphanFieldErrorsMemo: (formRef: React.RefObject<HTMLFormElement>) => boolean;
6
+ export default useFormHasOnlyOrphanFieldErrorsMemo;
@@ -1,4 +1,2 @@
1
- import { FlatFieldErrors } from '../flat/types';
2
-
3
- declare const getRootsFromFlatFieldErrors: (errors: FlatFieldErrors) => FlatFieldErrors;
1
+ declare const getRootsFromFlatFieldErrors: (errors: import('../flat/types').FlatFieldErrors) => import('../flat/types').FlatFieldErrors;
4
2
  export default getRootsFromFlatFieldErrors;
@@ -0,0 +1,7 @@
1
+ import { FlatFieldErrorEntry } from '../flat/types';
2
+
3
+ /**
4
+ * Util wrapper for {@link isFormErrorPathRoot} for usage with {@link FlatFieldErrorEntry}.
5
+ */
6
+ declare const isFlatFieldErrorEntryPathRoot: ([path]: FlatFieldErrorEntry) => boolean;
7
+ export default isFlatFieldErrorEntryPathRoot;
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * Determine if an error path is root. (e.g., `root` or `root.nested`)
3
+ *
3
4
  * @param path Flat path. (e.g., 'root.nested')
4
5
  */
5
6
  declare const isFormErrorPathRoot: (path: string) => boolean;
@@ -0,0 +1,7 @@
1
+ import { FieldErrors } from 'react-hook-form';
2
+
3
+ /**
4
+ * Create transformed memoized form errors value.
5
+ */
6
+ declare const useFormErrorsTransformMemo: <TTransformedReturn>(transform: (errors: FieldErrors) => TTransformedReturn) => TTransformedReturn;
7
+ export default useFormErrorsTransformMemo;
@@ -9,14 +9,14 @@ export { default as FormErrorMessage } from './errors/message/FormErrorMessage';
9
9
  export { default as FormErrorMessageByPath } from './errors/message/FormErrorMessageByPath';
10
10
  export { default as FormNonFieldErrorMarker } from './errors/nonfield/FormNonFieldErrorMarker';
11
11
  export { default as FormNonFieldErrorMarkerHtmlAttribute } from './errors/nonfield/FormNonFieldErrorMarkerHtmlAttribute';
12
- export { default as useFormHasOrphanAndNoFieldErrors } from './errors/orphan/useFormHasOrphanAndNoFieldErrors';
12
+ export { default as useFormHasOnlyOrphanFieldErrorsMemo } from './errors/orphan/useFormHasOnlyOrphanFieldErrorsMemo';
13
13
  export { default as useOrphanFormErrorsMemo } from './errors/orphan/useOrphanFormErrorsMemo';
14
14
  export { default as useOrphanFormErrorsToConsole } from './errors/orphan/useOrphanFormErrorsToConsole';
15
15
  export { default as useRootFormFieldErrorsMemo } from './errors/root/useRootFormFieldErrorsMemo';
16
16
  export { default as useFormErrorConsoleDebug } from './errors/useFormErrorConsoleDebug';
17
17
  export { default as useFormErrorsEffect } from './errors/useFormErrorsEffect';
18
18
  export { default as useFormErrorsIfAny } from './errors/useFormErrorsIfAny';
19
- export { default as useFormErrorsMemo } from './errors/useFormErrorsMemo';
19
+ export { default as useFormErrorsTransformMemo } from './errors/useFormErrorsTransformMemo';
20
20
  export { default as useFormRequestSubmit } from './errors/useFormRequestSubmit';
21
21
  export type { SafeFieldValues } from './form/SafeFieldValues';
22
22
  export type { UseFormFieldsProps } from './form/useForm';
@@ -3,9 +3,9 @@ import { SafeFieldValues } from './SafeFieldValues';
3
3
  import { default as React } from 'react';
4
4
 
5
5
  export type _FormSlots = 'top' | 'bottom';
6
- export type _FormProps<TFieldValues extends SafeFieldValues, TTransformedValues extends SafeFieldValues> = React.PropsWithChildren<Pick<UseFormProps<TFieldValues, TTransformedValues>, 'form'> & {
6
+ export type _FormProps<TFieldValues extends SafeFieldValues, TTransformedValues extends SafeFieldValues> = React.PropsWithChildren<Pick<UseFormProps<TFieldValues, TTransformedValues>, 'form' | 'config'> & {
7
7
  formId: string;
8
8
  formRef: React.RefObject<HTMLFormElement>;
9
9
  }>;
10
- declare function _Form<TFieldValues extends SafeFieldValues, TTransformedValues extends SafeFieldValues>({ formId, formRef, form, children, }: _FormProps<TFieldValues, TTransformedValues>): import("react/jsx-runtime").JSX.Element;
10
+ declare function _Form<TFieldValues extends SafeFieldValues, TTransformedValues extends SafeFieldValues>({ formId, formRef, form, config, children, }: _FormProps<TFieldValues, TTransformedValues>): import("react/jsx-runtime").JSX.Element;
11
11
  export default _Form;
@@ -3,6 +3,7 @@ import { SafeFieldValues } from './SafeFieldValues';
3
3
  import { FormUtilsContextProviderProps } from './context/utils/FormUtilsContextProvider';
4
4
  import { _FormProvidersProps } from './_FormProviders';
5
5
  import { _FormProps } from './_Form';
6
+ import { ClientConfig } from '../client/config';
6
7
  import { SubmitErrorHandler, UseFormProps as RhfUseFormProps, UseFormReturn as RhfUseFormReturn } from 'react-hook-form';
7
8
  import { default as React } from 'react';
8
9
 
@@ -13,6 +14,7 @@ export type UseFormFieldsProps<TFieldValues extends SafeFieldValues = SafeFieldV
13
14
  options?: UseFormOptions;
14
15
  };
15
16
  export type UseFormProps<TFieldValues extends SafeFieldValues, TTransformedValues extends SafeFieldValues> = {
17
+ config?: ClientConfig;
16
18
  /** {@link RhfUseFormProps} props for RHF's {@link useRhfForm}. */
17
19
  rhf?: RhfUseFormProps<TFieldValues>;
18
20
  /** {@link FormProps} props for Form. */
@@ -37,7 +39,7 @@ export type UseFormProps<TFieldValues extends SafeFieldValues, TTransformedValue
37
39
  * see https://caniuse.com/?search=form%20attribute
38
40
  * @returns Form provider and form.
39
41
  */
40
- declare const useForm: <TFieldValues extends SafeFieldValues, TTransformedValues extends SafeFieldValues>({ rhf, form, utils, }: UseFormProps<TFieldValues, TTransformedValues>) => {
42
+ declare const useForm: <TFieldValues extends SafeFieldValues, TTransformedValues extends SafeFieldValues>({ config, rhf, form, utils, }: UseFormProps<TFieldValues, TTransformedValues>) => {
41
43
  readonly id: string;
42
44
  readonly ref: React.RefObject<HTMLFormElement>;
43
45
  readonly context: RhfUseFormReturn<TFieldValues, unknown, TTransformedValues>;
@@ -1,6 +1,3 @@
1
- import { UseFormFieldsProps } from './useForm';
2
- import { _FormSlots } from './_Form';
3
- import { FormSubmitError } from '../submit/error/FormSubmitError';
4
1
  import { DevtoolUIProps } from '@hookform/devtools/dist/devToolUI';
5
2
 
6
3
  export type UseFormOptions = {
@@ -14,15 +11,4 @@ export type UseFormOptions = {
14
11
  stopSubmitPropagation?: boolean;
15
12
  /** Control dev tool options. */
16
13
  devTool?: DevtoolUIProps | 'disabled';
17
- /**
18
- * Components injected by slot.
19
- *
20
- * e.g., top: block navigation on dirty form.
21
- * e.g., bottom: root errors list.
22
- */
23
- Children?: Partial<Record<_FormSlots, React.FC<UseFormFieldsProps>>>;
24
- /**
25
- * Handle non-{@link FormSubmitError} errors. Optionally, return {@link FormSubmitError} to merge into context errors.
26
- */
27
- onSubmitError?: (error: unknown) => FormSubmitError | undefined;
28
14
  };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@paragrav/rhf-utils",
3
3
  "author": "paragrav.dev",
4
4
  "license": "MIT",
5
- "version": "0.0.67",
5
+ "version": "0.0.69",
6
6
  "description": "Integration utilities for react-hook-form.",
7
7
  "type": "module",
8
8
  "sideEffects": false,
@@ -57,9 +57,9 @@
57
57
  "default": "./dist/esm/errors/useFormErrorsIfAny.mjs",
58
58
  "types": "./dist/types/errors/useFormErrorsIfAny.d.ts"
59
59
  },
60
- "./errors/useFormErrorsOnChange": {
61
- "default": "./dist/esm/errors/useFormErrorsOnChange.mjs",
62
- "types": "./dist/types/errors/useFormErrorsOnChange.d.ts"
60
+ "./errors/useFormErrorsTransformMemo": {
61
+ "default": "./dist/esm/errors/useFormErrorsTransformMemo.mjs",
62
+ "types": "./dist/types/errors/useFormErrorsTransformMemo.d.ts"
63
63
  },
64
64
  "./errors/useFormRequestSubmit": {
65
65
  "default": "./dist/esm/errors/useFormRequestSubmit.mjs",
@@ -73,14 +73,14 @@
73
73
  "default": "./dist/esm/errors/nonfield/FormNonFieldErrorMarker.utils.mjs",
74
74
  "types": "./dist/types/errors/nonfield/FormNonFieldErrorMarker.utils.d.ts"
75
75
  },
76
+ "./errors/useFormHasOnlyOrphanFieldErrorsMemo": {
77
+ "default": "./dist/esm/errors/orphan/useFormHasOnlyOrphanFieldErrorsMemo.mjs",
78
+ "types": "./dist/types/errors/orphan/useFormHasOnlyOrphanFieldErrorsMemo.d.ts"
79
+ },
76
80
  "./errors/useOrphanFormErrorsToConsoleError": {
77
81
  "default": "./dist/esm/errors/orphan/useOrphanFormErrorsToConsoleError.mjs",
78
82
  "types": "./dist/types/errors/orphan/useOrphanFormErrorsToConsoleError.d.ts"
79
83
  },
80
- "./errors/useFormErrorsHasOnlyOrphans": {
81
- "default": "./dist/esm/errors/orphan/useFormErrorsHasOnlyOrphans.mjs",
82
- "types": "./dist/types/errors/orphan/useFormErrorsHasOnlyOrphans.d.ts"
83
- },
84
84
  "./errors/useOrphanFormErrors": {
85
85
  "default": "./dist/esm/errors/orphan/useOrphanFormErrors.mjs",
86
86
  "types": "./dist/types/errors/orphan/useOrphanFormErrors.d.ts"
@@ -166,21 +166,6 @@
166
166
  "types": "./dist/types/submit/useSubmitFormOnChange.d.ts"
167
167
  }
168
168
  },
169
- "scripts": {
170
- "build": "npm install && npm run validate && vite build",
171
- "build:dev": "vite build --config vite.config.dev.ts",
172
- "dev": "vite --config vite.config.dev.ts",
173
- "lint": "eslint --ignore-path ./.gitignore --ext ts,tsx --report-unused-disable-directives --max-warnings 0 .",
174
- "preinstall": "npx only-allow npm",
175
- "prepare": "husky",
176
- "prepublishOnly": "npm run build",
177
- "preview": "vite preview --config vite.config.dev.ts",
178
- "test": "vitest",
179
- "test:ct": "playwright test -c playwright-ct.config.ts",
180
- "test:ct:ui": "playwright test -c playwright-ct.config.ts --ui",
181
- "tsc": "tsc",
182
- "validate": "cross-env CI=1 npm run tsc & npm run lint & npm run test & npm run test:ct"
183
- },
184
169
  "peerDependencies": {
185
170
  "@hookform/devtools": "^4",
186
171
  "flat": "^6",
@@ -220,9 +205,8 @@
220
205
  },
221
206
  "engines": {
222
207
  "node": ">=20.12",
223
- "npm": "^10.2.4"
208
+ "pnpm": ">=9.0.6"
224
209
  },
225
- "packageManager": "npm@10.2.4",
226
210
  "repository": {
227
211
  "type": "git",
228
212
  "url": "git+https://github.com/paragrav/rhf-utils.git"
@@ -240,5 +224,18 @@
240
224
  "utilities",
241
225
  "utils",
242
226
  "zod"
243
- ]
244
- }
227
+ ],
228
+ "scripts": {
229
+ "build": "vite build",
230
+ "build:dev": "vite build --config vite.config.dev.ts",
231
+ "dev": "vite --config vite.config.dev.ts",
232
+ "lint": "eslint --ignore-path ./.gitignore --ext ts,tsx --report-unused-disable-directives --max-warnings 0 .",
233
+ "preinstall": "npx only-allow pnpm",
234
+ "preview": "vite preview --config vite.config.dev.ts",
235
+ "test": "vitest",
236
+ "test:ct": "playwright test -c playwright-ct.config.ts",
237
+ "test:ct:ui": "playwright test -c playwright-ct.config.ts --ui",
238
+ "tsc": "tsc",
239
+ "validate": "cross-env CI=1 pnpm install && pnpm tsc & pnpm lint & pnpm test && pnpm test:ct"
240
+ }
241
+ }
@@ -1,13 +0,0 @@
1
- import t from "../isFieldError.mjs";
2
- import s from "../useFormErrorsMemo.mjs";
3
- import i from "./getFlatFieldErrors.mjs";
4
- const d = () => s(m), m = (r) => {
5
- const e = i(r);
6
- return Object.fromEntries(
7
- Object.entries(e).filter(([, o]) => t(o))
8
- );
9
- };
10
- export {
11
- d as default,
12
- m as getFlatFieldFormErrors
13
- };
@@ -1,4 +0,0 @@
1
- const e = (r) => !!r.ref;
2
- export {
3
- e as default
4
- };
@@ -1,10 +0,0 @@
1
- import r from "../../utils/isEmptyObject.mjs";
2
- import t from "../flat/useRefdFieldErrorsMemo.mjs";
3
- import m from "./useOrphanFormErrorsMemo.mjs";
4
- const n = (o) => {
5
- const s = m(o), e = t();
6
- return r(s) ? !1 : !r(e);
7
- }, d = n;
8
- export {
9
- d as default
10
- };
@@ -1,7 +0,0 @@
1
- import { FieldError } from 'react-hook-form';
2
-
3
- /**
4
- * Determine if {@link FieldError} is a field error (i.e., has `ref`).
5
- */
6
- declare const isFieldError: (error: FieldError) => boolean;
7
- export default isFieldError;
@@ -1,9 +0,0 @@
1
- /**
2
- * Determined if there are orphan errors and no field errors.
3
- * (May be useful when reporting or displaying a specific message to user.)
4
- * RHF doesn't seem to have any other mechanism to indicate a failed submit but to `setErrors()`.
5
- * Therefore, we have no way of distinguishing between "placeholder" root error and actual error.
6
- * (e.g., "Please fix form errors above." vs "Start date must be less than end date.")
7
- */
8
- declare const useFormHasOrphanAndNoFieldErrors: (formRef: React.RefObject<HTMLFormElement>) => boolean;
9
- export default useFormHasOrphanAndNoFieldErrors;
@@ -1,7 +0,0 @@
1
- import { FieldErrors } from 'react-hook-form';
2
-
3
- /**
4
- * Create memoized value from form errors.
5
- */
6
- declare const useFormErrorsMemo: <TReturn>(callback: (errors: FieldErrors) => TReturn) => TReturn;
7
- export default useFormErrorsMemo;