@goodie-forms/react 1.1.6-alpha → 1.2.1-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +426 -426
- package/dist/components/FieldRenderer.d.ts +9 -9
- package/dist/components/FieldRenderer.d.ts.map +1 -1
- package/dist/hooks/useForm.d.ts +9 -8
- package/dist/hooks/useForm.d.ts.map +1 -1
- package/dist/hooks/useFormErrorObserver.d.ts +2 -2
- package/dist/hooks/useFormErrorObserver.d.ts.map +1 -1
- package/dist/hooks/useFormField.d.ts +2 -2
- package/dist/hooks/useFormField.d.ts.map +1 -1
- package/dist/hooks/useFormValuesObserver.d.ts +3 -3
- package/dist/hooks/useFormValuesObserver.d.ts.map +1 -1
- package/dist/index.js +82 -76
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/components/FieldRenderer.tsx +166 -120
- package/src/hooks/useForm.tsx +50 -55
- package/src/hooks/useFormErrorObserver.ts +44 -42
- package/src/hooks/useFormField.tsx +63 -55
- package/src/hooks/useFormValuesObserver.ts +49 -45
- package/src/hooks/useRenderControl.tsx +26 -26
- package/src/index.ts +7 -7
- package/src/utils/composeFns.ts +7 -7
- package/src/utils/groupBy.ts +13 -13
- package/tsconfig.json +8 -8
- package/vite.config.ts +23 -23
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FieldPath, FormField, NonnullFormField } from '../../../core/src';
|
|
2
2
|
import { ChangeEvent, FocusEvent, ReactNode, Ref } from 'react';
|
|
3
3
|
import { UseForm } from '../hooks/useForm';
|
|
4
|
-
export interface RenderParams<
|
|
4
|
+
export interface RenderParams<TOutput extends object, TValue> {
|
|
5
5
|
ref: Ref<any | null>;
|
|
6
|
-
value:
|
|
6
|
+
value: TValue | undefined;
|
|
7
7
|
handlers: {
|
|
8
8
|
onChange: (event: ChangeEvent<EventTarget>) => void;
|
|
9
9
|
onFocus: (event: FocusEvent) => void;
|
|
10
10
|
onBlur: (event: FocusEvent) => void;
|
|
11
11
|
};
|
|
12
|
-
field: undefined extends
|
|
12
|
+
field: undefined extends TValue ? FormField<TOutput, TValue> : NonnullFormField<TOutput, TValue>;
|
|
13
13
|
}
|
|
14
14
|
type DefaultValueProps<TValue> = undefined extends TValue ? {
|
|
15
15
|
defaultValue?: TValue | (() => TValue);
|
|
16
16
|
} : {
|
|
17
17
|
defaultValue: TValue | (() => TValue);
|
|
18
18
|
};
|
|
19
|
-
export type FieldRendererProps<
|
|
20
|
-
form: UseForm<
|
|
19
|
+
export type FieldRendererProps<TOutput extends object, TPath extends FieldPath.Segments> = {
|
|
20
|
+
form: UseForm<TOutput>;
|
|
21
21
|
path: TPath;
|
|
22
22
|
overrideInitialValue?: boolean;
|
|
23
23
|
unbindOnUnmount?: boolean;
|
|
24
|
-
render: (params: RenderParams<
|
|
25
|
-
} & DefaultValueProps<
|
|
26
|
-
export declare function FieldRenderer<
|
|
24
|
+
render: (params: RenderParams<TOutput, FieldPath.Resolve<TOutput, NoInfer<TPath>>>) => ReactNode;
|
|
25
|
+
} & DefaultValueProps<FieldPath.Resolve<TOutput, NoInfer<TPath>>>;
|
|
26
|
+
export declare function FieldRenderer<TOutput extends object, const TPath extends FieldPath.Segments>(props: FieldRendererProps<TOutput, TPath>): import("react/jsx-runtime").JSX.Element;
|
|
27
27
|
export {};
|
|
28
28
|
//# sourceMappingURL=FieldRenderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/FieldRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"FieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/FieldRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EACL,WAAW,EACX,UAAU,EACV,SAAS,EACT,GAAG,EAGJ,MAAM,OAAO,CAAC;AACf,OAAO,EAAW,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIpD,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,MAAM,EAAE,MAAM;IAC1D,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAErB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAE1B,QAAQ,EAAE;QACR,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;QACpD,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;QACrC,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;KACrC,CAAC;IAEF,KAAK,EAAE,SAAS,SAAS,MAAM,GAC3B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,GAC1B,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,KAAK,iBAAiB,CAAC,MAAM,IAAI,SAAS,SAAS,MAAM,GACrD;IAAE,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAA;CAAE,GAC1C;IAAE,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAA;CAAE,CAAC;AAE9C,MAAM,MAAM,kBAAkB,CAC5B,OAAO,SAAS,MAAM,EACtB,KAAK,SAAS,SAAS,CAAC,QAAQ,IAC9B;IACF,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACvB,IAAI,EAAE,KAAK,CAAC;IACZ,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,CACN,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KACtE,SAAS,CAAC;CAChB,GAAG,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAElE,wBAAgB,aAAa,CAC3B,OAAO,SAAS,MAAM,EACtB,KAAK,CAAC,KAAK,SAAS,SAAS,CAAC,QAAQ,EACtC,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,2CA4E1C"}
|
package/dist/hooks/useForm.d.ts
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare function useForm<
|
|
1
|
+
import { FieldPathBuilder, FormController } from '../../../core/src';
|
|
2
|
+
export declare function useForm<TOutput extends object>(formConfigs: FormController.Configs<TOutput>, hookConfigs?: {
|
|
3
3
|
validateMode?: "onChange" | "onBlur" | "onSubmit";
|
|
4
4
|
revalidateMode?: "onChange" | "onBlur" | "onSubmit";
|
|
5
5
|
watchIssues?: boolean;
|
|
6
6
|
watchValues?: boolean;
|
|
7
|
-
}):
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
hookConfigs
|
|
7
|
+
}): {
|
|
8
|
+
formConfigs: FormController.Configs<TOutput>;
|
|
9
|
+
paths: FieldPathBuilder<TOutput>;
|
|
10
|
+
hookConfigs: {
|
|
11
11
|
validateMode?: "onChange" | "onBlur" | "onSubmit";
|
|
12
12
|
revalidateMode?: "onChange" | "onBlur" | "onSubmit";
|
|
13
13
|
watchIssues?: boolean;
|
|
14
14
|
watchValues?: boolean;
|
|
15
|
-
};
|
|
16
|
-
controller: FormController<
|
|
15
|
+
} | undefined;
|
|
16
|
+
controller: FormController<TOutput>;
|
|
17
17
|
};
|
|
18
|
+
export type UseForm<TOutput extends object> = ReturnType<typeof useForm<TOutput>>;
|
|
18
19
|
//# sourceMappingURL=useForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useForm.d.ts","sourceRoot":"","sources":["../../src/hooks/useForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useForm.d.ts","sourceRoot":"","sources":["../../src/hooks/useForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKtE,wBAAgB,OAAO,CAAC,OAAO,SAAS,MAAM,EAC5C,WAAW,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAC5C,WAAW,CAAC,EAAE;IACZ,YAAY,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;IAClD,cAAc,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;;;;uBAJgB,UAAU,GAAG,QAAQ,GAAG,UAAU;yBAChC,UAAU,GAAG,QAAQ,GAAG,UAAU;sBACrC,OAAO;sBACP,OAAO;;;EAkCxB;AAED,MAAM,MAAM,OAAO,CAAC,OAAO,SAAS,MAAM,IAAI,UAAU,CACtD,OAAO,OAAO,CAAC,OAAO,CAAC,CACxB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FieldPath } from '../../../core/src';
|
|
2
2
|
import { UseForm } from './useForm';
|
|
3
|
-
export declare function useFormErrorObserver<
|
|
3
|
+
export declare function useFormErrorObserver<TOutput extends object, TInclude extends FieldPath.Segments[] | undefined = undefined>(form: UseForm<TOutput>, options?: {
|
|
4
4
|
include?: TInclude;
|
|
5
5
|
}): Record<string, import("@standard-schema/spec").StandardSchemaV1.Issue[]>;
|
|
6
6
|
//# sourceMappingURL=useFormErrorObserver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormErrorObserver.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormErrorObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useFormErrorObserver.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormErrorObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,oBAAoB,CAClC,OAAO,SAAS,MAAM,EACtB,QAAQ,SAAS,SAAS,CAAC,QAAQ,EAAE,GAAG,SAAS,GAAG,SAAS,EAE7D,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EACtB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,QAAQ,CAAC;CACpB,4EA6BF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FieldPath } from '../../../core/src';
|
|
2
2
|
import { UseForm } from '../hooks/useForm';
|
|
3
|
-
export declare function useFormField<
|
|
3
|
+
export declare function useFormField<TOutput extends object, TPath extends FieldPath.Segments>(form: UseForm<TOutput>, path: TPath, bindingConfig?: Parameters<typeof form.controller.bindField<TPath>>[1]): import('../../../core/src').FormField<TOutput, FieldPath.Resolve<TOutput, TPath>> | undefined;
|
|
4
4
|
//# sourceMappingURL=useFormField.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormField.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useFormField.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAI3C,wBAAgB,YAAY,CAC1B,OAAO,SAAS,MAAM,EACtB,KAAK,SAAS,SAAS,CAAC,QAAQ,EAEhC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EACtB,IAAI,EAAE,KAAK,EACX,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,kGAkDvE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FieldPath } from '../../../core/src';
|
|
2
2
|
import { UseForm } from './useForm';
|
|
3
|
-
export declare function useFormValuesObserver<
|
|
3
|
+
export declare function useFormValuesObserver<TOutput extends object, TPaths extends FieldPath.Segments[] | undefined = undefined>(form: UseForm<TOutput>, options?: {
|
|
4
4
|
include?: TPaths;
|
|
5
|
-
}): import('../../../core/src').DeepPartial<
|
|
5
|
+
}): import('../../../core/src').DeepPartial<TOutput>;
|
|
6
6
|
//# sourceMappingURL=useFormValuesObserver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormValuesObserver.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormValuesObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useFormValuesObserver.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormValuesObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,qBAAqB,CACnC,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,SAAS,CAAC,QAAQ,EAAE,GAAG,SAAS,GAAG,SAAS,EAE3D,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EACtB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,qDAmCF"}
|
package/dist/index.js
CHANGED
|
@@ -1,130 +1,136 @@
|
|
|
1
|
-
import { FormController as m,
|
|
2
|
-
import { useState as
|
|
3
|
-
import { jsx as
|
|
4
|
-
function
|
|
5
|
-
|
|
6
|
-
for (const n of e)
|
|
7
|
-
n();
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
function a() {
|
|
11
|
-
const [, e] = v(0), n = f(0), r = f(!1);
|
|
1
|
+
import { FormController as m, FieldPathBuilder as h, FieldPath as o } from "@goodie-forms/core";
|
|
2
|
+
import { useState as a, useRef as v, startTransition as F, useEffect as i } from "react";
|
|
3
|
+
import { jsx as g, Fragment as C } from "react/jsx-runtime";
|
|
4
|
+
function f() {
|
|
5
|
+
const [, e] = a(0), n = v(0), r = v(!1);
|
|
12
6
|
n.current++;
|
|
13
|
-
const
|
|
7
|
+
const u = () => {
|
|
14
8
|
r.current || (r.current = !0, queueMicrotask(() => {
|
|
15
|
-
|
|
16
|
-
e((
|
|
9
|
+
F(() => {
|
|
10
|
+
e((t) => t + 1);
|
|
17
11
|
}), r.current = !1;
|
|
18
12
|
}));
|
|
19
13
|
};
|
|
20
14
|
return {
|
|
21
15
|
renderCount: n.current,
|
|
22
|
-
forceRerender:
|
|
16
|
+
forceRerender: u
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function s(...e) {
|
|
20
|
+
return () => {
|
|
21
|
+
for (const n of e)
|
|
22
|
+
n();
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
function U(e, n) {
|
|
26
|
-
const [r] =
|
|
26
|
+
const [r] = a(() => new m(e)), [u] = a(() => new h()), t = f();
|
|
27
27
|
return i(() => {
|
|
28
|
-
const
|
|
28
|
+
const l = () => {
|
|
29
29
|
};
|
|
30
30
|
return s(
|
|
31
31
|
r.events.on("submissionStatusChange", () => {
|
|
32
|
-
|
|
32
|
+
t.forceRerender();
|
|
33
33
|
}),
|
|
34
34
|
n?.watchIssues ? r.events.on(
|
|
35
35
|
"fieldIssuesUpdated",
|
|
36
|
-
() =>
|
|
37
|
-
) :
|
|
36
|
+
() => t.forceRerender()
|
|
37
|
+
) : l,
|
|
38
38
|
n?.watchValues ? r.events.on(
|
|
39
39
|
"valueChanged",
|
|
40
|
-
() =>
|
|
41
|
-
) :
|
|
40
|
+
() => t.forceRerender()
|
|
41
|
+
) : l
|
|
42
42
|
);
|
|
43
43
|
}, [r]), {
|
|
44
44
|
formConfigs: e,
|
|
45
|
+
paths: u,
|
|
45
46
|
hookConfigs: n,
|
|
46
47
|
controller: r
|
|
47
48
|
};
|
|
48
49
|
}
|
|
49
|
-
function
|
|
50
|
-
const
|
|
51
|
-
let
|
|
52
|
-
return
|
|
50
|
+
function R(e, n, r) {
|
|
51
|
+
const u = f(), [t, l] = a(() => {
|
|
52
|
+
let d = e.controller.getField(n);
|
|
53
|
+
return d == null && r != null && (d = e.controller.bindField(n, r)), d;
|
|
53
54
|
});
|
|
54
55
|
return i(() => {
|
|
55
|
-
const { events:
|
|
56
|
-
return
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
const { events: d } = e.controller;
|
|
57
|
+
return l(e.controller.getField(n)), s(
|
|
58
|
+
d.on("fieldBound", (c) => {
|
|
59
|
+
o.equals(c, n) && l(e.controller.getField(n));
|
|
59
60
|
}),
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
d.on("fieldUnbound", (c) => {
|
|
62
|
+
o.equals(c, n) && l(void 0);
|
|
62
63
|
}),
|
|
63
|
-
|
|
64
|
-
(
|
|
64
|
+
d.on("valueChanged", (c) => {
|
|
65
|
+
(o.equals(c, n) || o.isDescendant(c, n)) && u.forceRerender();
|
|
65
66
|
}),
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
d.on("fieldTouchUpdated", (c) => {
|
|
68
|
+
o.equals(c, n) && u.forceRerender();
|
|
68
69
|
}),
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
d.on("fieldDirtyUpdated", (c) => {
|
|
71
|
+
o.equals(c, n) && u.forceRerender();
|
|
71
72
|
}),
|
|
72
|
-
|
|
73
|
-
|
|
73
|
+
d.on("fieldIssuesUpdated", (c) => {
|
|
74
|
+
o.equals(c, n) && u.forceRerender();
|
|
74
75
|
})
|
|
75
76
|
);
|
|
76
|
-
}, []),
|
|
77
|
+
}, []), t;
|
|
77
78
|
}
|
|
78
79
|
function w(e, n) {
|
|
79
|
-
const r =
|
|
80
|
-
const
|
|
81
|
-
|
|
80
|
+
const r = f(), u = n?.include == null ? e.controller._data : n.include.reduce((t, l) => {
|
|
81
|
+
const d = o.getValue(
|
|
82
|
+
e.controller._data,
|
|
83
|
+
l
|
|
84
|
+
);
|
|
85
|
+
return o.setValue(t, l, d), t;
|
|
82
86
|
}, {});
|
|
83
87
|
return i(() => {
|
|
84
|
-
const { events:
|
|
88
|
+
const { events: t } = e.controller;
|
|
85
89
|
return s(
|
|
86
|
-
|
|
90
|
+
t.on("valueChanged", (l) => {
|
|
87
91
|
(n?.include == null || n.include.some(
|
|
88
|
-
(
|
|
92
|
+
(c) => o.equals(c, l) || o.isDescendant(c, l)
|
|
89
93
|
)) && r.forceRerender();
|
|
90
94
|
})
|
|
91
95
|
);
|
|
92
|
-
}, []),
|
|
96
|
+
}, []), u;
|
|
93
97
|
}
|
|
94
|
-
function
|
|
98
|
+
function V(e, n) {
|
|
95
99
|
const r = {};
|
|
96
|
-
for (const
|
|
97
|
-
const
|
|
98
|
-
(r[
|
|
100
|
+
for (const u of e) {
|
|
101
|
+
const t = n(u);
|
|
102
|
+
(r[t] ??= []).push(u);
|
|
99
103
|
}
|
|
100
104
|
return r;
|
|
101
105
|
}
|
|
102
106
|
function y(e, n) {
|
|
103
|
-
const r =
|
|
107
|
+
const r = f(), u = e.controller._issues.filter((t) => {
|
|
104
108
|
if (n?.include == null) return !0;
|
|
105
|
-
const
|
|
106
|
-
return n.include.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
);
|
|
109
|
+
const l = o.normalize(t.path);
|
|
110
|
+
return n.include.some(
|
|
111
|
+
(d) => o.equals(d, l)
|
|
112
|
+
);
|
|
113
|
+
});
|
|
111
114
|
return i(() => {
|
|
112
115
|
const { events: t } = e.controller;
|
|
113
116
|
return s(
|
|
114
|
-
t.on("fieldIssuesUpdated", (
|
|
115
|
-
(n?.include?.includes?.(
|
|
117
|
+
t.on("fieldIssuesUpdated", (l) => {
|
|
118
|
+
(n?.include?.includes?.(l) ?? !0) && r.forceRerender();
|
|
116
119
|
})
|
|
117
120
|
);
|
|
118
|
-
}, []),
|
|
121
|
+
}, []), V(
|
|
122
|
+
u,
|
|
123
|
+
(t) => t.path == null ? "$" : o.toStringPath(o.normalize(t.path))
|
|
124
|
+
);
|
|
119
125
|
}
|
|
120
|
-
function
|
|
121
|
-
const n =
|
|
126
|
+
function B(e) {
|
|
127
|
+
const n = v(null), r = R(e.form, e.path, {
|
|
122
128
|
overrideInitialValue: e.overrideInitialValue ?? !0,
|
|
123
129
|
defaultValue: typeof e.defaultValue == "function" ? e.defaultValue() : e.defaultValue
|
|
124
|
-
}),
|
|
125
|
-
onChange(
|
|
126
|
-
const { target:
|
|
127
|
-
|
|
130
|
+
}), u = {
|
|
131
|
+
onChange(t) {
|
|
132
|
+
const { target: l } = t;
|
|
133
|
+
l === r.boundElement && "value" in l && typeof l.value == "string" && r.setValue(l.value, {
|
|
128
134
|
shouldTouch: !0,
|
|
129
135
|
shouldMarkDirty: !0
|
|
130
136
|
});
|
|
@@ -137,27 +143,27 @@ function D(e) {
|
|
|
137
143
|
}
|
|
138
144
|
};
|
|
139
145
|
return i(() => {
|
|
140
|
-
const { events:
|
|
146
|
+
const { events: t } = e.form.controller;
|
|
141
147
|
return s(
|
|
142
|
-
|
|
143
|
-
|
|
148
|
+
t.on("valueChanged", (l) => {
|
|
149
|
+
!o.equals(l, e.path) && !o.isDescendant(l, e.path) || e.form.hookConfigs?.validateMode === "onChange" && e.form.controller.validateField(e.path);
|
|
144
150
|
})
|
|
145
151
|
);
|
|
146
152
|
}, []), i(() => (r.bindElement(n.current), () => {
|
|
147
153
|
e.unbindOnUnmount && e.form.controller.unbindField(e.path);
|
|
148
|
-
}), []), /* @__PURE__ */
|
|
154
|
+
}), []), /* @__PURE__ */ g(C, { children: e.render({
|
|
149
155
|
ref: n,
|
|
150
156
|
value: r.value,
|
|
151
|
-
handlers:
|
|
157
|
+
handlers: u,
|
|
152
158
|
field: r
|
|
153
159
|
}) });
|
|
154
160
|
}
|
|
155
161
|
export {
|
|
156
|
-
|
|
162
|
+
B as FieldRenderer,
|
|
157
163
|
U as useForm,
|
|
158
164
|
y as useFormErrorObserver,
|
|
159
|
-
|
|
165
|
+
R as useFormField,
|
|
160
166
|
w as useFormValuesObserver,
|
|
161
|
-
|
|
167
|
+
f as useRenderControl
|
|
162
168
|
};
|
|
163
169
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/composeFns.ts","../src/hooks/useRenderControl.tsx","../src/hooks/useForm.tsx","../src/hooks/useFormField.tsx","../src/hooks/useFormValuesObserver.ts","../src/utils/groupBy.ts","../src/hooks/useFormErrorObserver.ts","../src/components/FieldRenderer.tsx"],"sourcesContent":["export function composeFns<TFns extends (() => void)[]>(...fns: TFns) {\n return () => {\n for (const fn of fns) {\n fn();\n }\n };\n}\n","import { startTransition, useRef, useState } from \"react\";\n\nexport function useRenderControl() {\n const [, rerender] = useState(0);\n const renderCount = useRef(0);\n const renderScheduled = useRef(false);\n renderCount.current++;\n\n const scheduleRerender = () => {\n if (renderScheduled.current) return;\n renderScheduled.current = true;\n\n queueMicrotask(() => {\n startTransition(() => {\n rerender((i) => i + 1);\n });\n\n renderScheduled.current = false;\n });\n };\n\n return {\n renderCount: renderCount.current,\n forceRerender: scheduleRerender,\n };\n}\n","import { FormController, type Form } from \"@goodie-forms/core\";\nimport { useEffect, useState } from \"react\";\nimport { composeFns } from \"../utils/composeFns\";\nimport { useRenderControl } from \"../hooks/useRenderControl\";\n\nexport function useForm<TShape extends object>(\n formConfigs: Form.FormConfigs<TShape>,\n hookConfigs?: {\n validateMode?: \"onChange\" | \"onBlur\" | \"onSubmit\";\n revalidateMode?: \"onChange\" | \"onBlur\" | \"onSubmit\";\n watchIssues?: boolean;\n watchValues?: boolean;\n }\n) {\n const [controller] = useState(() => new FormController(formConfigs));\n\n const renderControl = useRenderControl();\n\n useEffect(() => {\n const noop = () => {};\n\n return composeFns(\n controller.events.on(\"submissionStatusChange\", () => {\n renderControl.forceRerender();\n }),\n hookConfigs?.watchIssues\n ? controller.events.on(\"fieldIssuesUpdated\", () =>\n renderControl.forceRerender()\n )\n : noop,\n hookConfigs?.watchValues\n ? controller.events.on(\"valueChanged\", () =>\n renderControl.forceRerender()\n )\n : noop\n );\n }, [controller]);\n\n return {\n formConfigs,\n hookConfigs,\n controller,\n } as UseForm<TShape>;\n}\n\nexport type UseForm<TShape extends object> = {\n formConfigs: Form.FormConfigs<TShape>;\n hookConfigs?: {\n validateMode?: \"onChange\" | \"onBlur\" | \"onSubmit\";\n revalidateMode?: \"onChange\" | \"onBlur\" | \"onSubmit\";\n watchIssues?: boolean;\n watchValues?: boolean;\n };\n controller: FormController<TShape>;\n};\n","import { Field } from \"@goodie-forms/core\";\nimport { useEffect, useState } from \"react\";\nimport { UseForm } from \"../hooks/useForm\";\nimport { useRenderControl } from \"../hooks/useRenderControl\";\nimport { composeFns } from \"../utils/composeFns\";\n\nexport function useFormField<\n TShape extends object,\n TPath extends Field.Paths<TShape>\n>(\n form: UseForm<TShape>,\n path: TPath,\n bindingConfig?: Parameters<typeof form.controller.bindField<TPath>>[1]\n) {\n const renderControl = useRenderControl();\n\n const [field, setField] = useState(() => {\n let field = form.controller.getField(path);\n if (field == null && bindingConfig != null) {\n field = form.controller.bindField(path, bindingConfig);\n }\n return field;\n });\n\n useEffect(() => {\n const { events } = form.controller;\n\n setField(form.controller.getField(path));\n\n return composeFns(\n events.on(\"fieldBound\", (_path) => {\n if (_path === path) setField(form.controller.getField(path));\n }),\n events.on(\"fieldUnbound\", (_path) => {\n if (_path === path) setField(undefined);\n }),\n events.on(\"valueChanged\", (changedPath) => {\n if (changedPath === path || Field.isDescendant(changedPath, path)) {\n renderControl.forceRerender();\n }\n }),\n events.on(\"fieldTouchUpdated\", (_path) => {\n if (_path === path) renderControl.forceRerender();\n }),\n events.on(\"fieldDirtyUpdated\", (_path) => {\n if (_path === path) renderControl.forceRerender();\n }),\n events.on(\"fieldIssuesUpdated\", (_path) => {\n if (_path === path) renderControl.forceRerender();\n })\n );\n }, []);\n\n return field;\n}\n","import { Field } from \"@goodie-forms/core\";\nimport { useEffect } from \"react\";\nimport { composeFns } from \"../utils/composeFns\";\nimport type { UseForm } from \"./useForm\";\nimport { useRenderControl } from \"./useRenderControl\";\n\nexport function useFormValuesObserver<\n TShape extends object,\n TPaths extends Field.Paths<TShape>[] | undefined = undefined\n>(\n form: UseForm<TShape>,\n options?: {\n include?: TPaths;\n }\n) {\n const renderControl = useRenderControl();\n\n const observedValues =\n options?.include == null\n ? form.controller._data\n : options.include.reduce((data, path) => {\n const value = Field.getValue(form.controller._data as TShape, path)!;\n Field.setValue(data, path, value);\n return data;\n }, {} as TShape);\n\n useEffect(() => {\n const { events } = form.controller;\n\n return composeFns(\n events.on(\"valueChanged\", (changedPath) => {\n const watchingChange =\n options?.include == null\n ? true\n : options.include.some(\n (path) =>\n path === changedPath || Field.isDescendant(path, changedPath)\n );\n if (watchingChange) renderControl.forceRerender();\n })\n );\n }, []);\n\n return observedValues;\n}\n","export function groupBy<T, K extends PropertyKey>(\n items: readonly T[],\n key: (item: T) => K,\n): Record<K, T[]> {\n const result = {} as Record<K, T[]>;\n\n for (const item of items) {\n const k = key(item);\n (result[k] ??= []).push(item);\n }\n\n return result;\n}\n","import { Field } from \"@goodie-forms/core\";\nimport { useEffect } from \"react\";\nimport { composeFns } from \"../utils/composeFns\";\nimport { groupBy } from \"../utils/groupBy\";\nimport type { UseForm } from \"./useForm\";\nimport { useRenderControl } from \"./useRenderControl\";\n\nexport function useFormErrorObserver<\n TShape extends object,\n TInclude extends Field.Paths<TShape>[] | undefined\n>(\n form: UseForm<TShape>,\n options?: {\n include?: TInclude;\n }\n) {\n const renderControl = useRenderControl();\n\n const filteredIssues = form.controller._issues.filter((issue) => {\n if (options?.include == null) return true;\n const path = Field.parsePath(issue.path!) as Field.Paths<TShape>;\n return options.include.includes(path);\n });\n\n const observedIssues = groupBy(filteredIssues, (issue) =>\n Field.parsePath(issue.path!)\n );\n\n useEffect(() => {\n const { events } = form.controller;\n\n return composeFns(\n events.on(\"fieldIssuesUpdated\", (path) => {\n if (options?.include?.includes?.(path) ?? true) {\n renderControl.forceRerender();\n }\n })\n );\n }, []);\n\n return observedIssues;\n}\n","import { Field, FormField, NonnullFormField } from \"@goodie-forms/core\";\nimport {\n ChangeEvent,\n FocusEvent,\n ReactNode,\n Ref,\n useEffect,\n useRef,\n} from \"react\";\nimport { UseForm } from \"../hooks/useForm\";\nimport { useFormField } from \"../hooks/useFormField\";\nimport { composeFns } from \"../utils/composeFns\";\n\nexport interface RenderParams<\n TShape extends object,\n TPath extends Field.Paths<TShape>\n> {\n ref: Ref<any | null>;\n\n value: Field.GetValue<TShape, TPath> | undefined;\n\n handlers: {\n onChange: (event: ChangeEvent<EventTarget>) => void;\n onFocus: (event: FocusEvent) => void;\n onBlur: (event: FocusEvent) => void;\n };\n\n field: undefined extends Field.GetValue<TShape, TPath>\n ? FormField<TShape, TPath>\n : NonnullFormField<TShape, TPath>;\n}\n\ntype DefaultValueProps<TValue> = undefined extends TValue\n ? { defaultValue?: TValue | (() => TValue) }\n : { defaultValue: TValue | (() => TValue) };\n\nexport type FieldRendererProps<\n TShape extends object,\n TPath extends Field.Paths<TShape>\n> = {\n form: UseForm<TShape>;\n path: TPath;\n overrideInitialValue?: boolean;\n unbindOnUnmount?: boolean;\n render: (params: RenderParams<TShape, TPath>) => ReactNode;\n} & DefaultValueProps<Field.GetValue<TShape, TPath>>;\n\nexport function FieldRenderer<\n TShape extends object,\n TPath extends Field.Paths<TShape>\n>(props: FieldRendererProps<TShape, TPath>) {\n const elementRef = useRef<HTMLElement>(null);\n\n const field = useFormField(props.form, props.path, {\n overrideInitialValue: props.overrideInitialValue ?? true,\n defaultValue:\n typeof props.defaultValue === \"function\"\n ? (props.defaultValue as any)()\n : props.defaultValue,\n })!;\n\n const handlers: RenderParams<TShape, TPath>[\"handlers\"] = {\n onChange(event) {\n const { target } = event;\n if (target !== field.boundElement) return;\n if (!(\"value\" in target)) return;\n if (typeof target.value !== \"string\") return;\n field.setValue(target.value as Field.GetValue<TShape, TPath>, {\n shouldTouch: true,\n shouldMarkDirty: true,\n });\n },\n onFocus() {\n field.touch();\n },\n onBlur() {\n if (\n props.form.hookConfigs?.validateMode === \"onBlur\" ||\n props.form.hookConfigs?.validateMode === \"onChange\"\n ) {\n props.form.controller.validateField(props.path);\n }\n },\n };\n\n useEffect(() => {\n const { events } = props.form.controller;\n\n return composeFns(\n events.on(\"valueChanged\", (path) => {\n if (path !== props.path && !Field.isDescendant(path, props.path))\n return;\n if (props.form.hookConfigs?.validateMode === \"onChange\") {\n props.form.controller.validateField(props.path);\n }\n })\n );\n }, []);\n\n useEffect(() => {\n field.bindElement(elementRef.current!);\n\n return () => {\n if (props.unbindOnUnmount) {\n props.form.controller.unbindField(props.path);\n }\n };\n }, []);\n\n return (\n <>\n {props.render({\n ref: elementRef,\n value: field.value,\n handlers: handlers,\n field: field as any,\n })}\n </>\n );\n}\n"],"names":["composeFns","fns","fn","useRenderControl","rerender","useState","renderCount","useRef","renderScheduled","scheduleRerender","startTransition","i","useForm","formConfigs","hookConfigs","controller","FormController","renderControl","useEffect","noop","useFormField","form","path","bindingConfig","field","setField","events","_path","changedPath","Field","useFormValuesObserver","options","observedValues","data","value","groupBy","items","key","result","item","k","useFormErrorObserver","filteredIssues","issue","observedIssues","FieldRenderer","props","elementRef","handlers","event","target","jsx","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/hooks/useRenderControl.tsx","../src/utils/composeFns.ts","../src/hooks/useForm.tsx","../src/hooks/useFormField.tsx","../src/hooks/useFormValuesObserver.ts","../src/utils/groupBy.ts","../src/hooks/useFormErrorObserver.ts","../src/components/FieldRenderer.tsx"],"sourcesContent":["import { startTransition, useRef, useState } from \"react\";\r\n\r\nexport function useRenderControl() {\r\n const [, rerender] = useState(0);\r\n const renderCount = useRef(0);\r\n const renderScheduled = useRef(false);\r\n renderCount.current++;\r\n\r\n const scheduleRerender = () => {\r\n if (renderScheduled.current) return;\r\n renderScheduled.current = true;\r\n\r\n queueMicrotask(() => {\r\n startTransition(() => {\r\n rerender((i) => i + 1);\r\n });\r\n\r\n renderScheduled.current = false;\r\n });\r\n };\r\n\r\n return {\r\n renderCount: renderCount.current,\r\n forceRerender: scheduleRerender,\r\n };\r\n}\r\n","export function composeFns<TFns extends (() => void)[]>(...fns: TFns) {\r\n return () => {\r\n for (const fn of fns) {\r\n fn();\r\n }\r\n };\r\n}\r\n","import { FieldPathBuilder, FormController } from \"@goodie-forms/core\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { useRenderControl } from \"../hooks/useRenderControl\";\r\nimport { composeFns } from \"../utils/composeFns\";\r\n\r\nexport function useForm<TOutput extends object>(\r\n formConfigs: FormController.Configs<TOutput>,\r\n hookConfigs?: {\r\n validateMode?: \"onChange\" | \"onBlur\" | \"onSubmit\";\r\n revalidateMode?: \"onChange\" | \"onBlur\" | \"onSubmit\";\r\n watchIssues?: boolean;\r\n watchValues?: boolean;\r\n },\r\n) {\r\n const [controller] = useState(() => new FormController(formConfigs));\r\n const [paths] = useState(() => new FieldPathBuilder<TOutput>());\r\n\r\n const renderControl = useRenderControl();\r\n\r\n useEffect(() => {\r\n const noop = () => {};\r\n\r\n return composeFns(\r\n controller.events.on(\"submissionStatusChange\", () => {\r\n renderControl.forceRerender();\r\n }),\r\n hookConfigs?.watchIssues\r\n ? controller.events.on(\"fieldIssuesUpdated\", () =>\r\n renderControl.forceRerender(),\r\n )\r\n : noop,\r\n hookConfigs?.watchValues\r\n ? controller.events.on(\"valueChanged\", () =>\r\n renderControl.forceRerender(),\r\n )\r\n : noop,\r\n );\r\n }, [controller]);\r\n\r\n return {\r\n formConfigs,\r\n paths,\r\n hookConfigs,\r\n controller,\r\n };\r\n}\r\n\r\nexport type UseForm<TOutput extends object> = ReturnType<\r\n typeof useForm<TOutput>\r\n>;\r\n","import { FieldPath } from \"@goodie-forms/core\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { UseForm } from \"../hooks/useForm\";\r\nimport { useRenderControl } from \"../hooks/useRenderControl\";\r\nimport { composeFns } from \"../utils/composeFns\";\r\n\r\nexport function useFormField<\r\n TOutput extends object,\r\n TPath extends FieldPath.Segments,\r\n>(\r\n form: UseForm<TOutput>,\r\n path: TPath,\r\n bindingConfig?: Parameters<typeof form.controller.bindField<TPath>>[1],\r\n) {\r\n const renderControl = useRenderControl();\r\n\r\n const [field, setField] = useState(() => {\r\n let field = form.controller.getField(path);\r\n if (field == null && bindingConfig != null) {\r\n field = form.controller.bindField(path, bindingConfig);\r\n }\r\n return field;\r\n });\r\n\r\n useEffect(() => {\r\n const { events } = form.controller;\r\n\r\n setField(form.controller.getField(path));\r\n\r\n return composeFns(\r\n events.on(\"fieldBound\", (_path) => {\r\n if (!FieldPath.equals(_path, path)) return;\r\n setField(form.controller.getField(path));\r\n }),\r\n events.on(\"fieldUnbound\", (_path) => {\r\n if (!FieldPath.equals(_path, path)) return;\r\n setField(undefined);\r\n }),\r\n events.on(\"valueChanged\", (changedPath) => {\r\n if (\r\n FieldPath.equals(changedPath, path) ||\r\n FieldPath.isDescendant(changedPath, path)\r\n ) {\r\n renderControl.forceRerender();\r\n }\r\n }),\r\n events.on(\"fieldTouchUpdated\", (_path) => {\r\n if (!FieldPath.equals(_path, path)) return;\r\n renderControl.forceRerender();\r\n }),\r\n events.on(\"fieldDirtyUpdated\", (_path) => {\r\n if (!FieldPath.equals(_path, path)) return;\r\n renderControl.forceRerender();\r\n }),\r\n events.on(\"fieldIssuesUpdated\", (_path) => {\r\n if (!FieldPath.equals(_path, path)) return;\r\n renderControl.forceRerender();\r\n }),\r\n );\r\n }, []);\r\n\r\n return field;\r\n}\r\n","import { FieldPath } from \"@goodie-forms/core\";\r\nimport { useEffect } from \"react\";\r\nimport { composeFns } from \"../utils/composeFns\";\r\nimport type { UseForm } from \"./useForm\";\r\nimport { useRenderControl } from \"./useRenderControl\";\r\n\r\nexport function useFormValuesObserver<\r\n TOutput extends object,\r\n TPaths extends FieldPath.Segments[] | undefined = undefined,\r\n>(\r\n form: UseForm<TOutput>,\r\n options?: {\r\n include?: TPaths;\r\n },\r\n) {\r\n const renderControl = useRenderControl();\r\n\r\n const observedValues =\r\n options?.include == null\r\n ? form.controller._data\r\n : options.include.reduce((data, path) => {\r\n const value = FieldPath.getValue(\r\n form.controller._data as TOutput,\r\n path,\r\n )!;\r\n FieldPath.setValue(data, path, value);\r\n return data;\r\n }, {} as TOutput);\r\n\r\n useEffect(() => {\r\n const { events } = form.controller;\r\n\r\n return composeFns(\r\n events.on(\"valueChanged\", (changedPath) => {\r\n const watchingChange =\r\n options?.include == null\r\n ? true\r\n : options.include.some(\r\n (path) =>\r\n FieldPath.equals(path, changedPath) ||\r\n FieldPath.isDescendant(path, changedPath),\r\n );\r\n if (watchingChange) renderControl.forceRerender();\r\n }),\r\n );\r\n }, []);\r\n\r\n return observedValues;\r\n}\r\n","export function groupBy<T, K extends PropertyKey>(\r\n items: readonly T[],\r\n key: (item: T) => K,\r\n): Record<K, T[]> {\r\n const result = {} as Record<K, T[]>;\r\n\r\n for (const item of items) {\r\n const k = key(item);\r\n (result[k] ??= []).push(item);\r\n }\r\n\r\n return result;\r\n}\r\n","import { FieldPath } from \"@goodie-forms/core\";\r\nimport { groupBy } from \"../utils/groupBy\";\r\nimport { useEffect } from \"react\";\r\nimport { composeFns } from \"../utils/composeFns\";\r\nimport type { UseForm } from \"./useForm\";\r\nimport { useRenderControl } from \"./useRenderControl\";\r\n\r\nexport function useFormErrorObserver<\r\n TOutput extends object,\r\n TInclude extends FieldPath.Segments[] | undefined = undefined,\r\n>(\r\n form: UseForm<TOutput>,\r\n options?: {\r\n include?: TInclude;\r\n },\r\n) {\r\n const renderControl = useRenderControl();\r\n\r\n const observedIssues = form.controller._issues.filter((issue) => {\r\n if (options?.include == null) return true;\r\n const normalizedIssuePath = FieldPath.normalize(issue.path);\r\n return options.include.some((path) =>\r\n FieldPath.equals(path, normalizedIssuePath),\r\n );\r\n });\r\n\r\n useEffect(() => {\r\n const { events } = form.controller;\r\n\r\n return composeFns(\r\n events.on(\"fieldIssuesUpdated\", (path) => {\r\n if (options?.include?.includes?.(path) ?? true) {\r\n renderControl.forceRerender();\r\n }\r\n }),\r\n );\r\n }, []);\r\n\r\n return groupBy(observedIssues, (issue) =>\r\n issue.path == null\r\n ? \"$\"\r\n : FieldPath.toStringPath(FieldPath.normalize(issue.path)),\r\n );\r\n}\r\n","import { FieldPath, FormField, NonnullFormField } from \"@goodie-forms/core\";\r\nimport {\r\n ChangeEvent,\r\n FocusEvent,\r\n ReactNode,\r\n Ref,\r\n useEffect,\r\n useRef,\r\n} from \"react\";\r\nimport { useForm, UseForm } from \"../hooks/useForm\";\r\nimport { useFormField } from \"../hooks/useFormField\";\r\nimport { composeFns } from \"../utils/composeFns\";\r\n\r\nexport interface RenderParams<TOutput extends object, TValue> {\r\n ref: Ref<any | null>;\r\n\r\n value: TValue | undefined;\r\n\r\n handlers: {\r\n onChange: (event: ChangeEvent<EventTarget>) => void;\r\n onFocus: (event: FocusEvent) => void;\r\n onBlur: (event: FocusEvent) => void;\r\n };\r\n\r\n field: undefined extends TValue\r\n ? FormField<TOutput, TValue>\r\n : NonnullFormField<TOutput, TValue>;\r\n}\r\n\r\ntype DefaultValueProps<TValue> = undefined extends TValue\r\n ? { defaultValue?: TValue | (() => TValue) }\r\n : { defaultValue: TValue | (() => TValue) };\r\n\r\nexport type FieldRendererProps<\r\n TOutput extends object,\r\n TPath extends FieldPath.Segments,\r\n> = {\r\n form: UseForm<TOutput>;\r\n path: TPath;\r\n overrideInitialValue?: boolean;\r\n unbindOnUnmount?: boolean;\r\n render: (\r\n params: RenderParams<TOutput, FieldPath.Resolve<TOutput, NoInfer<TPath>>>,\r\n ) => ReactNode;\r\n} & DefaultValueProps<FieldPath.Resolve<TOutput, NoInfer<TPath>>>;\r\n\r\nexport function FieldRenderer<\r\n TOutput extends object,\r\n const TPath extends FieldPath.Segments,\r\n>(props: FieldRendererProps<TOutput, TPath>) {\r\n type TValue = FieldPath.Resolve<TOutput, TPath>;\r\n\r\n const elementRef = useRef<HTMLElement>(null);\r\n\r\n const field = useFormField(props.form, props.path, {\r\n overrideInitialValue: props.overrideInitialValue ?? true,\r\n defaultValue:\r\n typeof props.defaultValue === \"function\"\r\n ? (props.defaultValue as any)()\r\n : props.defaultValue,\r\n })!;\r\n\r\n const handlers: RenderParams<TOutput, TValue>[\"handlers\"] = {\r\n onChange(event) {\r\n const { target } = event;\r\n if (target !== field.boundElement) return;\r\n if (!(\"value\" in target)) return;\r\n if (typeof target.value !== \"string\") return;\r\n field.setValue(target.value as TValue, {\r\n shouldTouch: true,\r\n shouldMarkDirty: true,\r\n });\r\n },\r\n onFocus() {\r\n field.touch();\r\n },\r\n onBlur() {\r\n if (\r\n props.form.hookConfigs?.validateMode === \"onBlur\" ||\r\n props.form.hookConfigs?.validateMode === \"onChange\"\r\n ) {\r\n props.form.controller.validateField(props.path);\r\n }\r\n },\r\n };\r\n\r\n useEffect(() => {\r\n const { events } = props.form.controller;\r\n\r\n return composeFns(\r\n events.on(\"valueChanged\", (_path) => {\r\n if (\r\n !FieldPath.equals(_path, props.path) &&\r\n !FieldPath.isDescendant(_path, props.path)\r\n ) {\r\n return;\r\n }\r\n\r\n if (props.form.hookConfigs?.validateMode === \"onChange\") {\r\n props.form.controller.validateField(props.path);\r\n }\r\n }),\r\n );\r\n }, []);\r\n\r\n useEffect(() => {\r\n field.bindElement(elementRef.current!);\r\n\r\n return () => {\r\n if (props.unbindOnUnmount) {\r\n props.form.controller.unbindField(props.path);\r\n }\r\n };\r\n }, []);\r\n\r\n return (\r\n <>\r\n {props.render({\r\n ref: elementRef,\r\n value: field.value,\r\n handlers: handlers,\r\n field: field as any,\r\n })}\r\n </>\r\n );\r\n}\r\n\r\n/* ---- TESTS ---------------- */\r\n\r\n// function TestComp() {\r\n// const form = useForm<{ a?: { b: 99 } }>({});\r\n\r\n// const jsx = (\r\n// <>\r\n// <FieldRenderer\r\n// form={form}\r\n// path={form.paths.fromProxy((data) => data.a.b)}\r\n// defaultValue={() => 99 as const}\r\n// render={({ ref, value, handlers, field }) => {\r\n// // ^?\r\n// return <></>;\r\n// }}\r\n// />\r\n\r\n// {/* defaultField olmayabilir, çünkü \"a\" nullable */}\r\n// <FieldRenderer\r\n// form={form}\r\n// path={form.paths.fromProxy((data) => data.a)}\r\n// render={({ ref, value, handlers, field }) => {\r\n// // ^?\r\n// return <></>;\r\n// }}\r\n// />\r\n\r\n// <FieldRenderer\r\n// form={form}\r\n// path={form.paths.fromStringPath(\"a.b\")}\r\n// defaultValue={() => 99 as const}\r\n// render={({ ref, value, handlers, field }) => {\r\n// // ^?\r\n// return <></>;\r\n// }}\r\n// />\r\n// </>\r\n// );\r\n// }\r\n"],"names":["useRenderControl","rerender","useState","renderCount","useRef","renderScheduled","scheduleRerender","startTransition","i","composeFns","fns","fn","useForm","formConfigs","hookConfigs","controller","FormController","paths","FieldPathBuilder","renderControl","useEffect","noop","useFormField","form","path","bindingConfig","field","setField","events","_path","FieldPath","changedPath","useFormValuesObserver","options","observedValues","data","value","groupBy","items","key","result","item","k","useFormErrorObserver","observedIssues","issue","normalizedIssuePath","FieldRenderer","props","elementRef","handlers","event","target","jsx","Fragment"],"mappings":";;;AAEO,SAASA,IAAmB;AACjC,QAAM,GAAGC,CAAQ,IAAIC,EAAS,CAAC,GACzBC,IAAcC,EAAO,CAAC,GACtBC,IAAkBD,EAAO,EAAK;AACpC,EAAAD,EAAY;AAEZ,QAAMG,IAAmB,MAAM;AAC7B,IAAID,EAAgB,YACpBA,EAAgB,UAAU,IAE1B,eAAe,MAAM;AACnB,MAAAE,EAAgB,MAAM;AACpB,QAAAN,EAAS,CAACO,MAAMA,IAAI,CAAC;AAAA,MACvB,CAAC,GAEDH,EAAgB,UAAU;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,aAAaF,EAAY;AAAA,IACzB,eAAeG;AAAA,EAAA;AAEnB;ACzBO,SAASG,KAA2CC,GAAW;AACpE,SAAO,MAAM;AACX,eAAWC,KAAMD;AACf,MAAAC,EAAA;AAAA,EAEJ;AACF;ACDO,SAASC,EACdC,GACAC,GAMA;AACA,QAAM,CAACC,CAAU,IAAIb,EAAS,MAAM,IAAIc,EAAeH,CAAW,CAAC,GAC7D,CAACI,CAAK,IAAIf,EAAS,MAAM,IAAIgB,GAA2B,GAExDC,IAAgBnB,EAAA;AAEtB,SAAAoB,EAAU,MAAM;AACd,UAAMC,IAAO,MAAM;AAAA,IAAC;AAEpB,WAAOZ;AAAA,MACLM,EAAW,OAAO,GAAG,0BAA0B,MAAM;AACnD,QAAAI,EAAc,cAAA;AAAA,MAChB,CAAC;AAAA,MACDL,GAAa,cACTC,EAAW,OAAO;AAAA,QAAG;AAAA,QAAsB,MACzCI,EAAc,cAAA;AAAA,MAAc,IAE9BE;AAAA,MACJP,GAAa,cACTC,EAAW,OAAO;AAAA,QAAG;AAAA,QAAgB,MACnCI,EAAc,cAAA;AAAA,MAAc,IAE9BE;AAAA,IAAA;AAAA,EAER,GAAG,CAACN,CAAU,CAAC,GAER;AAAA,IACL,aAAAF;AAAA,IACA,OAAAI;AAAA,IACA,aAAAH;AAAA,IACA,YAAAC;AAAA,EAAA;AAEJ;ACvCO,SAASO,EAIdC,GACAC,GACAC,GACA;AACA,QAAMN,IAAgBnB,EAAA,GAEhB,CAAC0B,GAAOC,CAAQ,IAAIzB,EAAS,MAAM;AACvC,QAAIwB,IAAQH,EAAK,WAAW,SAASC,CAAI;AACzC,WAAIE,KAAS,QAAQD,KAAiB,SACpCC,IAAQH,EAAK,WAAW,UAAUC,GAAMC,CAAa,IAEhDC;AAAAA,EACT,CAAC;AAED,SAAAN,EAAU,MAAM;AACd,UAAM,EAAE,QAAAQ,MAAWL,EAAK;AAExB,WAAAI,EAASJ,EAAK,WAAW,SAASC,CAAI,CAAC,GAEhCf;AAAA,MACLmB,EAAO,GAAG,cAAc,CAACC,MAAU;AACjC,QAAKC,EAAU,OAAOD,GAAOL,CAAI,KACjCG,EAASJ,EAAK,WAAW,SAASC,CAAI,CAAC;AAAA,MACzC,CAAC;AAAA,MACDI,EAAO,GAAG,gBAAgB,CAACC,MAAU;AACnC,QAAKC,EAAU,OAAOD,GAAOL,CAAI,KACjCG,EAAS,MAAS;AAAA,MACpB,CAAC;AAAA,MACDC,EAAO,GAAG,gBAAgB,CAACG,MAAgB;AACzC,SACED,EAAU,OAAOC,GAAaP,CAAI,KAClCM,EAAU,aAAaC,GAAaP,CAAI,MAExCL,EAAc,cAAA;AAAA,MAElB,CAAC;AAAA,MACDS,EAAO,GAAG,qBAAqB,CAACC,MAAU;AACxC,QAAKC,EAAU,OAAOD,GAAOL,CAAI,KACjCL,EAAc,cAAA;AAAA,MAChB,CAAC;AAAA,MACDS,EAAO,GAAG,qBAAqB,CAACC,MAAU;AACxC,QAAKC,EAAU,OAAOD,GAAOL,CAAI,KACjCL,EAAc,cAAA;AAAA,MAChB,CAAC;AAAA,MACDS,EAAO,GAAG,sBAAsB,CAACC,MAAU;AACzC,QAAKC,EAAU,OAAOD,GAAOL,CAAI,KACjCL,EAAc,cAAA;AAAA,MAChB,CAAC;AAAA,IAAA;AAAA,EAEL,GAAG,CAAA,CAAE,GAEEO;AACT;ACxDO,SAASM,EAIdT,GACAU,GAGA;AACA,QAAMd,IAAgBnB,EAAA,GAEhBkC,IACJD,GAAS,WAAW,OAChBV,EAAK,WAAW,QAChBU,EAAQ,QAAQ,OAAO,CAACE,GAAMX,MAAS;AACrC,UAAMY,IAAQN,EAAU;AAAA,MACtBP,EAAK,WAAW;AAAA,MAChBC;AAAA,IAAA;AAEF,WAAAM,EAAU,SAASK,GAAMX,GAAMY,CAAK,GAC7BD;AAAA,EACT,GAAG,CAAA,CAAa;AAEtB,SAAAf,EAAU,MAAM;AACd,UAAM,EAAE,QAAAQ,MAAWL,EAAK;AAExB,WAAOd;AAAA,MACLmB,EAAO,GAAG,gBAAgB,CAACG,MAAgB;AASzC,SAPEE,GAAS,WAAW,QAEhBA,EAAQ,QAAQ;AAAA,UACd,CAACT,MACCM,EAAU,OAAON,GAAMO,CAAW,KAClCD,EAAU,aAAaN,GAAMO,CAAW;AAAA,QAAA,QAEhB,cAAA;AAAA,MACpC,CAAC;AAAA,IAAA;AAAA,EAEL,GAAG,CAAA,CAAE,GAEEG;AACT;AChDO,SAASG,EACdC,GACAC,GACgB;AAChB,QAAMC,IAAS,CAAA;AAEf,aAAWC,KAAQH,GAAO;AACxB,UAAMI,IAAIH,EAAIE,CAAI;AAClB,KAACD,EAAOE,CAAC,MAAM,CAAA,GAAI,KAAKD,CAAI;AAAA,EAC9B;AAEA,SAAOD;AACT;ACLO,SAASG,EAIdpB,GACAU,GAGA;AACA,QAAMd,IAAgBnB,EAAA,GAEhB4C,IAAiBrB,EAAK,WAAW,QAAQ,OAAO,CAACsB,MAAU;AAC/D,QAAIZ,GAAS,WAAW,KAAM,QAAO;AACrC,UAAMa,IAAsBhB,EAAU,UAAUe,EAAM,IAAI;AAC1D,WAAOZ,EAAQ,QAAQ;AAAA,MAAK,CAACT,MAC3BM,EAAU,OAAON,GAAMsB,CAAmB;AAAA,IAAA;AAAA,EAE9C,CAAC;AAED,SAAA1B,EAAU,MAAM;AACd,UAAM,EAAE,QAAAQ,MAAWL,EAAK;AAExB,WAAOd;AAAA,MACLmB,EAAO,GAAG,sBAAsB,CAACJ,MAAS;AACxC,SAAIS,GAAS,SAAS,WAAWT,CAAI,KAAK,OACxCL,EAAc,cAAA;AAAA,MAElB,CAAC;AAAA,IAAA;AAAA,EAEL,GAAG,CAAA,CAAE,GAEEkB;AAAA,IAAQO;AAAA,IAAgB,CAACC,MAC9BA,EAAM,QAAQ,OACV,MACAf,EAAU,aAAaA,EAAU,UAAUe,EAAM,IAAI,CAAC;AAAA,EAAA;AAE9D;ACGO,SAASE,EAGdC,GAA2C;AAG3C,QAAMC,IAAa7C,EAAoB,IAAI,GAErCsB,IAAQJ,EAAa0B,EAAM,MAAMA,EAAM,MAAM;AAAA,IACjD,sBAAsBA,EAAM,wBAAwB;AAAA,IACpD,cACE,OAAOA,EAAM,gBAAiB,aACzBA,EAAM,aAAA,IACPA,EAAM;AAAA,EAAA,CACb,GAEKE,IAAsD;AAAA,IAC1D,SAASC,GAAO;AACd,YAAM,EAAE,QAAAC,MAAWD;AACnB,MAAIC,MAAW1B,EAAM,gBACf,WAAW0B,KACb,OAAOA,EAAO,SAAU,YAC5B1B,EAAM,SAAS0B,EAAO,OAAiB;AAAA,QACrC,aAAa;AAAA,QACb,iBAAiB;AAAA,MAAA,CAClB;AAAA,IACH;AAAA,IACA,UAAU;AACR,MAAA1B,EAAM,MAAA;AAAA,IACR;AAAA,IACA,SAAS;AACP,OACEsB,EAAM,KAAK,aAAa,iBAAiB,YACzCA,EAAM,KAAK,aAAa,iBAAiB,eAEzCA,EAAM,KAAK,WAAW,cAAcA,EAAM,IAAI;AAAA,IAElD;AAAA,EAAA;AAGF,SAAA5B,EAAU,MAAM;AACd,UAAM,EAAE,QAAAQ,EAAA,IAAWoB,EAAM,KAAK;AAE9B,WAAOvC;AAAA,MACLmB,EAAO,GAAG,gBAAgB,CAACC,MAAU;AACnC,QACE,CAACC,EAAU,OAAOD,GAAOmB,EAAM,IAAI,KACnC,CAAClB,EAAU,aAAaD,GAAOmB,EAAM,IAAI,KAKvCA,EAAM,KAAK,aAAa,iBAAiB,cAC3CA,EAAM,KAAK,WAAW,cAAcA,EAAM,IAAI;AAAA,MAElD,CAAC;AAAA,IAAA;AAAA,EAEL,GAAG,CAAA,CAAE,GAEL5B,EAAU,OACRM,EAAM,YAAYuB,EAAW,OAAQ,GAE9B,MAAM;AACX,IAAID,EAAM,mBACRA,EAAM,KAAK,WAAW,YAAYA,EAAM,IAAI;AAAA,EAEhD,IACC,CAAA,CAAE,GAGH,gBAAAK,EAAAC,GAAA,EACG,YAAM,OAAO;AAAA,IACZ,KAAKL;AAAA,IACL,OAAOvB,EAAM;AAAA,IACb,UAAAwB;AAAA,IACA,OAAAxB;AAAA,EAAA,CACD,GACH;AAEJ;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goodie-forms/react",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1-alpha",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"react-dom": "^18 || ^19"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@goodie-forms/core": "1.1
|
|
21
|
+
"@goodie-forms/core": "1.2.1-alpha"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@types/react": "^19.2.9",
|