@ekz/formix 2.1.1 → 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.
Files changed (73) hide show
  1. package/lib/cjs/FieldState.d.ts +17 -0
  2. package/lib/cjs/FieldState.js +33 -0
  3. package/lib/cjs/FieldState.js.map +1 -0
  4. package/lib/cjs/fields.d.ts +15 -0
  5. package/lib/cjs/fields.js +121 -0
  6. package/lib/cjs/fields.js.map +1 -0
  7. package/lib/cjs/form.d.ts +13 -0
  8. package/lib/cjs/form.js +119 -0
  9. package/lib/cjs/form.js.map +1 -0
  10. package/lib/cjs/index.d.ts +5 -0
  11. package/lib/cjs/index.js +25 -0
  12. package/lib/cjs/index.js.map +1 -0
  13. package/lib/cjs/references.d.ts +5 -0
  14. package/lib/cjs/references.js +34 -0
  15. package/lib/cjs/references.js.map +1 -0
  16. package/lib/cjs/types.d.ts +111 -0
  17. package/lib/cjs/types.js +3 -0
  18. package/lib/cjs/types.js.map +1 -0
  19. package/lib/cjs/validation/fields.d.ts +5 -0
  20. package/lib/cjs/validation/fields.js +114 -0
  21. package/lib/cjs/validation/fields.js.map +1 -0
  22. package/lib/cjs/validation/form.d.ts +2 -0
  23. package/lib/cjs/validation/form.js +62 -0
  24. package/lib/cjs/validation/form.js.map +1 -0
  25. package/lib/esm/FieldState.d.ts +17 -0
  26. package/lib/esm/FieldState.js +30 -0
  27. package/lib/esm/FieldState.js.map +1 -0
  28. package/lib/esm/fields.d.ts +15 -0
  29. package/lib/esm/fields.js +114 -0
  30. package/lib/esm/fields.js.map +1 -0
  31. package/lib/esm/form.d.ts +13 -0
  32. package/lib/esm/form.js +111 -0
  33. package/lib/esm/form.js.map +1 -0
  34. package/lib/esm/index.d.ts +5 -0
  35. package/lib/esm/index.js +5 -0
  36. package/lib/esm/index.js.map +1 -0
  37. package/lib/esm/references.d.ts +5 -0
  38. package/lib/esm/references.js +27 -0
  39. package/lib/esm/references.js.map +1 -0
  40. package/lib/esm/types.d.ts +111 -0
  41. package/lib/esm/types.js +2 -0
  42. package/lib/esm/types.js.map +1 -0
  43. package/lib/esm/validation/fields.d.ts +5 -0
  44. package/lib/esm/validation/fields.js +107 -0
  45. package/lib/esm/validation/fields.js.map +1 -0
  46. package/lib/esm/validation/form.d.ts +2 -0
  47. package/lib/esm/validation/form.js +58 -0
  48. package/lib/esm/validation/form.js.map +1 -0
  49. package/lib/esnext/FieldState.d.ts +17 -0
  50. package/lib/esnext/FieldState.js +34 -0
  51. package/lib/esnext/FieldState.js.map +1 -0
  52. package/lib/esnext/fields.d.ts +15 -0
  53. package/lib/esnext/fields.js +114 -0
  54. package/lib/esnext/fields.js.map +1 -0
  55. package/lib/esnext/form.d.ts +13 -0
  56. package/lib/esnext/form.js +111 -0
  57. package/lib/esnext/form.js.map +1 -0
  58. package/lib/esnext/index.d.ts +5 -0
  59. package/lib/esnext/index.js +5 -0
  60. package/lib/esnext/index.js.map +1 -0
  61. package/lib/esnext/references.d.ts +5 -0
  62. package/lib/esnext/references.js +29 -0
  63. package/lib/esnext/references.js.map +1 -0
  64. package/lib/esnext/types.d.ts +111 -0
  65. package/lib/esnext/types.js +2 -0
  66. package/lib/esnext/types.js.map +1 -0
  67. package/lib/esnext/validation/fields.d.ts +5 -0
  68. package/lib/esnext/validation/fields.js +107 -0
  69. package/lib/esnext/validation/fields.js.map +1 -0
  70. package/lib/esnext/validation/form.d.ts +2 -0
  71. package/lib/esnext/validation/form.js +58 -0
  72. package/lib/esnext/validation/form.js.map +1 -0
  73. package/package.json +3 -3
