effect-app 4.0.0-beta.133 → 4.0.0-beta.134
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 +9 -0
- package/dist/Schema/Class.d.ts +8 -5
- package/dist/Schema/Class.d.ts.map +1 -1
- package/dist/Schema/Class.js +14 -8
- package/package.json +1 -1
- package/src/Schema/Class.ts +25 -11
- package/test/special.test.ts +48 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @effect-app/prelude
|
|
2
2
|
|
|
3
|
+
## 4.0.0-beta.134
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 9d3495e: Preserve field-level schema decode errors for relaxed Class and TaggedClass declarations so decode failures report nested constraints (for example min-length violations) instead of only a generic class-type mismatch.
|
|
8
|
+
- f353d48: Rename the Class/TaggedClass relaxed declaration option to `strict` (default `false`) and apply it to `Class`, `TaggedClass`, `ExtendedClass`, and `ExtendedTaggedClass`.
|
|
9
|
+
|
|
10
|
+
When `strict: true`, class decoding keeps strict class-level declaration behavior; by default, decoding remains relaxed and preserves field-level schema errors.
|
|
11
|
+
|
|
3
12
|
## 4.0.0-beta.133
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
package/dist/Schema/Class.d.ts
CHANGED
|
@@ -15,6 +15,9 @@ type HasFields<Fields extends S.Struct.Fields> = {
|
|
|
15
15
|
} | {
|
|
16
16
|
readonly from: HasFields<Fields>;
|
|
17
17
|
};
|
|
18
|
+
type ClassOptions = {
|
|
19
|
+
readonly strict?: boolean;
|
|
20
|
+
};
|
|
18
21
|
export type Class<Self, S extends S.Top & {
|
|
19
22
|
readonly fields: S.Struct.Fields;
|
|
20
23
|
}, Inherited> = EnhancedClass<Self, S, Inherited>;
|
|
@@ -37,7 +40,7 @@ export type Class<Self, S extends S.Top & {
|
|
|
37
40
|
* Schema.encodeUnknownSync(A)({ a: "hello" }) // { a: "hello" }
|
|
38
41
|
* ```
|
|
39
42
|
*/
|
|
40
|
-
export declare const Class: <Self = never>(identifier: string) => <Fields extends S.Struct.Fields>(fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self
|
|
43
|
+
export declare const Class: <Self = never>(identifier: string) => <Fields extends S.Struct.Fields>(fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self>, options?: ClassOptions) => [Self] extends [never] ? MissingSelfGeneric<"Class"> : EnhancedClass<Self, S.Struct<Fields>, {}>;
|
|
41
44
|
/**
|
|
42
45
|
* Like `Schema.TaggedClass`, but the resulting class accepts plain objects
|
|
43
46
|
* matching the struct schema during encoding.
|
|
@@ -54,17 +57,17 @@ export declare const Class: <Self = never>(identifier: string) => <Fields extend
|
|
|
54
57
|
* Schema.encodeUnknownSync(Circle)({ _tag: "Circle", radius: 5 })
|
|
55
58
|
* ```
|
|
56
59
|
*/
|
|
57
|
-
export declare const TaggedClass: <Self = never>(identifier?: string) => <Tag extends string, Fields extends S.Struct.Fields>(tag: Tag, fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self
|
|
60
|
+
export declare const TaggedClass: <Self = never>(identifier?: string) => <Tag extends string, Fields extends S.Struct.Fields>(tag: Tag, fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self>, options?: ClassOptions) => [Self] extends [never] ? MissingSelfGeneric<"TaggedClass"> : EnhancedClass<Self, S.Struct<{
|
|
58
61
|
readonly _tag: S.tag<Tag>;
|
|
59
62
|
} & Fields>, {}>;
|
|
60
|
-
export declare const ExtendedClass: <Self, _SelfFrom>(identifier: string) => <Fields extends S.Struct.Fields>(fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self
|
|
63
|
+
export declare const ExtendedClass: <Self, _SelfFrom>(identifier: string) => <Fields extends S.Struct.Fields>(fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self>, options?: ClassOptions) => EnhancedClass<Self, S.Struct<Fields>, {}>;
|
|
61
64
|
export interface EnhancedTaggedClass<Self, Tag extends string, Fields extends S.Struct.Fields, SelfFrom> extends EnhancedClass<Self, S.Struct<Fields> & {
|
|
62
65
|
readonly Encoded: SelfFrom;
|
|
63
66
|
}, {}> {
|
|
64
67
|
readonly _tag: Tag;
|
|
65
68
|
}
|
|
66
|
-
export declare const ExtendedTaggedClass: <Self, SelfFrom>(identifier?: string) => <Tag extends string, Fields extends S.Struct.Fields>(tag: Tag, fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self
|
|
69
|
+
export declare const ExtendedTaggedClass: <Self, SelfFrom>(identifier?: string) => <Tag extends string, Fields extends S.Struct.Fields>(tag: Tag, fieldsOr: Fields | HasFields<Fields>, annotations?: ClassAnnotations<Self>, options?: ClassOptions) => EnhancedTaggedClass<Self, Tag, {
|
|
67
70
|
readonly _tag: S.tag<Tag>;
|
|
68
71
|
} & Fields, SelfFrom>;
|
|
69
72
|
export {};
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xhc3MuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TY2hlbWEvQ2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLENBQUMsTUFBTSxlQUFlLENBQUE7QUFFbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUd4QyxLQUFLLGdCQUFnQixDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFFN0UsTUFBTSxXQUFXLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxTQUFTLENBQUMsQ0FBQyxHQUFHLEdBQUc7SUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFBO0NBQUUsRUFBRSxTQUFTLENBQzFHLFNBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQztJQUV6Qzs7T0FFRztJQUNILFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLE9BQU8sVUFBVSxDQUFDLEtBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFBO0NBQ2xFO0FBQ0QsS0FBSyxrQkFBa0IsQ0FBQyxLQUFLLFNBQVMsTUFBTSxFQUFFLE1BQU0sU0FBUyxNQUFNLEdBQUcsRUFBRSxJQUN0RSx1REFBdUQsS0FBSyxZQUFZLE1BQU0sWUFBWSxDQUFBO0FBRTVGLEtBQUssU0FBUyxDQUFDLE1BQU0sU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSTtJQUMvQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQTtDQUN4QixHQUFHO0lBQ0YsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7Q0FDakMsQ0FBQTtBQUVELEtBQUssWUFBWSxHQUFHO0lBQ2xC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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Class.d.ts","sourceRoot":"","sources":["../../src/Schema/Class.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"Class.d.ts","sourceRoot":"","sources":["../../src/Schema/Class.ts"],"names":[],"mappings":"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"}
|
package/dist/Schema/Class.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import { Effect, Option, Schema, SchemaAST, SchemaIssue } from "effect";
|
|
3
3
|
import * as S from "effect/Schema";
|
|
4
|
+
import * as SchemaParser from "effect/SchemaParser";
|
|
4
5
|
import { copyOrigin } from "../utils.js";
|
|
5
6
|
import { concurrencyUnbounded } from "./ext.js";
|
|
6
7
|
/**
|
|
@@ -9,16 +10,19 @@ import { concurrencyUnbounded } from "./ext.js";
|
|
|
9
10
|
*/
|
|
10
11
|
function makeRelaxedDeclaration(ast, fields, cls) {
|
|
11
12
|
const structSchema = Schema.Struct(fields);
|
|
12
|
-
const
|
|
13
|
+
const decodeStruct = SchemaParser.decodeUnknownEffect(structSchema);
|
|
13
14
|
const existingParseOptions = ast.annotations?.["parseOptions"];
|
|
14
15
|
const annotations = {
|
|
15
16
|
...ast.annotations,
|
|
16
17
|
parseOptions: { ...existingParseOptions, concurrency: "unbounded" }
|
|
17
18
|
};
|
|
18
|
-
return new SchemaAST.Declaration(ast.typeParameters, () => (input, self) => {
|
|
19
|
-
if (input instanceof cls
|
|
19
|
+
return new SchemaAST.Declaration(ast.typeParameters, () => (input, self, options) => {
|
|
20
|
+
if (input instanceof cls) {
|
|
20
21
|
return Effect.succeed(input);
|
|
21
22
|
}
|
|
23
|
+
if (input !== null && typeof input === "object") {
|
|
24
|
+
return decodeStruct(input, options);
|
|
25
|
+
}
|
|
22
26
|
return Effect.fail(new SchemaIssue.InvalidType(self, Option.some(input)));
|
|
23
27
|
}, annotations, ast.checks, ast.encoding, ast.context);
|
|
24
28
|
}
|
|
@@ -44,7 +48,8 @@ function makeRelaxedDeclaration(ast, fields, cls) {
|
|
|
44
48
|
* Schema.encodeUnknownSync(A)({ a: "hello" }) // { a: "hello" }
|
|
45
49
|
* ```
|
|
46
50
|
*/
|
|
47
|
-
export const Class = (identifier) => (fields, annotations) => {
|
|
51
|
+
export const Class = (identifier) => (fields, annotations, options) => {
|
|
52
|
+
const relaxed = !(options?.strict ?? false);
|
|
48
53
|
// Build the original Schema.Class
|
|
49
54
|
const Base = S.Class(identifier)(fields, annotations);
|
|
50
55
|
// Get the original ast getter from the base class
|
|
@@ -68,7 +73,7 @@ export const Class = (identifier) => (fields, annotations) => {
|
|
|
68
73
|
// Call the original getter with `this` bound to the actual user class,
|
|
69
74
|
// so getClassSchema(this) creates a schema that uses `new this(...)`.
|
|
70
75
|
const originalAst = originalAstDescriptor.get.call(this);
|
|
71
|
-
cached = makeRelaxedDeclaration(originalAst, Base.fields, this);
|
|
76
|
+
cached = relaxed ? makeRelaxedDeclaration(originalAst, Base.fields, this) : originalAst;
|
|
72
77
|
astCache.set(this, cached);
|
|
73
78
|
return cached;
|
|
74
79
|
}
|
|
@@ -96,7 +101,8 @@ export const Class = (identifier) => (fields, annotations) => {
|
|
|
96
101
|
* Schema.encodeUnknownSync(Circle)({ _tag: "Circle", radius: 5 })
|
|
97
102
|
* ```
|
|
98
103
|
*/
|
|
99
|
-
export const TaggedClass = (identifier) => (tag, fields, annotations) => {
|
|
104
|
+
export const TaggedClass = (identifier) => (tag, fields, annotations, options) => {
|
|
105
|
+
const relaxed = !(options?.strict ?? false);
|
|
100
106
|
const Base = S.TaggedClass(identifier)(tag, fields, annotations);
|
|
101
107
|
const originalAstDescriptor = Object.getOwnPropertyDescriptor(Base, "ast");
|
|
102
108
|
const astCache = new WeakMap();
|
|
@@ -115,7 +121,7 @@ export const TaggedClass = (identifier) => (tag, fields, annotations) => {
|
|
|
115
121
|
if (cached !== undefined)
|
|
116
122
|
return cached;
|
|
117
123
|
const originalAst = originalAstDescriptor.get.call(this);
|
|
118
|
-
cached = makeRelaxedDeclaration(originalAst, Base.fields, this);
|
|
124
|
+
cached = relaxed ? makeRelaxedDeclaration(originalAst, Base.fields, this) : originalAst;
|
|
119
125
|
astCache.set(this, cached);
|
|
120
126
|
return cached;
|
|
121
127
|
}
|
|
@@ -129,4 +135,4 @@ export const TaggedClass = (identifier) => (tag, fields, annotations) => {
|
|
|
129
135
|
// ---------------------------------------------------------------------------
|
|
130
136
|
export const ExtendedClass = Class;
|
|
131
137
|
export const ExtendedTaggedClass = TaggedClass;
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2NoZW1hL0NsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUN2RSxPQUFPLEtBQUssQ0FBQyxNQUFNLGVBQWUsQ0FBQTtBQUNsQyxPQUFPLEtBQUssWUFBWSxNQUFNLHFCQUFxQixDQUFBO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDeEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBK0IvQzs7O0dBR0c7QUFDSCxTQUFTLHNCQUFzQixDQUM3QixHQUEwQixFQUMxQixNQUE0QixFQUM1QixHQUFRO0lBRVIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMxQyxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDbkUsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsY0FBYyxDQUF1QyxDQUFBO0lBQ3BHLE1BQU0sV0FBVyxHQUFHO1FBQ2xCLEdBQUcsR0FBRyxDQUFDLFdBQVc7UUFDbEIsWUFBWSxFQUFFLEVBQUUsR0FBRyxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsV0FBb0IsRUFBRTtLQUM3RSxDQUFBO0lBQ0QsT0FBTyxJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQzlCLEdBQUcsQ0FBQyxjQUFjLEVBQ2xCLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBYyxFQUFFLElBQTJCLEVBQUUsT0FBK0IsRUFBRSxFQUFFO1FBQ3JGLElBQUksS0FBSyxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FB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
|
package/package.json
CHANGED
package/src/Schema/Class.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import { Effect, Option, Schema, SchemaAST, SchemaIssue } from "effect"
|
|
3
3
|
import * as S from "effect/Schema"
|
|
4
|
+
import * as SchemaParser from "effect/SchemaParser"
|
|
4
5
|
import { copyOrigin } from "../utils.js"
|
|
5
6
|
import { concurrencyUnbounded } from "./ext.js"
|
|
6
7
|
|
|
@@ -23,6 +24,10 @@ type HasFields<Fields extends S.Struct.Fields> = {
|
|
|
23
24
|
readonly from: HasFields<Fields>
|
|
24
25
|
}
|
|
25
26
|
|
|
27
|
+
type ClassOptions = {
|
|
28
|
+
readonly strict?: boolean
|
|
29
|
+
}
|
|
30
|
+
|
|
26
31
|
export type Class<Self, S extends S.Top & { readonly fields: S.Struct.Fields }, Inherited> = EnhancedClass<
|
|
27
32
|
Self,
|
|
28
33
|
S,
|
|
@@ -39,7 +44,7 @@ function makeRelaxedDeclaration(
|
|
|
39
44
|
cls: any
|
|
40
45
|
): SchemaAST.Declaration {
|
|
41
46
|
const structSchema = Schema.Struct(fields)
|
|
42
|
-
const
|
|
47
|
+
const decodeStruct = SchemaParser.decodeUnknownEffect(structSchema)
|
|
43
48
|
const existingParseOptions = ast.annotations?.["parseOptions"] as SchemaAST.ParseOptions | undefined
|
|
44
49
|
const annotations = {
|
|
45
50
|
...ast.annotations,
|
|
@@ -47,10 +52,13 @@ function makeRelaxedDeclaration(
|
|
|
47
52
|
}
|
|
48
53
|
return new SchemaAST.Declaration(
|
|
49
54
|
ast.typeParameters,
|
|
50
|
-
() => (input: unknown, self: SchemaAST.Declaration) => {
|
|
51
|
-
if (input instanceof cls
|
|
55
|
+
() => (input: unknown, self: SchemaAST.Declaration, options: SchemaAST.ParseOptions) => {
|
|
56
|
+
if (input instanceof cls) {
|
|
52
57
|
return Effect.succeed(input)
|
|
53
58
|
}
|
|
59
|
+
if (input !== null && typeof input === "object") {
|
|
60
|
+
return decodeStruct(input, options)
|
|
61
|
+
}
|
|
54
62
|
return Effect.fail(new SchemaIssue.InvalidType(self, Option.some(input)))
|
|
55
63
|
},
|
|
56
64
|
annotations,
|
|
@@ -85,13 +93,15 @@ function makeRelaxedDeclaration(
|
|
|
85
93
|
*/
|
|
86
94
|
export const Class: <Self = never>(identifier: string) => <Fields extends S.Struct.Fields>(
|
|
87
95
|
fieldsOr: Fields | HasFields<Fields>,
|
|
88
|
-
annotations?: ClassAnnotations<Self
|
|
96
|
+
annotations?: ClassAnnotations<Self>,
|
|
97
|
+
options?: ClassOptions
|
|
89
98
|
) => [Self] extends [never] ? MissingSelfGeneric<"Class">
|
|
90
99
|
: EnhancedClass<
|
|
91
100
|
Self,
|
|
92
101
|
S.Struct<Fields>,
|
|
93
102
|
{}
|
|
94
|
-
> = (identifier) => (fields, annotations) => {
|
|
103
|
+
> = (identifier) => (fields, annotations, options) => {
|
|
104
|
+
const relaxed = !(options?.strict ?? false)
|
|
95
105
|
// Build the original Schema.Class
|
|
96
106
|
const Base = (S.Class as any)(identifier)(fields, annotations)
|
|
97
107
|
// Get the original ast getter from the base class
|
|
@@ -116,7 +126,7 @@ export const Class: <Self = never>(identifier: string) => <Fields extends S.Stru
|
|
|
116
126
|
// Call the original getter with `this` bound to the actual user class,
|
|
117
127
|
// so getClassSchema(this) creates a schema that uses `new this(...)`.
|
|
118
128
|
const originalAst = originalAstDescriptor.get!.call(this) as SchemaAST.Declaration
|
|
119
|
-
cached = makeRelaxedDeclaration(originalAst, Base.fields, this)
|
|
129
|
+
cached = relaxed ? makeRelaxedDeclaration(originalAst, Base.fields, this) : originalAst
|
|
120
130
|
astCache.set(this, cached)
|
|
121
131
|
return cached
|
|
122
132
|
}
|
|
@@ -151,13 +161,15 @@ export const TaggedClass: <Self = never>(
|
|
|
151
161
|
) => <Tag extends string, Fields extends S.Struct.Fields>(
|
|
152
162
|
tag: Tag,
|
|
153
163
|
fieldsOr: Fields | HasFields<Fields>,
|
|
154
|
-
annotations?: ClassAnnotations<Self
|
|
164
|
+
annotations?: ClassAnnotations<Self>,
|
|
165
|
+
options?: ClassOptions
|
|
155
166
|
) => [Self] extends [never] ? MissingSelfGeneric<"TaggedClass">
|
|
156
167
|
: EnhancedClass<
|
|
157
168
|
Self,
|
|
158
169
|
S.Struct<{ readonly _tag: S.tag<Tag> } & Fields>,
|
|
159
170
|
{}
|
|
160
|
-
> = (identifier) => (tag, fields, annotations) => {
|
|
171
|
+
> = (identifier) => (tag, fields, annotations, options) => {
|
|
172
|
+
const relaxed = !(options?.strict ?? false)
|
|
161
173
|
const Base = (S.TaggedClass as any)(identifier)(tag, fields, annotations)
|
|
162
174
|
const originalAstDescriptor = Object.getOwnPropertyDescriptor(Base, "ast")!
|
|
163
175
|
const astCache = new WeakMap<any, SchemaAST.Declaration>()
|
|
@@ -176,7 +188,7 @@ export const TaggedClass: <Self = never>(
|
|
|
176
188
|
let cached = astCache.get(this)
|
|
177
189
|
if (cached !== undefined) return cached
|
|
178
190
|
const originalAst = originalAstDescriptor.get!.call(this) as SchemaAST.Declaration
|
|
179
|
-
cached = makeRelaxedDeclaration(originalAst, Base.fields, this)
|
|
191
|
+
cached = relaxed ? makeRelaxedDeclaration(originalAst, Base.fields, this) : originalAst
|
|
180
192
|
astCache.set(this, cached)
|
|
181
193
|
return cached
|
|
182
194
|
}
|
|
@@ -192,7 +204,8 @@ export const TaggedClass: <Self = never>(
|
|
|
192
204
|
|
|
193
205
|
export const ExtendedClass: <Self, _SelfFrom>(identifier: string) => <Fields extends S.Struct.Fields>(
|
|
194
206
|
fieldsOr: Fields | HasFields<Fields>,
|
|
195
|
-
annotations?: ClassAnnotations<Self
|
|
207
|
+
annotations?: ClassAnnotations<Self>,
|
|
208
|
+
options?: ClassOptions
|
|
196
209
|
) => EnhancedClass<
|
|
197
210
|
Self,
|
|
198
211
|
S.Struct<Fields>,
|
|
@@ -219,7 +232,8 @@ export const ExtendedTaggedClass: <Self, SelfFrom>(
|
|
|
219
232
|
) => <Tag extends string, Fields extends S.Struct.Fields>(
|
|
220
233
|
tag: Tag,
|
|
221
234
|
fieldsOr: Fields | HasFields<Fields>,
|
|
222
|
-
annotations?: ClassAnnotations<Self
|
|
235
|
+
annotations?: ClassAnnotations<Self>,
|
|
236
|
+
options?: ClassOptions
|
|
223
237
|
) => EnhancedTaggedClass<
|
|
224
238
|
Self,
|
|
225
239
|
Tag,
|
package/test/special.test.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Option, Predicate, Schema, SchemaGetter } from "effect"
|
|
2
2
|
import { InvalidStateError, LoginError, NotFoundError, NotLoggedInError, OptimisticConcurrencyException, ServiceUnavailableError, UnauthorizedError, ValidationError } from "effect-app/client/errors"
|
|
3
3
|
import * as AppSchema from "effect-app/Schema"
|
|
4
|
-
import { Class, TaggedClass } from "effect-app/Schema/Class"
|
|
4
|
+
import { Class, ExtendedClass, ExtendedTaggedClass, TaggedClass } from "effect-app/Schema/Class"
|
|
5
5
|
import { flattenNestedAnyOf, flattenSimpleAllOf, specialJsonSchemaDocument } from "effect-app/Schema/SpecialJsonSchema"
|
|
6
6
|
import { deduplicateOpenApiSchemas } from "effect-app/Schema/SpecialOpenApi"
|
|
7
7
|
import * as S from "effect/Schema"
|
|
@@ -131,6 +131,21 @@ describe("TaggedClass constructor", () => {
|
|
|
131
131
|
expect((decoded as Circle)._tag).toBe("Circle")
|
|
132
132
|
})
|
|
133
133
|
|
|
134
|
+
it("S.decodeSync(S.toType(X)) should report n length schema error", () => {
|
|
135
|
+
class X extends TaggedClass<X>()("X", { n: S.String.pipe(S.check(S.isMinLength(3))) }) {}
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
S.decodeSync(S.toType(X))({ _tag: "X", n: "a" /* not length 3 */ })
|
|
139
|
+
expect.fail("expected decode to fail with a SchemaError")
|
|
140
|
+
} catch (error) {
|
|
141
|
+
expect(error).toBeInstanceOf(Error)
|
|
142
|
+
if (error instanceof Error) {
|
|
143
|
+
expect(error.message).toContain("n")
|
|
144
|
+
expect(error.message.toLowerCase()).toContain("length")
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
})
|
|
148
|
+
|
|
134
149
|
it("exposes fields, identifier", () => {
|
|
135
150
|
class Circle extends TaggedClass<Circle>()("Circle", { radius: S.Number }) {}
|
|
136
151
|
|
|
@@ -140,6 +155,38 @@ describe("TaggedClass constructor", () => {
|
|
|
140
155
|
})
|
|
141
156
|
})
|
|
142
157
|
|
|
158
|
+
describe("strict declaration option", () => {
|
|
159
|
+
it("Class strict: true keeps class-level expected errors", () => {
|
|
160
|
+
class X extends Class<X>("X")({ n: S.String.pipe(S.check(S.isMinLength(3))) }, undefined, { strict: true }) {}
|
|
161
|
+
|
|
162
|
+
expect(() => S.decodeSync(S.toType(X))({ n: "a" })).toThrow("Expected X")
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
it("TaggedClass strict: true keeps class-level expected errors", () => {
|
|
166
|
+
class X extends TaggedClass<X>()("X", { n: S.String.pipe(S.check(S.isMinLength(3))) }, undefined, {
|
|
167
|
+
strict: true
|
|
168
|
+
}) {}
|
|
169
|
+
|
|
170
|
+
expect(() => S.decodeSync(S.toType(X))({ _tag: "X", n: "a" })).toThrow("Expected X")
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
it("ExtendedClass strict: true keeps class-level expected errors", () => {
|
|
174
|
+
class X extends ExtendedClass<X, never>("X")({ n: S.String.pipe(S.check(S.isMinLength(3))) }, undefined, {
|
|
175
|
+
strict: true
|
|
176
|
+
}) {}
|
|
177
|
+
|
|
178
|
+
expect(() => S.decodeSync(S.toType(X))({ n: "a" })).toThrow("Expected X")
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
it("ExtendedTaggedClass strict: true keeps class-level expected errors", () => {
|
|
182
|
+
class X extends ExtendedTaggedClass<X, never>()("X", { n: S.String.pipe(S.check(S.isMinLength(3))) }, undefined, {
|
|
183
|
+
strict: true
|
|
184
|
+
}) {}
|
|
185
|
+
|
|
186
|
+
expect(() => S.decodeSync(S.toType(X))({ _tag: "X", n: "a" })).toThrow("Expected X")
|
|
187
|
+
})
|
|
188
|
+
})
|
|
189
|
+
|
|
143
190
|
describe("Class.copy", () => {
|
|
144
191
|
it("creates a new instance with updated fields", () => {
|
|
145
192
|
class A extends Class<A>("A")({ a: S.String, b: S.Number }) {}
|