This commit is contained in:
@@ -7,10 +7,7 @@ import { Extend } from "../util"
|
|||||||
|
|
||||||
export class EffectSchemaTraitExpression<
|
export class EffectSchemaTraitExpression<
|
||||||
Fields extends S.Struct.Fields,
|
Fields extends S.Struct.Fields,
|
||||||
A,
|
A, I, R, C,
|
||||||
I,
|
|
||||||
R,
|
|
||||||
C,
|
|
||||||
Inherited extends object,
|
Inherited extends object,
|
||||||
Proto,
|
Proto,
|
||||||
Static extends object,
|
Static extends object,
|
||||||
@@ -18,12 +15,13 @@ export class EffectSchemaTraitExpression<
|
|||||||
const Traits extends readonly Trait<any, any, any, any>[],
|
const Traits extends readonly Trait<any, any, any, any>[],
|
||||||
>
|
>
|
||||||
implements TraitExpressionLike<
|
implements TraitExpressionLike<
|
||||||
S.Class<unknown, Fields, A, I, R, C, Inherited, Proto> & Static,
|
S.Class<unknown, Fields, A, I, R, C, Inherited, Proto>,
|
||||||
Traits
|
Traits
|
||||||
> {
|
> {
|
||||||
constructor(
|
constructor(
|
||||||
readonly superclass: S.Class<unknown, Fields, A, I, R, C, Inherited, Proto> & Static,
|
readonly superclass: S.Class<unknown, Fields, A, I, R, C, Inherited, Proto>,
|
||||||
readonly traits: Traits,
|
readonly superclassStatic: Static,
|
||||||
|
readonly traits: Traits,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
|
|
||||||
@@ -31,10 +29,7 @@ implements TraitExpressionLike<
|
|||||||
S.Class<
|
S.Class<
|
||||||
Self,
|
Self,
|
||||||
Fields,
|
Fields,
|
||||||
A,
|
A, I, R, C,
|
||||||
I,
|
|
||||||
R,
|
|
||||||
C,
|
|
||||||
Simplify<
|
Simplify<
|
||||||
Extend<[
|
Extend<[
|
||||||
Inherited,
|
Inherited,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Schema as S } from "@effect/schema"
|
import { Schema as S } from "@effect/schema"
|
||||||
import { Mutable, Simplify } from "effect/Types"
|
import * as Types from "effect/Types"
|
||||||
|
import { Simplify } from "type-fest"
|
||||||
import { Trait, TraitTuple } from "../Trait"
|
import { Trait, TraitTuple } from "../Trait"
|
||||||
import { TraitExpression } from "../TraitExpression"
|
import { TraitExpression } from "../TraitExpression"
|
||||||
import { TraitExpressionBuilder } from "../TraitExpressionBuilder"
|
import { TraitExpressionBuilder } from "../TraitExpressionBuilder"
|
||||||
@@ -19,6 +20,7 @@ export class EffectSchemaInitialTraitExpressionBuilder {
|
|||||||
) {
|
) {
|
||||||
return new EffectSchemaTraitExpressionBuilder(
|
return new EffectSchemaTraitExpressionBuilder(
|
||||||
S.Class<unknown>(identifier)(fields, annotations),
|
S.Class<unknown>(identifier)(fields, annotations),
|
||||||
|
{},
|
||||||
[],
|
[],
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -33,6 +35,7 @@ export class EffectSchemaInitialTraitExpressionBuilder {
|
|||||||
) {
|
) {
|
||||||
return new EffectSchemaTraitExpressionBuilder(
|
return new EffectSchemaTraitExpressionBuilder(
|
||||||
S.TaggedClass<unknown>()(tag, fields, annotations),
|
S.TaggedClass<unknown>()(tag, fields, annotations),
|
||||||
|
{},
|
||||||
[],
|
[],
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -41,10 +44,7 @@ export class EffectSchemaInitialTraitExpressionBuilder {
|
|||||||
Super extends S.Class<any, Fields, A, I, R, C, Inherited, Proto>,
|
Super extends S.Class<any, Fields, A, I, R, C, Inherited, Proto>,
|
||||||
|
|
||||||
Fields extends S.Struct.Fields,
|
Fields extends S.Struct.Fields,
|
||||||
A,
|
A, I, R, C,
|
||||||
I,
|
|
||||||
R,
|
|
||||||
C,
|
|
||||||
Inherited extends object,
|
Inherited extends object,
|
||||||
Proto,
|
Proto,
|
||||||
|
|
||||||
@@ -55,19 +55,22 @@ export class EffectSchemaInitialTraitExpressionBuilder {
|
|||||||
fields: NewFields,
|
fields: NewFields,
|
||||||
annotations?: S.Annotations.Schema<unknown>,
|
annotations?: S.Annotations.Schema<unknown>,
|
||||||
) {
|
) {
|
||||||
return new EffectSchemaTraitExpressionBuilder<
|
return new EffectSchemaTraitExpressionBuilder(
|
||||||
Fields & NewFields,
|
superclass.extend<unknown>(identifier)(fields, annotations) as S.Class<
|
||||||
Simplify<A & S.Struct.Type<NewFields>>,
|
unknown,
|
||||||
Simplify<I & S.Struct.Encoded<NewFields>>,
|
Fields & NewFields,
|
||||||
R | S.Struct.Context<NewFields>,
|
Types.Simplify<A & S.Struct.Type<NewFields>>,
|
||||||
Simplify<C & S.Struct.Type<NewFields>>,
|
Types.Simplify<I & S.Struct.Encoded<NewFields>>,
|
||||||
InstanceType<Super>,
|
R | S.Struct.Context<NewFields>,
|
||||||
Proto,
|
Types.Simplify<C & S.Struct.Type<NewFields>>,
|
||||||
StaticMembers<Super>,
|
InstanceType<Super>,
|
||||||
|
Proto
|
||||||
|
>,
|
||||||
|
|
||||||
|
{} as Simplify<
|
||||||
|
Omit<StaticMembers<Super>, keyof S.Class<any, Fields, A, I, R, C, Inherited, Proto>>
|
||||||
|
>,
|
||||||
|
|
||||||
readonly []
|
|
||||||
>(
|
|
||||||
superclass.extend<unknown>(identifier)(fields, annotations) as any,
|
|
||||||
[],
|
[],
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -76,10 +79,7 @@ export class EffectSchemaInitialTraitExpressionBuilder {
|
|||||||
|
|
||||||
export class EffectSchemaTraitExpressionBuilder<
|
export class EffectSchemaTraitExpressionBuilder<
|
||||||
Fields extends S.Struct.Fields,
|
Fields extends S.Struct.Fields,
|
||||||
A,
|
A, I, R, C,
|
||||||
I,
|
|
||||||
R,
|
|
||||||
C,
|
|
||||||
Inherited extends object,
|
Inherited extends object,
|
||||||
Proto,
|
Proto,
|
||||||
Static extends object,
|
Static extends object,
|
||||||
@@ -87,39 +87,42 @@ export class EffectSchemaTraitExpressionBuilder<
|
|||||||
const Traits extends readonly Trait<any, any, any, any>[],
|
const Traits extends readonly Trait<any, any, any, any>[],
|
||||||
> {
|
> {
|
||||||
constructor(
|
constructor(
|
||||||
readonly expressionSuperclass: S.Class<unknown, Fields, A, I, R, C, Inherited, Proto> & Static,
|
readonly expressionSuperclass: S.Class<unknown, Fields, A, I, R, C, Inherited, Proto>,
|
||||||
readonly expressionTraits: Traits,
|
readonly expressionSuperclassStatic: Static,
|
||||||
|
readonly expressionTraits: Traits,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
|
|
||||||
mutable(): EffectSchemaTraitExpressionBuilder<
|
mutable() {
|
||||||
Fields,
|
return new EffectSchemaTraitExpressionBuilder(
|
||||||
Mutable<A>,
|
this.expressionSuperclass as S.Class<unknown, Fields, Types.Mutable<A>, I, R, C, Inherited, Proto>,
|
||||||
I,
|
this.expressionSuperclassStatic,
|
||||||
R,
|
this.expressionTraits,
|
||||||
C,
|
)
|
||||||
Inherited,
|
|
||||||
Proto,
|
|
||||||
Static,
|
|
||||||
|
|
||||||
Traits
|
|
||||||
> {
|
|
||||||
return new EffectSchemaTraitExpressionBuilder(this.expressionSuperclass, this.expressionTraits)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mutableEncoded(): EffectSchemaTraitExpressionBuilder<
|
immutable() {
|
||||||
Fields,
|
return new EffectSchemaTraitExpressionBuilder(
|
||||||
A,
|
this.expressionSuperclass as S.Class<unknown, Fields, Readonly<A>, I, R, C, Inherited, Proto>,
|
||||||
Mutable<I>,
|
this.expressionSuperclassStatic,
|
||||||
R,
|
this.expressionTraits,
|
||||||
C,
|
)
|
||||||
Inherited,
|
}
|
||||||
Proto,
|
|
||||||
Static,
|
|
||||||
|
|
||||||
Traits
|
mutableEncoded() {
|
||||||
> {
|
return new EffectSchemaTraitExpressionBuilder(
|
||||||
return new EffectSchemaTraitExpressionBuilder(this.expressionSuperclass, this.expressionTraits)
|
this.expressionSuperclass as S.Class<unknown, Fields, A, Readonly<I>, R, C, Inherited, Proto>,
|
||||||
|
this.expressionSuperclassStatic,
|
||||||
|
this.expressionTraits,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
immutableEncoded() {
|
||||||
|
return new EffectSchemaTraitExpressionBuilder(
|
||||||
|
this.expressionSuperclass as S.Class<unknown, Fields, A, Types.Mutable<I>, R, C, Inherited, Proto>,
|
||||||
|
this.expressionSuperclassStatic,
|
||||||
|
this.expressionTraits,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -135,25 +138,15 @@ export class EffectSchemaTraitExpressionBuilder<
|
|||||||
>[]
|
>[]
|
||||||
>(
|
>(
|
||||||
...traits: T
|
...traits: T
|
||||||
): EffectSchemaTraitExpressionBuilder<
|
) {
|
||||||
Fields,
|
|
||||||
A,
|
|
||||||
I,
|
|
||||||
R,
|
|
||||||
C,
|
|
||||||
Inherited,
|
|
||||||
Proto,
|
|
||||||
Static,
|
|
||||||
|
|
||||||
TraitExpressionBuilder.ExpressesReturnTypeTraits<Traits, T>
|
|
||||||
> {
|
|
||||||
return new EffectSchemaTraitExpressionBuilder(
|
return new EffectSchemaTraitExpressionBuilder(
|
||||||
this.expressionSuperclass,
|
this.expressionSuperclass,
|
||||||
|
this.expressionSuperclassStatic,
|
||||||
|
|
||||||
traitsUnique([
|
traitsUnique([
|
||||||
...this.expressionTraits,
|
...this.expressionTraits,
|
||||||
...spreadSupertraits(traits),
|
...spreadSupertraits(traits),
|
||||||
]),
|
]) as TraitExpressionBuilder.ExpressesReturnTypeTraits<Traits, T>,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,10 +168,7 @@ export class EffectSchemaTraitExpressionBuilder<
|
|||||||
? "Type conflict between the traits implementation static members and/or the superclass static members."
|
? "Type conflict between the traits implementation static members and/or the superclass static members."
|
||||||
: EffectSchemaTraitExpression<
|
: EffectSchemaTraitExpression<
|
||||||
Fields,
|
Fields,
|
||||||
A,
|
A, I, R, C,
|
||||||
I,
|
|
||||||
R,
|
|
||||||
C,
|
|
||||||
Inherited,
|
Inherited,
|
||||||
Proto,
|
Proto,
|
||||||
Static,
|
Static,
|
||||||
@@ -186,7 +176,11 @@ export class EffectSchemaTraitExpressionBuilder<
|
|||||||
Traits
|
Traits
|
||||||
>
|
>
|
||||||
) {
|
) {
|
||||||
return new EffectSchemaTraitExpression(this.expressionSuperclass, this.expressionTraits) as any
|
return new EffectSchemaTraitExpression(
|
||||||
|
this.expressionSuperclass,
|
||||||
|
this.expressionSuperclassStatic,
|
||||||
|
this.expressionTraits,
|
||||||
|
) as any
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,26 @@
|
|||||||
import { Schema as S } from "@effect/schema"
|
import { Schema as S } from "@effect/schema"
|
||||||
import { Implements } from "../TraitExpression"
|
import { Implements } from "../TraitExpression"
|
||||||
import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder"
|
import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder"
|
||||||
|
import { StaticMembers } from "../util"
|
||||||
|
import { Trait } from "../Trait"
|
||||||
|
import { EffectSchemaTraitExpression } from "./EffectSchemaTraitExpression"
|
||||||
|
|
||||||
|
|
||||||
|
type Extr<T> =
|
||||||
|
T extends EffectSchemaTraitExpression<
|
||||||
|
infer Fields,
|
||||||
|
infer A,
|
||||||
|
infer I,
|
||||||
|
infer R,
|
||||||
|
infer C,
|
||||||
|
infer Inherited,
|
||||||
|
infer Proto,
|
||||||
|
infer Static,
|
||||||
|
|
||||||
|
infer Traits
|
||||||
|
>
|
||||||
|
? Static
|
||||||
|
: never
|
||||||
|
|
||||||
|
|
||||||
const userExp = effectSchemaExpression
|
const userExp = effectSchemaExpression
|
||||||
@@ -27,11 +47,15 @@ const adminExp = effectSchemaExpression
|
|||||||
.extends(User, "User", {
|
.extends(User, "User", {
|
||||||
role: S.Literal("Admin")
|
role: S.Literal("Admin")
|
||||||
})
|
})
|
||||||
|
.immutable()
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
|
adminExp.superclass
|
||||||
|
type T = Extr<typeof adminExp>
|
||||||
|
|
||||||
@adminExp.staticImplements
|
@adminExp.staticImplements
|
||||||
class Admin extends adminExp.extends<Admin>() implements Implements<typeof adminExp> {
|
class Admin extends adminExp.extends<Admin>() implements Implements<typeof adminExp> {
|
||||||
}
|
}
|
||||||
|
|
||||||
const admin = new Admin({ id: 1n, role: "Admin" })
|
const admin = new Admin({ id: 1n, role: "Admin" })
|
||||||
// admin.id = 1n
|
// admin.role = "Admin"
|
||||||
|
|||||||
Reference in New Issue
Block a user