effect-app 4.0.0-beta.16 → 4.0.0-beta.17
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/CHANGELOG.md +6 -0
- package/dist/Operations.d.ts +25 -29
- package/dist/Operations.d.ts.map +1 -1
- package/dist/Schema.d.ts +23 -24
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +18 -18
- package/package.json +1 -1
- package/src/Schema.ts +44 -31
- package/test/schema.test.ts +32 -1
package/CHANGELOG.md
CHANGED
package/dist/Operations.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as S from "./Schema.js";
|
|
2
2
|
export type OperationId = S.StringId;
|
|
3
|
-
export declare const OperationId: S.WithDefaults<S.brand<S.String, "NonEmptyString" | "
|
|
3
|
+
export declare const OperationId: S.WithDefaults<S.brand<S.String, "NonEmptyString" | "StringId" | "NonEmptyString50" | "NonEmptyString64" | "NonEmptyString80" | "NonEmptyString100" | "NonEmptyString255" | "NonEmptyString2k" | "NonEmptyString64k"> & {
|
|
4
4
|
make: () => S.StringId;
|
|
5
|
-
withDefault: S.withConstructorDefault<S.brand<S.String, "NonEmptyString" | "
|
|
6
|
-
}> & S.brand<S.String, "NonEmptyString" | "
|
|
5
|
+
withDefault: S.withConstructorDefault<S.brand<S.String, "NonEmptyString" | "StringId" | "NonEmptyString50" | "NonEmptyString64" | "NonEmptyString80" | "NonEmptyString100" | "NonEmptyString255" | "NonEmptyString2k" | "NonEmptyString64k"> & S.WithoutConstructorDefault>;
|
|
6
|
+
}> & S.brand<S.String, "NonEmptyString" | "StringId" | "NonEmptyString50" | "NonEmptyString64" | "NonEmptyString80" | "NonEmptyString100" | "NonEmptyString255" | "NonEmptyString2k" | "NonEmptyString64k"> & {
|
|
7
7
|
make: () => S.StringId;
|
|
8
|
-
withDefault: S.withConstructorDefault<S.brand<S.String, "NonEmptyString" | "
|
|
8
|
+
withDefault: S.withConstructorDefault<S.brand<S.String, "NonEmptyString" | "StringId" | "NonEmptyString50" | "NonEmptyString64" | "NonEmptyString80" | "NonEmptyString100" | "NonEmptyString255" | "NonEmptyString2k" | "NonEmptyString64k"> & S.WithoutConstructorDefault>;
|
|
9
9
|
};
|
|
10
10
|
declare const OperationProgress_base: S.EnhancedClass<OperationProgress, S.Struct<{
|
|
11
11
|
completed: S.WithDefaults<S.brand<import("effect/Schema").Int, "NonNegativeInt" | "Int" | "NonNegativeNumber">> & S.brand<import("effect/Schema").Int, "NonNegativeInt" | "Int" | "NonNegativeNumber"> & {
|
|
@@ -20,49 +20,45 @@ export declare class OperationProgress extends OperationProgress_base {
|
|
|
20
20
|
declare const OperationSuccess_base: S.EnhancedTaggedClass<OperationSuccess, "OperationSuccess", {
|
|
21
21
|
readonly _tag: S.tag<"OperationSuccess">;
|
|
22
22
|
} & {
|
|
23
|
-
message: S.withConstructorDefault<import("effect/Schema").NullOr<S.WithDefaults<S.brand<S.String, "NonEmptyString" | "
|
|
23
|
+
message: S.withConstructorDefault<import("effect/Schema").NullOr<S.WithDefaults<S.brand<S.String, "NonEmptyString" | "NonEmptyString2k" | "NonEmptyString64k">> & S.brand<S.String, "NonEmptyString" | "NonEmptyString2k" | "NonEmptyString64k">> & S.WithoutConstructorDefault>;
|
|
24
24
|
}, OperationSuccess.Encoded>;
|
|
25
25
|
export declare class OperationSuccess extends OperationSuccess_base {
|
|
26
26
|
}
|
|
27
27
|
declare const OperationFailure_base: S.EnhancedTaggedClass<OperationFailure, "OperationFailure", {
|
|
28
28
|
readonly _tag: S.tag<"OperationFailure">;
|
|
29
29
|
} & {
|
|
30
|
-
message: S.withConstructorDefault<import("effect/Schema").NullOr<S.WithDefaults<S.brand<S.String, "NonEmptyString" | "
|
|
30
|
+
message: S.withConstructorDefault<import("effect/Schema").NullOr<S.WithDefaults<S.brand<S.String, "NonEmptyString" | "NonEmptyString2k" | "NonEmptyString64k">> & S.brand<S.String, "NonEmptyString" | "NonEmptyString2k" | "NonEmptyString64k">> & S.WithoutConstructorDefault>;
|
|
31
31
|
}, OperationFailure.Encoded>;
|
|
32
32
|
export declare class OperationFailure extends OperationFailure_base {
|
|
33
33
|
}
|
|
34
34
|
export declare const OperationResult: S.Union<[typeof OperationSuccess, typeof OperationFailure]> & {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
tagMap: any;
|
|
43
|
-
tags: any;
|
|
35
|
+
isA: S.Is<OperationSuccess | OperationFailure>;
|
|
36
|
+
isAnyOf: S.IsAny<OperationSuccess | OperationFailure>;
|
|
37
|
+
tagMap: {
|
|
38
|
+
OperationSuccess: typeof OperationSuccess;
|
|
39
|
+
OperationFailure: typeof OperationFailure;
|
|
40
|
+
};
|
|
41
|
+
tags: S.Literals<["OperationSuccess", "OperationFailure"]>;
|
|
44
42
|
};
|
|
45
43
|
export type OperationResult = S.Schema.Type<typeof OperationResult>;
|
|
46
44
|
declare const Operation_base: S.EnhancedClass<Operation, S.Struct<{
|
|
47
|
-
id: S.WithDefaults<S.brand<S.String, "NonEmptyString" | "
|
|
45
|
+
id: S.WithDefaults<S.brand<S.String, "NonEmptyString" | "StringId" | "NonEmptyString50" | "NonEmptyString64" | "NonEmptyString80" | "NonEmptyString100" | "NonEmptyString255" | "NonEmptyString2k" | "NonEmptyString64k"> & {
|
|
48
46
|
make: () => S.StringId;
|
|
49
|
-
withDefault: S.withConstructorDefault<S.brand<S.String, "NonEmptyString" | "
|
|
50
|
-
}> & S.brand<S.String, "NonEmptyString" | "
|
|
47
|
+
withDefault: S.withConstructorDefault<S.brand<S.String, "NonEmptyString" | "StringId" | "NonEmptyString50" | "NonEmptyString64" | "NonEmptyString80" | "NonEmptyString100" | "NonEmptyString255" | "NonEmptyString2k" | "NonEmptyString64k"> & S.WithoutConstructorDefault>;
|
|
48
|
+
}> & S.brand<S.String, "NonEmptyString" | "StringId" | "NonEmptyString50" | "NonEmptyString64" | "NonEmptyString80" | "NonEmptyString100" | "NonEmptyString255" | "NonEmptyString2k" | "NonEmptyString64k"> & {
|
|
51
49
|
make: () => S.StringId;
|
|
52
|
-
withDefault: S.withConstructorDefault<S.brand<S.String, "NonEmptyString" | "
|
|
50
|
+
withDefault: S.withConstructorDefault<S.brand<S.String, "NonEmptyString" | "StringId" | "NonEmptyString50" | "NonEmptyString64" | "NonEmptyString80" | "NonEmptyString100" | "NonEmptyString255" | "NonEmptyString2k" | "NonEmptyString64k"> & S.WithoutConstructorDefault>;
|
|
53
51
|
};
|
|
54
|
-
title: S.WithDefaults<S.brand<S.String, "NonEmptyString" | "
|
|
52
|
+
title: S.WithDefaults<S.brand<S.String, "NonEmptyString" | "NonEmptyString2k" | "NonEmptyString64k">> & S.brand<S.String, "NonEmptyString" | "NonEmptyString2k" | "NonEmptyString64k">;
|
|
55
53
|
progress: S.optional<typeof OperationProgress>;
|
|
56
54
|
result: S.optional<S.Union<[typeof OperationSuccess, typeof OperationFailure]> & {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
tagMap: any;
|
|
65
|
-
tags: any;
|
|
55
|
+
isA: S.Is<OperationSuccess | OperationFailure>;
|
|
56
|
+
isAnyOf: S.IsAny<OperationSuccess | OperationFailure>;
|
|
57
|
+
tagMap: {
|
|
58
|
+
OperationSuccess: typeof OperationSuccess;
|
|
59
|
+
OperationFailure: typeof OperationFailure;
|
|
60
|
+
};
|
|
61
|
+
tags: S.Literals<["OperationSuccess", "OperationFailure"]>;
|
|
66
62
|
}>;
|
|
67
63
|
createdAt: S.withConstructorDefault<S.decodeTo<import("effect/Schema").Date, S.String, never, never> & S.WithoutConstructorDefault>;
|
|
68
64
|
updatedAt: S.withConstructorDefault<import("effect/Schema").NullOr<S.decodeTo<import("effect/Schema").Date, S.String, never, never> & {
|
package/dist/Operations.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Operations.d.ts","sourceRoot":"","sources":["../src/Operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,aAAa,CAAA;AAEhC,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAA;AACpC,eAAO,MAAM,WAAW;;;;;;CAAa,CAAA;;;;;;;;;AAErC,qBAAa,iBAAkB,SAAQ,sBAMrC;CAAG;;;;;;AAEL,qBAAa,gBACX,SAAQ,qBAEN;CACF;;;;;;AAEF,qBAAa,gBACX,SAAQ,qBAEN;CACF;AAEF,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"Operations.d.ts","sourceRoot":"","sources":["../src/Operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,aAAa,CAAA;AAEhC,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAA;AACpC,eAAO,MAAM,WAAW;;;;;;CAAa,CAAA;;;;;;;;;AAErC,qBAAa,iBAAkB,SAAQ,sBAMrC;CAAG;;;;;;AAEL,qBAAa,gBACX,SAAQ,qBAEN;CACF;;;;;;AAEF,qBAAa,gBACX,SAAQ,qBAEN;CACF;AAEF,eAAO,MAAM,eAAe;;;;;;;;CAAoD,CAAA;AAChF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,eAAe,CAAC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;AAEnE,qBAAa,SAAU,SAAQ,cAO7B;CAAG;AAKL,yBAAiB,iBAAiB,CAAC;IACjC,UAAiB,OAAQ,SAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;KAAG;CACzF;AACD,yBAAiB,gBAAgB,CAAC;IAChC,UAAiB,OAAQ,SAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC;KAAG;CACxF;AACD,yBAAiB,gBAAgB,CAAC;IAChC,UAAiB,OAAQ,SAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC;KAAG;CACxF;AACD,yBAAiB,SAAS,CAAC;IACzB,UAAiB,OAAQ,SAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;KAAG;CACjF"}
|
package/dist/Schema.d.ts
CHANGED
|
@@ -32,10 +32,10 @@ export declare const PhoneNumber: import("./Schema/ext.js").WithDefaults<import(
|
|
|
32
32
|
export type PhoneNumber = PhoneNumberType;
|
|
33
33
|
export declare const makeIs: <A extends {
|
|
34
34
|
_tag: string;
|
|
35
|
-
}, I,
|
|
35
|
+
}, I, RD, RE>(schema: S.Codec<A, I, RD, RE>) => Is<A>;
|
|
36
36
|
export declare const makeIsAnyOf: <A extends {
|
|
37
37
|
_tag: string;
|
|
38
|
-
}, I,
|
|
38
|
+
}, I, RD, RE>(schema: S.Codec<A, I, RD, RE>) => IsAny<A>;
|
|
39
39
|
export type ExtractUnion<A extends {
|
|
40
40
|
_tag: string;
|
|
41
41
|
}, Tags extends A["_tag"]> = Extract<A, Record<"_tag", Tags>>;
|
|
@@ -50,40 +50,39 @@ export interface IsAny<A extends {
|
|
|
50
50
|
}> {
|
|
51
51
|
<Keys extends A["_tag"][]>(...keys: Keys): (a: A) => a is ExtractUnion<A, ElemType<Keys>>;
|
|
52
52
|
}
|
|
53
|
+
type TaggedUnionMap<Members extends readonly (S.Top & {
|
|
54
|
+
fields: {
|
|
55
|
+
_tag: S.tag<string>;
|
|
56
|
+
};
|
|
57
|
+
})[]> = {
|
|
58
|
+
[Key in Members[number] as Key["fields"]["_tag"]["Type"]]: Key;
|
|
59
|
+
};
|
|
53
60
|
export declare const taggedUnionMap: <Members extends readonly (S.Top & {
|
|
54
61
|
fields: {
|
|
55
62
|
_tag: S.tag<string>;
|
|
56
63
|
};
|
|
57
|
-
})[]>(self: Members) =>
|
|
64
|
+
})[]>(self: Members) => TaggedUnionMap<Members>;
|
|
58
65
|
export declare const tags: <Members extends NonEmptyReadonlyArray<(S.Top & {
|
|
59
66
|
fields: {
|
|
60
67
|
_tag: S.tag<string>;
|
|
61
68
|
};
|
|
62
|
-
})>>(self: Members) =>
|
|
69
|
+
})>>(self: Members) => S.Literals<{ [Index in keyof Members]: S.Schema.Type<Members[Index]["fields"]["_tag"]>; }>;
|
|
63
70
|
export declare const ExtendTaggedUnion: <A extends {
|
|
64
|
-
_tag: string;
|
|
71
|
+
readonly _tag: string;
|
|
65
72
|
}, I, R>(schema: S.Codec<A, I, R>) => S.Codec<A, I, R, never> & {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
_tag: string;
|
|
69
|
-
}>;
|
|
70
|
-
isAnyOf: IsAny<{
|
|
71
|
-
_tag: string;
|
|
72
|
-
}>;
|
|
73
|
+
isA: Is<A>;
|
|
74
|
+
isAnyOf: IsAny<A>;
|
|
73
75
|
};
|
|
74
|
-
export declare const TaggedUnion: <Members extends
|
|
76
|
+
export declare const TaggedUnion: <Members extends NonEmptyReadonlyArray<S.Codec<{
|
|
77
|
+
readonly _tag: string;
|
|
78
|
+
}, any, any, any> & {
|
|
75
79
|
fields: {
|
|
76
|
-
_tag: S.tag<
|
|
80
|
+
_tag: S.tag<string>;
|
|
77
81
|
};
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}>;
|
|
83
|
-
isAnyOf: IsAny<{
|
|
84
|
-
_tag: string;
|
|
85
|
-
}>;
|
|
86
|
-
tagMap: any;
|
|
87
|
-
tags: any;
|
|
82
|
+
}>>(...a: Members) => S.Union<Members> & {
|
|
83
|
+
isA: Is<{ [K in keyof Members]: Members[K]["Type"]; }[number]>;
|
|
84
|
+
isAnyOf: IsAny<{ [K in keyof Members]: Members[K]["Type"]; }[number]>;
|
|
85
|
+
tagMap: TaggedUnionMap<Members>;
|
|
86
|
+
tags: S.Literals<{ [Index in keyof Members]: S.Schema.Type<Members[Index]["fields"]["_tag"]>; }>;
|
|
88
87
|
};
|
|
89
88
|
//# sourceMappingURL=Schema.d.ts.map
|
package/dist/Schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,KAAK,CAAC,MAAM,eAAe,CAAA;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEvD,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,KAAK,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE5E,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,KAAK,WAAW,IAAI,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAI1G,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,gBAAgB,IAAI,WAAW,EAAE,MAAM,eAAe,CAAA;AAE/D,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC9G,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,KAAK,WAAW,MAAM,oBAAoB,CAAA;AACjD,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAA;AAEnD,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAE7C,eAAO,MAAM,MAAM,eAAW,CAAA;AAC9B,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAA;AAElC,MAAM,WAAW,gBAAgB;IAC/B,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAA;CACvB;AAKD,eAAO,MAAM,KAAK,iGAOf,CAAA;AAEH,MAAM,MAAM,KAAK,GAAG,SAAS,CAAA;AAE7B,eAAO,MAAM,WAAW,mQAQrB,CAAA;AAEH,MAAM,MAAM,WAAW,GAAG,eAAe,CAAA;AAEzC,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"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"}
|
package/dist/Schema.js
CHANGED
|
@@ -69,31 +69,31 @@ export const makeIsAnyOf = (schema) => {
|
|
|
69
69
|
}
|
|
70
70
|
throw new Error("Unsupported");
|
|
71
71
|
};
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return
|
|
85
|
-
|
|
86
|
-
|
|
72
|
+
const getTagLiteral = (schema) => {
|
|
73
|
+
if (!SchemaAST.isLiteral(schema.ast)) {
|
|
74
|
+
throw new Error("Unsupported _tag schema: expected a literal AST");
|
|
75
|
+
}
|
|
76
|
+
return schema.ast.literal;
|
|
77
|
+
};
|
|
78
|
+
export const taggedUnionMap = (self) => {
|
|
79
|
+
const out = {};
|
|
80
|
+
for (const key of self) {
|
|
81
|
+
const tag = getTagLiteral(key.fields._tag);
|
|
82
|
+
out[tag] = key;
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
};
|
|
86
|
+
export const tags = (self) => S.Literals(self.map((key) => getTagLiteral(key.fields._tag)));
|
|
87
87
|
export const ExtendTaggedUnion = (schema) => extendM(schema, (_) => ({
|
|
88
|
-
is: S.is(schema),
|
|
88
|
+
// is: S.is(schema), // only works with never DecodingServices
|
|
89
89
|
isA: makeIs(_),
|
|
90
90
|
isAnyOf: makeIsAnyOf(_) /*, map: taggedUnionMap(a) */
|
|
91
91
|
}));
|
|
92
92
|
export const TaggedUnion = (...a) => pipe(S.Union(a), (_) => extendM(_, (_) => ({
|
|
93
|
-
is: S.is(_),
|
|
93
|
+
// is: S.is(_), // only works with never DecodingServices
|
|
94
94
|
isA: makeIs(_),
|
|
95
95
|
isAnyOf: makeIsAnyOf(_),
|
|
96
96
|
tagMap: taggedUnionMap(a),
|
|
97
97
|
tags: tags(a)
|
|
98
98
|
})));
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFlLE1BQU0sUUFBUSxDQUFBO0FBQ3BFLE9BQU8sS0FBSyxDQUFDLE1BQU0sZUFBZSxDQUFBO0FBRWxDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDckMsT0FBTyxFQUFFLEtBQUssSUFBSSxNQUFNLEVBQTJCLE1BQU0sbUJBQW1CLENBQUE7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ2pELE9BQU8sRUFBRSxXQUFXLElBQUksWUFBWSxFQUF1QyxNQUFNLHlCQUF5QixDQUFBO0FBRTFHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFcEMsY0FBYyxlQUFlLENBQUE7QUFDN0IsOENBQThDO0FBQzlDLE9BQU8sRUFBRSxnQkFBZ0IsSUFBSSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFL0QsY0FBYyxtQkFBbUIsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRXRELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDdEQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDOUcsT0FBTyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUV6RCxjQUFjLG1CQUFtQixDQUFBO0FBQ2pDLGNBQWMsaUJBQWlCLENBQUE7QUFDL0IsY0FBYyx5QkFBeUIsQ0FB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
|
package/package.json
CHANGED
package/src/Schema.ts
CHANGED
|
@@ -66,8 +66,8 @@ export const PhoneNumber = PhoneNumberT
|
|
|
66
66
|
|
|
67
67
|
export type PhoneNumber = PhoneNumberType
|
|
68
68
|
|
|
69
|
-
export const makeIs = <A extends { _tag: string }, I,
|
|
70
|
-
schema: S.Codec<A, I,
|
|
69
|
+
export const makeIs = <A extends { _tag: string }, I, RD, RE>(
|
|
70
|
+
schema: S.Codec<A, I, RD, RE>
|
|
71
71
|
) => {
|
|
72
72
|
// In v4, transformations are stored as encoding on nodes, not as wrapper nodes.
|
|
73
73
|
// Union member ASTs are directly Objects (TypeLiteral equivalent).
|
|
@@ -94,8 +94,8 @@ export const makeIs = <A extends { _tag: string }, I, R>(
|
|
|
94
94
|
throw new Error("Unsupported")
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
export const makeIsAnyOf = <A extends { _tag: string }, I,
|
|
98
|
-
schema: S.Codec<A, I,
|
|
97
|
+
export const makeIsAnyOf = <A extends { _tag: string }, I, RD, RE>(
|
|
98
|
+
schema: S.Codec<A, I, RD, RE>
|
|
99
99
|
): IsAny<A> => {
|
|
100
100
|
if (SchemaAST.isUnion(schema.ast)) {
|
|
101
101
|
return <Keys extends A["_tag"][]>(...keys: Keys) => (a: A): a is ExtractUnion<A, ElemType<Keys>> =>
|
|
@@ -111,20 +111,30 @@ export interface IsAny<A extends { _tag: string }> {
|
|
|
111
111
|
<Keys extends A["_tag"][]>(...keys: Keys): (a: A) => a is ExtractUnion<A, ElemType<Keys>>
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
+
const getTagLiteral = <Tag extends string>(schema: S.tag<Tag>): Tag => {
|
|
115
|
+
if (!SchemaAST.isLiteral(schema.ast)) {
|
|
116
|
+
throw new Error("Unsupported _tag schema: expected a literal AST")
|
|
117
|
+
}
|
|
118
|
+
return schema.ast.literal as Tag
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
type TaggedUnionMap<Members extends readonly (S.Top & { fields: { _tag: S.tag<string> } })[]> = {
|
|
122
|
+
[Key in Members[number] as Key["fields"]["_tag"]["Type"]]: Key
|
|
123
|
+
}
|
|
124
|
+
|
|
114
125
|
export const taggedUnionMap = <
|
|
115
126
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
116
127
|
Members extends readonly (S.Top & { fields: { _tag: S.tag<string> } })[]
|
|
117
128
|
>(
|
|
118
129
|
self: Members
|
|
119
|
-
) =>
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}, {} as any)
|
|
130
|
+
) => {
|
|
131
|
+
const out = {} as TaggedUnionMap<Members>
|
|
132
|
+
for (const key of self) {
|
|
133
|
+
const tag = getTagLiteral(key.fields._tag) as keyof TaggedUnionMap<Members>
|
|
134
|
+
out[tag] = key as TaggedUnionMap<Members>[typeof tag]
|
|
135
|
+
}
|
|
136
|
+
return out
|
|
137
|
+
}
|
|
128
138
|
|
|
129
139
|
export const tags = <
|
|
130
140
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -132,38 +142,41 @@ export const tags = <
|
|
|
132
142
|
>(
|
|
133
143
|
self: Members
|
|
134
144
|
) =>
|
|
135
|
-
S.Literals(
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
145
|
+
S.Literals(
|
|
146
|
+
self.map((key) => getTagLiteral(key.fields._tag)) as {
|
|
147
|
+
[Index in keyof Members]: S.Schema.Type<Members[Index]["fields"]["_tag"]>
|
|
148
|
+
}
|
|
149
|
+
) as S.Literals<
|
|
150
|
+
{
|
|
151
|
+
[Index in keyof Members]: S.Schema.Type<Members[Index]["fields"]["_tag"]>
|
|
152
|
+
}
|
|
153
|
+
>
|
|
154
|
+
|
|
155
|
+
export const ExtendTaggedUnion = <A extends { readonly _tag: string }, I, R>(
|
|
144
156
|
schema: S.Codec<A, I, R>
|
|
145
157
|
) =>
|
|
146
158
|
extendM(
|
|
147
159
|
schema,
|
|
148
160
|
(_) => ({
|
|
149
|
-
is: S.is(schema
|
|
150
|
-
isA: makeIs(_
|
|
151
|
-
isAnyOf: makeIsAnyOf(_
|
|
161
|
+
// is: S.is(schema), // only works with never DecodingServices
|
|
162
|
+
isA: makeIs(_),
|
|
163
|
+
isAnyOf: makeIsAnyOf(_) /*, map: taggedUnionMap(a) */
|
|
152
164
|
})
|
|
153
165
|
)
|
|
154
166
|
|
|
155
167
|
export const TaggedUnion = <
|
|
156
|
-
|
|
157
|
-
|
|
168
|
+
Members extends NonEmptyReadonlyArray<
|
|
169
|
+
S.Codec<{ readonly _tag: string }, any, any, any> & { fields: { _tag: S.tag<string> } }
|
|
170
|
+
>
|
|
158
171
|
>(...a: Members) =>
|
|
159
172
|
pipe(
|
|
160
173
|
S.Union(a),
|
|
161
174
|
(_) =>
|
|
162
175
|
extendM(_, (_) => ({
|
|
163
|
-
is: S.is(_
|
|
164
|
-
isA: makeIs(_
|
|
165
|
-
isAnyOf: makeIsAnyOf(_
|
|
176
|
+
// is: S.is(_), // only works with never DecodingServices
|
|
177
|
+
isA: makeIs(_),
|
|
178
|
+
isAnyOf: makeIsAnyOf(_),
|
|
166
179
|
tagMap: taggedUnionMap(a),
|
|
167
|
-
tags: tags(a
|
|
180
|
+
tags: tags(a)
|
|
168
181
|
}))
|
|
169
182
|
)
|
package/test/schema.test.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// import { generateFromArbitrary } from "@effect-app/infra/test"
|
|
2
2
|
import { Array, S } from "effect-app"
|
|
3
|
-
import { test } from "vitest"
|
|
3
|
+
import { expect, test } from "vitest"
|
|
4
4
|
|
|
5
5
|
const A = S.Struct({ a: S.NonEmptyString255, email: S.NullOr(S.Email) })
|
|
6
6
|
test("works", () => {
|
|
@@ -23,3 +23,34 @@ test("literal default works", () => {
|
|
|
23
23
|
const s2 = S.Struct({ l: l2.withDefault })
|
|
24
24
|
expect(s2.makeUnsafe({}).l).toBe("b")
|
|
25
25
|
})
|
|
26
|
+
|
|
27
|
+
test("tagged union derives tag map and tags from v4 literal ast", () => {
|
|
28
|
+
const schema = S.TaggedUnion(
|
|
29
|
+
S.TaggedStruct("A", { a: S.String }),
|
|
30
|
+
S.TaggedStruct("B", { b: S.Number }),
|
|
31
|
+
S.TaggedStruct("C", { c: S.Boolean })
|
|
32
|
+
)
|
|
33
|
+
const caseA = schema.tagMap["A"]
|
|
34
|
+
const caseB = schema.tagMap["B"]
|
|
35
|
+
const caseC = schema.tagMap["C"]
|
|
36
|
+
const isAOrB = schema.isAnyOf("A", "B")
|
|
37
|
+
|
|
38
|
+
expect(caseA.fields._tag.ast.literal).toBe("A")
|
|
39
|
+
expect(caseB.fields._tag.ast.literal).toBe("B")
|
|
40
|
+
expect(caseC.fields._tag.ast.literal).toBe("C")
|
|
41
|
+
expect(S.decodeSync(schema.tags)("A")).toBe("A")
|
|
42
|
+
expect(S.decodeSync(schema.tags)("B")).toBe("B")
|
|
43
|
+
expect(S.decodeSync(schema.tags)("C")).toBe("C")
|
|
44
|
+
expect(() => S.decodeUnknownSync(schema.tags)("D")).toThrow()
|
|
45
|
+
|
|
46
|
+
expect(schema.isA.A({ _tag: "A", a: "ok" })).toBe(true)
|
|
47
|
+
expect(schema.isA.A({ _tag: "B", b: 1 })).toBe(false)
|
|
48
|
+
expect(schema.isA.B({ _tag: "B", b: 1 })).toBe(true)
|
|
49
|
+
expect(schema.isA.B({ _tag: "A", a: "ok" })).toBe(false)
|
|
50
|
+
expect(schema.isA.C({ _tag: "C", c: true })).toBe(true)
|
|
51
|
+
expect(schema.isA.C({ _tag: "A", a: "ok" })).toBe(false)
|
|
52
|
+
|
|
53
|
+
expect(isAOrB({ _tag: "A", a: "ok" })).toBe(true)
|
|
54
|
+
expect(isAOrB({ _tag: "B", b: 1 })).toBe(true)
|
|
55
|
+
expect(isAOrB({ _tag: "C", c: true })).toBe(false)
|
|
56
|
+
})
|