From 90bb907db29948c9c0b26accfe60095b1cb6aab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 9 May 2024 02:10:56 +0200 Subject: [PATCH 01/23] EffectSchemaTraitExpressionBuilder --- src/TraitExpressionBuilder.ts | 96 +++---------------- .../EffectSchemaTraitExpressionBuilder.ts | 78 +++++++++++++++ src/spreadSupertraits.ts | 35 +++++++ src/traitsUnique.ts | 39 ++++++++ 4 files changed, 166 insertions(+), 82 deletions(-) create mode 100644 src/effect/EffectSchemaTraitExpressionBuilder.ts create mode 100644 src/spreadSupertraits.ts create mode 100644 src/traitsUnique.ts diff --git a/src/TraitExpressionBuilder.ts b/src/TraitExpressionBuilder.ts index c563268..464740d 100644 --- a/src/TraitExpressionBuilder.ts +++ b/src/TraitExpressionBuilder.ts @@ -1,7 +1,8 @@ -import { unique } from "remeda" -import { AbstractClass, IsEqual } from "type-fest" +import { AbstractClass } from "type-fest" import { Trait, TraitTuple } from "./Trait" import { TraitExpression } from "./TraitExpression" +import { SpreadSupertraits, spreadSupertraits } from "./spreadSupertraits" +import { TraitsUnique, traitsUnique } from "./traitsUnique" import { Extendable, StaticMembers } from "./util" @@ -9,56 +10,18 @@ export class TraitExpressionBuilder< Superclass extends AbstractClass, const Traits extends readonly Trait[], > { - declare ["constructor"]: typeof TraitExpressionBuilder - constructor( readonly expressionSuperclass: Superclass, readonly expressionTraits: Traits, ) {} - static spreadSupertraits< - const T extends readonly Trait< - TraitExpression< - typeof TraitExpression.NullSuperclass, - readonly Trait[] - >, - any, - any, - any - >[] - >( - traits: T - ) { - return traits.flatMap(trait => [ - ...trait.superExpression.traits, - trait, - ]) as readonly Trait[] as TraitExpressionBuilder.SpreadSupertraits - } - - static traitsUnique< - const T extends readonly Trait< - TraitExpression< - typeof TraitExpression.NullSuperclass, - readonly Trait[] - >, - any, - any, - any - >[] - >( - traits: T - ) { - return unique(traits) as readonly Trait[] as TraitExpressionBuilder.TraitsUnique - } - - extends< Super extends AbstractClass >( superclass: Super ) { - return new this.constructor( + return new TraitExpressionBuilder( superclass, this.expressionTraits, ) @@ -80,12 +43,12 @@ export class TraitExpressionBuilder< Superclass, TraitExpressionBuilder.ExpressesReturnTypeTraits > { - return new this.constructor( + return new TraitExpressionBuilder( this.expressionSuperclass, - this.constructor.traitsUnique([ + traitsUnique([ ...this.expressionTraits, - ...this.constructor.spreadSupertraits(traits), + ...spreadSupertraits(traits), ]), ) } @@ -106,11 +69,11 @@ export class TraitExpressionBuilder< Superclass, TraitExpressionBuilder.ExpressesFirstReturnTypeTraits > { - return new this.constructor( + return new TraitExpressionBuilder( this.expressionSuperclass, - this.constructor.traitsUnique([ - ...this.constructor.spreadSupertraits(traits), + traitsUnique([ + ...spreadSupertraits(traits), ...this.expressionTraits, ]), ) @@ -141,44 +104,13 @@ export class TraitExpressionBuilder< } export namespace TraitExpressionBuilder { - export type SpreadSupertraits = ( - Traits extends readonly [ - infer El extends Trait, - ...infer Rest, - ] - ? readonly [ - ...Trait.Supertraits, - El, - ...SpreadSupertraits, - ] - : readonly [] - ) - - export type TraitsUnique = ( - Traits extends readonly [ - ...infer Rest, - infer El extends Trait, - ] - ? IsTraitInTupleFromRight extends true - ? TraitsUnique - : readonly [...TraitsUnique, El] - : readonly [] - ) - type IsTraitInTupleFromRight = ( - Traits extends readonly [...infer Rest, infer El] - ? IsEqual extends true - ? true - : IsTraitInTupleFromRight - : false - ) - export type ExpressesReturnTypeTraits< Traits extends readonly Trait[], T extends readonly Trait[], > = ( - TraitExpressionBuilder.TraitsUnique, + ...SpreadSupertraits, ]> ) @@ -186,8 +118,8 @@ export namespace TraitExpressionBuilder { Traits extends readonly Trait[], T extends readonly Trait[], > = ( - TraitExpressionBuilder.TraitsUnique, + TraitsUnique, ...Traits, ]> ) diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts new file mode 100644 index 0000000..a67c018 --- /dev/null +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -0,0 +1,78 @@ +import { Schema as S } from "@effect/schema" +import { Trait } from "../Trait" +import { TraitExpression } from "../TraitExpression" +import { TraitExpressionBuilder } from "../TraitExpressionBuilder" +import { spreadSupertraits } from "../spreadSupertraits" +import { traitsUnique } from "../traitsUnique" + + +export class EffectSchemaTraitExpressionBuilder< + Superclass extends S.Class, + const Traits extends readonly Trait[], + + Fields extends S.Struct.Fields, + A, I, R, C, + Inherited extends object, + Proto, +> { + constructor( + readonly expressionSuperclass: Superclass, + readonly expressionTraits: Traits, + ) {} + + + extends< + Super extends S.Class, + + SuperFields extends S.Struct.Fields, + SuperA, SuperI, SuperR, SuperC, + SuperInherited extends object, + SuperProto, + >( + superclass: Super | S.Class + ) { + return new EffectSchemaTraitExpressionBuilder< + Super, + Traits, + + SuperFields, + SuperA, SuperI, SuperR, SuperC, + SuperInherited, + SuperProto + >( + superclass as Super, + this.expressionTraits, + ) + } + + expresses< + const T extends readonly Trait< + TraitExpression< + typeof TraitExpression.NullSuperclass, + readonly Trait[] + >, + any, + any, + any + >[] + >( + ...traits: T + ): EffectSchemaTraitExpressionBuilder< + Superclass, + TraitExpressionBuilder.ExpressesReturnTypeTraits, + + Fields, + A, I, R, C, + Inherited, + Proto + > { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass, + + traitsUnique([ + ...this.expressionTraits, + ...spreadSupertraits(traits), + ]), + ) + } +} diff --git a/src/spreadSupertraits.ts b/src/spreadSupertraits.ts new file mode 100644 index 0000000..77c3377 --- /dev/null +++ b/src/spreadSupertraits.ts @@ -0,0 +1,35 @@ +import { Trait } from "./Trait" +import { TraitExpression } from "./TraitExpression" + + +export function spreadSupertraits< + const T extends readonly Trait< + TraitExpression< + typeof TraitExpression.NullSuperclass, + readonly Trait[] + >, + any, + any, + any + >[] +>( + traits: T +) { + return traits.flatMap(trait => [ + ...trait.superExpression.traits, + trait, + ]) as readonly Trait[] as SpreadSupertraits +} + +export type SpreadSupertraits = ( + Traits extends readonly [ + infer El extends Trait, + ...infer Rest, + ] + ? readonly [ + ...Trait.Supertraits, + El, + ...SpreadSupertraits, + ] + : readonly [] +) diff --git a/src/traitsUnique.ts b/src/traitsUnique.ts new file mode 100644 index 0000000..6df91cd --- /dev/null +++ b/src/traitsUnique.ts @@ -0,0 +1,39 @@ +import { unique } from "remeda" +import { IsEqual } from "type-fest" +import { Trait } from "./Trait" +import { TraitExpression } from "./TraitExpression" + + +export function traitsUnique< + const T extends readonly Trait< + TraitExpression< + typeof TraitExpression.NullSuperclass, + readonly Trait[] + >, + any, + any, + any + >[] +>( + traits: T +) { + return unique(traits) as readonly Trait[] as TraitsUnique +} + +export type TraitsUnique = ( + Traits extends readonly [ + ...infer Rest, + infer El extends Trait, + ] + ? IsTraitInTupleFromRight extends true + ? TraitsUnique + : readonly [...TraitsUnique, El] + : readonly [] +) +type IsTraitInTupleFromRight = ( + Traits extends readonly [...infer Rest, infer El] + ? IsEqual extends true + ? true + : IsTraitInTupleFromRight + : false +) -- 2.49.1 From 5add4b629efa5ea56172dccb9a0964dc0f26490b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 9 May 2024 03:38:50 +0200 Subject: [PATCH 02/23] EffectSchemaTraitExpression --- src/effect/EffectSchemaTraitExpression.ts | 53 +++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/effect/EffectSchemaTraitExpression.ts diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts new file mode 100644 index 0000000..7f5dc9e --- /dev/null +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -0,0 +1,53 @@ +import { Schema as S } from "@effect/schema" +import { Simplify } from "type-fest" +import { Trait, TraitTuple } from "../Trait" +import { StaticImplements, TraitExpression } from "../TraitExpression" +import { Extend } from "../util" + + +export class EffectSchemaTraitExpression< + Superclass extends S.Class, + Fields extends S.Struct.Fields, + A, I, R, C, + Inherited extends object, + Proto, + + const Traits extends readonly Trait[], +> { + constructor( + readonly superclass: Superclass, + readonly traits: Traits, + ) {} + + + extends(): ( + S.Class< + Self, + Fields, + A, I, R, C, + Simplify< + Extend<[ + Inherited, + ...TraitTuple.MapImplInstance + ]> + >, + Proto + > & + + Simplify< + Extend> + > + ) { + return this.traits.reduce( + (previous, trait) => trait.apply(previous), + this.superclass, + ) as any + } + + + staticImplements(_target: StaticImplements>, _context: any) {} + + get staticImplementsStage2() { + return (_target: StaticImplements>) => {} + } +} -- 2.49.1 From 6979cc27a7a7d36679cdf8baa34465331cddef56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 9 May 2024 03:45:34 +0200 Subject: [PATCH 03/23] Effect tests --- src/effect/tests.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/effect/tests.ts diff --git a/src/effect/tests.ts b/src/effect/tests.ts new file mode 100644 index 0000000..2c653c9 --- /dev/null +++ b/src/effect/tests.ts @@ -0,0 +1,30 @@ +import { Schema as S } from "@effect/schema" +import { Implements } from "../TraitExpression" +import { expression } from "../TraitExpressionBuilder" +import { extendsEffectSchemaExpression } from "../effect" + + +const UserSchema = S.Class("User")({ + id: S.BigIntFromSelf +}) + +const userExp = expression + .extends(UserSchema) + .build() + +@userExp.staticImplements +class User extends extendsEffectSchemaExpression(userExp)() implements Implements { + static aStaticMethodThatShouldBeInherited() {} +} + + +const AdminSchema = User.extend("Admin")({ +}) + +const adminExp = expression + .extends(AdminSchema) + .build() + +@adminExp.staticImplements +class Admin extends extendsEffectSchemaExpression(adminExp)() implements Implements { +} -- 2.49.1 From 7e68b0002d7772a32f9b26736d0fc496cd98ca30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 9 May 2024 04:15:27 +0200 Subject: [PATCH 04/23] EffectSchemaTraitExpressionBuilder work --- .../EffectSchemaTraitExpressionBuilder.ts | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index a67c018..051e0cb 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -7,20 +7,32 @@ import { traitsUnique } from "../traitsUnique" export class EffectSchemaTraitExpressionBuilder< - Superclass extends S.Class, - const Traits extends readonly Trait[], - Fields extends S.Struct.Fields, A, I, R, C, Inherited extends object, Proto, + Static extends object, + + const Traits extends readonly Trait[], > { constructor( - readonly expressionSuperclass: Superclass, + readonly expressionSuperclass: S.Class & Static, readonly expressionTraits: Traits, ) {} + class( + identifier: string, + fields: NewFields, + annotations?: S.Annotations.Schema + ) { + return new EffectSchemaTraitExpressionBuilder( + S.Class(identifier)(fields, annotations), + this.expressionTraits, + ) + } + + extends< Super extends S.Class, @@ -58,13 +70,13 @@ export class EffectSchemaTraitExpressionBuilder< >( ...traits: T ): EffectSchemaTraitExpressionBuilder< - Superclass, - TraitExpressionBuilder.ExpressesReturnTypeTraits, - Fields, A, I, R, C, Inherited, - Proto + Proto, + Static, + + TraitExpressionBuilder.ExpressesReturnTypeTraits > { return new EffectSchemaTraitExpressionBuilder( this.expressionSuperclass, -- 2.49.1 From b092fdef5889bcb9e56466c852f5590f41ff435f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 9 May 2024 13:39:12 +0200 Subject: [PATCH 05/23] Effect schema work --- src/effect/EffectSchemaTraitExpression.ts | 10 +- .../EffectSchemaTraitExpressionBuilder.ts | 116 ++++++++++++------ 2 files changed, 86 insertions(+), 40 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index 7f5dc9e..96a3b5c 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -8,7 +8,10 @@ import { Extend } from "../util" export class EffectSchemaTraitExpression< Superclass extends S.Class, Fields extends S.Struct.Fields, - A, I, R, C, + A, + I, + R, + C, Inherited extends object, Proto, @@ -24,7 +27,10 @@ export class EffectSchemaTraitExpression< S.Class< Self, Fields, - A, I, R, C, + A, + I, + R, + C, Simplify< Extend<[ Inherited, diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index 051e0cb..fd9d063 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,14 +1,84 @@ import { Schema as S } from "@effect/schema" +import { Simplify } from "effect/Types" import { Trait } from "../Trait" import { TraitExpression } from "../TraitExpression" import { TraitExpressionBuilder } from "../TraitExpressionBuilder" import { spreadSupertraits } from "../spreadSupertraits" import { traitsUnique } from "../traitsUnique" +import { StaticMembers } from "../util" + + +export class EffectSchemaInitialTraitExpressionBuilder { + class< + Fields extends S.Struct.Fields + >( + identifier: string, + fields: Fields, + annotations?: S.Annotations.Schema, + ) { + return new EffectSchemaTraitExpressionBuilder( + S.Class(identifier)(fields, annotations), + [], + ) + } + + taggedClass< + Tag extends string, + Fields extends S.Struct.Fields, + >( + tag: Tag, + fields: Fields, + annotations?: S.Annotations.Schema, + ) { + return new EffectSchemaTraitExpressionBuilder( + S.TaggedClass()(tag, fields, annotations), + [], + ) + } + + extends< + Super extends S.Class, + + Fields extends S.Struct.Fields, + A, + I, + R, + C, + Inherited extends object, + Proto, + + NewFields extends S.Struct.Fields, + >( + superclass: Super | S.Class, + identifier: string, + fields: NewFields, + annotations?: S.Annotations.Schema, + ) { + return new EffectSchemaTraitExpressionBuilder< + Fields & NewFields, + Simplify>, + Simplify>, + R | S.Struct.Context, + Simplify>, + InstanceType, + Proto, + StaticMembers, + + readonly [] + >( + superclass.extend(identifier)(fields, annotations) as any, + [], + ) + } +} export class EffectSchemaTraitExpressionBuilder< Fields extends S.Struct.Fields, - A, I, R, C, + A, + I, + R, + C, Inherited extends object, Proto, Static extends object, @@ -21,42 +91,6 @@ export class EffectSchemaTraitExpressionBuilder< ) {} - class( - identifier: string, - fields: NewFields, - annotations?: S.Annotations.Schema - ) { - return new EffectSchemaTraitExpressionBuilder( - S.Class(identifier)(fields, annotations), - this.expressionTraits, - ) - } - - - extends< - Super extends S.Class, - - SuperFields extends S.Struct.Fields, - SuperA, SuperI, SuperR, SuperC, - SuperInherited extends object, - SuperProto, - >( - superclass: Super | S.Class - ) { - return new EffectSchemaTraitExpressionBuilder< - Super, - Traits, - - SuperFields, - SuperA, SuperI, SuperR, SuperC, - SuperInherited, - SuperProto - >( - superclass as Super, - this.expressionTraits, - ) - } - expresses< const T extends readonly Trait< TraitExpression< @@ -71,7 +105,10 @@ export class EffectSchemaTraitExpressionBuilder< ...traits: T ): EffectSchemaTraitExpressionBuilder< Fields, - A, I, R, C, + A, + I, + R, + C, Inherited, Proto, Static, @@ -88,3 +125,6 @@ export class EffectSchemaTraitExpressionBuilder< ) } } + + +export const effectSchemaExpression = new EffectSchemaInitialTraitExpressionBuilder() -- 2.49.1 From 4e5cd07ef31543e116ae574118f23e53072c2d7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 9 May 2024 17:31:59 +0200 Subject: [PATCH 06/23] Effect work --- src/effect/EffectSchemaTraitExpression.ts | 13 ++++--- .../EffectSchemaTraitExpressionBuilder.ts | 37 ++++++++++++++++++- src/effect/tests.ts | 27 ++++++-------- 3 files changed, 55 insertions(+), 22 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index 96a3b5c..95b978f 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -6,7 +6,6 @@ import { Extend } from "../util" export class EffectSchemaTraitExpression< - Superclass extends S.Class, Fields extends S.Struct.Fields, A, I, @@ -14,11 +13,12 @@ export class EffectSchemaTraitExpression< C, Inherited extends object, Proto, + Static extends object, const Traits extends readonly Trait[], > { constructor( - readonly superclass: Superclass, + readonly superclass: S.Class & Static, readonly traits: Traits, ) {} @@ -41,7 +41,10 @@ export class EffectSchemaTraitExpression< > & Simplify< - Extend> + Extend<[ + Static, + ...TraitTuple.MapImplStaticMembers + ]> > ) { return this.traits.reduce( @@ -51,9 +54,9 @@ export class EffectSchemaTraitExpression< } - staticImplements(_target: StaticImplements>, _context: any) {} + staticImplements(_target: StaticImplements>, _context: any) {} get staticImplementsStage2() { - return (_target: StaticImplements>) => {} + return (_target: StaticImplements>) => {} } } diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index fd9d063..afa83db 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,11 +1,12 @@ import { Schema as S } from "@effect/schema" import { Simplify } from "effect/Types" -import { Trait } from "../Trait" +import { Trait, TraitTuple } from "../Trait" import { TraitExpression } from "../TraitExpression" import { TraitExpressionBuilder } from "../TraitExpressionBuilder" import { spreadSupertraits } from "../spreadSupertraits" import { traitsUnique } from "../traitsUnique" -import { StaticMembers } from "../util" +import { Extendable, StaticMembers } from "../util" +import { EffectSchemaTraitExpression } from "./EffectSchemaTraitExpression" export class EffectSchemaInitialTraitExpressionBuilder { @@ -124,6 +125,38 @@ export class EffectSchemaTraitExpressionBuilder< ]), ) } + + + build(): ( + Extendable> extends false + ? "Type conflict between the traits abstract definitions." + : Extendable> extends false + ? "Type conflict between the traits static abstract definitions." + : Extendable<[ + InstanceType, + ...TraitTuple.MapImplInstance, + ]> extends false + ? "Type conflict between the traits implementation instance and/or the superclass instance." + : Extendable<[ + Static, + ...TraitTuple.MapImplStaticMembers, + ]> extends false + ? "Type conflict between the traits implementation static members and/or the superclass static members." + : EffectSchemaTraitExpression< + Fields, + A, + I, + R, + C, + Inherited, + Proto, + Static, + + Traits + > + ) { + return new EffectSchemaTraitExpression(this.expressionSuperclass, this.expressionTraits) as any + } } diff --git a/src/effect/tests.ts b/src/effect/tests.ts index 2c653c9..7d6593f 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -1,30 +1,27 @@ import { Schema as S } from "@effect/schema" import { Implements } from "../TraitExpression" -import { expression } from "../TraitExpressionBuilder" -import { extendsEffectSchemaExpression } from "../effect" +import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder" -const UserSchema = S.Class("User")({ - id: S.BigIntFromSelf -}) - -const userExp = expression - .extends(UserSchema) +const userExp = effectSchemaExpression + .class("User", { + id: S.BigIntFromSelf, + role: S.Union(S.Literal("User"), S.Literal("Admin")), + }) .build() @userExp.staticImplements -class User extends extendsEffectSchemaExpression(userExp)() implements Implements { +class User extends userExp.extends() implements Implements { static aStaticMethodThatShouldBeInherited() {} } -const AdminSchema = User.extend("Admin")({ -}) - -const adminExp = expression - .extends(AdminSchema) +const adminExp = effectSchemaExpression + .extends(User, "User", { + role: S.Literal("Admin") + }) .build() @adminExp.staticImplements -class Admin extends extendsEffectSchemaExpression(adminExp)() implements Implements { +class Admin extends adminExp.extends() implements Implements { } -- 2.49.1 From d6be922c4d4519206ad80a65f24c9fb3cec4a429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 9 May 2024 23:01:05 +0200 Subject: [PATCH 07/23] Effect work --- src/TraitExpression.ts | 28 +++++++++++++++-------- src/effect/EffectSchemaTraitExpression.ts | 10 +++++--- src/effect/tests.ts | 3 +++ 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/TraitExpression.ts b/src/TraitExpression.ts index b7a8f80..1198170 100644 --- a/src/TraitExpression.ts +++ b/src/TraitExpression.ts @@ -4,10 +4,20 @@ import { TraitBuilder } from "./TraitBuilder" import { Extend, StaticMembers } from "./util" +export type TraitExpressionLike< + Superclass extends AbstractClass, + Traits extends readonly Trait[], +> = { + readonly superclass: Superclass, + readonly traits: Traits, +} + + export class TraitExpression< Superclass extends AbstractClass, const Traits extends readonly Trait[], -> { +> +implements TraitExpressionLike { constructor( readonly superclass: Superclass, readonly traits: Traits, @@ -84,13 +94,13 @@ export namespace TraitExpression { } export type Superclass = ( - T extends TraitExpression + T extends TraitExpressionLike ? Superclass : never ) export type Traits = ( - T extends TraitExpression + T extends TraitExpressionLike ? Traits : never ) @@ -98,7 +108,7 @@ export namespace TraitExpression { export type Implements< - Exp extends TraitExpression[]> + Exp extends TraitExpressionLike[]> > = ( Simplify< Extend< @@ -110,7 +120,7 @@ export type Implements< ) export type StaticImplements< - Exp extends TraitExpression[]> + Exp extends TraitExpressionLike[]> > = ( Simplify< Extend< @@ -123,7 +133,7 @@ export type StaticImplements< export type TraitExpressionClass< - Exp extends TraitExpression[]> + Exp extends TraitExpressionLike[]> > = ( AbstractClass< TraitExpressionInstance, @@ -133,7 +143,7 @@ export type TraitExpressionClass< ) export type TraitExpressionConcreteClass< - Exp extends TraitExpression[]> + Exp extends TraitExpressionLike[]> > = ( Class< TraitExpressionInstance, @@ -143,7 +153,7 @@ export type TraitExpressionConcreteClass< ) export type TraitExpressionInstance< - Exp extends TraitExpression[]> + Exp extends TraitExpressionLike[]> > = ( InstanceType> & // Keep the instance of the superclass outside of any kind of type manipulation // as it can accidentely remove abstract properties @@ -155,7 +165,7 @@ export type TraitExpressionInstance< ) export type TraitExpressionStaticMembers< - Exp extends TraitExpression[]> + Exp extends TraitExpressionLike[]> > = ( Simplify< Extend<[ diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index 95b978f..7f3cfd4 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -1,7 +1,7 @@ import { Schema as S } from "@effect/schema" import { Simplify } from "type-fest" import { Trait, TraitTuple } from "../Trait" -import { StaticImplements, TraitExpression } from "../TraitExpression" +import { StaticImplements, TraitExpressionLike } from "../TraitExpression" import { Extend } from "../util" @@ -16,6 +16,10 @@ export class EffectSchemaTraitExpression< Static extends object, const Traits extends readonly Trait[], +> +implements TraitExpressionLike< + S.Class & Static, + Traits > { constructor( readonly superclass: S.Class & Static, @@ -54,9 +58,9 @@ export class EffectSchemaTraitExpression< } - staticImplements(_target: StaticImplements>, _context: any) {} + staticImplements(_target: StaticImplements, _context: any) {} get staticImplementsStage2() { - return (_target: StaticImplements>) => {} + return (_target: StaticImplements) => {} } } diff --git a/src/effect/tests.ts b/src/effect/tests.ts index 7d6593f..8910c9c 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -12,6 +12,7 @@ const userExp = effectSchemaExpression @userExp.staticImplements class User extends userExp.extends() implements Implements { + aMethodThatShouldBeInherited() {} static aStaticMethodThatShouldBeInherited() {} } @@ -25,3 +26,5 @@ const adminExp = effectSchemaExpression @adminExp.staticImplements class Admin extends adminExp.extends() implements Implements { } + +new Admin({ id: 0n, role: "Admin" }).aMethodThatShouldBeInherited() -- 2.49.1 From 63045c5d783e6605b94880fe733b57a541fe9801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 9 May 2024 23:49:11 +0200 Subject: [PATCH 08/23] Effect schema work --- .../EffectSchemaTraitExpressionBuilder.ts | 33 ++++++++++++++++++- src/effect/tests.ts | 9 ++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index afa83db..42ad51e 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,5 +1,5 @@ import { Schema as S } from "@effect/schema" -import { Simplify } from "effect/Types" +import { Mutable, Simplify } from "effect/Types" import { Trait, TraitTuple } from "../Trait" import { TraitExpression } from "../TraitExpression" import { TraitExpressionBuilder } from "../TraitExpressionBuilder" @@ -92,6 +92,37 @@ export class EffectSchemaTraitExpressionBuilder< ) {} + mutable(): EffectSchemaTraitExpressionBuilder< + Fields, + Mutable, + I, + R, + C, + Inherited, + Proto, + Static, + + Traits + > { + return new EffectSchemaTraitExpressionBuilder(this.expressionSuperclass, this.expressionTraits) + } + + mutableEncoded(): EffectSchemaTraitExpressionBuilder< + Fields, + A, + Mutable, + R, + C, + Inherited, + Proto, + Static, + + Traits + > { + return new EffectSchemaTraitExpressionBuilder(this.expressionSuperclass, this.expressionTraits) + } + + expresses< const T extends readonly Trait< TraitExpression< diff --git a/src/effect/tests.ts b/src/effect/tests.ts index 8910c9c..34b0b97 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -8,6 +8,8 @@ const userExp = effectSchemaExpression id: S.BigIntFromSelf, role: S.Union(S.Literal("User"), S.Literal("Admin")), }) + .mutable() + .mutableEncoded() .build() @userExp.staticImplements @@ -16,6 +18,10 @@ class User extends userExp.extends() implements Implements static aStaticMethodThatShouldBeInherited() {} } +const user = new User({ id: 0n, role: "User" }) +user.id = 0n +type UserEncoded = S.Schema.Encoded + const adminExp = effectSchemaExpression .extends(User, "User", { @@ -27,4 +33,5 @@ const adminExp = effectSchemaExpression class Admin extends adminExp.extends() implements Implements { } -new Admin({ id: 0n, role: "Admin" }).aMethodThatShouldBeInherited() +const admin = new Admin({ id: 1n, role: "Admin" }) +// admin.id = 1n -- 2.49.1 From 8d6d99ef0f96b4cbcd4d65aa33eca7f560bfde32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 9 May 2024 23:51:10 +0200 Subject: [PATCH 09/23] Effect schema lib --- src/effect/lib.ts | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/effect/lib.ts diff --git a/src/effect/lib.ts b/src/effect/lib.ts new file mode 100644 index 0000000..1d4762b --- /dev/null +++ b/src/effect/lib.ts @@ -0,0 +1,2 @@ +export { EffectSchemaTraitExpression } from "./EffectSchemaTraitExpression" +export { EffectSchemaInitialTraitExpressionBuilder, EffectSchemaTraitExpressionBuilder, effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder" -- 2.49.1 From 199b158ace2559b1188c3b8d273b7099f62f00e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 9 May 2024 23:55:23 +0200 Subject: [PATCH 10/23] Dependencies upgrade --- bun.lockb | Bin 151871 -> 160474 bytes package.json | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bun.lockb b/bun.lockb index cae4041c9f80f849eb51d54648713cb77556cae3..fe3e53f4c4369169314e280546e1af8e5071604b 100755 GIT binary patch delta 28224 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 diff --git a/package.json b/package.json index 2e38b31..d5b0c92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thilawyn/traitify-ts", - "version": "0.1.20", + "version": "0.1.21", "type": "module", "publishConfig": { "registry": "https://git.jvalver.de/api/packages/thilawyn/npm/" @@ -30,18 +30,18 @@ }, "dependencies": { "remeda": "^1.61.0", - "type-fest": "^4.18.0" + "type-fest": "^4.18.2" }, "devDependencies": { "bun-types": "latest", "npm-check-updates": "^16.14.20", "npm-sort": "^0.0.4", "tsup": "^8.0.2", - "tsx": "^4.7.3", + "tsx": "^4.9.3", "typescript": "^5.4.5" }, "optionalDependencies": { - "@effect/schema": "^0.66.12", - "effect": "^3.1.0" + "@effect/schema": "^0.66.16", + "effect": "^3.1.3" } } -- 2.49.1 From 74b9275268da1861b7ade9556e2864b842f5f31b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 10 May 2024 00:20:44 +0200 Subject: [PATCH 11/23] Build system work --- package.json | 10 ++++++++++ tsup.config.ts | 5 +++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d5b0c92..76862df 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,16 @@ "types": "./dist/lib.d.cts", "default": "./dist/lib.cjs" } + }, + "./effect": { + "import": { + "types": "./dist/effect/lib.d.ts", + "default": "./dist/effect/lib.js" + }, + "require": { + "types": "./dist/effect/lib.d.cts", + "default": "./dist/effect/lib.cjs" + } } }, "scripts": { diff --git a/tsup.config.ts b/tsup.config.ts index 3f59156..8d6a0de 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -2,10 +2,11 @@ import { defineConfig } from "tsup" export default defineConfig({ - entry: ["./src/lib.ts"], + entry: ["./src/lib.ts", "./src/effect/lib.ts"], format: ["esm", "cjs"], + skipNodeModulesBundle: true, dts: true, - splitting: false, + splitting: true, sourcemap: true, clean: true, }) -- 2.49.1 From daac666041911c60487f4f23e1ed378c1e83914f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 11 May 2024 00:05:41 +0200 Subject: [PATCH 12/23] Fixed effect --- src/effect/EffectSchemaTraitExpression.ts | 17 +-- .../EffectSchemaTraitExpressionBuilder.ts | 126 +++++++++--------- src/effect/tests.ts | 26 +++- 3 files changed, 91 insertions(+), 78 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index 7f3cfd4..7707758 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -7,10 +7,7 @@ import { Extend } from "../util" export class EffectSchemaTraitExpression< Fields extends S.Struct.Fields, - A, - I, - R, - C, + A, I, R, C, Inherited extends object, Proto, Static extends object, @@ -18,12 +15,13 @@ export class EffectSchemaTraitExpression< const Traits extends readonly Trait[], > implements TraitExpressionLike< - S.Class & Static, + S.Class, Traits > { constructor( - readonly superclass: S.Class & Static, - readonly traits: Traits, + readonly superclass: S.Class, + readonly superclassStatic: Static, + readonly traits: Traits, ) {} @@ -31,10 +29,7 @@ implements TraitExpressionLike< S.Class< Self, Fields, - A, - I, - R, - C, + A, I, R, C, Simplify< Extend<[ Inherited, diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index 42ad51e..126404c 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,5 +1,6 @@ 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 { TraitExpression } from "../TraitExpression" import { TraitExpressionBuilder } from "../TraitExpressionBuilder" @@ -19,6 +20,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { ) { return new EffectSchemaTraitExpressionBuilder( S.Class(identifier)(fields, annotations), + {}, [], ) } @@ -33,6 +35,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { ) { return new EffectSchemaTraitExpressionBuilder( S.TaggedClass()(tag, fields, annotations), + {}, [], ) } @@ -41,10 +44,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { Super extends S.Class, Fields extends S.Struct.Fields, - A, - I, - R, - C, + A, I, R, C, Inherited extends object, Proto, @@ -55,19 +55,22 @@ export class EffectSchemaInitialTraitExpressionBuilder { fields: NewFields, annotations?: S.Annotations.Schema, ) { - return new EffectSchemaTraitExpressionBuilder< - Fields & NewFields, - Simplify>, - Simplify>, - R | S.Struct.Context, - Simplify>, - InstanceType, - Proto, - StaticMembers, + return new EffectSchemaTraitExpressionBuilder( + superclass.extend(identifier)(fields, annotations) as S.Class< + unknown, + Fields & NewFields, + Types.Simplify>, + Types.Simplify>, + R | S.Struct.Context, + Types.Simplify>, + InstanceType, + Proto + >, + + {} as Simplify< + Omit, keyof S.Class> + >, - readonly [] - >( - superclass.extend(identifier)(fields, annotations) as any, [], ) } @@ -76,10 +79,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { export class EffectSchemaTraitExpressionBuilder< Fields extends S.Struct.Fields, - A, - I, - R, - C, + A, I, R, C, Inherited extends object, Proto, Static extends object, @@ -87,39 +87,42 @@ export class EffectSchemaTraitExpressionBuilder< const Traits extends readonly Trait[], > { constructor( - readonly expressionSuperclass: S.Class & Static, - readonly expressionTraits: Traits, + readonly expressionSuperclass: S.Class, + readonly expressionSuperclassStatic: Static, + readonly expressionTraits: Traits, ) {} - mutable(): EffectSchemaTraitExpressionBuilder< - Fields, - Mutable, - I, - R, - C, - Inherited, - Proto, - Static, - - Traits - > { - return new EffectSchemaTraitExpressionBuilder(this.expressionSuperclass, this.expressionTraits) + mutable() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, + this.expressionSuperclassStatic, + this.expressionTraits, + ) } - mutableEncoded(): EffectSchemaTraitExpressionBuilder< - Fields, - A, - Mutable, - R, - C, - Inherited, - Proto, - Static, + immutable() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, + this.expressionSuperclassStatic, + this.expressionTraits, + ) + } - Traits - > { - return new EffectSchemaTraitExpressionBuilder(this.expressionSuperclass, this.expressionTraits) + mutableEncoded() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclassStatic, + this.expressionTraits, + ) + } + + immutableEncoded() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclassStatic, + this.expressionTraits, + ) } @@ -135,25 +138,15 @@ export class EffectSchemaTraitExpressionBuilder< >[] >( ...traits: T - ): EffectSchemaTraitExpressionBuilder< - Fields, - A, - I, - R, - C, - Inherited, - Proto, - Static, - - TraitExpressionBuilder.ExpressesReturnTypeTraits - > { + ) { return new EffectSchemaTraitExpressionBuilder( this.expressionSuperclass, + this.expressionSuperclassStatic, traitsUnique([ ...this.expressionTraits, ...spreadSupertraits(traits), - ]), + ]) as TraitExpressionBuilder.ExpressesReturnTypeTraits, ) } @@ -175,10 +168,7 @@ export class EffectSchemaTraitExpressionBuilder< ? "Type conflict between the traits implementation static members and/or the superclass static members." : EffectSchemaTraitExpression< Fields, - A, - I, - R, - C, + A, I, R, C, Inherited, Proto, Static, @@ -186,7 +176,11 @@ export class EffectSchemaTraitExpressionBuilder< Traits > ) { - return new EffectSchemaTraitExpression(this.expressionSuperclass, this.expressionTraits) as any + return new EffectSchemaTraitExpression( + this.expressionSuperclass, + this.expressionSuperclassStatic, + this.expressionTraits, + ) as any } } diff --git a/src/effect/tests.ts b/src/effect/tests.ts index 34b0b97..2ed34b7 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -1,6 +1,26 @@ import { Schema as S } from "@effect/schema" import { Implements } from "../TraitExpression" import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder" +import { StaticMembers } from "../util" +import { Trait } from "../Trait" +import { EffectSchemaTraitExpression } from "./EffectSchemaTraitExpression" + + +type Extr = + 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 @@ -27,11 +47,15 @@ const adminExp = effectSchemaExpression .extends(User, "User", { role: S.Literal("Admin") }) + .immutable() .build() +adminExp.superclass +type T = Extr + @adminExp.staticImplements class Admin extends adminExp.extends() implements Implements { } const admin = new Admin({ id: 1n, role: "Admin" }) -// admin.id = 1n +// admin.role = "Admin" -- 2.49.1 From 35016a7c4660ca64b38dfd559eb69b6d2b4d79fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 11 May 2024 00:27:20 +0200 Subject: [PATCH 13/23] Dependencies upgrade --- bun.lockb | Bin 160474 -> 160473 bytes package.json | 4 ++-- src/effect.ts | 39 --------------------------------------- src/effect/tests.ts | 4 +--- src/lib.ts | 1 - 5 files changed, 3 insertions(+), 45 deletions(-) delete mode 100644 src/effect.ts diff --git a/bun.lockb b/bun.lockb index fe3e53f4c4369169314e280546e1af8e5071604b..79b98510527f96930d7da6986d2b95604dd0edd3 100755 GIT binary patch delta 351 zcmcchl=J3O&Ix*oO^o-rXC>S_a(wzZDIuqysS6fwa#%cL<8Gnjzto-QZ2RN6(chDo zbA2@f0~Z5B!?(=~dENOYrvz(E7LexHEFt5P&S?u2X8;1{$rq)xLBfnXC(mrQXZl~g z`Bw99X$QZMPT$CHTNk$Rv4`F>(BiVY=KNt+jY8$}mf6xaOR5a@G=zx{enfk6EsiSQdQj@8dtvPdP>UNchn zS1N;C2QslMK-;hWe3$#wU*;||Qx;2SCwrWlaSkNT= z$*Mr8>p)tU=9Eu7+BqJZX8jh>`L%3bbMe;A|7L|t`5g~eoauB(LU4Pk9;0Umiz_;w30#u@7w8tWM`q^6~%CYLZU#4FsN(s<_R qc8H9gF$2T*?Zsaha~T<(wm[], ->( - expression: TraitExpression< - S.Class, - Traits - > -) { - return (): ( - S.Class< - Self, - Fields, - A, I, R, C, - Simplify< - Extend<[ - Inherited, - ...TraitTuple.MapImplInstance - ]> - >, - Proto - > & - - Simplify< - Extend> - > - ) => expression.extends as any -} diff --git a/src/effect/tests.ts b/src/effect/tests.ts index 2ed34b7..bfbdaad 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -1,9 +1,7 @@ import { Schema as S } from "@effect/schema" import { Implements } from "../TraitExpression" -import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder" -import { StaticMembers } from "../util" -import { Trait } from "../Trait" import { EffectSchemaTraitExpression } from "./EffectSchemaTraitExpression" +import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder" type Extr = diff --git a/src/lib.ts b/src/lib.ts index 32077ec..a96aa6a 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -2,4 +2,3 @@ export { Trait, TraitClass, TraitConcreteClass, TraitInstance, TraitStaticMember export { ImplStatic, TraitBuilder, implStaticInstantiableThis, implStaticThis, trait } from "./TraitBuilder" export { Implements, StaticImplements, TraitExpression, TraitExpressionClass, TraitExpressionConcreteClass, TraitExpressionInstance, TraitExpressionStaticMembers } from "./TraitExpression" export { TraitExpressionBuilder, expression } from "./TraitExpressionBuilder" -export { extendsEffectSchemaExpression } from "./effect" -- 2.49.1 From 94f9a872b17519925e1701d1f2bb870e1a9e9b9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 11 May 2024 01:08:56 +0200 Subject: [PATCH 14/23] Fixed --- src/effect/EffectSchemaTraitExpression.ts | 8 +- .../EffectSchemaTraitExpressionBuilder.ts | 73 +++++++++---------- src/effect/tests.ts | 9 +-- 3 files changed, 42 insertions(+), 48 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index 7707758..a791036 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -7,7 +7,7 @@ import { Extend } from "../util" export class EffectSchemaTraitExpression< Fields extends S.Struct.Fields, - A, I, R, C, + I, R, C, Inherited extends object, Proto, Static extends object, @@ -15,11 +15,11 @@ export class EffectSchemaTraitExpression< const Traits extends readonly Trait[], > implements TraitExpressionLike< - S.Class, + S.Class, Traits > { constructor( - readonly superclass: S.Class, + readonly superclass: S.Class, readonly superclassStatic: Static, readonly traits: Traits, ) {} @@ -29,7 +29,7 @@ implements TraitExpressionLike< S.Class< Self, Fields, - A, I, R, C, + I, R, C, Simplify< Extend<[ Inherited, diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index 126404c..f4b121a 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,6 +1,5 @@ import { Schema as S } from "@effect/schema" import * as Types from "effect/Types" -import { Simplify } from "type-fest" import { Trait, TraitTuple } from "../Trait" import { TraitExpression } from "../TraitExpression" import { TraitExpressionBuilder } from "../TraitExpressionBuilder" @@ -41,36 +40,32 @@ export class EffectSchemaInitialTraitExpressionBuilder { } extends< - Super extends S.Class, - + Super extends S.Class, + Self, Fields extends S.Struct.Fields, - A, I, R, C, + I, R, C, Inherited extends object, Proto, NewFields extends S.Struct.Fields, >( - superclass: Super | S.Class, + superclass: Super | S.Class, identifier: string, fields: NewFields, annotations?: S.Annotations.Schema, ) { return new EffectSchemaTraitExpressionBuilder( - superclass.extend(identifier)(fields, annotations) as S.Class< - unknown, - Fields & NewFields, - Types.Simplify>, - Types.Simplify>, - R | S.Struct.Context, - Types.Simplify>, - InstanceType, - Proto - >, - - {} as Simplify< - Omit, keyof S.Class> - >, - + // superclass.extend(identifier)(fields, annotations) as S.Class< + // unknown, + // Fields & NewFields, + // I & S.Struct.Encoded, + // R | S.Struct.Context, + // C & S.Struct.Constructor, + // InstanceType, + // Proto + // >, + superclass.extend(identifier)(fields, annotations), + {} as Omit, keyof S.Class>, [], ) } @@ -79,7 +74,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { export class EffectSchemaTraitExpressionBuilder< Fields extends S.Struct.Fields, - A, I, R, C, + I, R, C, Inherited extends object, Proto, Static extends object, @@ -87,31 +82,31 @@ export class EffectSchemaTraitExpressionBuilder< const Traits extends readonly Trait[], > { constructor( - readonly expressionSuperclass: S.Class, + readonly expressionSuperclass: S.Class, readonly expressionSuperclassStatic: Static, readonly expressionTraits: Traits, ) {} - mutable() { - return new EffectSchemaTraitExpressionBuilder( - this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, - this.expressionSuperclassStatic, - this.expressionTraits, - ) - } + // mutable() { + // return new EffectSchemaTraitExpressionBuilder( + // this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, + // this.expressionSuperclassStatic, + // this.expressionTraits, + // ) + // } - immutable() { - return new EffectSchemaTraitExpressionBuilder( - this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, - this.expressionSuperclassStatic, - this.expressionTraits, - ) - } + // immutable() { + // return new EffectSchemaTraitExpressionBuilder( + // this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, + // this.expressionSuperclassStatic, + // this.expressionTraits, + // ) + // } mutableEncoded() { return new EffectSchemaTraitExpressionBuilder( - this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, this.expressionSuperclassStatic, this.expressionTraits, ) @@ -119,7 +114,7 @@ export class EffectSchemaTraitExpressionBuilder< immutableEncoded() { return new EffectSchemaTraitExpressionBuilder( - this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, this.expressionSuperclassStatic, this.expressionTraits, ) @@ -168,7 +163,7 @@ export class EffectSchemaTraitExpressionBuilder< ? "Type conflict between the traits implementation static members and/or the superclass static members." : EffectSchemaTraitExpression< Fields, - A, I, R, C, + I, R, C, Inherited, Proto, Static, diff --git a/src/effect/tests.ts b/src/effect/tests.ts index bfbdaad..70a786c 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -7,7 +7,6 @@ import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder" type Extr = T extends EffectSchemaTraitExpression< infer Fields, - infer A, infer I, infer R, infer C, @@ -26,8 +25,8 @@ const userExp = effectSchemaExpression id: S.BigIntFromSelf, role: S.Union(S.Literal("User"), S.Literal("Admin")), }) - .mutable() - .mutableEncoded() + // .mutable() + // .mutableEncoded() .build() @userExp.staticImplements @@ -37,7 +36,7 @@ class User extends userExp.extends() implements Implements } const user = new User({ id: 0n, role: "User" }) -user.id = 0n +// user.id = 0n type UserEncoded = S.Schema.Encoded @@ -45,7 +44,7 @@ const adminExp = effectSchemaExpression .extends(User, "User", { role: S.Literal("Admin") }) - .immutable() + // .immutable() .build() adminExp.superclass -- 2.49.1 From f028fb5a32ef3b5a38ec31d51087a2d64489ef2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 11 May 2024 01:45:17 +0200 Subject: [PATCH 15/23] Fix --- src/effect/EffectSchemaTraitExpressionBuilder.ts | 9 --------- src/effect/tests.ts | 15 +++++++++++---- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index f4b121a..8e8139f 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -55,15 +55,6 @@ export class EffectSchemaInitialTraitExpressionBuilder { annotations?: S.Annotations.Schema, ) { return new EffectSchemaTraitExpressionBuilder( - // superclass.extend(identifier)(fields, annotations) as S.Class< - // unknown, - // Fields & NewFields, - // I & S.Struct.Encoded, - // R | S.Struct.Context, - // C & S.Struct.Constructor, - // InstanceType, - // Proto - // >, superclass.extend(identifier)(fields, annotations), {} as Omit, keyof S.Class>, [], diff --git a/src/effect/tests.ts b/src/effect/tests.ts index 70a786c..315bf07 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -4,6 +4,10 @@ import { EffectSchemaTraitExpression } from "./EffectSchemaTraitExpression" import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder" +type RequiredKeys = { + [K in keyof T]-?: {} extends Pick ? never : K + }[keyof T] + type Extr = T extends EffectSchemaTraitExpression< infer Fields, @@ -19,6 +23,10 @@ type Extr = ? Static : never +type InspectSchemaClass = T extends S.Class + ? C + : never + const userExp = effectSchemaExpression .class("User", { @@ -35,9 +43,11 @@ class User extends userExp.extends() implements Implements static aStaticMethodThatShouldBeInherited() {} } +type T1 = InspectSchemaClass +type T2 = InstanceType + const user = new User({ id: 0n, role: "User" }) // user.id = 0n -type UserEncoded = S.Schema.Encoded const adminExp = effectSchemaExpression @@ -47,9 +57,6 @@ const adminExp = effectSchemaExpression // .immutable() .build() -adminExp.superclass -type T = Extr - @adminExp.staticImplements class Admin extends adminExp.extends() implements Implements { } -- 2.49.1 From ac64dad81f1b4a775dc6e15482c1bd006dfc4386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 11 May 2024 02:15:48 +0200 Subject: [PATCH 16/23] Fix attempt --- .../EffectSchemaTraitExpressionBuilder.ts | 23 +++++++++++++++---- src/effect/tests.ts | 11 ++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index 8e8139f..50a4110 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,5 +1,6 @@ import { Schema as S } from "@effect/schema" import * as Types from "effect/Types" +import { Simplify } from "type-fest" import { Trait, TraitTuple } from "../Trait" import { TraitExpression } from "../TraitExpression" import { TraitExpressionBuilder } from "../TraitExpressionBuilder" @@ -40,7 +41,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { } extends< - Super extends S.Class, + Super extends StaticMembers>, Self, Fields extends S.Struct.Fields, I, R, C, @@ -49,14 +50,28 @@ export class EffectSchemaInitialTraitExpressionBuilder { NewFields extends S.Struct.Fields, >( - superclass: Super | S.Class, + superclass: Super | StaticMembers>, identifier: string, fields: NewFields, annotations?: S.Annotations.Schema, ) { return new EffectSchemaTraitExpressionBuilder( - superclass.extend(identifier)(fields, annotations), - {} as Omit, keyof S.Class>, + superclass.extend(identifier)(fields, annotations) as S.Class< + unknown, + Fields & NewFields, + I & S.Struct.Encoded, + R | S.Struct.Context, + C & S.Struct.Constructor, + Self, + Proto + >, + + {} as Simplify< + Omit + > + >, + [], ) } diff --git a/src/effect/tests.ts b/src/effect/tests.ts index 315bf07..a241123 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -24,7 +24,7 @@ type Extr = : never type InspectSchemaClass = T extends S.Class - ? C + ? Inherited : never @@ -38,14 +38,11 @@ const userExp = effectSchemaExpression .build() @userExp.staticImplements -class User extends userExp.extends() implements Implements { +export class User extends userExp.extends() implements Implements { aMethodThatShouldBeInherited() {} static aStaticMethodThatShouldBeInherited() {} } -type T1 = InspectSchemaClass -type T2 = InstanceType - const user = new User({ id: 0n, role: "User" }) // user.id = 0n @@ -57,8 +54,10 @@ const adminExp = effectSchemaExpression // .immutable() .build() +type T = InspectSchemaClass + @adminExp.staticImplements -class Admin extends adminExp.extends() implements Implements { +export class Admin extends adminExp.extends() implements Implements { } const admin = new Admin({ id: 1n, role: "Admin" }) -- 2.49.1 From 7cb7981854b685af324e9adcc1b0319604162a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 11 May 2024 02:22:13 +0200 Subject: [PATCH 17/23] Fix --- src/effect/EffectSchemaTraitExpressionBuilder.ts | 12 ++---------- src/effect/tests.ts | 2 -- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index 50a4110..18e6be3 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -42,7 +42,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { extends< Super extends StaticMembers>, - Self, + Self extends object, Fields extends S.Struct.Fields, I, R, C, Inherited extends object, @@ -56,15 +56,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { annotations?: S.Annotations.Schema, ) { return new EffectSchemaTraitExpressionBuilder( - superclass.extend(identifier)(fields, annotations) as S.Class< - unknown, - Fields & NewFields, - I & S.Struct.Encoded, - R | S.Struct.Context, - C & S.Struct.Constructor, - Self, - Proto - >, + superclass.extend(identifier)(fields, annotations), {} as Simplify< Omit - @adminExp.staticImplements export class Admin extends adminExp.extends() implements Implements { } -- 2.49.1 From e0c705a24d6a4263d61bf3d4094cb65e9427567b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 11 May 2024 02:48:17 +0200 Subject: [PATCH 18/23] Fix --- src/effect/EffectSchemaTraitExpressionBuilder.ts | 4 ++-- src/effect/tests.ts | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index 18e6be3..6918b16 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -104,7 +104,7 @@ export class EffectSchemaTraitExpressionBuilder< mutableEncoded() { return new EffectSchemaTraitExpressionBuilder( - this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, this.expressionSuperclassStatic, this.expressionTraits, ) @@ -112,7 +112,7 @@ export class EffectSchemaTraitExpressionBuilder< immutableEncoded() { return new EffectSchemaTraitExpressionBuilder( - this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, this.expressionSuperclassStatic, this.expressionTraits, ) diff --git a/src/effect/tests.ts b/src/effect/tests.ts index aa33f91..c51f12f 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -34,7 +34,7 @@ const userExp = effectSchemaExpression role: S.Union(S.Literal("User"), S.Literal("Admin")), }) // .mutable() - // .mutableEncoded() + .mutableEncoded() .build() @userExp.staticImplements @@ -43,6 +43,8 @@ export class User extends userExp.extends() implements Implements Date: Sat, 11 May 2024 03:32:11 +0200 Subject: [PATCH 19/23] Fix attempt --- src/effect/EffectSchemaTraitExpression.ts | 45 ++++++++++++++++------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index a791036..f42b0d9 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -1,8 +1,14 @@ import { Schema as S } from "@effect/schema" -import { Simplify } from "type-fest" +import { AbstractClass, AbstractConstructor, Simplify } from "type-fest" import { Trait, TraitTuple } from "../Trait" import { StaticImplements, TraitExpressionLike } from "../TraitExpression" -import { Extend } from "../util" +import { Extend, StaticMembers } from "../util" +import { Types } from "effect" + + +type RequiredKeys = { + [K in keyof T]-?: {} extends Pick ? never : K + }[keyof T] export class EffectSchemaTraitExpression< @@ -26,17 +32,30 @@ implements TraitExpressionLike< extends(): ( - S.Class< - Self, - Fields, - I, R, C, - Simplify< - Extend<[ - Inherited, - ...TraitTuple.MapImplInstance - ]> - >, - Proto + AbstractConstructor< + S.Struct.Type & + Omit & + Proto, + + [ + props: RequiredKeys extends never ? void | {} : Types.Simplify, + disableValidation?: boolean | undefined + ] + > & + + StaticMembers< + S.Class< + Self, + Fields, + I, R, C, + Simplify< + Extend<[ + Inherited, + ...TraitTuple.MapImplInstance + ]> + >, + Proto + > > & Simplify< -- 2.49.1 From de5bce07d825632b16613a4e3565a393a67dd3be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 11 May 2024 03:42:44 +0200 Subject: [PATCH 20/23] Fix --- src/effect/EffectSchemaTraitExpression.ts | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index f42b0d9..1cdb9d6 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -1,14 +1,8 @@ import { Schema as S } from "@effect/schema" -import { AbstractClass, AbstractConstructor, Simplify } from "type-fest" +import { AbstractConstructor, Simplify } from "type-fest" import { Trait, TraitTuple } from "../Trait" import { StaticImplements, TraitExpressionLike } from "../TraitExpression" import { Extend, StaticMembers } from "../util" -import { Types } from "effect" - - -type RequiredKeys = { - [K in keyof T]-?: {} extends Pick ? never : K - }[keyof T] export class EffectSchemaTraitExpression< @@ -37,10 +31,7 @@ implements TraitExpressionLike< Omit & Proto, - [ - props: RequiredKeys extends never ? void | {} : Types.Simplify, - disableValidation?: boolean | undefined - ] + ConstructorParameters> > & StaticMembers< -- 2.49.1 From eb6789225dedc5fd914a15bd5083a930cb44745f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 11 May 2024 22:48:35 +0200 Subject: [PATCH 21/23] Chunk fix --- package.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/package.json b/package.json index 1d4df7b..cfe6005 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,14 @@ "types": "./dist/effect/lib.d.cts", "default": "./dist/effect/lib.cjs" } + }, + "./traitsUnique-CJ9oW-Fc": { + "import": { + "types": "./dist/traitsUnique-CJ9oW-Fc.d.ts" + }, + "require": { + "types": "./dist/traitsUnique-CJ9oW-Fc.d.ts" + } } }, "scripts": { -- 2.49.1 From 62b1a57cea4b576fd1c7aec2604eedaf1770b466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 12 May 2024 01:06:44 +0200 Subject: [PATCH 22/23] Working effect schema mutability --- src/effect/EffectSchemaTraitExpression.ts | 31 +++++--- .../EffectSchemaTraitExpressionBuilder.ts | 75 ++++++++++++------- src/effect/tests.ts | 19 +---- 3 files changed, 74 insertions(+), 51 deletions(-) diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index 1cdb9d6..a3d29ca 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -6,28 +6,33 @@ import { Extend, StaticMembers } from "../util" export class EffectSchemaTraitExpression< - Fields extends S.Struct.Fields, + Fields extends S.Struct.Fields, I, R, C, - Inherited extends object, + Inherited extends object, Proto, - Static extends object, + Static extends object, - const Traits extends readonly Trait[], + const Traits extends readonly Trait[], + + const Mutability extends "Immutable" | "Mutable", + const EncodedMutability extends "Immutable" | "Mutable", > implements TraitExpressionLike< S.Class, Traits > { constructor( - readonly superclass: S.Class, - readonly superclassStatic: Static, - readonly traits: Traits, + readonly superclass: S.Class, + readonly superclassStatic: Static, + readonly traits: Traits, + readonly mutability: Mutability, + readonly encodedMutability: EncodedMutability, ) {} extends(): ( AbstractConstructor< - S.Struct.Type & + ApplyMutability, Mutability> & Omit & Proto, @@ -38,7 +43,8 @@ implements TraitExpressionLike< S.Class< Self, Fields, - I, R, C, + ApplyMutability, + R, C, Simplify< Extend<[ Inherited, @@ -69,3 +75,10 @@ implements TraitExpressionLike< return (_target: StaticImplements) => {} } } + + +type ApplyMutability = ( + Mutability extends "Immutable" + ? { +readonly [P in keyof T]: T[P] } + : { -readonly [P in keyof T]: T[P] } +) diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index 6918b16..a8d6f4c 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,5 +1,4 @@ import { Schema as S } from "@effect/schema" -import * as Types from "effect/Types" import { Simplify } from "type-fest" import { Trait, TraitTuple } from "../Trait" import { TraitExpression } from "../TraitExpression" @@ -22,6 +21,8 @@ export class EffectSchemaInitialTraitExpressionBuilder { S.Class(identifier)(fields, annotations), {}, [], + "Immutable", + "Immutable", ) } @@ -37,6 +38,8 @@ export class EffectSchemaInitialTraitExpressionBuilder { S.TaggedClass()(tag, fields, annotations), {}, [], + "Immutable", + "Immutable", ) } @@ -65,56 +68,71 @@ export class EffectSchemaInitialTraitExpressionBuilder { >, [], + "Immutable", + "Immutable", ) } } export class EffectSchemaTraitExpressionBuilder< - Fields extends S.Struct.Fields, + Fields extends S.Struct.Fields, I, R, C, - Inherited extends object, + Inherited extends object, Proto, - Static extends object, + Static extends object, - const Traits extends readonly Trait[], + const Traits extends readonly Trait[], + + const Mutability extends "Immutable" | "Mutable", + const EncodedMutability extends "Immutable" | "Mutable", > { constructor( - readonly expressionSuperclass: S.Class, - readonly expressionSuperclassStatic: Static, - readonly expressionTraits: Traits, + readonly expressionSuperclass: S.Class, + readonly expressionSuperclassStatic: Static, + readonly expressionTraits: Traits, + readonly expressionMutability: Mutability, + readonly expressionEncodedMutability: EncodedMutability, ) {} - // mutable() { - // return new EffectSchemaTraitExpressionBuilder( - // this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, - // this.expressionSuperclassStatic, - // this.expressionTraits, - // ) - // } + mutable() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass, + this.expressionSuperclassStatic, + this.expressionTraits, + "Mutable", + this.expressionEncodedMutability, + ) + } - // immutable() { - // return new EffectSchemaTraitExpressionBuilder( - // this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, - // this.expressionSuperclassStatic, - // this.expressionTraits, - // ) - // } + immutable() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass, + this.expressionSuperclassStatic, + this.expressionTraits, + "Immutable", + this.expressionEncodedMutability, + ) + } mutableEncoded() { return new EffectSchemaTraitExpressionBuilder( - this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclass, this.expressionSuperclassStatic, this.expressionTraits, + this.expressionMutability, + "Mutable", ) } immutableEncoded() { return new EffectSchemaTraitExpressionBuilder( - this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclass, this.expressionSuperclassStatic, this.expressionTraits, + this.expressionMutability, + "Immutable", ) } @@ -140,6 +158,9 @@ export class EffectSchemaTraitExpressionBuilder< ...this.expressionTraits, ...spreadSupertraits(traits), ]) as TraitExpressionBuilder.ExpressesReturnTypeTraits, + + this.expressionMutability, + this.expressionEncodedMutability, ) } @@ -166,13 +187,17 @@ export class EffectSchemaTraitExpressionBuilder< Proto, Static, - Traits + Traits, + Mutability, + EncodedMutability > ) { return new EffectSchemaTraitExpression( this.expressionSuperclass, this.expressionSuperclassStatic, this.expressionTraits, + this.expressionMutability, + this.expressionEncodedMutability, ) as any } } diff --git a/src/effect/tests.ts b/src/effect/tests.ts index c51f12f..5052c90 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -8,21 +8,6 @@ type RequiredKeys = { [K in keyof T]-?: {} extends Pick ? never : K }[keyof T] -type Extr = - T extends EffectSchemaTraitExpression< - infer Fields, - infer I, - infer R, - infer C, - infer Inherited, - infer Proto, - infer Static, - - infer Traits - > - ? Static - : never - type InspectSchemaClass = T extends S.Class ? Inherited : never @@ -33,7 +18,7 @@ const userExp = effectSchemaExpression id: S.BigIntFromSelf, role: S.Union(S.Literal("User"), S.Literal("Admin")), }) - // .mutable() + .mutable() .mutableEncoded() .build() @@ -46,7 +31,7 @@ export class User extends userExp.extends() implements Implements Date: Sun, 12 May 2024 01:08:49 +0200 Subject: [PATCH 23/23] Dependencies upgrade --- bun.lockb | Bin 160473 -> 160474 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index 79b98510527f96930d7da6986d2b95604dd0edd3..ccc9e1c91efc1a03ee0f8412d0910640344a7e0b 100755 GIT binary patch delta 13673 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 aSZ^_L0`)Ab{FO~$;y2Z@q}%M(S^ooFe1Z-D delta 13688 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