@lucas-barake/effect-form 0.23.0 → 0.25.0-beta.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/Field.d.ts +10 -10
- package/dist/Field.d.ts.map +1 -1
- package/dist/Field.js +15 -20
- package/dist/Field.js.map +1 -1
- package/dist/FieldState.d.ts +1 -1
- package/dist/FieldState.d.ts.map +1 -1
- package/dist/FormAtoms.d.ts +11 -10
- package/dist/FormAtoms.d.ts.map +1 -1
- package/dist/FormAtoms.js +26 -19
- package/dist/FormAtoms.js.map +1 -1
- package/dist/FormBuilder.d.ts +16 -12
- package/dist/FormBuilder.d.ts.map +1 -1
- package/dist/FormBuilder.js +6 -2
- package/dist/FormBuilder.js.map +1 -1
- package/dist/Mode.d.ts.map +1 -1
- package/dist/Mode.js +1 -1
- package/dist/Mode.js.map +1 -1
- package/dist/Validation.d.ts +4 -4
- package/dist/Validation.d.ts.map +1 -1
- package/dist/Validation.js +41 -58
- package/dist/Validation.js.map +1 -1
- package/dist/internal/dirty.d.ts.map +1 -1
- package/dist/internal/dirty.js +2 -5
- package/dist/internal/dirty.js.map +1 -1
- package/package.json +2 -3
- package/src/Field.ts +27 -35
- package/src/FieldState.ts +1 -1
- package/src/FormAtoms.ts +51 -39
- package/src/FormBuilder.ts +33 -22
- package/src/Mode.ts +3 -1
- package/src/Validation.ts +53 -68
- package/src/internal/dirty.ts +2 -5
package/dist/FormBuilder.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import type * as Registry from "@effect-atom/atom/Registry";
|
|
2
1
|
import type * as Effect from "effect/Effect";
|
|
3
2
|
import type * as Option from "effect/Option";
|
|
4
3
|
import * as Schema from "effect/Schema";
|
|
4
|
+
import type * as AtomRegistry from "effect/unstable/reactivity/AtomRegistry";
|
|
5
5
|
import type { ArrayFieldDef, DecodedFromFields, EncodedFromFields, FieldDef, FieldsRecord } from "./Field.ts";
|
|
6
|
+
type FilterResult = undefined | boolean | string | {
|
|
7
|
+
readonly path: ReadonlyArray<PropertyKey>;
|
|
8
|
+
readonly message: string;
|
|
9
|
+
};
|
|
6
10
|
export interface SubmittedValues<TFields extends FieldsRecord> {
|
|
7
11
|
readonly encoded: EncodedFromFields<TFields>;
|
|
8
12
|
readonly decoded: DecodedFromFields<TFields>;
|
|
@@ -30,11 +34,11 @@ export interface FormState<TFields extends FieldsRecord> {
|
|
|
30
34
|
}
|
|
31
35
|
interface SyncRefinement {
|
|
32
36
|
readonly _tag: "sync";
|
|
33
|
-
readonly fn: (values: unknown) =>
|
|
37
|
+
readonly fn: (values: unknown) => FilterResult;
|
|
34
38
|
}
|
|
35
39
|
interface AsyncRefinement {
|
|
36
40
|
readonly _tag: "async";
|
|
37
|
-
readonly fn: (values: unknown) => Effect.Effect<
|
|
41
|
+
readonly fn: (values: unknown) => Effect.Effect<FilterResult, never, unknown>;
|
|
38
42
|
}
|
|
39
43
|
type Refinement = SyncRefinement | AsyncRefinement;
|
|
40
44
|
export interface FormBuilder<TFields extends FieldsRecord, R> {
|
|
@@ -42,21 +46,21 @@ export interface FormBuilder<TFields extends FieldsRecord, R> {
|
|
|
42
46
|
readonly fields: TFields;
|
|
43
47
|
readonly refinements: ReadonlyArray<Refinement>;
|
|
44
48
|
readonly _R?: R;
|
|
45
|
-
addField<K extends string, S extends Schema.
|
|
49
|
+
addField<K extends string, S extends Schema.Top>(this: FormBuilder<TFields, R>, field: FieldDef<K, S>): FormBuilder<TFields & {
|
|
46
50
|
readonly [key in K]: FieldDef<K, S>;
|
|
47
|
-
}, R | Schema.
|
|
48
|
-
addField<K extends string, S extends Schema.
|
|
51
|
+
}, R | Schema.Codec.DecodingServices<S>>;
|
|
52
|
+
addField<K extends string, S extends Schema.Top>(this: FormBuilder<TFields, R>, field: ArrayFieldDef<K, S>): FormBuilder<TFields & {
|
|
49
53
|
readonly [key in K]: ArrayFieldDef<K, S>;
|
|
50
|
-
}, R | Schema.
|
|
51
|
-
addField<K extends string, S extends Schema.
|
|
54
|
+
}, R | Schema.Codec.DecodingServices<S>>;
|
|
55
|
+
addField<K extends string, S extends Schema.Top>(this: FormBuilder<TFields, R>, key: K, schema: S): FormBuilder<TFields & {
|
|
52
56
|
readonly [key in K]: FieldDef<K, S>;
|
|
53
|
-
}, R | Schema.
|
|
57
|
+
}, R | Schema.Codec.DecodingServices<S>>;
|
|
54
58
|
merge<TFields2 extends FieldsRecord, R2>(this: FormBuilder<TFields, R>, other: FormBuilder<TFields2, R2>): FormBuilder<TFields & TFields2, R | R2>;
|
|
55
|
-
refine(this: FormBuilder<TFields, R>, predicate: (values: DecodedFromFields<TFields>) =>
|
|
56
|
-
refineEffect<RD>(this: FormBuilder<TFields, R>, predicate: (values: DecodedFromFields<TFields>) => Effect.Effect<
|
|
59
|
+
refine(this: FormBuilder<TFields, R>, predicate: (values: DecodedFromFields<TFields>) => FilterResult): FormBuilder<TFields, R>;
|
|
60
|
+
refineEffect<RD>(this: FormBuilder<TFields, R>, predicate: (values: DecodedFromFields<TFields>) => Effect.Effect<FilterResult, never, RD>): FormBuilder<TFields, R | Exclude<RD, AtomRegistry.AtomRegistry>>;
|
|
57
61
|
}
|
|
58
62
|
export declare const isFormBuilder: (u: unknown) => u is FormBuilder<any, any>;
|
|
59
63
|
export declare const empty: FormBuilder<{}, never>;
|
|
60
|
-
export declare const buildSchema: <TFields extends FieldsRecord, R>(self: FormBuilder<TFields, R>) => Schema.
|
|
64
|
+
export declare const buildSchema: <TFields extends FieldsRecord, R>(self: FormBuilder<TFields, R>) => Schema.Codec<DecodedFromFields<TFields>, EncodedFromFields<TFields>, R>;
|
|
61
65
|
export {};
|
|
62
66
|
//# sourceMappingURL=FormBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormBuilder.d.ts","sourceRoot":"","sources":["../src/FormBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"FormBuilder.d.ts","sourceRoot":"","sources":["../src/FormBuilder.ts"],"names":[],"mappings":"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"}
|
package/dist/FormBuilder.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as Predicate from "effect/Predicate";
|
|
2
2
|
import * as Schema from "effect/Schema";
|
|
3
|
+
import * as SchemaGetter from "effect/SchemaGetter";
|
|
3
4
|
import { isArrayFieldDef, isFieldDef, makeField } from "./Field.js";
|
|
4
5
|
export const FieldTypeId = /*#__PURE__*/Symbol.for("@lucas-barake/effect-form/Field");
|
|
5
6
|
export const makeFieldRef = key => ({
|
|
@@ -68,9 +69,12 @@ export const buildSchema = self => {
|
|
|
68
69
|
let schema = Schema.Struct(schemaFields);
|
|
69
70
|
for (const refinement of self.refinements) {
|
|
70
71
|
if (refinement._tag === "sync") {
|
|
71
|
-
schema = schema.pipe(Schema.
|
|
72
|
+
schema = schema.pipe(Schema.check(Schema.makeFilter(input => refinement.fn(input))));
|
|
72
73
|
} else {
|
|
73
|
-
schema = schema.pipe(Schema.
|
|
74
|
+
schema = schema.pipe(Schema.decode({
|
|
75
|
+
decode: SchemaGetter.checkEffect(input => refinement.fn(input)),
|
|
76
|
+
encode: SchemaGetter.passthrough()
|
|
77
|
+
}));
|
|
74
78
|
}
|
|
75
79
|
}
|
|
76
80
|
return schema;
|
package/dist/FormBuilder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormBuilder.js","names":["Predicate","Schema","isArrayFieldDef","isFieldDef","makeField","FieldTypeId","Symbol","for","makeFieldRef","key","_S","undefined","TypeId","FormBuilderProto","addField","keyOrField","schema","field","newSelf","Object","create","fields","refinements","merge","other","refine","predicate","_tag","fn","values","refineEffect","isFormBuilder","u","hasProperty","empty","self","buildSchema","schemaFields","def","entries","Array","itemSchema","Struct","refinement","pipe","
|
|
1
|
+
{"version":3,"file":"FormBuilder.js","names":["Predicate","Schema","SchemaGetter","isArrayFieldDef","isFieldDef","makeField","FieldTypeId","Symbol","for","makeFieldRef","key","_S","undefined","TypeId","FormBuilderProto","addField","keyOrField","schema","field","newSelf","Object","create","fields","refinements","merge","other","refine","predicate","_tag","fn","values","refineEffect","isFormBuilder","u","hasProperty","empty","self","buildSchema","schemaFields","def","entries","Array","itemSchema","Struct","refinement","pipe","check","makeFilter","input","decode","checkEffect","encode","passthrough"],"sources":["../src/FormBuilder.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/Mode.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Mode.d.ts","sourceRoot":"","sources":["../src/Mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAC5F;IAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAC3F;IAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAElH,MAAM,MAAM,yBAAyB,GACjC;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAC5F;IAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GACzF;IAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAA;CAAE,CAAA;AAEhH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAA;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAC7B;AAED,eAAO,MAAM,KAAK,GAAI,OAAO,QAAQ,KAAG,
|
|
1
|
+
{"version":3,"file":"Mode.d.ts","sourceRoot":"","sources":["../src/Mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAC5F;IAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAC3F;IAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAElH,MAAM,MAAM,yBAAyB,GACjC;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAC5F;IAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GACzF;IAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAA;CAAE,CAAA;AAEhH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAA;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAC7B;AAED,eAAO,MAAM,KAAK,GAAI,OAAO,QAAQ,KAAG,UAgBvC,CAAA"}
|
package/dist/Mode.js
CHANGED
|
@@ -9,7 +9,7 @@ export const parse = mode => {
|
|
|
9
9
|
};
|
|
10
10
|
}
|
|
11
11
|
if (validation === "onChange") {
|
|
12
|
-
const debounceMs = mode?.debounce === undefined ? null : Duration.toMillis(mode.debounce);
|
|
12
|
+
const debounceMs = mode?.debounce === undefined ? null : Duration.toMillis(Duration.fromDurationInputUnsafe(mode.debounce));
|
|
13
13
|
const autoSubmit = mode?.autoSubmit === true;
|
|
14
14
|
return {
|
|
15
15
|
validation: "onChange",
|
package/dist/Mode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Mode.js","names":["Duration","parse","mode","validation","debounce","autoSubmit","debounceMs","undefined","toMillis"],"sources":["../src/Mode.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,QAAQ,MAAM,iBAAiB;AAkB3C,OAAO,MAAMC,KAAK,GAAIC,IAAe,IAAgB;EACnD,MAAMC,UAAU,GAAGD,IAAI,EAAEC,UAAU,IAAI,UAAU;EAEjD,IAAIA,UAAU,KAAK,QAAQ,EAAE;IAC3B,OAAO;MAAEA,UAAU,EAAE,QAAQ;MAAEC,QAAQ,EAAE,IAAI;MAAEC,UAAU,EAAEH,IAAI,EAAEG,UAAU,KAAK;IAAI,CAAE;EACxF;EAEA,IAAIF,UAAU,KAAK,UAAU,EAAE;IAC7B,MAAMG,UAAU,GAAGJ,IAAI,EAAEE,QAAQ,KAAKG,SAAS,
|
|
1
|
+
{"version":3,"file":"Mode.js","names":["Duration","parse","mode","validation","debounce","autoSubmit","debounceMs","undefined","toMillis","fromDurationInputUnsafe"],"sources":["../src/Mode.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,QAAQ,MAAM,iBAAiB;AAkB3C,OAAO,MAAMC,KAAK,GAAIC,IAAe,IAAgB;EACnD,MAAMC,UAAU,GAAGD,IAAI,EAAEC,UAAU,IAAI,UAAU;EAEjD,IAAIA,UAAU,KAAK,QAAQ,EAAE;IAC3B,OAAO;MAAEA,UAAU,EAAE,QAAQ;MAAEC,QAAQ,EAAE,IAAI;MAAEC,UAAU,EAAEH,IAAI,EAAEG,UAAU,KAAK;IAAI,CAAE;EACxF;EAEA,IAAIF,UAAU,KAAK,UAAU,EAAE;IAC7B,MAAMG,UAAU,GAAGJ,IAAI,EAAEE,QAAQ,KAAKG,SAAS,GAC3C,IAAI,GACJP,QAAQ,CAACQ,QAAQ,CAACR,QAAQ,CAACS,uBAAuB,CAACP,IAAI,CAACE,QAAQ,CAAC,CAAC;IACtE,MAAMC,UAAU,GAAGH,IAAI,EAAEG,UAAU,KAAK,IAAI;IAC5C,OAAO;MAAEF,UAAU,EAAE,UAAU;MAAEC,QAAQ,EAAEE,UAAU;MAAED;IAAU,CAAE;EACrE;EAEA,OAAO;IAAEF,UAAU,EAAE,UAAU;IAAEC,QAAQ,EAAE,IAAI;IAAEC,UAAU,EAAE;EAAK,CAAE;AACtE,CAAC","ignoreList":[]}
|
package/dist/Validation.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as Option from "effect/Option";
|
|
2
|
-
import * as
|
|
2
|
+
import type * as Schema from "effect/Schema";
|
|
3
3
|
export type ErrorSource = "field" | "refinement";
|
|
4
4
|
export interface ErrorEntry {
|
|
5
5
|
readonly message: string;
|
|
6
6
|
readonly source: ErrorSource;
|
|
7
7
|
}
|
|
8
|
-
export declare const extractFirstError: (error:
|
|
9
|
-
export declare const routeErrors: (error:
|
|
10
|
-
export declare const routeErrorsWithSource: (error:
|
|
8
|
+
export declare const extractFirstError: (error: Schema.SchemaError) => Option.Option<string>;
|
|
9
|
+
export declare const routeErrors: (error: Schema.SchemaError) => Map<string, string>;
|
|
10
|
+
export declare const routeErrorsWithSource: (error: Schema.SchemaError) => Map<string, ErrorEntry>;
|
|
11
11
|
//# sourceMappingURL=Validation.d.ts.map
|
package/dist/Validation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Validation.d.ts","sourceRoot":"","sources":["../src/Validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"Validation.d.ts","sourceRoot":"","sources":["../src/Validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAI5C,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,YAAY,CAAA;AAEhD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAC7B;AA8DD,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,CAAC,WAAW,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAMjF,CAAA;AAWD,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,CAAC,WAAW,KAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAYzE,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,CAAC,WAAW,KAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CA6CvF,CAAA"}
|
package/dist/Validation.js
CHANGED
|
@@ -1,92 +1,75 @@
|
|
|
1
1
|
import * as Option from "effect/Option";
|
|
2
|
-
import * as
|
|
2
|
+
import * as SchemaIssue from "effect/SchemaIssue";
|
|
3
3
|
import { schemaPathToFieldPath } from "./Path.js";
|
|
4
|
-
const
|
|
5
|
-
switch (ast._tag) {
|
|
6
|
-
case "Refinement":
|
|
7
|
-
case "Transformation":
|
|
8
|
-
return getBaseAST(ast.from);
|
|
9
|
-
default:
|
|
10
|
-
return ast;
|
|
11
|
-
}
|
|
12
|
-
};
|
|
13
|
-
const isCompositeType = ast => {
|
|
14
|
-
const base = getBaseAST(ast);
|
|
15
|
-
switch (base._tag) {
|
|
16
|
-
case "TypeLiteral": // Schema.Struct
|
|
17
|
-
case "TupleType": // Schema.Tuple
|
|
18
|
-
case "Declaration": // Schema.Class, Schema.TaggedClass
|
|
19
|
-
case "Union": // Schema.Union
|
|
20
|
-
case "Suspend":
|
|
21
|
-
// Recursive schemas
|
|
22
|
-
return true;
|
|
23
|
-
default:
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
};
|
|
4
|
+
const standardFormatter = /*#__PURE__*/SchemaIssue.makeFormatterStandardSchemaV1();
|
|
27
5
|
const collectIssueSources = error => {
|
|
28
6
|
const entries = [];
|
|
29
7
|
const walk = (issue, path, source) => {
|
|
30
8
|
switch (issue._tag) {
|
|
31
|
-
case "
|
|
32
|
-
if (
|
|
9
|
+
case "Filter":
|
|
10
|
+
if (path.length === 0) {
|
|
33
11
|
walk(issue.issue, path, "refinement");
|
|
34
12
|
} else {
|
|
35
13
|
walk(issue.issue, path, source);
|
|
36
14
|
}
|
|
37
15
|
break;
|
|
38
|
-
case "
|
|
39
|
-
{
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
16
|
+
case "Encoding":
|
|
17
|
+
if (path.length === 0) {
|
|
18
|
+
walk(issue.issue, path, "refinement");
|
|
19
|
+
} else {
|
|
20
|
+
walk(issue.issue, path, source);
|
|
43
21
|
}
|
|
22
|
+
break;
|
|
23
|
+
case "Pointer":
|
|
24
|
+
walk(issue.issue, [...path, ...issue.path], source);
|
|
25
|
+
break;
|
|
44
26
|
case "Composite":
|
|
45
|
-
{
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
27
|
+
for (const sub of issue.issues) {
|
|
28
|
+
walk(sub, path, source);
|
|
29
|
+
}
|
|
30
|
+
break;
|
|
31
|
+
case "AnyOf":
|
|
32
|
+
for (const sub of issue.issues) {
|
|
33
|
+
walk(sub, path, source);
|
|
51
34
|
}
|
|
52
|
-
|
|
53
|
-
case "
|
|
54
|
-
case "
|
|
35
|
+
break;
|
|
36
|
+
case "InvalidType":
|
|
37
|
+
case "InvalidValue":
|
|
38
|
+
case "MissingKey":
|
|
39
|
+
case "UnexpectedKey":
|
|
55
40
|
case "Forbidden":
|
|
41
|
+
case "OneOf":
|
|
56
42
|
entries.push({
|
|
57
43
|
path,
|
|
58
44
|
source,
|
|
59
45
|
issue
|
|
60
46
|
});
|
|
61
47
|
break;
|
|
62
|
-
case "Transformation":
|
|
63
|
-
if (issue.kind === "Transformation" && issue.ast.transformation._tag === "FinalTransformation" && isCompositeType(issue.ast.from) && path.length === 0) {
|
|
64
|
-
walk(issue.issue, path, "refinement");
|
|
65
|
-
} else {
|
|
66
|
-
walk(issue.issue, path, source);
|
|
67
|
-
}
|
|
68
|
-
break;
|
|
69
48
|
}
|
|
70
49
|
};
|
|
71
50
|
walk(error.issue, [], "field");
|
|
72
51
|
return entries;
|
|
73
52
|
};
|
|
74
53
|
const getIssueMessage = issue => {
|
|
75
|
-
const formatted =
|
|
76
|
-
return formatted[0]?.message;
|
|
54
|
+
const formatted = standardFormatter(issue);
|
|
55
|
+
return formatted.issues[0]?.message;
|
|
77
56
|
};
|
|
78
57
|
export const extractFirstError = error => {
|
|
79
|
-
const
|
|
80
|
-
if (issues.length === 0) {
|
|
58
|
+
const formatted = standardFormatter(error.issue);
|
|
59
|
+
if (formatted.issues.length === 0) {
|
|
81
60
|
return Option.none();
|
|
82
61
|
}
|
|
83
|
-
return Option.some(issues[0].message);
|
|
62
|
+
return Option.some(formatted.issues[0].message);
|
|
63
|
+
};
|
|
64
|
+
const normalizePath = path => {
|
|
65
|
+
if (!path) return [];
|
|
66
|
+
return path.map(segment => typeof segment === "object" && segment !== null && "key" in segment ? segment.key : segment);
|
|
84
67
|
};
|
|
85
68
|
export const routeErrors = error => {
|
|
86
69
|
const result = new Map();
|
|
87
|
-
const
|
|
88
|
-
for (const issue of issues) {
|
|
89
|
-
const fieldPath = schemaPathToFieldPath(issue.path);
|
|
70
|
+
const formatted = standardFormatter(error.issue);
|
|
71
|
+
for (const issue of formatted.issues) {
|
|
72
|
+
const fieldPath = schemaPathToFieldPath(normalizePath(issue.path));
|
|
90
73
|
if (fieldPath && !result.has(fieldPath)) {
|
|
91
74
|
result.set(fieldPath, issue.message);
|
|
92
75
|
}
|
|
@@ -95,7 +78,7 @@ export const routeErrors = error => {
|
|
|
95
78
|
};
|
|
96
79
|
export const routeErrorsWithSource = error => {
|
|
97
80
|
const result = new Map();
|
|
98
|
-
const formattedIssues =
|
|
81
|
+
const formattedIssues = standardFormatter(error.issue).issues;
|
|
99
82
|
const issueSources = collectIssueSources(error);
|
|
100
83
|
const messageSources = new Map();
|
|
101
84
|
const refinementPaths = new Set();
|
|
@@ -114,7 +97,7 @@ export const routeErrorsWithSource = error => {
|
|
|
114
97
|
}
|
|
115
98
|
}
|
|
116
99
|
for (const issue of formattedIssues) {
|
|
117
|
-
const fieldPath = schemaPathToFieldPath(issue.path) ?? "";
|
|
100
|
+
const fieldPath = schemaPathToFieldPath(normalizePath(issue.path)) ?? "";
|
|
118
101
|
if (result.has(fieldPath)) continue;
|
|
119
102
|
const preferredSource = refinementPaths.has(fieldPath) ? "refinement" : "field";
|
|
120
103
|
const messageKey = `${fieldPath}::${issue.message}`;
|
|
@@ -129,7 +112,7 @@ export const routeErrorsWithSource = error => {
|
|
|
129
112
|
}
|
|
130
113
|
if (result.size < formattedIssues.length) {
|
|
131
114
|
for (const issue of formattedIssues) {
|
|
132
|
-
const fieldPath = schemaPathToFieldPath(issue.path) ?? "";
|
|
115
|
+
const fieldPath = schemaPathToFieldPath(normalizePath(issue.path)) ?? "";
|
|
133
116
|
if (result.has(fieldPath)) continue;
|
|
134
117
|
const messageKey = `${fieldPath}::${issue.message}`;
|
|
135
118
|
const issueSource = messageSources.get(messageKey) ?? "field";
|
package/dist/Validation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Validation.js","names":["Option","
|
|
1
|
+
{"version":3,"file":"Validation.js","names":["Option","SchemaIssue","schemaPathToFieldPath","standardFormatter","makeFormatterStandardSchemaV1","collectIssueSources","error","entries","walk","issue","path","source","_tag","length","sub","issues","push","getIssueMessage","formatted","message","extractFirstError","none","some","normalizePath","map","segment","key","routeErrors","result","Map","fieldPath","has","set","routeErrorsWithSource","formattedIssues","issueSources","messageSources","refinementPaths","Set","entry","undefined","messageKey","existing","get","add","preferredSource","issueSource","size"],"sources":["../src/Validation.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dirty.d.ts","sourceRoot":"","sources":["../../src/internal/dirty.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dirty.d.ts","sourceRoot":"","sources":["../../src/internal/dirty.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,8BAA8B,GACzC,aAAa,WAAW,CAAC,MAAM,CAAC,EAChC,eAAe,OAAO,EACtB,WAAW,MAAM,EACjB,UAAU,aAAa,CAAC,OAAO,CAAC,KAC/B,WAAW,CAAC,MAAM,CA+BpB,CAAA;AAED,eAAO,MAAM,uBAAuB,GAClC,cAAc,WAAW,CAAC,MAAM,CAAC,EACjC,YAAY,OAAO,EACnB,WAAW,OAAO,EAClB,WAAU,MAAW,KACpB,WAAW,CAAC,MAAM,CAyDpB,CAAA"}
|
package/dist/internal/dirty.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as Equal from "effect/Equal";
|
|
2
|
-
import * as Utils from "effect/Utils";
|
|
3
2
|
import { getNestedValue, isPathUnderRoot } from "../Path.js";
|
|
4
3
|
export const recalculateDirtyFieldsForArray = (dirtyFields, initialValues, arrayPath, newItems) => {
|
|
5
4
|
const initialItems = getNestedValue(initialValues, arrayPath) ?? [];
|
|
@@ -13,8 +12,7 @@ export const recalculateDirtyFieldsForArray = (dirtyFields, initialValues, array
|
|
|
13
12
|
const newItem = newItems[i];
|
|
14
13
|
const initialItem = initialItems[i];
|
|
15
14
|
if (newItem === initialItem) continue;
|
|
16
|
-
|
|
17
|
-
if (!isEqual) {
|
|
15
|
+
if (!Equal.equals(newItem, initialItem)) {
|
|
18
16
|
nextDirty.add(itemPath);
|
|
19
17
|
}
|
|
20
18
|
}
|
|
@@ -70,8 +68,7 @@ export const recalculateDirtySubtree = (currentDirty, allInitial, allValues, roo
|
|
|
70
68
|
}
|
|
71
69
|
}
|
|
72
70
|
} else {
|
|
73
|
-
|
|
74
|
-
if (!isEqual && path) nextDirty.add(path);
|
|
71
|
+
if (!Equal.equals(current, initial) && path) nextDirty.add(path);
|
|
75
72
|
}
|
|
76
73
|
};
|
|
77
74
|
recurse(targetValue, targetInitial, rootPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dirty.js","names":["Equal","
|
|
1
|
+
{"version":3,"file":"dirty.js","names":["Equal","getNestedValue","isPathUnderRoot","recalculateDirtyFieldsForArray","dirtyFields","initialValues","arrayPath","newItems","initialItems","nextDirty","Set","Array","from","filter","path","loopLength","Math","max","length","i","itemPath","newItem","initialItem","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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lucas-barake/effect-form",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.0-beta.0",
|
|
4
4
|
"description": "Type-safe form builder powered by Effect Schema",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -36,8 +36,7 @@
|
|
|
36
36
|
"license": "MIT",
|
|
37
37
|
"sideEffects": [],
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"
|
|
40
|
-
"effect": "^3.19.15"
|
|
39
|
+
"effect": "^4.0.0-beta.0"
|
|
41
40
|
},
|
|
42
41
|
"scripts": {
|
|
43
42
|
"build": "tsc -b tsconfig.json && pnpm babel",
|
package/src/Field.ts
CHANGED
|
@@ -5,28 +5,27 @@ export const TypeId: unique symbol = Symbol.for("@lucas-barake/effect-form/Field
|
|
|
5
5
|
|
|
6
6
|
export type TypeId = typeof TypeId
|
|
7
7
|
|
|
8
|
-
export interface FieldDef<K extends string, S extends Schema.
|
|
8
|
+
export interface FieldDef<K extends string, S extends Schema.Top,> {
|
|
9
9
|
readonly _tag: "field"
|
|
10
10
|
readonly key: K
|
|
11
11
|
readonly schema: S
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
export interface ArrayFieldDef<K extends string, S extends Schema.
|
|
14
|
+
export interface ArrayFieldDef<K extends string, S extends Schema.Top,> {
|
|
15
15
|
readonly _tag: "array"
|
|
16
16
|
readonly key: K
|
|
17
17
|
readonly itemSchema: S
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
export type AnyFieldDef = FieldDef<string, Schema.
|
|
20
|
+
export type AnyFieldDef = FieldDef<string, Schema.Top> | ArrayFieldDef<string, Schema.Top>
|
|
21
21
|
|
|
22
22
|
export type FieldsRecord = Record<string, AnyFieldDef>
|
|
23
23
|
|
|
24
|
-
export const isArrayFieldDef = (def: AnyFieldDef): def is ArrayFieldDef<string, Schema.
|
|
25
|
-
def._tag === "array"
|
|
24
|
+
export const isArrayFieldDef = (def: AnyFieldDef): def is ArrayFieldDef<string, Schema.Top> => def._tag === "array"
|
|
26
25
|
|
|
27
|
-
export const isFieldDef = (def: AnyFieldDef): def is FieldDef<string, Schema.
|
|
26
|
+
export const isFieldDef = (def: AnyFieldDef): def is FieldDef<string, Schema.Top> => def._tag === "field"
|
|
28
27
|
|
|
29
|
-
export const makeField = <K extends string, S extends Schema.
|
|
28
|
+
export const makeField = <K extends string, S extends Schema.Top,>(
|
|
30
29
|
key: K,
|
|
31
30
|
schema: S
|
|
32
31
|
): FieldDef<K, S> => ({
|
|
@@ -35,7 +34,7 @@ export const makeField = <K extends string, S extends Schema.Schema.Any,>(
|
|
|
35
34
|
schema
|
|
36
35
|
})
|
|
37
36
|
|
|
38
|
-
export const makeArrayField = <K extends string, S extends Schema.
|
|
37
|
+
export const makeArrayField = <K extends string, S extends Schema.Top,>(
|
|
39
38
|
key: K,
|
|
40
39
|
itemSchema: S
|
|
41
40
|
): ArrayFieldDef<K, S> => ({
|
|
@@ -45,8 +44,8 @@ export const makeArrayField = <K extends string, S extends Schema.Schema.Any,>(
|
|
|
45
44
|
})
|
|
46
45
|
|
|
47
46
|
export type EncodedFromFields<T extends FieldsRecord,> = {
|
|
48
|
-
readonly [K in keyof T]: T[K] extends FieldDef<any, infer S> ? Schema.
|
|
49
|
-
: T[K] extends ArrayFieldDef<any, infer S> ? ReadonlyArray<Schema.
|
|
47
|
+
readonly [K in keyof T]: T[K] extends FieldDef<any, infer S> ? Schema.Codec.Encoded<S>
|
|
48
|
+
: T[K] extends ArrayFieldDef<any, infer S> ? ReadonlyArray<Schema.Codec.Encoded<S>>
|
|
50
49
|
: never
|
|
51
50
|
}
|
|
52
51
|
|
|
@@ -56,23 +55,23 @@ export type DecodedFromFields<T extends FieldsRecord,> = {
|
|
|
56
55
|
: never
|
|
57
56
|
}
|
|
58
57
|
|
|
59
|
-
export const getDefaultFromSchema = (schema: Schema.
|
|
60
|
-
const ast = schema.ast
|
|
58
|
+
export const getDefaultFromSchema = (schema: Schema.Top): unknown => {
|
|
59
|
+
const ast = AST.toEncoded(schema.ast)
|
|
61
60
|
switch (ast._tag) {
|
|
62
|
-
case "
|
|
61
|
+
case "String":
|
|
63
62
|
case "TemplateLiteral":
|
|
64
63
|
return ""
|
|
65
|
-
case "
|
|
64
|
+
case "Number":
|
|
66
65
|
return 0
|
|
67
|
-
case "
|
|
66
|
+
case "Boolean":
|
|
68
67
|
return false
|
|
69
68
|
case "Literal":
|
|
70
69
|
return ast.literal
|
|
71
|
-
case "
|
|
70
|
+
case "Enum": {
|
|
72
71
|
const first = ast.enums[0]
|
|
73
72
|
return first ? first[1] : undefined
|
|
74
73
|
}
|
|
75
|
-
case "
|
|
74
|
+
case "Objects": {
|
|
76
75
|
const result: Record<string, unknown> = {}
|
|
77
76
|
for (const prop of ast.propertySignatures) {
|
|
78
77
|
result[prop.name as string] = getDefaultFromSchema(Schema.make(prop.type))
|
|
@@ -83,14 +82,10 @@ export const getDefaultFromSchema = (schema: Schema.Schema.Any): unknown => {
|
|
|
83
82
|
const first = ast.types[0]
|
|
84
83
|
return first ? getDefaultFromSchema(Schema.make(first)) : undefined
|
|
85
84
|
}
|
|
86
|
-
case "
|
|
85
|
+
case "Never":
|
|
87
86
|
return undefined
|
|
88
|
-
case "Transformation":
|
|
89
|
-
return getDefaultFromSchema(Schema.make(ast.from))
|
|
90
|
-
case "Refinement":
|
|
91
|
-
return getDefaultFromSchema(Schema.make(ast.from))
|
|
92
87
|
case "Suspend":
|
|
93
|
-
return getDefaultFromSchema(Schema.make(ast.
|
|
88
|
+
return getDefaultFromSchema(Schema.make(ast.thunk()))
|
|
94
89
|
default:
|
|
95
90
|
return ""
|
|
96
91
|
}
|
|
@@ -117,20 +112,17 @@ export const createTouchedRecord = (fields: FieldsRecord, value: boolean): Recor
|
|
|
117
112
|
}
|
|
118
113
|
|
|
119
114
|
export const extractStructFieldDefs = (
|
|
120
|
-
schema: Schema.
|
|
121
|
-
): ReadonlyArray<FieldDef<string, Schema.
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
if (AST.
|
|
125
|
-
if (AST.
|
|
126
|
-
if (AST.isSuspend(ast)) return unwrapTypeLiteral(ast.f())
|
|
115
|
+
schema: Schema.Top
|
|
116
|
+
): ReadonlyArray<FieldDef<string, Schema.Top>> | undefined => {
|
|
117
|
+
const unwrapObjects = (ast: AST.AST): AST.Objects | undefined => {
|
|
118
|
+
const base = AST.toType(ast)
|
|
119
|
+
if (AST.isObjects(base)) return base
|
|
120
|
+
if (AST.isSuspend(base)) return unwrapObjects(base.thunk())
|
|
127
121
|
return undefined
|
|
128
122
|
}
|
|
129
123
|
|
|
130
|
-
const
|
|
131
|
-
if (!
|
|
124
|
+
const objects = unwrapObjects(schema.ast)
|
|
125
|
+
if (!objects) return undefined
|
|
132
126
|
|
|
133
|
-
return
|
|
134
|
-
makeField(prop.name as string, { ast: prop.type } as Schema.Schema.Any)
|
|
135
|
-
)
|
|
127
|
+
return objects.propertySignatures.map((prop) => makeField(prop.name as string, { ast: prop.type } as Schema.Top))
|
|
136
128
|
}
|
package/src/FieldState.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type * as Option from "effect/Option"
|
|
2
2
|
import type * as Schema from "effect/Schema"
|
|
3
3
|
|
|
4
|
-
export type FieldValue<T,> = T extends Schema.
|
|
4
|
+
export type FieldValue<T,> = T extends Schema.Top ? Schema.Codec.Encoded<T> : T
|
|
5
5
|
|
|
6
6
|
export interface FieldState<E,> {
|
|
7
7
|
readonly value: E
|