@lucas-barake/effect-form 0.13.0 → 0.15.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/dist/cjs/Field.js +0 -67
- package/dist/cjs/Field.js.map +1 -1
- package/dist/cjs/FormAtoms.js +6 -26
- package/dist/cjs/FormAtoms.js.map +1 -1
- package/dist/cjs/FormBuilder.js +0 -66
- package/dist/cjs/FormBuilder.js.map +1 -1
- package/dist/cjs/Mode.js +0 -9
- package/dist/cjs/Mode.js.map +1 -1
- package/dist/cjs/Path.js +0 -34
- package/dist/cjs/Path.js.map +1 -1
- package/dist/cjs/Validation.js +0 -30
- package/dist/cjs/Validation.js.map +1 -1
- package/dist/cjs/internal/dirty.js +0 -16
- package/dist/cjs/internal/dirty.js.map +1 -1
- package/dist/cjs/internal/weak-registry.js +0 -11
- package/dist/cjs/internal/weak-registry.js.map +1 -1
- package/dist/dts/Field.d.ts +0 -99
- package/dist/dts/Field.d.ts.map +1 -1
- package/dist/dts/FormAtoms.d.ts +1 -54
- package/dist/dts/FormAtoms.d.ts.map +1 -1
- package/dist/dts/FormBuilder.d.ts +3 -152
- package/dist/dts/FormBuilder.d.ts.map +1 -1
- package/dist/dts/Mode.d.ts +0 -33
- package/dist/dts/Mode.d.ts.map +1 -1
- package/dist/dts/Path.d.ts +0 -34
- package/dist/dts/Path.d.ts.map +1 -1
- package/dist/dts/Validation.d.ts +0 -37
- package/dist/dts/Validation.d.ts.map +1 -1
- package/dist/dts/index.d.ts +17 -19
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/dirty.d.ts +0 -10
- package/dist/dts/internal/dirty.d.ts.map +1 -1
- package/dist/dts/internal/weak-registry.d.ts +8 -6
- package/dist/dts/internal/weak-registry.d.ts.map +1 -1
- package/dist/esm/Field.js +0 -66
- package/dist/esm/Field.js.map +1 -1
- package/dist/esm/FormAtoms.js +7 -27
- package/dist/esm/FormAtoms.js.map +1 -1
- package/dist/esm/FormBuilder.js +0 -66
- package/dist/esm/FormBuilder.js.map +1 -1
- package/dist/esm/Mode.js +0 -8
- package/dist/esm/Mode.js.map +1 -1
- package/dist/esm/Path.js +0 -34
- package/dist/esm/Path.js.map +1 -1
- package/dist/esm/Validation.js +0 -29
- package/dist/esm/Validation.js.map +1 -1
- package/dist/esm/index.js +17 -19
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/dirty.js +0 -15
- package/dist/esm/internal/dirty.js.map +1 -1
- package/dist/esm/internal/weak-registry.js +0 -11
- package/dist/esm/internal/weak-registry.js.map +1 -1
- package/package.json +1 -1
- package/src/Field.ts +0 -99
- package/src/FormAtoms.ts +277 -320
- package/src/FormBuilder.ts +0 -172
- package/src/Mode.ts +0 -33
- package/src/Path.ts +0 -35
- package/src/Validation.ts +0 -41
- package/src/index.ts +22 -19
- package/src/internal/dirty.ts +0 -15
- package/src/internal/weak-registry.ts +0 -17
package/dist/esm/Validation.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Validation utilities for form error handling.
|
|
3
|
-
*/
|
|
4
1
|
import * as Option from "effect/Option";
|
|
5
2
|
import * as ParseResult from "effect/ParseResult";
|
|
6
3
|
import { schemaPathToFieldPath } from "./Path.js";
|
|
@@ -13,10 +10,6 @@ const getBaseAST = ast => {
|
|
|
13
10
|
return ast;
|
|
14
11
|
}
|
|
15
12
|
};
|
|
16
|
-
/**
|
|
17
|
-
* Returns true if the AST represents a composite type where refinements indicate cross-field validation.
|
|
18
|
-
* Covers: Schema.Struct, Class, Tuple, Union, Suspend.
|
|
19
|
-
*/
|
|
20
13
|
const isCompositeType = ast => {
|
|
21
14
|
const base = getBaseAST(ast);
|
|
22
15
|
switch (base._tag) {
|
|
@@ -31,11 +24,6 @@ const isCompositeType = ast => {
|
|
|
31
24
|
return false;
|
|
32
25
|
}
|
|
33
26
|
};
|
|
34
|
-
/**
|
|
35
|
-
* Extracts the first error message from a ParseError.
|
|
36
|
-
*
|
|
37
|
-
* @category Error Handling
|
|
38
|
-
*/
|
|
39
27
|
export const extractFirstError = error => {
|
|
40
28
|
const issues = ParseResult.ArrayFormatter.formatErrorSync(error);
|
|
41
29
|
if (issues.length === 0) {
|
|
@@ -43,12 +31,6 @@ export const extractFirstError = error => {
|
|
|
43
31
|
}
|
|
44
32
|
return Option.some(issues[0].message);
|
|
45
33
|
};
|
|
46
|
-
/**
|
|
47
|
-
* Routes validation errors from a ParseError to a map of field paths to error messages.
|
|
48
|
-
* Used for cross-field validation where schema errors need to be displayed on specific fields.
|
|
49
|
-
*
|
|
50
|
-
* @category Error Handling
|
|
51
|
-
*/
|
|
52
34
|
export const routeErrors = error => {
|
|
53
35
|
const result = new Map();
|
|
54
36
|
const issues = ParseResult.ArrayFormatter.formatErrorSync(error);
|
|
@@ -109,17 +91,6 @@ const determineErrorSources = error => {
|
|
|
109
91
|
walk(error.issue, [], "field");
|
|
110
92
|
return sources;
|
|
111
93
|
};
|
|
112
|
-
/**
|
|
113
|
-
* Routes validation errors with source tracking.
|
|
114
|
-
*
|
|
115
|
-
* Source determination:
|
|
116
|
-
* - `kind: "Predicate"` on composite types → "refinement" (cross-field validation)
|
|
117
|
-
* - All other errors → "field" (per-field schema validation)
|
|
118
|
-
*
|
|
119
|
-
* Empty string key ("") stores root-level errors (refinements without specific paths).
|
|
120
|
-
*
|
|
121
|
-
* @category Error Handling
|
|
122
|
-
*/
|
|
123
94
|
export const routeErrorsWithSource = error => {
|
|
124
95
|
const result = new Map();
|
|
125
96
|
const formattedIssues = ParseResult.ArrayFormatter.formatErrorSync(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Validation.js","names":["Option","ParseResult","schemaPathToFieldPath","getBaseAST","ast","_tag","from","isCompositeType","base","extractFirstError","error","issues","ArrayFormatter","formatErrorSync","length","none","some","message","routeErrors","result","Map","issue","fieldPath","path","has","set","determineErrorSources","sources","walk","source","kind","pointerPath","Array","isArray","sub","key","transformation","routeErrorsWithSource","formattedIssues","get"],"sources":["../../src/Validation.ts"],"sourcesContent":[null],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"Validation.js","names":["Option","ParseResult","schemaPathToFieldPath","getBaseAST","ast","_tag","from","isCompositeType","base","extractFirstError","error","issues","ArrayFormatter","formatErrorSync","length","none","some","message","routeErrors","result","Map","issue","fieldPath","path","has","set","determineErrorSources","sources","walk","source","kind","pointerPath","Array","isArray","sub","key","transformation","routeErrorsWithSource","formattedIssues","get"],"sources":["../../src/Validation.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,27 +1,25 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Field definitions for type-safe forms.
|
|
3
|
-
*/
|
|
4
1
|
export * as Field from "./Field.js";
|
|
5
2
|
/**
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
* Root anchor atom for the form's dependency graph.
|
|
4
|
+
* Mount this atom to keep all form state alive even when field components unmount.
|
|
5
|
+
*
|
|
6
|
+
* Useful for:
|
|
7
|
+
* - Multi-step wizards where steps unmount but state should persist
|
|
8
|
+
* - Conditional fields (toggles) where state should survive visibility changes
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* // Keep form state alive at wizard root level
|
|
13
|
+
* function Wizard() {
|
|
14
|
+
* useAtomMount(step1Form.mount)
|
|
15
|
+
* useAtomMount(step2Form.mount)
|
|
16
|
+
* return currentStep === 1 ? <Step1 /> : <Step2 />
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
10
20
|
export * as FormAtoms from "./FormAtoms.js";
|
|
11
|
-
/**
|
|
12
|
-
* @category Models
|
|
13
|
-
*/
|
|
14
21
|
export * as FormBuilder from "./FormBuilder.js";
|
|
15
|
-
/**
|
|
16
|
-
* Form validation mode configuration.
|
|
17
|
-
*/
|
|
18
22
|
export * as Mode from "./Mode.js";
|
|
19
|
-
/**
|
|
20
|
-
* Path utilities for form field operations.
|
|
21
|
-
*/
|
|
22
23
|
export * as Path from "./Path.js";
|
|
23
|
-
/**
|
|
24
|
-
* Validation utilities for form error handling.
|
|
25
|
-
*/
|
|
26
24
|
export * as Validation from "./Validation.js";
|
|
27
25
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Field","FormAtoms","FormBuilder","Mode","Path","Validation"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":["Field","FormAtoms","FormBuilder","Mode","Path","Validation"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AACA,OAAO,KAAKA,KAAK,MAAM,YAAY;AAEnC;;;;;;;;;;;;;;;;;;AAkBA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAG3C,OAAO,KAAKC,WAAW,MAAM,kBAAkB;AAG/C,OAAO,KAAKC,IAAI,MAAM,WAAW;AAGjC,OAAO,KAAKC,IAAI,MAAM,WAAW;AAGjC,OAAO,KAAKC,UAAU,MAAM,iBAAiB","ignoreList":[]}
|
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Internal dirty tracking algorithms.
|
|
3
|
-
*
|
|
4
|
-
* @internal
|
|
5
|
-
*/
|
|
6
1
|
import * as Equal from "effect/Equal";
|
|
7
2
|
import * as Utils from "effect/Utils";
|
|
8
3
|
import { getNestedValue, isPathUnderRoot } from "../Path.js";
|
|
9
|
-
/**
|
|
10
|
-
* Recalculates dirty fields for an array after mutation.
|
|
11
|
-
* Clears all paths under the array and re-evaluates each item.
|
|
12
|
-
*/
|
|
13
4
|
export const recalculateDirtyFieldsForArray = (dirtyFields, initialValues, arrayPath, newItems) => {
|
|
14
5
|
const initialItems = getNestedValue(initialValues, arrayPath) ?? [];
|
|
15
6
|
if (newItems === initialItems) {
|
|
@@ -34,12 +25,6 @@ export const recalculateDirtyFieldsForArray = (dirtyFields, initialValues, array
|
|
|
34
25
|
}
|
|
35
26
|
return nextDirty;
|
|
36
27
|
};
|
|
37
|
-
/**
|
|
38
|
-
* Recalculates dirty fields for a subtree after value change.
|
|
39
|
-
* Clears the rootPath and all children, then re-evaluates recursively.
|
|
40
|
-
*
|
|
41
|
-
* @param rootPath - Empty string for full form, or a specific path for targeted update
|
|
42
|
-
*/
|
|
43
28
|
export const recalculateDirtySubtree = (currentDirty, allInitial, allValues, rootPath = "") => {
|
|
44
29
|
const targetValue = rootPath ? getNestedValue(allValues, rootPath) : allValues;
|
|
45
30
|
const targetInitial = rootPath ? getNestedValue(allInitial, rootPath) : allInitial;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dirty.js","names":["Equal","Utils","getNestedValue","isPathUnderRoot","recalculateDirtyFieldsForArray","dirtyFields","initialValues","arrayPath","newItems","initialItems","nextDirty","Set","Array","from","filter","path","loopLength","Math","max","length","i","itemPath","newItem","initialItem","isEqual","structuralRegion","equals","add","delete","recalculateDirtySubtree","currentDirty","allInitial","allValues","rootPath","targetValue","targetInitial","changed","clear","recurse","current","initial","isArray","initialArr","initialObj","key","undefined"],"sources":["../../../src/internal/dirty.ts"],"sourcesContent":[null],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dirty.js","names":["Equal","Utils","getNestedValue","isPathUnderRoot","recalculateDirtyFieldsForArray","dirtyFields","initialValues","arrayPath","newItems","initialItems","nextDirty","Set","Array","from","filter","path","loopLength","Math","max","length","i","itemPath","newItem","initialItem","isEqual","structuralRegion","equals","add","delete","recalculateDirtySubtree","currentDirty","allInitial","allValues","rootPath","targetValue","targetInitial","changed","clear","recurse","current","initial","isArray","initialArr","initialObj","key","undefined"],"sources":["../../../src/internal/dirty.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Internal WeakRef-based registry for caching atoms.
|
|
3
|
-
*
|
|
4
|
-
* @internal
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Creates a WeakRef-based registry with automatic cleanup via FinalizationRegistry.
|
|
8
|
-
* Falls back to a regular Map in environments without WeakRef support.
|
|
9
|
-
*
|
|
10
|
-
* @internal
|
|
11
|
-
*/
|
|
12
1
|
export const createWeakRegistry = () => {
|
|
13
2
|
if (typeof WeakRef === "undefined" || typeof FinalizationRegistry === "undefined") {
|
|
14
3
|
const map = new Map();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weak-registry.js","names":["createWeakRegistry","WeakRef","FinalizationRegistry","map","Map","get","key","set","value","delete","clear","values","registry","deref","register","ref","undefined"],"sources":["../../../src/internal/weak-registry.ts"],"sourcesContent":[null],"mappings":"
|
|
1
|
+
{"version":3,"file":"weak-registry.js","names":["createWeakRegistry","WeakRef","FinalizationRegistry","map","Map","get","key","set","value","delete","clear","values","registry","deref","register","ref","undefined"],"sources":["../../../src/internal/weak-registry.ts"],"sourcesContent":[null],"mappings":"AAQA,OAAO,MAAMA,kBAAkB,GAAGA,CAAA,KAAwC;EACxE,IAAI,OAAOC,OAAO,KAAK,WAAW,IAAI,OAAOC,oBAAoB,KAAK,WAAW,EAAE;IACjF,MAAMC,GAAG,GAAG,IAAIC,GAAG,EAAa;IAChC,OAAO;MACLC,GAAG,EAAGC,GAAG,IAAKH,GAAG,CAACE,GAAG,CAACC,GAAG,CAAC;MAC1BC,GAAG,EAAEA,CAACD,GAAG,EAAEE,KAAK,KAAI;QAClBL,GAAG,CAACI,GAAG,CAACD,GAAG,EAAEE,KAAK,CAAC;MACrB,CAAC;MACDC,MAAM,EAAGH,GAAG,IAAKH,GAAG,CAACM,MAAM,CAACH,GAAG,CAAC;MAChCI,KAAK,EAAEA,CAAA,KAAMP,GAAG,CAACO,KAAK,EAAE;MACxBC,MAAM,EAAEA,CAAA,KAAMR,GAAG,CAACQ,MAAM;KACzB;EACH;EAEA,MAAMR,GAAG,GAAG,IAAIC,GAAG,EAAsB;EACzC,MAAMQ,QAAQ,GAAG,IAAIV,oBAAoB,CAAUI,GAAG,IAAI;IACxDH,GAAG,CAACM,MAAM,CAACH,GAAG,CAAC;EACjB,CAAC,CAAC;EAEF,OAAO;IACLD,GAAG,EAAGC,GAAG,IAAKH,GAAG,CAACE,GAAG,CAACC,GAAG,CAAC,EAAEO,KAAK,EAAE;IACnCN,GAAG,EAAEA,CAACD,GAAG,EAAEE,KAAK,KAAI;MAClBL,GAAG,CAACI,GAAG,CAACD,GAAG,EAAE,IAAIL,OAAO,CAACO,KAAK,CAAC,CAAC;MAChCI,QAAQ,CAACE,QAAQ,CAACN,KAAK,EAAEF,GAAG,CAAC;IAC/B,CAAC;IACDG,MAAM,EAAGH,GAAG,IAAKH,GAAG,CAACM,MAAM,CAACH,GAAG,CAAC;IAChCI,KAAK,EAAEA,CAAA,KAAMP,GAAG,CAACO,KAAK,EAAE;IACxB,CAACC,MAAMA,CAAA;MACL,KAAK,MAAMI,GAAG,IAAIZ,GAAG,CAACQ,MAAM,EAAE,EAAE;QAC9B,MAAMH,KAAK,GAAGO,GAAG,CAACF,KAAK,EAAE;QACzB,IAAIL,KAAK,KAAKQ,SAAS,EAAE,MAAMR,KAAK;MACtC;IACF;GACD;AACH,CAAC","ignoreList":[]}
|
package/package.json
CHANGED
package/src/Field.ts
CHANGED
|
@@ -1,84 +1,30 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Field definitions for type-safe forms.
|
|
3
|
-
*/
|
|
4
1
|
import * as Schema from "effect/Schema"
|
|
5
2
|
|
|
6
|
-
/**
|
|
7
|
-
* Unique identifier for Field instances.
|
|
8
|
-
*
|
|
9
|
-
* @category Symbols
|
|
10
|
-
*/
|
|
11
3
|
export const TypeId: unique symbol = Symbol.for("@lucas-barake/effect-form/Field")
|
|
12
4
|
|
|
13
|
-
/**
|
|
14
|
-
* @category Symbols
|
|
15
|
-
*/
|
|
16
5
|
export type TypeId = typeof TypeId
|
|
17
6
|
|
|
18
|
-
/**
|
|
19
|
-
* A scalar field definition containing the key and schema.
|
|
20
|
-
*
|
|
21
|
-
* @category Models
|
|
22
|
-
*/
|
|
23
7
|
export interface FieldDef<K extends string, S extends Schema.Schema.Any> {
|
|
24
8
|
readonly _tag: "field"
|
|
25
9
|
readonly key: K
|
|
26
10
|
readonly schema: S
|
|
27
11
|
}
|
|
28
12
|
|
|
29
|
-
/**
|
|
30
|
-
* An array field definition containing a schema for items.
|
|
31
|
-
*
|
|
32
|
-
* @category Models
|
|
33
|
-
*/
|
|
34
13
|
export interface ArrayFieldDef<K extends string, S extends Schema.Schema.Any> {
|
|
35
14
|
readonly _tag: "array"
|
|
36
15
|
readonly key: K
|
|
37
16
|
readonly itemSchema: S
|
|
38
17
|
}
|
|
39
18
|
|
|
40
|
-
/**
|
|
41
|
-
* Union of all field definition types.
|
|
42
|
-
*
|
|
43
|
-
* @category Models
|
|
44
|
-
*/
|
|
45
19
|
export type AnyFieldDef = FieldDef<string, Schema.Schema.Any> | ArrayFieldDef<string, Schema.Schema.Any>
|
|
46
20
|
|
|
47
|
-
/**
|
|
48
|
-
* A record of field definitions.
|
|
49
|
-
*
|
|
50
|
-
* @category Models
|
|
51
|
-
*/
|
|
52
21
|
export type FieldsRecord = Record<string, AnyFieldDef>
|
|
53
22
|
|
|
54
|
-
/**
|
|
55
|
-
* Checks if a field definition is an array field.
|
|
56
|
-
*
|
|
57
|
-
* @category Guards
|
|
58
|
-
*/
|
|
59
23
|
export const isArrayFieldDef = (def: AnyFieldDef): def is ArrayFieldDef<string, Schema.Schema.Any> =>
|
|
60
24
|
def._tag === "array"
|
|
61
25
|
|
|
62
|
-
/**
|
|
63
|
-
* Checks if a field definition is a scalar field.
|
|
64
|
-
*
|
|
65
|
-
* @category Guards
|
|
66
|
-
*/
|
|
67
26
|
export const isFieldDef = (def: AnyFieldDef): def is FieldDef<string, Schema.Schema.Any> => def._tag === "field"
|
|
68
27
|
|
|
69
|
-
/**
|
|
70
|
-
* Creates a scalar field definition.
|
|
71
|
-
*
|
|
72
|
-
* @example
|
|
73
|
-
* ```ts
|
|
74
|
-
* import * as Field from "@lucas-barake/effect-form/Field"
|
|
75
|
-
* import * as Schema from "effect/Schema"
|
|
76
|
-
*
|
|
77
|
-
* const NameField = Field.makeField("name", Schema.String)
|
|
78
|
-
* ```
|
|
79
|
-
*
|
|
80
|
-
* @category Constructors
|
|
81
|
-
*/
|
|
82
28
|
export const makeField = <K extends string, S extends Schema.Schema.Any>(
|
|
83
29
|
key: K,
|
|
84
30
|
schema: S,
|
|
@@ -88,26 +34,6 @@ export const makeField = <K extends string, S extends Schema.Schema.Any>(
|
|
|
88
34
|
schema,
|
|
89
35
|
})
|
|
90
36
|
|
|
91
|
-
/**
|
|
92
|
-
* Creates an array field definition.
|
|
93
|
-
*
|
|
94
|
-
* @example
|
|
95
|
-
* ```ts
|
|
96
|
-
* import * as Field from "@lucas-barake/effect-form/Field"
|
|
97
|
-
* import * as Schema from "effect/Schema"
|
|
98
|
-
*
|
|
99
|
-
* // Array of primitives
|
|
100
|
-
* const TagsField = Field.makeArrayField("tags", Schema.String)
|
|
101
|
-
*
|
|
102
|
-
* // Array of objects
|
|
103
|
-
* const ItemsField = Field.makeArrayField("items", Schema.Struct({
|
|
104
|
-
* name: Schema.String,
|
|
105
|
-
* quantity: Schema.Number
|
|
106
|
-
* }))
|
|
107
|
-
* ```
|
|
108
|
-
*
|
|
109
|
-
* @category Constructors
|
|
110
|
-
*/
|
|
111
37
|
export const makeArrayField = <K extends string, S extends Schema.Schema.Any>(
|
|
112
38
|
key: K,
|
|
113
39
|
itemSchema: S,
|
|
@@ -117,33 +43,18 @@ export const makeArrayField = <K extends string, S extends Schema.Schema.Any>(
|
|
|
117
43
|
itemSchema,
|
|
118
44
|
})
|
|
119
45
|
|
|
120
|
-
/**
|
|
121
|
-
* Extracts the encoded (input) type from a fields record.
|
|
122
|
-
*
|
|
123
|
-
* @category Type Helpers
|
|
124
|
-
*/
|
|
125
46
|
export type EncodedFromFields<T extends FieldsRecord> = {
|
|
126
47
|
readonly [K in keyof T]: T[K] extends FieldDef<any, infer S> ? Schema.Schema.Encoded<S>
|
|
127
48
|
: T[K] extends ArrayFieldDef<any, infer S> ? ReadonlyArray<Schema.Schema.Encoded<S>>
|
|
128
49
|
: never
|
|
129
50
|
}
|
|
130
51
|
|
|
131
|
-
/**
|
|
132
|
-
* Extracts the decoded (output) type from a fields record.
|
|
133
|
-
*
|
|
134
|
-
* @category Type Helpers
|
|
135
|
-
*/
|
|
136
52
|
export type DecodedFromFields<T extends FieldsRecord> = {
|
|
137
53
|
readonly [K in keyof T]: T[K] extends FieldDef<any, infer S> ? Schema.Schema.Type<S>
|
|
138
54
|
: T[K] extends ArrayFieldDef<any, infer S> ? ReadonlyArray<Schema.Schema.Type<S>>
|
|
139
55
|
: never
|
|
140
56
|
}
|
|
141
57
|
|
|
142
|
-
/**
|
|
143
|
-
* Gets a default encoded value from a schema.
|
|
144
|
-
*
|
|
145
|
-
* @category Helpers
|
|
146
|
-
*/
|
|
147
58
|
export const getDefaultFromSchema = (schema: Schema.Schema.Any): unknown => {
|
|
148
59
|
const ast = schema.ast
|
|
149
60
|
switch (ast._tag) {
|
|
@@ -172,11 +83,6 @@ export const getDefaultFromSchema = (schema: Schema.Schema.Any): unknown => {
|
|
|
172
83
|
}
|
|
173
84
|
}
|
|
174
85
|
|
|
175
|
-
/**
|
|
176
|
-
* Gets default encoded values for a fields record.
|
|
177
|
-
*
|
|
178
|
-
* @category Helpers
|
|
179
|
-
*/
|
|
180
86
|
export const getDefaultEncodedValues = (fields: FieldsRecord): Record<string, unknown> => {
|
|
181
87
|
const result: Record<string, unknown> = {}
|
|
182
88
|
for (const [key, def] of Object.entries(fields)) {
|
|
@@ -189,11 +95,6 @@ export const getDefaultEncodedValues = (fields: FieldsRecord): Record<string, un
|
|
|
189
95
|
return result
|
|
190
96
|
}
|
|
191
97
|
|
|
192
|
-
/**
|
|
193
|
-
* Creates a touched record with all fields set to the given value.
|
|
194
|
-
*
|
|
195
|
-
* @category Helpers
|
|
196
|
-
*/
|
|
197
98
|
export const createTouchedRecord = (fields: FieldsRecord, value: boolean): Record<string, boolean> => {
|
|
198
99
|
const result: Record<string, boolean> = {}
|
|
199
100
|
for (const key of Object.keys(fields)) {
|