@ekz/formix 2.1.0 → 2.1.2
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/lib/cjs/FieldState.d.ts +17 -0
- package/lib/cjs/FieldState.js +33 -0
- package/lib/cjs/FieldState.js.map +1 -0
- package/lib/cjs/fields.d.ts +15 -0
- package/lib/cjs/fields.js +121 -0
- package/lib/cjs/fields.js.map +1 -0
- package/lib/cjs/form.d.ts +13 -0
- package/lib/cjs/form.js +119 -0
- package/lib/cjs/form.js.map +1 -0
- package/lib/cjs/index.d.ts +5 -0
- package/lib/cjs/index.js +25 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/references.d.ts +5 -0
- package/lib/cjs/references.js +34 -0
- package/lib/cjs/references.js.map +1 -0
- package/lib/cjs/types.d.ts +111 -0
- package/lib/cjs/types.js +3 -0
- package/lib/cjs/types.js.map +1 -0
- package/lib/cjs/validation/fields.d.ts +5 -0
- package/lib/cjs/validation/fields.js +114 -0
- package/lib/cjs/validation/fields.js.map +1 -0
- package/lib/cjs/validation/form.d.ts +2 -0
- package/lib/cjs/validation/form.js +62 -0
- package/lib/cjs/validation/form.js.map +1 -0
- package/lib/esm/FieldState.d.ts +17 -0
- package/lib/esm/FieldState.js +30 -0
- package/lib/esm/FieldState.js.map +1 -0
- package/lib/esm/fields.d.ts +15 -0
- package/lib/esm/fields.js +114 -0
- package/lib/esm/fields.js.map +1 -0
- package/lib/esm/form.d.ts +13 -0
- package/lib/esm/form.js +111 -0
- package/lib/esm/form.js.map +1 -0
- package/lib/esm/index.d.ts +5 -0
- package/lib/esm/index.js +5 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/references.d.ts +5 -0
- package/lib/esm/references.js +27 -0
- package/lib/esm/references.js.map +1 -0
- package/lib/esm/types.d.ts +111 -0
- package/lib/esm/types.js +2 -0
- package/lib/esm/types.js.map +1 -0
- package/lib/esm/validation/fields.d.ts +5 -0
- package/lib/esm/validation/fields.js +107 -0
- package/lib/esm/validation/fields.js.map +1 -0
- package/lib/esm/validation/form.d.ts +2 -0
- package/lib/esm/validation/form.js +58 -0
- package/lib/esm/validation/form.js.map +1 -0
- package/lib/esnext/FieldState.d.ts +17 -0
- package/lib/esnext/FieldState.js +34 -0
- package/lib/esnext/FieldState.js.map +1 -0
- package/lib/esnext/fields.d.ts +15 -0
- package/lib/esnext/fields.js +114 -0
- package/lib/esnext/fields.js.map +1 -0
- package/lib/esnext/form.d.ts +13 -0
- package/lib/esnext/form.js +111 -0
- package/lib/esnext/form.js.map +1 -0
- package/lib/esnext/index.d.ts +5 -0
- package/lib/esnext/index.js +5 -0
- package/lib/esnext/index.js.map +1 -0
- package/lib/esnext/references.d.ts +5 -0
- package/lib/esnext/references.js +29 -0
- package/lib/esnext/references.js.map +1 -0
- package/lib/esnext/types.d.ts +111 -0
- package/lib/esnext/types.js +2 -0
- package/lib/esnext/types.js.map +1 -0
- package/lib/esnext/validation/fields.d.ts +5 -0
- package/lib/esnext/validation/fields.js +107 -0
- package/lib/esnext/validation/fields.js.map +1 -0
- package/lib/esnext/validation/form.d.ts +2 -0
- package/lib/esnext/validation/form.js +58 -0
- package/lib/esnext/validation/form.js.map +1 -0
- package/package.json +6 -5
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { Map, List, OrderedSet } from 'immutable';
|
|
2
|
+
export type GenericFieldRef = ArrayFieldRef<GenericFieldRef, unknown> | FieldRef<unknown> | {
|
|
3
|
+
[key: string]: GenericFieldRef;
|
|
4
|
+
};
|
|
5
|
+
export interface FieldRef<T> {
|
|
6
|
+
readonly initialState: FieldState<T>;
|
|
7
|
+
}
|
|
8
|
+
export interface ArrayFieldRef<T extends GenericFieldRef, V> extends FieldRef<List<T>> {
|
|
9
|
+
itemTemplate(value: V): T;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* `FieldState` represents the state of a `FieldRef`
|
|
13
|
+
*/
|
|
14
|
+
export interface FieldState<T> extends FieldValue<T>, FieldMetadata {
|
|
15
|
+
/**
|
|
16
|
+
* Value of the field
|
|
17
|
+
*/
|
|
18
|
+
readonly value: T;
|
|
19
|
+
/**
|
|
20
|
+
* `true` when field is disabled
|
|
21
|
+
*/
|
|
22
|
+
readonly disabled: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* `true` when field is focused
|
|
25
|
+
*/
|
|
26
|
+
readonly active: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* `true` when field has been focused once
|
|
29
|
+
*/
|
|
30
|
+
readonly touched: boolean;
|
|
31
|
+
updated(fields: Partial<FieldValue<T> & FieldMetadata>): FieldState<T>;
|
|
32
|
+
/**
|
|
33
|
+
* `equals` only takes the value and disabled properties into consideration.
|
|
34
|
+
*/
|
|
35
|
+
equals(other: FieldState<T> | null | undefined): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* `hashCode` only takes the value and disabled properties into consideration.
|
|
38
|
+
*/
|
|
39
|
+
hashCode(): number;
|
|
40
|
+
}
|
|
41
|
+
export interface FieldValue<T> {
|
|
42
|
+
readonly value: T;
|
|
43
|
+
}
|
|
44
|
+
export interface FieldMetadata {
|
|
45
|
+
readonly disabled: boolean;
|
|
46
|
+
readonly active: boolean;
|
|
47
|
+
readonly touched: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface FieldMetadataUpdaters {
|
|
50
|
+
setDisabled(disabled: boolean): void;
|
|
51
|
+
onFocus(): void;
|
|
52
|
+
onBlur(): void;
|
|
53
|
+
}
|
|
54
|
+
export interface Field<T> extends FieldValue<T>, FieldMetadata, FieldMetadataUpdaters, ValidationResult {
|
|
55
|
+
setValue(value: React.SetStateAction<T>): void;
|
|
56
|
+
}
|
|
57
|
+
export interface ArrayField<T extends GenericFieldRef, V> extends FieldMetadata, FieldMetadataUpdaters, ValidationResult {
|
|
58
|
+
readonly items: List<T>;
|
|
59
|
+
unshift(value: V): T;
|
|
60
|
+
push(value: V): T;
|
|
61
|
+
insert(index: number, value: V): T;
|
|
62
|
+
remove(item: T): void;
|
|
63
|
+
swap(indexA: number, indexB: number): void;
|
|
64
|
+
}
|
|
65
|
+
export type FormStates<F> = F extends ArrayFieldRef<infer T, unknown> ? List<FormStates<T>> : F extends FieldRef<infer T> ? FieldState<T> : F extends {
|
|
66
|
+
[K: string]: GenericFieldRef;
|
|
67
|
+
} ? {
|
|
68
|
+
[K in keyof F]: FormStates<F[K]>;
|
|
69
|
+
} : never;
|
|
70
|
+
export type FieldRefStates<T extends GenericFieldRef[]> = {
|
|
71
|
+
[K in keyof T]: FormStates<T[K]>;
|
|
72
|
+
};
|
|
73
|
+
export type FormValues<F> = F extends ArrayFieldRef<infer T, unknown> ? List<FormValues<T>> : F extends FieldRef<infer T> ? T : F extends {
|
|
74
|
+
[K: string]: GenericFieldRef;
|
|
75
|
+
} ? {
|
|
76
|
+
[K in keyof F]: FormValues<F[K]>;
|
|
77
|
+
} : never;
|
|
78
|
+
export type FieldRefValues<T extends GenericFieldRef[]> = {
|
|
79
|
+
[K in keyof T]: FormValues<T[K]>;
|
|
80
|
+
};
|
|
81
|
+
export interface FormApi extends FormValidationApi {
|
|
82
|
+
getFieldState<T>(fieldRef: FieldRef<T>): FieldState<T>;
|
|
83
|
+
getFieldValue<T>(fieldRef: FieldRef<T>): T;
|
|
84
|
+
setFieldState<T>(fieldRef: FieldRef<T>, state: React.SetStateAction<FieldState<T>>): void;
|
|
85
|
+
getStates<F extends GenericFieldRef>(fields: F): FormStates<F>;
|
|
86
|
+
getValues<F extends GenericFieldRef>(fields: F): FormValues<F>;
|
|
87
|
+
reset(): void;
|
|
88
|
+
modified: boolean;
|
|
89
|
+
}
|
|
90
|
+
export interface FormWithFields<F extends GenericFieldRef> extends FormApi {
|
|
91
|
+
fields: F;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* A ReactElement or a string represent an error message, and null represents no errors.
|
|
95
|
+
*/
|
|
96
|
+
export type ValidationError = React.ReactElement | string | null;
|
|
97
|
+
export interface ValidationResult {
|
|
98
|
+
readonly error: ValidationError;
|
|
99
|
+
readonly pending: boolean;
|
|
100
|
+
}
|
|
101
|
+
export interface FieldValidation<T> extends ValidationResult {
|
|
102
|
+
readonly fieldRef: FieldRef<T>;
|
|
103
|
+
}
|
|
104
|
+
export type FormValidations = Map<FieldRef<unknown>, OrderedSet<FieldValidation<unknown>>>;
|
|
105
|
+
export interface FormValidationApi {
|
|
106
|
+
registerValidation(validation: FieldValidation<unknown>): () => void;
|
|
107
|
+
getValidationResult(fieldRef: FieldRef<unknown>): ValidationResult;
|
|
108
|
+
isFieldValid(fieldRef: GenericFieldRef): boolean;
|
|
109
|
+
valid: boolean;
|
|
110
|
+
pending: boolean;
|
|
111
|
+
}
|
package/lib/esm/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/main/web/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { GenericFieldRef, FormValues, FormStates, FieldRef, FieldRefValues, FieldRefStates, ValidationError } from '../types';
|
|
2
|
+
export declare function useFieldValidation<F extends FieldRef<unknown>, D extends GenericFieldRef[] = []>(fieldRef: F, validate: (value: FormValues<F>, ds: [...FieldRefValues<D>]) => ValidationError, deps?: [...D]): void;
|
|
3
|
+
export declare function useAsyncFieldValidation<F extends FieldRef<unknown>, D extends GenericFieldRef[] = []>(fieldRef: F, validate: (value: FormValues<F>, ds: [...FieldRefValues<D>]) => Promise<ValidationError>, deps?: [...D], debounceMs?: number): void;
|
|
4
|
+
export declare function useFieldStateValidation<F extends FieldRef<unknown>, D extends GenericFieldRef[] = []>(fieldRef: F, validate: (fieldState: FormStates<F>, dependentFieldStates: [...FieldRefStates<D>]) => ValidationError, deps?: [...D]): void;
|
|
5
|
+
export declare function useAsyncFieldStateValidation<F extends FieldRef<unknown>, D extends GenericFieldRef[] = []>(fieldRef: F, validate: (fieldState: FormStates<F>, ds: [...FieldRefStates<D>]) => Promise<ValidationError>, deps?: [...D], debounceMs?: number): void;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useForm } from '../form';
|
|
3
|
+
export function useFieldValidation(fieldRef, validate, deps) {
|
|
4
|
+
const { getValues, registerValidation } = useForm();
|
|
5
|
+
const value = getValues(fieldRef);
|
|
6
|
+
const dependentValues = React.useMemo(() => {
|
|
7
|
+
return (deps ?? []).map(getValues);
|
|
8
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
9
|
+
}, [getValues, ...(deps ?? [])]);
|
|
10
|
+
const error = React.useMemo(() => {
|
|
11
|
+
return validate(value, dependentValues);
|
|
12
|
+
// validate should not be considered for changes
|
|
13
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
14
|
+
}, [value, ...dependentValues]);
|
|
15
|
+
const validation = React.useMemo(() => ({
|
|
16
|
+
fieldRef,
|
|
17
|
+
error,
|
|
18
|
+
pending: false
|
|
19
|
+
}), [fieldRef, error]);
|
|
20
|
+
React.useLayoutEffect(() => registerValidation(validation), [registerValidation, validation]);
|
|
21
|
+
}
|
|
22
|
+
function useAsyncValidationResult(validate, debounceMs, deps) {
|
|
23
|
+
const [result, setResult] = React.useState({
|
|
24
|
+
pending: false,
|
|
25
|
+
error: null
|
|
26
|
+
});
|
|
27
|
+
React.useEffect(() => {
|
|
28
|
+
let mounted = true;
|
|
29
|
+
setResult((previous) => ({ pending: true, error: previous.error }));
|
|
30
|
+
const timeoutId = setTimeout(() => {
|
|
31
|
+
validate()
|
|
32
|
+
.then((error) => {
|
|
33
|
+
if (mounted) {
|
|
34
|
+
setResult({ pending: false, error: error });
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
.catch((error) => {
|
|
38
|
+
if (mounted) {
|
|
39
|
+
setResult({ pending: false, error: 'Unexpected error' });
|
|
40
|
+
}
|
|
41
|
+
console.warn('[Unhandled Validation Error]', error);
|
|
42
|
+
console.warn('An async validator should never throw, but it should resolve with the validation result.');
|
|
43
|
+
});
|
|
44
|
+
}, debounceMs);
|
|
45
|
+
return () => {
|
|
46
|
+
mounted = false;
|
|
47
|
+
clearTimeout(timeoutId);
|
|
48
|
+
};
|
|
49
|
+
// validate should not be considered for changes
|
|
50
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
51
|
+
}, [debounceMs, ...deps]);
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
export function useAsyncFieldValidation(fieldRef, validate, deps, debounceMs = 200) {
|
|
55
|
+
const { getValues, registerValidation } = useForm();
|
|
56
|
+
const value = getValues(fieldRef);
|
|
57
|
+
const dependentValues = React.useMemo(() => {
|
|
58
|
+
return (deps ?? []).map(getValues);
|
|
59
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
60
|
+
}, [getValues, ...(deps ?? [])]);
|
|
61
|
+
const result = useAsyncValidationResult(() => {
|
|
62
|
+
return validate(value, dependentValues);
|
|
63
|
+
}, debounceMs, [value, ...dependentValues]);
|
|
64
|
+
const validation = React.useMemo(() => ({
|
|
65
|
+
fieldRef,
|
|
66
|
+
error: result.error,
|
|
67
|
+
pending: result.pending
|
|
68
|
+
}), [fieldRef, result.error, result.pending]);
|
|
69
|
+
React.useLayoutEffect(() => registerValidation(validation), [registerValidation, validation]);
|
|
70
|
+
}
|
|
71
|
+
export function useFieldStateValidation(fieldRef, validate, deps) {
|
|
72
|
+
const { getStates, registerValidation } = useForm();
|
|
73
|
+
const fieldState = getStates(fieldRef);
|
|
74
|
+
const dependentStates = React.useMemo(() => {
|
|
75
|
+
return (deps ?? []).map(getStates);
|
|
76
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
77
|
+
}, [getStates, ...(deps ?? [])]);
|
|
78
|
+
const error = React.useMemo(() => {
|
|
79
|
+
return validate(fieldState, dependentStates);
|
|
80
|
+
// validate should not be considered for changes
|
|
81
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
82
|
+
}, [fieldState, ...dependentStates]);
|
|
83
|
+
const validation = React.useMemo(() => ({
|
|
84
|
+
fieldRef,
|
|
85
|
+
error,
|
|
86
|
+
pending: false
|
|
87
|
+
}), [fieldRef, error]);
|
|
88
|
+
React.useLayoutEffect(() => registerValidation(validation), [registerValidation, validation]);
|
|
89
|
+
}
|
|
90
|
+
export function useAsyncFieldStateValidation(fieldRef, validate, deps, debounceMs = 200) {
|
|
91
|
+
const { getStates, registerValidation } = useForm();
|
|
92
|
+
const fieldState = getStates(fieldRef);
|
|
93
|
+
const dependentValues = React.useMemo(() => {
|
|
94
|
+
return (deps ?? []).map(getStates);
|
|
95
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
96
|
+
}, [getStates, ...(deps ?? [])]);
|
|
97
|
+
const result = useAsyncValidationResult(() => {
|
|
98
|
+
return validate(fieldState, dependentValues);
|
|
99
|
+
}, debounceMs, [fieldState, ...dependentValues]);
|
|
100
|
+
const validation = React.useMemo(() => ({
|
|
101
|
+
fieldRef,
|
|
102
|
+
error: result.error,
|
|
103
|
+
pending: result.pending
|
|
104
|
+
}), [fieldRef, result.error, result.pending]);
|
|
105
|
+
React.useLayoutEffect(() => registerValidation(validation), [registerValidation, validation]);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../src/main/web/validation/fields.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Seq, List, Map, OrderedSet } from 'immutable';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { isArrayFieldRef, isFieldRef } from '../references';
|
|
4
|
+
export function useFormValidation(getFieldState) {
|
|
5
|
+
const [validations, setValidations] = React.useState(Map);
|
|
6
|
+
const registerValidation = React.useCallback((validation) => {
|
|
7
|
+
setValidations((previous) => previous.update(validation.fieldRef, OrderedSet(), (validations) => validations.add(validation)));
|
|
8
|
+
return () => setValidations((previous) => previous.update(validation.fieldRef, OrderedSet(), (validations) => validations.remove(validation)));
|
|
9
|
+
}, []);
|
|
10
|
+
const getValidationResult = React.useCallback((fieldRef) => {
|
|
11
|
+
const result = validations.get(fieldRef, OrderedSet()).reduce((result, validation) => ({
|
|
12
|
+
error: result.error || validation.error,
|
|
13
|
+
pending: result.pending || validation.pending
|
|
14
|
+
}), EmptyValidationResult);
|
|
15
|
+
// The reduce allocates a fresh object even for a passing field, which makes every
|
|
16
|
+
// `useField` on a validated field unstable across renders. Collapse the no-error,
|
|
17
|
+
// no-pending case back to the frozen singleton so identity stays stable.
|
|
18
|
+
return result.error == null && !result.pending ? EmptyValidationResult : result;
|
|
19
|
+
}, [validations]);
|
|
20
|
+
const isFieldValid = React.useCallback((fieldRef) => {
|
|
21
|
+
function flatten(field) {
|
|
22
|
+
if (isArrayFieldRef(field)) {
|
|
23
|
+
return getFieldState(field).value.flatMap(flatten);
|
|
24
|
+
}
|
|
25
|
+
else if (isFieldRef(field)) {
|
|
26
|
+
return List.of(field);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return Seq.Keyed(field).valueSeq().flatMap(flatten).toList();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const fields = flatten(fieldRef).toSet();
|
|
33
|
+
return validations
|
|
34
|
+
.filter((_, field) => fields.has(field))
|
|
35
|
+
.valueSeq()
|
|
36
|
+
.flatMap((v) => v)
|
|
37
|
+
.every((v) => v.error == null && !v.pending);
|
|
38
|
+
}, [getFieldState, validations]);
|
|
39
|
+
const pending = React.useMemo(() => {
|
|
40
|
+
return validations
|
|
41
|
+
.valueSeq()
|
|
42
|
+
.flatMap((v) => v)
|
|
43
|
+
.some((v) => v.pending);
|
|
44
|
+
}, [validations]);
|
|
45
|
+
const valid = React.useMemo(() => {
|
|
46
|
+
return (!pending &&
|
|
47
|
+
validations
|
|
48
|
+
.valueSeq()
|
|
49
|
+
.flatMap((v) => v)
|
|
50
|
+
.every((v) => v.error == null));
|
|
51
|
+
}, [pending, validations]);
|
|
52
|
+
return { registerValidation, getValidationResult, isFieldValid, valid, pending };
|
|
53
|
+
}
|
|
54
|
+
const EmptyValidationResult = Object.freeze({
|
|
55
|
+
error: null,
|
|
56
|
+
pending: false
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../../src/main/web/validation/form.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { FieldMetadata, FieldValue, FieldState as IFieldState } from './types';
|
|
2
|
+
export default class FieldState<T> implements IFieldState<T> {
|
|
3
|
+
readonly value: T;
|
|
4
|
+
readonly disabled: boolean;
|
|
5
|
+
readonly active: boolean;
|
|
6
|
+
readonly touched: boolean;
|
|
7
|
+
constructor(value: T, disabled: boolean, active: boolean, touched: boolean);
|
|
8
|
+
updated(fields: Partial<FieldValue<T> & FieldMetadata>): FieldState<T>;
|
|
9
|
+
/**
|
|
10
|
+
* `equals` only takes the value and disabled properties into consideration.
|
|
11
|
+
*/
|
|
12
|
+
equals(other: FieldState<T> | null | undefined): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* `hashCode` only takes the value and disabled properties into consideration.
|
|
15
|
+
*/
|
|
16
|
+
hashCode(): number;
|
|
17
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { hash, is } from 'immutable';
|
|
2
|
+
export default class FieldState {
|
|
3
|
+
value;
|
|
4
|
+
disabled;
|
|
5
|
+
active;
|
|
6
|
+
touched;
|
|
7
|
+
constructor(value, disabled, active, touched) {
|
|
8
|
+
this.value = value;
|
|
9
|
+
this.disabled = disabled;
|
|
10
|
+
this.active = active;
|
|
11
|
+
this.touched = touched;
|
|
12
|
+
this.value = value;
|
|
13
|
+
this.disabled = disabled;
|
|
14
|
+
this.active = active;
|
|
15
|
+
this.touched = touched;
|
|
16
|
+
}
|
|
17
|
+
updated(fields) {
|
|
18
|
+
const o = { value: this.value, ...fields };
|
|
19
|
+
return new FieldState(o.value, fields.disabled ?? this.disabled, fields.active ?? this.active, fields.touched ?? this.touched);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* `equals` only takes the value and disabled properties into consideration.
|
|
23
|
+
*/
|
|
24
|
+
equals(other) {
|
|
25
|
+
return other != null && is(this.value, other.value) && this.disabled === other.disabled;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* `hashCode` only takes the value and disabled properties into consideration.
|
|
29
|
+
*/
|
|
30
|
+
hashCode() {
|
|
31
|
+
return hash(this.value) & hash(this.disabled);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=FieldState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldState.js","sourceRoot":"","sources":["../../src/main/web/FieldState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAIrC,MAAM,CAAC,OAAO,OAAO,UAAU;IAEP;IACA;IACA;IACA;IAJpB,YACoB,KAAQ,EACR,QAAiB,EACjB,MAAe,EACf,OAAgB;QAHhB,UAAK,GAAL,KAAK,CAAG;QACR,aAAQ,GAAR,QAAQ,CAAS;QACjB,WAAM,GAAN,MAAM,CAAS;QACf,YAAO,GAAP,OAAO,CAAS;QAEhC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,MAA8C;QAClD,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC;QAC3C,OAAO,IAAI,UAAU,CACjB,CAAC,CAAC,KAAK,EACP,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAChC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAC5B,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CACjC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAuC;QAC1C,OAAO,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC;IAC5F,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;CACJ"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { ArrayField, ArrayFieldRef, Field, FieldRef, GenericFieldRef } from './types';
|
|
3
|
+
export declare function useField<T>(fieldRef: FieldRef<T>): Field<T>;
|
|
4
|
+
export declare function useArrayField<T extends GenericFieldRef, V>(fieldRef: ArrayFieldRef<T, V>): ArrayField<T, V>;
|
|
5
|
+
type UseFieldProps<T> = {
|
|
6
|
+
field: FieldRef<T>;
|
|
7
|
+
render(field: Field<T>): React.ReactNode;
|
|
8
|
+
};
|
|
9
|
+
export declare function UseField<T>(props: UseFieldProps<T>): React.ReactElement;
|
|
10
|
+
type UseArrayFieldProps<T extends GenericFieldRef, V> = {
|
|
11
|
+
field: ArrayFieldRef<T, V>;
|
|
12
|
+
render(field: ArrayField<T, V>): React.ReactNode;
|
|
13
|
+
};
|
|
14
|
+
export declare function UseArrayField<T extends GenericFieldRef, V>(props: UseArrayFieldProps<T, V>): React.ReactElement;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { useForm } from './form';
|
|
4
|
+
export function useField(fieldRef) {
|
|
5
|
+
const { getFieldState, setFieldState, getValidationResult } = useForm();
|
|
6
|
+
const fieldState = getFieldState(fieldRef);
|
|
7
|
+
const validationResult = getValidationResult(fieldRef);
|
|
8
|
+
const setValue = React.useCallback((value) => {
|
|
9
|
+
setFieldState(fieldRef, (previousState) => {
|
|
10
|
+
const nextValue =
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
12
|
+
// @ts-ignore
|
|
13
|
+
typeof value === 'function' ? value(previousState.value) : value;
|
|
14
|
+
return previousState.value === nextValue
|
|
15
|
+
? previousState
|
|
16
|
+
: previousState.updated({
|
|
17
|
+
value: nextValue,
|
|
18
|
+
touched: true
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}, [fieldRef, setFieldState]);
|
|
22
|
+
const setDisabled = React.useCallback((disabled) => setFieldState(fieldRef, (state) => state.updated({ disabled })), [fieldRef, setFieldState]);
|
|
23
|
+
const onFocus = React.useCallback(() => setFieldState(fieldRef, (state) => state.updated({ active: true, touched: true })), [fieldRef, setFieldState]);
|
|
24
|
+
const onBlur = React.useCallback(() => setFieldState(fieldRef, (state) => state.updated({ active: false })), [fieldRef, setFieldState]);
|
|
25
|
+
return React.useMemo(() => ({
|
|
26
|
+
value: fieldState.value,
|
|
27
|
+
...validationResult,
|
|
28
|
+
disabled: fieldState.disabled,
|
|
29
|
+
active: fieldState.active,
|
|
30
|
+
touched: fieldState.touched,
|
|
31
|
+
setValue,
|
|
32
|
+
setDisabled,
|
|
33
|
+
onFocus,
|
|
34
|
+
onBlur
|
|
35
|
+
}), [fieldState, validationResult, setValue, setDisabled, onFocus, onBlur]);
|
|
36
|
+
}
|
|
37
|
+
export function useArrayField(fieldRef) {
|
|
38
|
+
const { getValidationResult } = useForm();
|
|
39
|
+
const { value: items, setValue, disabled, active, touched, setDisabled, onBlur, onFocus } = useField(fieldRef);
|
|
40
|
+
const validationResult = getValidationResult(fieldRef);
|
|
41
|
+
const unshift = React.useCallback((value) => {
|
|
42
|
+
const item = fieldRef.itemTemplate(value);
|
|
43
|
+
setValue((previous) => previous.unshift(item));
|
|
44
|
+
return item;
|
|
45
|
+
}, [setValue, fieldRef]);
|
|
46
|
+
const push = React.useCallback((value) => {
|
|
47
|
+
const item = fieldRef.itemTemplate(value);
|
|
48
|
+
setValue((previous) => previous.push(item));
|
|
49
|
+
return item;
|
|
50
|
+
}, [setValue, fieldRef]);
|
|
51
|
+
const insert = React.useCallback((index, value) => {
|
|
52
|
+
const item = fieldRef.itemTemplate(value);
|
|
53
|
+
setValue((items) => items.insert(index, item));
|
|
54
|
+
return item;
|
|
55
|
+
}, [setValue, fieldRef]);
|
|
56
|
+
const remove = React.useCallback((value) => {
|
|
57
|
+
setValue((previous) => {
|
|
58
|
+
const index = previous.indexOf(value);
|
|
59
|
+
return index !== -1 ? previous.remove(index) : previous;
|
|
60
|
+
});
|
|
61
|
+
}, [setValue]);
|
|
62
|
+
const swap = React.useCallback((indexA, indexB) => {
|
|
63
|
+
setValue((previous) => {
|
|
64
|
+
const itemA = previous.get(indexA);
|
|
65
|
+
const itemB = previous.get(indexB);
|
|
66
|
+
if (itemA == null || itemB == null) {
|
|
67
|
+
throw new Error('Invalid element access');
|
|
68
|
+
}
|
|
69
|
+
return previous
|
|
70
|
+
.remove(indexA)
|
|
71
|
+
.insert(indexA, itemB)
|
|
72
|
+
.remove(indexB)
|
|
73
|
+
.insert(indexB, itemA);
|
|
74
|
+
});
|
|
75
|
+
}, [setValue]);
|
|
76
|
+
return React.useMemo(() => ({
|
|
77
|
+
items,
|
|
78
|
+
...validationResult,
|
|
79
|
+
unshift,
|
|
80
|
+
push,
|
|
81
|
+
insert,
|
|
82
|
+
remove,
|
|
83
|
+
swap,
|
|
84
|
+
disabled,
|
|
85
|
+
active,
|
|
86
|
+
touched,
|
|
87
|
+
setDisabled,
|
|
88
|
+
onBlur,
|
|
89
|
+
onFocus
|
|
90
|
+
}), [
|
|
91
|
+
items,
|
|
92
|
+
validationResult,
|
|
93
|
+
unshift,
|
|
94
|
+
push,
|
|
95
|
+
insert,
|
|
96
|
+
remove,
|
|
97
|
+
swap,
|
|
98
|
+
disabled,
|
|
99
|
+
active,
|
|
100
|
+
touched,
|
|
101
|
+
setDisabled,
|
|
102
|
+
onBlur,
|
|
103
|
+
onFocus
|
|
104
|
+
]);
|
|
105
|
+
}
|
|
106
|
+
export function UseField(props) {
|
|
107
|
+
const field = useField(props.field);
|
|
108
|
+
return _jsx(React.Fragment, { children: props.render(field) });
|
|
109
|
+
}
|
|
110
|
+
export function UseArrayField(props) {
|
|
111
|
+
const field = useArrayField(props.field);
|
|
112
|
+
return _jsx(React.Fragment, { children: props.render(field) });
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/main/web/fields.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { GenericFieldRef, FormApi, FormWithFields } from './types';
|
|
3
|
+
export declare function FormProvider(props: {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
}): React.ReactElement;
|
|
6
|
+
export declare function useForm(): FormApi;
|
|
7
|
+
export declare function useFormWithFields<Deps extends unknown[], F extends GenericFieldRef>(fieldsCreator: (...deps: [...Deps]) => F, deps: [...Deps]): FormWithFields<F>;
|
|
8
|
+
export declare function withForm<Props>(Component: React.ComponentType<Props>): React.ComponentType<Props>;
|
|
9
|
+
type UseFormProps = {
|
|
10
|
+
children: (form: FormApi) => React.ReactNode;
|
|
11
|
+
};
|
|
12
|
+
export declare function UseForm(props: UseFormProps): React.ReactElement;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Map, Seq } from 'immutable';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { isArrayFieldRef, isFieldRef } from './references';
|
|
5
|
+
import { useFormValidation } from './validation/form';
|
|
6
|
+
function useFormApi() {
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
const [fieldStates, setFieldStates] = React.useState(Map);
|
|
9
|
+
const getFieldState = React.useCallback(function getFieldState(fieldRef) {
|
|
10
|
+
return fieldStates.get(fieldRef, fieldRef.initialState);
|
|
11
|
+
}, [fieldStates]);
|
|
12
|
+
const getFieldValue = React.useCallback((fieldRef) => getFieldState(fieldRef).value, [getFieldState]);
|
|
13
|
+
const setFieldState = React.useCallback(function setFieldState(fieldRef, state) {
|
|
14
|
+
setFieldStates((xs) => typeof state === 'function'
|
|
15
|
+
? xs.update(fieldRef, fieldRef.initialState, state)
|
|
16
|
+
: xs.set(fieldRef, state));
|
|
17
|
+
}, []);
|
|
18
|
+
const extract = React.useCallback((fields, type) => {
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
+
function extractField(field) {
|
|
21
|
+
if (isArrayFieldRef(field)) {
|
|
22
|
+
return getFieldState(field).value.map(extractField);
|
|
23
|
+
}
|
|
24
|
+
else if (isFieldRef(field)) {
|
|
25
|
+
const state = getFieldState(field);
|
|
26
|
+
return type === 'value' ? state.value : state;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return Seq.Keyed(field)
|
|
30
|
+
.map((value) => extractField(value))
|
|
31
|
+
.toObject();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return extractField(fields);
|
|
35
|
+
}, [getFieldState]);
|
|
36
|
+
const getStates = React.useCallback((fields) => extract(fields, 'state'), [extract]);
|
|
37
|
+
const getValues = React.useCallback((fields) => extract(fields, 'value'), [extract]);
|
|
38
|
+
const reset = React.useCallback(() => setFieldStates(Map()), [setFieldStates]);
|
|
39
|
+
const modified = React.useMemo(() => {
|
|
40
|
+
return fieldStates.some((state, fieldRef) => !state.equals(fieldRef.initialState));
|
|
41
|
+
}, [fieldStates]);
|
|
42
|
+
const formValidation = useFormValidation(getFieldState);
|
|
43
|
+
return React.useMemo(() => ({
|
|
44
|
+
getFieldState,
|
|
45
|
+
getFieldValue,
|
|
46
|
+
setFieldState,
|
|
47
|
+
getStates,
|
|
48
|
+
getValues,
|
|
49
|
+
reset,
|
|
50
|
+
modified,
|
|
51
|
+
...formValidation
|
|
52
|
+
}), [
|
|
53
|
+
getFieldState,
|
|
54
|
+
getFieldValue,
|
|
55
|
+
setFieldState,
|
|
56
|
+
getStates,
|
|
57
|
+
getValues,
|
|
58
|
+
reset,
|
|
59
|
+
modified,
|
|
60
|
+
formValidation
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
function noop() {
|
|
64
|
+
throw new Error('Cannot call method on empty context. Did you forget <Form />?');
|
|
65
|
+
}
|
|
66
|
+
const FormContext = React.createContext({
|
|
67
|
+
getFieldState: noop,
|
|
68
|
+
getFieldValue: noop,
|
|
69
|
+
setFieldState: noop,
|
|
70
|
+
getStates: noop,
|
|
71
|
+
getValues: noop,
|
|
72
|
+
getValidationResult: noop,
|
|
73
|
+
registerValidation: noop,
|
|
74
|
+
isFieldValid: noop,
|
|
75
|
+
reset: noop,
|
|
76
|
+
pending: false,
|
|
77
|
+
valid: false,
|
|
78
|
+
modified: false
|
|
79
|
+
});
|
|
80
|
+
export function FormProvider(props) {
|
|
81
|
+
const api = useFormApi();
|
|
82
|
+
return _jsx(FormContext.Provider, { value: api, children: props.children });
|
|
83
|
+
}
|
|
84
|
+
export function useForm() {
|
|
85
|
+
return React.useContext(FormContext);
|
|
86
|
+
}
|
|
87
|
+
export function useFormWithFields(fieldsCreator, deps) {
|
|
88
|
+
const { reset, ...form } = useForm();
|
|
89
|
+
const fields = React.useMemo(() => {
|
|
90
|
+
return fieldsCreator(...deps);
|
|
91
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
92
|
+
}, deps);
|
|
93
|
+
React.useLayoutEffect(() => {
|
|
94
|
+
reset();
|
|
95
|
+
}, [reset, fields]);
|
|
96
|
+
return React.useMemo(() => ({
|
|
97
|
+
...form,
|
|
98
|
+
reset,
|
|
99
|
+
fields
|
|
100
|
+
}), [form, reset, fields]);
|
|
101
|
+
}
|
|
102
|
+
export function withForm(Component) {
|
|
103
|
+
return function WithForm(props) {
|
|
104
|
+
return (_jsx(FormProvider, { children: _jsx(Component, { ...props }) }));
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function UseForm(props) {
|
|
108
|
+
const form = useForm();
|
|
109
|
+
return _jsx(React.Fragment, { children: props.children(form) });
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/main/web/form.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,SAAS,UAAU;IACf,8DAA8D;IAC9D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAsC,GAAG,CAAC,CAAC;IAE/F,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CACnC,SAAS,aAAa,CAAI,QAAqB;QAC3C,OAAO,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC,EACD,CAAC,WAAW,CAAC,CAChB,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CACnC,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,EAC3C,CAAC,aAAa,CAAC,CAClB,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,aAAa,CAC1D,QAAqB,EACrB,KAA0C;QAE1C,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,CAClB,OAAO,KAAK,KAAK,UAAU;YACvB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC;YACnD,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAChC,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAC7B,CAAC,MAAuB,EAAE,IAAuB,EAAE,EAAE;QACjD,8DAA8D;QAC9D,SAAS,YAAY,CAAC,KAAsB;YACxC,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;gBACnC,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACJ,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;qBAClB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;qBACnC,QAAQ,EAAE,CAAC;YACpB,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC,EACD,CAAC,aAAa,CAAC,CAClB,CAAC;IAEF,MAAM,SAAS,GAAyB,KAAK,CAAC,WAAW,CACrD,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,CAAC,OAAO,CAAC,CACZ,CAAC;IAEF,MAAM,SAAS,GAAyB,KAAK,CAAC,WAAW,CACrD,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,CAAC,OAAO,CAAC,CACZ,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAE/E,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAChC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACvF,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,cAAc,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAExD,OAAO,KAAK,CAAC,OAAO,CAChB,GAAG,EAAE,CAAC,CAAC;QACH,aAAa;QACb,aAAa;QACb,aAAa;QACb,SAAS;QACT,SAAS;QACT,KAAK;QACL,QAAQ;QACR,GAAG,cAAc;KACpB,CAAC,EACF;QACI,aAAa;QACb,aAAa;QACb,aAAa;QACb,SAAS;QACT,SAAS;QACT,KAAK;QACL,QAAQ;QACR,cAAc;KACjB,CACJ,CAAC;AACN,CAAC;AAED,SAAS,IAAI;IACT,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAU;IAC7C,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IACnB,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,YAAY,EAAE,IAAI;IAClB,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,KAAK;CAClB,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,KAAoC;IAC7D,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,OAAO,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,GAAG,YAAG,KAAK,CAAC,QAAQ,GAAwB,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,OAAO;IACnB,OAAO,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC7B,aAAwC,EACxC,IAAe;IAEf,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC9B,OAAO,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9B,uDAAuD;IAC3D,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE;QACvB,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpB,OAAO,KAAK,CAAC,OAAO,CAChB,GAAG,EAAE,CAAC,CAAC;QACH,GAAG,IAAI;QACP,KAAK;QACL,MAAM;KACT,CAAC,EACF,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CACxB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,QAAQ,CAAQ,SAAqC;IACjE,OAAO,SAAS,QAAQ,CAAC,KAAY;QACjC,OAAO,CACH,KAAC,YAAY,cAGT,KAAC,SAAS,OAAK,KAAK,GAAI,GACb,CAClB,CAAC;IACN,CAAC,CAAC;AACN,CAAC;AAMD,MAAM,UAAU,OAAO,CAAC,KAAmB;IACvC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,KAAC,KAAK,CAAC,QAAQ,cAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAkB,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { useField, useArrayField, UseField, UseArrayField } from './fields';
|
|
2
|
+
export { FormProvider, UseForm, useForm, useFormWithFields, withForm } from './form';
|
|
3
|
+
export { defineField, isFieldRef, defineArrayField, isArrayFieldRef } from './references';
|
|
4
|
+
export { useAsyncFieldStateValidation, useAsyncFieldValidation, useFieldStateValidation, useFieldValidation } from './validation/fields';
|
|
5
|
+
export type { GenericFieldRef, FieldRef, ArrayFieldRef, Field, ArrayField, FieldValue, FieldState, FieldMetadata, FieldMetadataUpdaters, FormStates, FieldRefStates, FormValues, FieldRefValues, FormApi, FormWithFields, ValidationError, ValidationResult, FieldValidation, FormValidationApi, FormValidations } from './types';
|