From fe465c131cb4c7542b416249e8c3f3368e5fcacc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 20 Feb 2024 04:05:06 +0100 Subject: [PATCH 1/6] Added TODO --- src/TraitBuilder.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/TraitBuilder.ts b/src/TraitBuilder.ts index a59b333..bcc45ee 100644 --- a/src/TraitBuilder.ts +++ b/src/TraitBuilder.ts @@ -51,6 +51,7 @@ export class TraitBuilder< private readonly traitApply: (Super: AbstractClass) => ImplClass, ) {} + // TODO: consider "implements" as a name? abstract( _: (Super: AbstractClass) => AbstractClass ) { @@ -62,6 +63,7 @@ export class TraitBuilder< ) } + // TODO: consider "staticImplements" as a name? staticAbstract( _: (Super: AbstractClass) => AbstractClass ) { @@ -73,6 +75,7 @@ export class TraitBuilder< ) } + // TODO: consider "impl" as a name? implement< ImplClassWithAbstract extends ImplSuper // TODO: find a way to set the constraint to concrete classes while keeping the Super arg as an abstract class >( -- 2.49.1 From 59cb8646ab774cd9e3cd7640538335adc36e00fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 21 Feb 2024 01:12:09 +0100 Subject: [PATCH 2/6] BuildTraitExpression refactoring --- src/TraitExpressionBuilder.ts | 40 +++++++++++++---------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/src/TraitExpressionBuilder.ts b/src/TraitExpressionBuilder.ts index 4e222ee..89b01ec 100644 --- a/src/TraitExpressionBuilder.ts +++ b/src/TraitExpressionBuilder.ts @@ -16,35 +16,25 @@ type SpreadSupertraits = ( ) -type InstanceExtendable< - Superclass extends AbstractClass, - Traits extends Trait[], -> = ( - Extendable<[ - InstanceType, - ...TraitTuple.MapInstance, - ]> -) - -type StaticMembersExtendable< - Superclass extends AbstractClass, - Traits extends Trait[], -> = ( - Extendable<[ - StaticMembers, - ...TraitTuple.MapStaticMembers, - ]> -) - type BuildTraitExpression< Superclass extends AbstractClass, Traits extends Trait[], > = ( - InstanceExtendable extends false - ? "Type conflict on the instance side." - : StaticMembersExtendable extends false - ? "Type conflict on the static side." - : TraitExpression + 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<[ + StaticMembers, + ...TraitTuple.MapImplStaticMembers, + ]> extends false + ? "Type conflict between the traits implementation static members and/or the superclass static members." + : TraitExpression ) -- 2.49.1 From f20d1e44c2d3cedc4fca2428470dc277c562899a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 21 Feb 2024 03:36:39 +0100 Subject: [PATCH 3/6] TraitsUniq --- src/TraitExpressionBuilder.ts | 19 +++++++++++++++++-- src/tests.ts | 6 ------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/TraitExpressionBuilder.ts b/src/TraitExpressionBuilder.ts index 89b01ec..7921146 100644 --- a/src/TraitExpressionBuilder.ts +++ b/src/TraitExpressionBuilder.ts @@ -1,5 +1,5 @@ import { uniq } from "lodash-es" -import { AbstractClass } from "type-fest" +import { AbstractClass, IsEqual } from "type-fest" import { Trait, TraitTuple } from "./Trait" import { TraitExpression } from "./TraitExpression" import { Extendable, StaticMembers } from "./util" @@ -15,6 +15,21 @@ type SpreadSupertraits = ( : [] ) +type TraitsUniq = ( + Traits extends [...infer Rest, infer Trait] + ? IsTraitInTupleFromRight extends true + ? TraitsUniq + : [...TraitsUniq, Trait] + : [] +) +type IsTraitInTupleFromRight = ( + Traits extends [...infer Rest, infer Trait] + ? IsEqual extends true + ? true + : IsTraitInTupleFromRight + : false +) + type BuildTraitExpression< Superclass extends AbstractClass, @@ -80,7 +95,7 @@ export class TraitExpressionBuilder< ...trait.superExpression.traits, trait, ]), - ]) as [...Traits, ...SpreadSupertraits], + ]) as TraitsUniq<[...Traits, ...SpreadSupertraits]>, ) } diff --git a/src/tests.ts b/src/tests.ts index daf516b..631b011 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -81,9 +81,3 @@ class User extends exp.extends implements Implements { } console.log(new User()) - - -// type T = NonExtendableKeys<[ -// { prout: "gneugneu" }, -// { prout: string }, -// ]> -- 2.49.1 From adf8439cd6d92baaaaf1c550e7e260dd43af3e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 21 Feb 2024 04:03:30 +0100 Subject: [PATCH 4/6] Working TraitsUniq --- src/TraitExpressionBuilder.ts | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/TraitExpressionBuilder.ts b/src/TraitExpressionBuilder.ts index 7921146..efdfeb9 100644 --- a/src/TraitExpressionBuilder.ts +++ b/src/TraitExpressionBuilder.ts @@ -5,26 +5,32 @@ import { TraitExpression } from "./TraitExpression" import { Extendable, StaticMembers } from "./util" -type SpreadSupertraits = ( - T extends [infer Trait, ...infer Rest] +type SpreadSupertraits = ( + Traits extends [ + infer El extends Trait, + ...infer Rest, + ] ? [ - ...Trait.Supertraits, - Trait, + ...Trait.Supertraits, + El, ...SpreadSupertraits, ] : [] ) type TraitsUniq = ( - Traits extends [...infer Rest, infer Trait] - ? IsTraitInTupleFromRight extends true + Traits extends [ + ...infer Rest, + infer El extends Trait, + ] + ? IsTraitInTupleFromRight extends true ? TraitsUniq - : [...TraitsUniq, Trait] + : [...TraitsUniq, El] : [] ) type IsTraitInTupleFromRight = ( - Traits extends [...infer Rest, infer Trait] - ? IsEqual extends true + Traits extends [...infer Rest, infer El] + ? IsEqual extends true ? true : IsTraitInTupleFromRight : false -- 2.49.1 From 99503357053ccbd4ed317494c5c5cca0d46cade5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 21 Feb 2024 04:36:59 +0100 Subject: [PATCH 5/6] expressesFirst --- src/TraitExpressionBuilder.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/TraitExpressionBuilder.ts b/src/TraitExpressionBuilder.ts index efdfeb9..0fd65d6 100644 --- a/src/TraitExpressionBuilder.ts +++ b/src/TraitExpressionBuilder.ts @@ -105,6 +105,32 @@ export class TraitExpressionBuilder< ) } + expressesFirst< + const T extends Trait< + TraitExpression< + typeof TraitExpression.NullSuperclass, + Trait[] + >, + any, + any, + any + >[] + >( + ...traits: T + ) { + return new TraitExpressionBuilder( + this.expressionSuperclass, + + uniq([ + ...traits.flatMap(trait => [ + ...trait.superExpression.traits, + trait, + ]), + ...this.expressionTraits, + ]) as TraitsUniq<[...SpreadSupertraits, ...Traits]>, + ) + } + build() { return new TraitExpression( this.expressionSuperclass, -- 2.49.1 From c57d3413a72c43c531034b93931cdb6861946c2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 21 Feb 2024 04:42:10 +0100 Subject: [PATCH 6/6] Version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 115a0c5..df29d94 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thilawyn/traitify-ts", - "version": "0.1.6", + "version": "0.1.7", "type": "module", "publishConfig": { "registry": "https://git.jvalver.de/api/packages/thilawyn/npm/" -- 2.49.1