@@ -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,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const immutable_1 = require("immutable");
4
+ class FieldState {
5
+ constructor(value, disabled, active, touched) {
6
+ this.value = value;
7
+ this.disabled = disabled;
8
+ this.active = active;
9
+ this.touched = touched;
10
+ this.value = value;
11
+ this.disabled = disabled;
12
+ this.active = active;
13
+ this.touched = touched;
14
+ }
15
+ updated(fields) {
16
+ const o = { value: this.value, ...fields };
17
+ return new FieldState(o.value, fields.disabled ?? this.disabled, fields.active ?? this.active, fields.touched ?? this.touched);
18
+ }
19
+ /**
20
+ * `equals` only takes the value and disabled properties into consideration.
21
+ */
22
+ equals(other) {
23
+ return other != null && (0, immutable_1.is)(this.value, other.value) && this.disabled === other.disabled;
24
+ }
25
+ /**
26
+ * `hashCode` only takes the value and disabled properties into consideration.
27
+ */
28
+ hashCode() {
29
+ return (0, immutable_1.hash)(this.value) & (0, immutable_1.hash)(this.disabled);
30
+ }
31
+ }
32
+ exports.default = FieldState;
33
+ //# sourceMappingURL=FieldState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldState.js","sourceRoot":"","sources":["../../src/main/web/FieldState.ts"],"names":[],"mappings":";;AAAA,yCAAqC;AAIrC,MAAqB,UAAU;IAC3B,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,IAAA,cAAE,EAAC,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,IAAA,gBAAI,EAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAA,gBAAI,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;CACJ;AApCD,6BAoCC"}
@@ -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,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useField = useField;
4
+ exports.useArrayField = useArrayField;
5
+ exports.UseField = UseField;
6
+ exports.UseArrayField = UseArrayField;
7
+ const tslib_1 = require("tslib");
8
+ const jsx_runtime_1 = require("react/jsx-runtime");
9
+ const React = tslib_1.__importStar(require("react"));
10
+ const form_1 = require("./form");
11
+ function useField(fieldRef) {
12
+ const { getFieldState, setFieldState, getValidationResult } = (0, form_1.useForm)();
13
+ const fieldState = getFieldState(fieldRef);
14
+ const validationResult = getValidationResult(fieldRef);
15
+ const setValue = React.useCallback((value) => {
16
+ setFieldState(fieldRef, (previousState) => {
17
+ const nextValue =
18
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
19
+ // @ts-ignore
20
+ typeof value === 'function' ? value(previousState.value) : value;
21
+ return previousState.value === nextValue
22
+ ? previousState
23
+ : previousState.updated({
24
+ value: nextValue,
25
+ touched: true
26
+ });
27
+ });
28
+ }, [fieldRef, setFieldState]);
29
+ const setDisabled = React.useCallback((disabled) => setFieldState(fieldRef, (state) => state.updated({ disabled })), [fieldRef, setFieldState]);
30
+ const onFocus = React.useCallback(() => setFieldState(fieldRef, (state) => state.updated({ active: true, touched: true })), [fieldRef, setFieldState]);
31
+ const onBlur = React.useCallback(() => setFieldState(fieldRef, (state) => state.updated({ active: false })), [fieldRef, setFieldState]);
32
+ return React.useMemo(() => ({
33
+ value: fieldState.value,
34
+ ...validationResult,
35
+ disabled: fieldState.disabled,
36
+ active: fieldState.active,
37
+ touched: fieldState.touched,
38
+ setValue,
39
+ setDisabled,
40
+ onFocus,
41
+ onBlur
42
+ }), [fieldState, validationResult, setValue, setDisabled, onFocus, onBlur]);
43
+ }
44
+ function useArrayField(fieldRef) {
45
+ const { getValidationResult } = (0, form_1.useForm)();
46
+ const { value: items, setValue, disabled, active, touched, setDisabled, onBlur, onFocus } = useField(fieldRef);
47
+ const validationResult = getValidationResult(fieldRef);
48
+ const unshift = React.useCallback((value) => {
49
+ const item = fieldRef.itemTemplate(value);
50
+ setValue((previous) => previous.unshift(item));
51
+ return item;
52
+ }, [setValue, fieldRef]);
53
+ const push = React.useCallback((value) => {
54
+ const item = fieldRef.itemTemplate(value);
55
+ setValue((previous) => previous.push(item));
56
+ return item;
57
+ }, [setValue, fieldRef]);
58
+ const insert = React.useCallback((index, value) => {
59
+ const item = fieldRef.itemTemplate(value);
60
+ setValue((items) => items.insert(index, item));
61
+ return item;
62
+ }, [setValue, fieldRef]);
63
+ const remove = React.useCallback((value) => {
64
+ setValue((previous) => {
65
+ const index = previous.indexOf(value);
66
+ return index !== -1 ? previous.remove(index) : previous;
67
+ });
68
+ }, [setValue]);
69
+ const swap = React.useCallback((indexA, indexB) => {
70
+ setValue((previous) => {
71
+ const itemA = previous.get(indexA);
72
+ const itemB = previous.get(indexB);
73
+ if (itemA == null || itemB == null) {
74
+ throw new Error('Invalid element access');
75
+ }
76
+ return previous
77
+ .remove(indexA)
78
+ .insert(indexA, itemB)
79
+ .remove(indexB)
80
+ .insert(indexB, itemA);
81
+ });
82
+ }, [setValue]);
83
+ return React.useMemo(() => ({
84
+ items,
85
+ ...validationResult,
86
+ unshift,
87
+ push,
88
+ insert,
89
+ remove,
90
+ swap,
91
+ disabled,
92
+ active,
93
+ touched,
94
+ setDisabled,
95
+ onBlur,
96
+ onFocus
97
+ }), [
98
+ items,
99
+ validationResult,
100
+ unshift,
101
+ push,
102
+ insert,
103
+ remove,
104
+ swap,
105
+ disabled,
106
+ active,
107
+ touched,
108
+ setDisabled,
109
+ onBlur,
110
+ onFocus
111
+ ]);
112
+ }
113
+ function UseField(props) {
114
+ const field = useField(props.field);
115
+ return (0, jsx_runtime_1.jsx)(React.Fragment, { children: props.render(field) });
116
+ }
117
+ function UseArrayField(props) {
118
+ const field = useArrayField(props.field);
119
+ return (0, jsx_runtime_1.jsx)(React.Fragment, { children: props.render(field) });
120
+ }
121
+ //# 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,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FormProvider = FormProvider;
4
+ exports.useForm = useForm;
5
+ exports.useFormWithFields = useFormWithFields;
6
+ exports.withForm = withForm;
7
+ exports.UseForm = UseForm;
8
+ const tslib_1 = require("tslib");
9
+ const jsx_runtime_1 = require("react/jsx-runtime");
10
+ const immutable_1 = require("immutable");
11
+ const React = tslib_1.__importStar(require("react"));
12
+ const references_1 = require("./references");
13
+ const form_1 = require("./validation/form");
14
+ function useFormApi() {
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ const [fieldStates, setFieldStates] = React.useState(immutable_1.Map);
17
+ const getFieldState = React.useCallback(function getFieldState(fieldRef) {
18
+ return fieldStates.get(fieldRef, fieldRef.initialState);
19
+ }, [fieldStates]);
20
+ const getFieldValue = React.useCallback((fieldRef) => getFieldState(fieldRef).value, [getFieldState]);
21
+ const setFieldState = React.useCallback(function setFieldState(fieldRef, state) {
22
+ setFieldStates((xs) => typeof state === 'function'
23
+ ? xs.update(fieldRef, fieldRef.initialState, state)
24
+ : xs.set(fieldRef, state));
25
+ }, []);
26
+ const extract = React.useCallback((fields, type) => {
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ function extractField(field) {
29
+ if ((0, references_1.isArrayFieldRef)(field)) {
30
+ return getFieldState(field).value.map(extractField);
31
+ }
32
+ else if ((0, references_1.isFieldRef)(field)) {
33
+ const state = getFieldState(field);
34
+ return type === 'value' ? state.value : state;
35
+ }
36
+ else {
37
+ return immutable_1.Seq.Keyed(field)
38
+ .map((value) => extractField(value))
39
+ .toObject();
40
+ }
41
+ }
42
+ return extractField(fields);
43
+ }, [getFieldState]);
44
+ const getStates = React.useCallback((fields) => extract(fields, 'state'), [extract]);
45
+ const getValues = React.useCallback((fields) => extract(fields, 'value'), [extract]);
46
+ const reset = React.useCallback(() => setFieldStates((0, immutable_1.Map)()), [setFieldStates]);
47
+ const modified = React.useMemo(() => {
48
+ return fieldStates.some((state, fieldRef) => !state.equals(fieldRef.initialState));
49
+ }, [fieldStates]);
50
+ const formValidation = (0, form_1.useFormValidation)(getFieldState);
51
+ return React.useMemo(() => ({
52
+ getFieldState,
53
+ getFieldValue,
54
+ setFieldState,
55
+ getStates,
56
+ getValues,
57
+ reset,
58
+ modified,
59
+ ...formValidation
60
+ }), [
61
+ getFieldState,
62
+ getFieldValue,
63
+ setFieldState,
64
+ getStates,
65
+ getValues,
66
+ reset,
67
+ modified,
68
+ formValidation
69
+ ]);
70
+ }
71
+ function noop() {
72
+ throw new Error('Cannot call method on empty context. Did you forget <Form />?');
73
+ }
74
+ const FormContext = React.createContext({
75
+ getFieldState: noop,
76
+ getFieldValue: noop,
77
+ setFieldState: noop,
78
+ getStates: noop,
79
+ getValues: noop,
80
+ getValidationResult: noop,
81
+ registerValidation: noop,
82
+ isFieldValid: noop,
83
+ reset: noop,
84
+ pending: false,
85
+ valid: false,
86
+ modified: false
87
+ });
88
+ function FormProvider(props) {
89
+ const api = useFormApi();
90
+ return (0, jsx_runtime_1.jsx)(FormContext.Provider, { value: api, children: props.children });
91
+ }
92
+ function useForm() {
93
+ return React.useContext(FormContext);
94
+ }
95
+ function useFormWithFields(fieldsCreator, deps) {
96
+ const { reset, ...form } = useForm();
97
+ const fields = React.useMemo(() => {
98
+ return fieldsCreator(...deps);
99
+ // eslint-disable-next-line react-hooks/exhaustive-deps
100
+ }, deps);
101
+ React.useLayoutEffect(() => {
102
+ reset();
103
+ }, [reset, fields]);
104
+ return React.useMemo(() => ({
105
+ ...form,
106
+ reset,
107
+ fields
108
+ }), [form, reset, fields]);
109
+ }
110
+ function withForm(Component) {
111
+ return function WithForm(props) {
112
+ return ((0, jsx_runtime_1.jsx)(FormProvider, { children: (0, jsx_runtime_1.jsx)(Component, { ...props }) }));
113
+ };
114
+ }
115
+ function UseForm(props) {
116
+ const form = useForm();
117
+ return (0, jsx_runtime_1.jsx)(React.Fragment, { children: props.children(form) });
118
+ }
119
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/main/web/form.tsx"],"names":[],"mappings":"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"}
@@ -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';
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useFieldValidation = exports.useFieldStateValidation = exports.useAsyncFieldValidation = exports.useAsyncFieldStateValidation = exports.isArrayFieldRef = exports.defineArrayField = exports.isFieldRef = exports.defineField = exports.withForm = exports.useFormWithFields = exports.useForm = exports.UseForm = exports.FormProvider = exports.UseArrayField = exports.UseField = exports.useArrayField = exports.useField = void 0;
4
+ var fields_1 = require("./fields");
5
+ Object.defineProperty(exports, "useField", { enumerable: true, get: function () { return fields_1.useField; } });
6
+ Object.defineProperty(exports, "useArrayField", { enumerable: true, get: function () { return fields_1.useArrayField; } });
7
+ Object.defineProperty(exports, "UseField", { enumerable: true, get: function () { return fields_1.UseField; } });
8
+ Object.defineProperty(exports, "UseArrayField", { enumerable: true, get: function () { return fields_1.UseArrayField; } });
9
+ var form_1 = require("./form");
10
+ Object.defineProperty(exports, "FormProvider", { enumerable: true, get: function () { return form_1.FormProvider; } });
11
+ Object.defineProperty(exports, "UseForm", { enumerable: true, get: function () { return form_1.UseForm; } });
12
+ Object.defineProperty(exports, "useForm", { enumerable: true, get: function () { return form_1.useForm; } });
13
+ Object.defineProperty(exports, "useFormWithFields", { enumerable: true, get: function () { return form_1.useFormWithFields; } });
14
+ Object.defineProperty(exports, "withForm", { enumerable: true, get: function () { return form_1.withForm; } });
15
+ var references_1 = require("./references");
16
+ Object.defineProperty(exports, "defineField", { enumerable: true, get: function () { return references_1.defineField; } });
17
+ Object.defineProperty(exports, "isFieldRef", { enumerable: true, get: function () { return references_1.isFieldRef; } });
18
+ Object.defineProperty(exports, "defineArrayField", { enumerable: true, get: function () { return references_1.defineArrayField; } });
19
+ Object.defineProperty(exports, "isArrayFieldRef", { enumerable: true, get: function () { return references_1.isArrayFieldRef; } });
20
+ var fields_2 = require("./validation/fields");
21
+ Object.defineProperty(exports, "useAsyncFieldStateValidation", { enumerable: true, get: function () { return fields_2.useAsyncFieldStateValidation; } });
22
+ Object.defineProperty(exports, "useAsyncFieldValidation", { enumerable: true, get: function () { return fields_2.useAsyncFieldValidation; } });
23
+ Object.defineProperty(exports, "useFieldStateValidation", { enumerable: true, get: function () { return fields_2.useFieldStateValidation; } });
24
+ Object.defineProperty(exports, "useFieldValidation", { enumerable: true, get: function () { return fields_2.useFieldValidation; } });
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/main/web/index.ts"],"names":[],"mappings":";;;AAAA,mCAA4E;AAAnE,kGAAA,QAAQ,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,kGAAA,QAAQ,OAAA;AAAE,uGAAA,aAAa,OAAA;AAEzD,+BAAqF;AAA5E,oGAAA,YAAY,OAAA;AAAE,+FAAA,OAAO,OAAA;AAAE,+FAAA,OAAO,OAAA;AAAE,yGAAA,iBAAiB,OAAA;AAAE,gGAAA,QAAQ,OAAA;AAEpE,2CAA0F;AAAjF,yGAAA,WAAW,OAAA;AAAE,wGAAA,UAAU,OAAA;AAAE,8GAAA,gBAAgB,OAAA;AAAE,6GAAA,eAAe,OAAA;AAEnE,8CAK6B;AAJzB,sHAAA,4BAA4B,OAAA;AAC5B,iHAAA,uBAAuB,OAAA;AACvB,iHAAA,uBAAuB,OAAA;AACvB,4GAAA,kBAAkB,OAAA"}
@@ -0,0 +1,5 @@
1
+ import type { ArrayFieldRef, FieldRef, GenericFieldRef } from './types';
2
+ export declare function defineField<V>(initialValue: V, initialDisabled?: boolean): FieldRef<V>;
3
+ export declare function isFieldRef(field: unknown): field is FieldRef<unknown>;
4
+ export declare function defineArrayField<T extends GenericFieldRef, V>(initialItems: Iterable<V>, itemTemplate: (value: V) => T, initialDisabled?: boolean): ArrayFieldRef<T, V>;
5
+ export declare function isArrayFieldRef(field: unknown): field is ArrayFieldRef<GenericFieldRef, unknown>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineField = defineField;
4
+ exports.isFieldRef = isFieldRef;
5
+ exports.defineArrayField = defineArrayField;
6
+ exports.isArrayFieldRef = isArrayFieldRef;
7
+ const tslib_1 = require("tslib");
8
+ const immutable_1 = require("immutable");
9
+ const FieldState_1 = tslib_1.__importDefault(require("./FieldState"));
10
+ class FieldRefImpl {
11
+ constructor(initialValue, initialDisabled) {
12
+ this.initialState = new FieldState_1.default(initialValue, initialDisabled, false, false);
13
+ }
14
+ }
15
+ function defineField(initialValue, initialDisabled = false) {
16
+ return new FieldRefImpl(initialValue, initialDisabled);
17
+ }
18
+ function isFieldRef(field) {
19
+ return field instanceof FieldRefImpl;
20
+ }
21
+ class ArrayFieldRefImpl extends FieldRefImpl {
22
+ constructor(initialItems, itemTemplate, initialDisabled) {
23
+ super(initialItems, initialDisabled);
24
+ this.itemTemplate = itemTemplate;
25
+ this.itemTemplate = itemTemplate;
26
+ }
27
+ }
28
+ function defineArrayField(initialItems, itemTemplate, initialDisabled = false) {
29
+ return new ArrayFieldRefImpl((0, immutable_1.Seq)(initialItems).map(itemTemplate).toList(), itemTemplate, initialDisabled);
30
+ }
31
+ function isArrayFieldRef(field) {
32
+ return field instanceof ArrayFieldRefImpl;
33
+ }
34
+ //# sourceMappingURL=references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/main/web/references.ts"],"names":[],"mappings":";;AAaA,kCAEC;AAED,gCAEC;AAgBD,4CAUC;AAED,0CAEC;;AAjDD,yCAAsC;AAEtC,sEAA0C;AAG1C,MAAM,YAAY;IAGd,YAAY,YAAe,EAAE,eAAwB;QACjD,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAc,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACxF,CAAC;CACJ;AAED,SAAgB,WAAW,CAAI,YAAe,EAAE,eAAe,GAAG,KAAK;IACnE,OAAO,IAAI,YAAY,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AAC3D,CAAC;AAED,SAAgB,UAAU,CAAC,KAAc;IACrC,OAAO,KAAK,YAAY,YAAY,CAAC;AACzC,CAAC;AAED,MAAM,iBACF,SAAQ,YAAqB;IAG7B,YACI,YAAqB,EACZ,YAA6B,EACtC,eAAwB;QAExB,KAAK,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAH5B,iBAAY,GAAZ,YAAY,CAAiB;QAItC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;CACJ;AAED,SAAgB,gBAAgB,CAC5B,YAAyB,EACzB,YAA6B,EAC7B,eAAe,GAAG,KAAK;IAEvB,OAAO,IAAI,iBAAiB,CACxB,IAAA,eAAG,EAAC,YAAY,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAC5C,YAAY,EACZ,eAAe,CAClB,CAAC;AACN,CAAC;AAED,SAAgB,eAAe,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,iBAAiB,CAAC;AAC9C,CAAC"}
@@ -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
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -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;