@ekz/formix 1.0.2 → 2.0.0
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/package.json +68 -42
- package/lib/FieldState.d.ts +0 -17
- package/lib/fields.d.ts +0 -15
- package/lib/form.d.ts +0 -13
- package/lib/index.d.ts +0 -5
- package/lib/index.js +0 -1
- package/lib/references.d.ts +0 -5
- package/lib/types.d.ts +0 -111
- package/lib/validation/fields.d.ts +0 -5
- package/lib/validation/form.d.ts +0 -2
package/package.json
CHANGED
|
@@ -1,65 +1,91 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ekz/formix",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"license": "MIT",
|
|
5
5
|
"description": "Type-safe React form to be used with Typescript",
|
|
6
|
-
"keywords": [
|
|
7
|
-
"react",
|
|
8
|
-
"form",
|
|
9
|
-
"formix",
|
|
10
|
-
"typescript",
|
|
11
|
-
"type-safe"
|
|
12
|
-
],
|
|
13
|
-
"author": {
|
|
14
|
-
"name": "Alan Heitkotter",
|
|
15
|
-
"email": "heitkotter@gmail.com"
|
|
16
|
-
},
|
|
17
6
|
"repository": {
|
|
18
7
|
"type": "git",
|
|
19
|
-
"url": "
|
|
8
|
+
"url": "https://github.com/erkez/ekz.git",
|
|
9
|
+
"directory": "formix"
|
|
20
10
|
},
|
|
21
|
-
"
|
|
22
|
-
"
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public",
|
|
13
|
+
"registry": "https://registry.npmjs.org"
|
|
14
|
+
},
|
|
15
|
+
"main": "lib/cjs/index.js",
|
|
16
|
+
"module": "lib/esm/index.js",
|
|
17
|
+
"esnext": "lib/esnext/index.js",
|
|
18
|
+
"typings": "lib/esm/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./lib/esm/index.d.ts",
|
|
22
|
+
"import": "./lib/esm/index.js",
|
|
23
|
+
"require": "./lib/cjs/index.js"
|
|
24
|
+
}
|
|
23
25
|
},
|
|
24
|
-
"homepage": "https://github.com/erkez/formix#readme",
|
|
25
|
-
"main": "lib/index.js",
|
|
26
|
-
"types": "lib/index.d.ts",
|
|
27
|
-
"license": "MIT",
|
|
28
26
|
"files": [
|
|
29
27
|
"lib",
|
|
30
28
|
"README.md",
|
|
31
29
|
"LICENSE"
|
|
32
30
|
],
|
|
31
|
+
"keywords": [
|
|
32
|
+
"react",
|
|
33
|
+
"form",
|
|
34
|
+
"formix",
|
|
35
|
+
"typescript",
|
|
36
|
+
"type-safe"
|
|
37
|
+
],
|
|
33
38
|
"peerDependencies": {
|
|
34
|
-
"@ekz/option": "^
|
|
35
|
-
"immutable": "^4",
|
|
36
|
-
"react": "^16.8.0 || ^17 || ^18",
|
|
39
|
+
"@ekz/option": "^2.0.0",
|
|
40
|
+
"immutable": "^4 || ^5",
|
|
41
|
+
"react": "^16.8.0 || ^17 || ^18 || ^19",
|
|
37
42
|
"typescript": "^4 || ^5"
|
|
38
43
|
},
|
|
39
44
|
"devDependencies": {
|
|
40
|
-
"@ekz/option": "
|
|
41
|
-
"@
|
|
42
|
-
"@testing-library/jest-dom": "^
|
|
43
|
-
"@testing-library/react": "^
|
|
44
|
-
"@testing-library/react-hooks": "^
|
|
45
|
-
"@
|
|
46
|
-
"@types/jest": "^
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
45
|
+
"@ekz/option": "workspace:^",
|
|
46
|
+
"@testing-library/dom": "^10.4.1",
|
|
47
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
48
|
+
"@testing-library/react": "^16.3.2",
|
|
49
|
+
"@testing-library/react-hooks": "^8.0.1",
|
|
50
|
+
"@testing-library/user-event": "^14.6.1",
|
|
51
|
+
"@types/jest": "^30.0.0",
|
|
52
|
+
"@types/node": "^25.6.0",
|
|
53
|
+
"@types/react": "18.3.28",
|
|
54
|
+
"immutable": "^5.1.5",
|
|
55
|
+
"jest": "^30.2.0",
|
|
56
|
+
"jest-environment-jsdom": "^30.2.0",
|
|
57
|
+
"npm-run-all": "^4.1.5",
|
|
50
58
|
"react": "^18.3.1",
|
|
51
59
|
"react-dom": "^18.3.1",
|
|
52
|
-
"
|
|
60
|
+
"ts-jest": "^29.4.6",
|
|
61
|
+
"typescript": "^5.9.3"
|
|
53
62
|
},
|
|
54
63
|
"scripts": {
|
|
55
|
-
"
|
|
56
|
-
"lint": "npx eslint --ext .ts --ext .tsx
|
|
64
|
+
"clean": "rm -rf lib/* || true",
|
|
65
|
+
"lint": "npx eslint --ext .ts --ext .tsx ./src/main/web",
|
|
57
66
|
"lint:fix": "yarn lint --fix",
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"prepublish": "yarn test --ci --no-watchman && yarn lint && yarn
|
|
67
|
+
"compile": "run-p \"compile:*\"",
|
|
68
|
+
"compile:esm": "tsc -p ./src/main/web --outDir ./lib/esm",
|
|
69
|
+
"compile:cjs": "tsc -p ./src/main/web -m commonjs --verbatimModuleSyntax false --outDir ./lib/cjs",
|
|
70
|
+
"compile:esnext": "tsc -p ./src/main/web -t esnext --outDir ./lib/esnext",
|
|
71
|
+
"test": "jest",
|
|
72
|
+
"prepublish": "yarn clean && yarn test --ci --no-watchman && yarn lint && yarn compile"
|
|
73
|
+
},
|
|
74
|
+
"jest": {
|
|
75
|
+
"preset": "ts-jest/presets/default",
|
|
76
|
+
"testEnvironment": "jsdom",
|
|
77
|
+
"roots": [
|
|
78
|
+
"<rootDir>/__tests__"
|
|
79
|
+
],
|
|
80
|
+
"transform": {
|
|
81
|
+
"^.+\\.tsx?$": [
|
|
82
|
+
"ts-jest",
|
|
83
|
+
{
|
|
84
|
+
"tsconfig": {
|
|
85
|
+
"jsx": "react"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
|
64
90
|
}
|
|
65
91
|
}
|
package/lib/FieldState.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { 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
|
-
}
|
package/lib/fields.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { 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 {};
|
package/lib/form.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { 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 {};
|
package/lib/index.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
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';
|
package/lib/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("immutable"),require("react")):"function"==typeof define&&define.amd?define(["immutable","react"],t):"object"==typeof exports?exports.Formix=t(require("immutable"),require("react")):e.Formix=t(e.immutable,e.react)}(self,((e,t)=>(()=>{"use strict";var r={144:t=>{t.exports=e},155:e=>{e.exports=t}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var u=n[e]={exports:{}};return r[e](u,u.exports,i),u.exports}i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var u={};i.r(u),i.d(u,{FormProvider:()=>V,UseArrayField:()=>U,UseField:()=>L,UseForm:()=>D,defineArrayField:()=>g,defineField:()=>b,isArrayFieldRef:()=>h,isFieldRef:()=>m,useArrayField:()=>_,useAsyncFieldStateValidation:()=>W,useAsyncFieldValidation:()=>K,useField:()=>A,useFieldStateValidation:()=>z,useFieldValidation:()=>B,useForm:()=>C,useFormWithFields:()=>k,withForm:()=>x});var o=i(155),a=i(144);function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e,t,r){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}const f=function(){function e(e,t,r,n){this.value=e,this.disabled=t,this.active=r,this.touched=n,this.value=e,this.disabled=t,this.active=r,this.touched=n}return e.prototype.updated=function(t){var r,n,i,u=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){c(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}({value:this.value},t);return new e(u.value,null!==(r=t.disabled)&&void 0!==r?r:this.disabled,null!==(n=t.active)&&void 0!==n?n:this.active,null!==(i=t.touched)&&void 0!==i?i:this.touched)},e.prototype.equals=function(e){return null!=e&&(0,a.is)(this.value,e.value)&&this.disabled===e.disabled},e.prototype.hashCode=function(){return(0,a.hash)(this.value)&(0,a.hash)(this.disabled)},e}();var s,d=(s=function(e,t){return s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},s(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}s(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});function p(e,t,r){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var v=function(e,t){p(this,"initialState",void 0),this.initialState=new f(e,t,!1,!1)};function b(e){return new v(e,arguments.length>1&&void 0!==arguments[1]&&arguments[1])}function m(e){return e instanceof v}var y=function(e){function t(t,r,n){var i=e.call(this,t,n)||this;return i.itemTemplate=r,i.itemTemplate=r,i}return d(t,e),t}(v);function g(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return new y((0,a.Seq)(e).map(t).toList(),t,r)}function h(e){return e instanceof y}var O=Object.freeze({error:null,pending:!1}),j=["reset"];function S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function w(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?S(Object(r),!0).forEach((function(t){P(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):S(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function P(e,t,r){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function F(){var e=o.useState(a.Map),t=e[0],r=e[1],n=o.useCallback((function(e){return t.get(e,e.initialState)}),[t]),i=o.useCallback((function(e){return n(e).value}),[n]),u=o.useCallback((function(e,t){r((function(r){return"function"==typeof t?r.update(e,e.initialState,t):r.set(e,t)}))}),[]),l=o.useCallback((function(e,t){return function e(r){if(h(r))return n(r).value.map(e);if(m(r)){var i=n(r);return"value"===t?i.value:i}return a.Seq.Keyed(r).map((function(t){return e(t)})).toObject()}(e)}),[n]),c=o.useCallback((function(e){return l(e,"state")}),[l]),f=o.useCallback((function(e){return l(e,"value")}),[l]),s=o.useCallback((function(){return r((0,a.Map)())}),[r]),d=o.useMemo((function(){return t.some((function(e,t){return!e.equals(t.initialState)}))}),[t]),p=function(e){var t=o.useState(a.Map),r=t[0],n=t[1],i=o.useCallback((function(e){return n((function(t){return t.update(e.fieldRef,(0,a.OrderedSet)(),(function(t){return t.add(e)}))})),function(){return n((function(t){return t.update(e.fieldRef,(0,a.OrderedSet)(),(function(t){return t.remove(e)}))}))}}),[]),u=o.useCallback((function(e){return r.get(e,(0,a.OrderedSet)()).reduce((function(e,t){return{error:e.error||t.error,pending:e.pending||t.pending}}),O)}),[r]),l=o.useCallback((function(t){var n=function t(r){return h(r)?e(r).value.flatMap(t):m(r)?a.List.of(r):a.Seq.Keyed(r).valueSeq().flatMap(t).toList()}(t).toSet();return r.filter((function(e,t){return n.has(t)})).valueSeq().flatMap((function(e){return e})).every((function(e){return null==e.error&&!e.pending}))}),[e,r]),c=o.useMemo((function(){return r.valueSeq().flatMap((function(e){return e})).some((function(e){return e.pending}))}),[r]);return{registerValidation:i,getValidationResult:u,isFieldValid:l,valid:o.useMemo((function(){return!c&&r.valueSeq().flatMap((function(e){return e})).every((function(e){return null==e.error}))}),[c,r]),pending:c}}(n);return o.useMemo((function(){return w({getFieldState:n,getFieldValue:i,setFieldState:u,getStates:c,getValues:f,reset:s,modified:d},p)}),[n,i,u,c,f,s,d,p])}function M(){throw new Error("Cannot call method on empty context. Did you forget <Form />?")}var E=o.createContext({getFieldState:M,getFieldValue:M,setFieldState:M,getStates:M,getValues:M,getValidationResult:M,registerValidation:M,isFieldValid:M,reset:M,pending:!1,valid:!1,modified:!1});function V(e){var t=F();return o.createElement(E.Provider,{value:t},e.children)}function C(){return o.useContext(E)}function k(e,t){var r=C(),n=r.reset,i=function(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.includes(n))continue;r[n]=e[n]}return r}(e,t);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(e);for(n=0;n<u.length;n++)r=u[n],t.includes(r)||{}.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}(r,j),u=o.useMemo((function(){return e.apply(void 0,t)}),t);return o.useLayoutEffect((function(){n()}),[n,u]),o.useMemo((function(){return w(w({},i),{},{reset:n,fields:u})}),[i,n,u])}function x(e){return function(t){return o.createElement(V,null,o.createElement(e,t))}}function D(e){var t=C();return o.createElement(o.Fragment,null,e.children(t))}function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function q(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?T(Object(r),!0).forEach((function(t){R(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):T(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function R(e,t,r){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function A(e){var t=C(),r=t.getFieldState,n=t.setFieldState,i=t.getValidationResult,u=r(e),a=i(e),l=o.useCallback((function(t){n(e,(function(e){var r="function"==typeof t?t(e.value):t;return e.value===r?e:e.updated({value:r,touched:!0})}))}),[e,n]),c=o.useCallback((function(t){return n(e,(function(e){return e.updated({disabled:t})}))}),[e,n]),f=o.useCallback((function(){return n(e,(function(e){return e.updated({active:!0,touched:!0})}))}),[e,n]),s=o.useCallback((function(){return n(e,(function(e){return e.updated({active:!1})}))}),[e,n]);return o.useMemo((function(){return q(q({value:u.value},a),{},{disabled:u.disabled,active:u.active,touched:u.touched,setValue:l,setDisabled:c,onFocus:f,onBlur:s})}),[u,a,l,c,f,s])}function _(e){var t=C().getValidationResult,r=A(e),n=r.value,i=r.setValue,u=r.disabled,a=r.active,l=r.touched,c=r.setDisabled,f=r.onBlur,s=r.onFocus,d=t(e),p=o.useCallback((function(t){var r=e.itemTemplate(t);return i((function(e){return e.unshift(r)})),r}),[i,e]),v=o.useCallback((function(t){var r=e.itemTemplate(t);return i((function(e){return e.push(r)})),r}),[i,e]),b=o.useCallback((function(t,r){var n=e.itemTemplate(r);return i((function(e){return e.insert(t,n)})),n}),[i,e]),m=o.useCallback((function(e){i((function(t){var r=t.indexOf(e);return-1!==r?t.remove(r):t}))}),[i]),y=o.useCallback((function(e,t){i((function(r){var n=r.get(e),i=r.get(t);if(null==n||null==i)throw new Error("Invalid element access");return r.remove(e).insert(e,i).remove(t).insert(t,n)}))}),[i]);return o.useMemo((function(){return q(q({items:n},d),{},{unshift:p,push:v,insert:b,remove:m,swap:y,disabled:u,active:a,touched:l,setDisabled:c,onBlur:f,onFocus:s})}),[n,d,p,v,b,m,y,u,a,l,c,f,s])}function L(e){var t=A(e.field);return o.createElement(o.Fragment,null,e.render(t))}function U(e){var t=_(e.field);return o.createElement(o.Fragment,null,e.render(t))}var N=function(e,t,r){if(r||2===arguments.length)for(var n,i=0,u=t.length;i<u;i++)!n&&i in t||(n||(n=Array.prototype.slice.call(t,0,i)),n[i]=t[i]);return e.concat(n||Array.prototype.slice.call(t))};function B(e,t,r){var n=C(),i=n.getValues,u=n.registerValidation,a=i(e),l=o.useMemo((function(){return(null!=r?r:[]).map(i)}),N([i],null!=r?r:[],!0)),c=o.useMemo((function(){return t(a,l)}),N([a],l,!0)),f=o.useMemo((function(){return{fieldRef:e,error:c,pending:!1}}),[e,c]);o.useLayoutEffect((function(){return u(f)}),[u,f])}function I(e,t,r){var n=o.useState({pending:!1,error:null}),i=n[0],u=n[1];return o.useEffect((function(){var r=!0;u((function(e){return{pending:!0,error:e.error}}));var n=setTimeout((function(){e().then((function(e){r&&u({pending:!1,error:e})})).catch((function(e){r&&u({pending:!1,error:"Unexpected error"}),console.warn("[Unhandled Validation Error]",e),console.warn("An async validator should never throw, but it should resolve with the validation result.")}))}),t);return function(){r=!1,clearTimeout(n)}}),N([t],r,!0)),i}function K(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:200,i=C(),u=i.getValues,a=i.registerValidation,l=u(e),c=o.useMemo((function(){return(null!=r?r:[]).map(u)}),N([u],null!=r?r:[],!0)),f=I((function(){return t(l,c)}),n,N([l],c,!0)),s=o.useMemo((function(){return{fieldRef:e,error:f.error,pending:f.pending}}),[e,f.error,f.pending]);o.useLayoutEffect((function(){return a(s)}),[a,s])}function z(e,t,r){var n=C(),i=n.getStates,u=n.registerValidation,a=i(e),l=o.useMemo((function(){return(null!=r?r:[]).map(i)}),N([i],null!=r?r:[],!0)),c=o.useMemo((function(){return t(a,l)}),N([a],l,!0)),f=o.useMemo((function(){return{fieldRef:e,error:c,pending:!1}}),[e,c]);o.useLayoutEffect((function(){return u(f)}),[u,f])}function W(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:200,i=C(),u=i.getStates,a=i.registerValidation,l=u(e),c=o.useMemo((function(){return(null!=r?r:[]).map(u)}),N([u],null!=r?r:[],!0)),f=I((function(){return t(l,c)}),n,N([l],c,!0)),s=o.useMemo((function(){return{fieldRef:e,error:f.error,pending:f.pending}}),[e,f.error,f.pending]);o.useLayoutEffect((function(){return a(s)}),[a,s])}return u})()));
|
package/lib/references.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { 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>;
|
package/lib/types.d.ts
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { 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;
|
package/lib/validation/form.d.ts
DELETED