0.1.12 #12

Merged
Thilawyn merged 5 commits from next into master 2024-02-25 03:25:55 +01:00
4 changed files with 29 additions and 29 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "@thilawyn/traitify-ts", "name": "@thilawyn/traitify-ts",
"version": "0.1.11", "version": "0.1.12",
"type": "module", "type": "module",
"publishConfig": { "publishConfig": {
"registry": "https://git.jvalver.de/api/packages/thilawyn/npm/" "registry": "https://git.jvalver.de/api/packages/thilawyn/npm/"

View File

@@ -74,43 +74,43 @@ export namespace Trait {
export namespace TraitTuple { export namespace TraitTuple {
export type MapAbstract<T> = { export type MapAbstract<T> = {
[K in keyof T]: K extends keyof [] [K in keyof T]: K extends keyof readonly []
? T[K] ? T[K]
: Trait.Abstract<T[K]> : Trait.Abstract<T[K]>
} }
export type MapStaticAbstract<T> = { export type MapStaticAbstract<T> = {
[K in keyof T]: K extends keyof [] [K in keyof T]: K extends keyof readonly []
? T[K] ? T[K]
: Trait.StaticAbstract<T[K]> : Trait.StaticAbstract<T[K]>
} }
export type MapImplClass<T> = { export type MapImplClass<T> = {
[K in keyof T]: K extends keyof [] [K in keyof T]: K extends keyof readonly []
? T[K] ? T[K]
: Trait.ImplClass<T[K]> : Trait.ImplClass<T[K]>
} }
export type MapImplInstance<T> = { export type MapImplInstance<T> = {
[K in keyof T]: K extends keyof [] [K in keyof T]: K extends keyof readonly []
? T[K] ? T[K]
: Trait.ImplInstance<T[K]> : Trait.ImplInstance<T[K]>
} }
export type MapImplStaticMembers<T> = { export type MapImplStaticMembers<T> = {
[K in keyof T]: K extends keyof [] [K in keyof T]: K extends keyof readonly []
? T[K] ? T[K]
: Trait.ImplStaticMembers<T[K]> : Trait.ImplStaticMembers<T[K]>
} }
export type MapInstance<T> = { export type MapInstance<T> = {
[K in keyof T]: K extends keyof [] [K in keyof T]: K extends keyof readonly []
? T[K] ? T[K]
: Trait.Instance<T[K]> : Trait.Instance<T[K]>
} }
export type MapStaticMembers<T> = { export type MapStaticMembers<T> = {
[K in keyof T]: K extends keyof [] [K in keyof T]: K extends keyof readonly []
? T[K] ? T[K]
: Trait.Static<T[K]> : Trait.Static<T[K]>
} }

View File

@@ -33,7 +33,7 @@ export class TraitExpressionBuilder<
return traits.flatMap(trait => [ return traits.flatMap(trait => [
...trait.superExpression.traits, ...trait.superExpression.traits,
trait, trait,
]) as TraitExpressionBuilder.SpreadSupertraits<T> ]) as readonly Trait<any, any, any, any>[] as TraitExpressionBuilder.SpreadSupertraits<T>
} }
static traitsUniq< static traitsUniq<
@@ -49,7 +49,7 @@ export class TraitExpressionBuilder<
>( >(
traits: T traits: T
) { ) {
return uniq(traits) as TraitExpressionBuilder.TraitsUniq<T> return uniq(traits) as readonly Trait<any, any, any, any>[] as TraitExpressionBuilder.TraitsUniq<T>
} }
@@ -142,30 +142,30 @@ export class TraitExpressionBuilder<
export namespace TraitExpressionBuilder { export namespace TraitExpressionBuilder {
export type SpreadSupertraits<Traits> = ( export type SpreadSupertraits<Traits> = (
Traits extends [ Traits extends readonly [
infer El extends Trait<any, any, any, any>, infer El extends Trait<any, any, any, any>,
...infer Rest, ...infer Rest,
] ]
? [ ? readonly [
...Trait.Supertraits<El>, ...Trait.Supertraits<El>,
El, El,
...SpreadSupertraits<Rest>, ...SpreadSupertraits<Rest>,
] ]
: [] : readonly []
) )
export type TraitsUniq<Traits> = ( export type TraitsUniq<Traits> = (
Traits extends [ Traits extends readonly [
...infer Rest, ...infer Rest,
infer El extends Trait<any, any, any, any>, infer El extends Trait<any, any, any, any>,
] ]
? IsTraitInTupleFromRight<Rest, El> extends true ? IsTraitInTupleFromRight<Rest, El> extends true
? TraitsUniq<Rest> ? TraitsUniq<Rest>
: [...TraitsUniq<Rest>, El] : readonly [...TraitsUniq<Rest>, El]
: [] : readonly []
) )
type IsTraitInTupleFromRight<Traits, T> = ( type IsTraitInTupleFromRight<Traits, T> = (
Traits extends [...infer Rest, infer El] Traits extends readonly [...infer Rest, infer El]
? IsEqual<El, T> extends true ? IsEqual<El, T> extends true
? true ? true
: IsTraitInTupleFromRight<Rest, T> : IsTraitInTupleFromRight<Rest, T>
@@ -176,7 +176,7 @@ export namespace TraitExpressionBuilder {
Traits extends readonly Trait<any, any, any, any>[], Traits extends readonly Trait<any, any, any, any>[],
T extends readonly Trait<any, any, any, any>[], T extends readonly Trait<any, any, any, any>[],
> = ( > = (
TraitExpressionBuilder.TraitsUniq<[ TraitExpressionBuilder.TraitsUniq<readonly [
...Traits, ...Traits,
...TraitExpressionBuilder.SpreadSupertraits<T>, ...TraitExpressionBuilder.SpreadSupertraits<T>,
]> ]>
@@ -186,7 +186,7 @@ export namespace TraitExpressionBuilder {
Traits extends readonly Trait<any, any, any, any>[], Traits extends readonly Trait<any, any, any, any>[],
T extends readonly Trait<any, any, any, any>[], T extends readonly Trait<any, any, any, any>[],
> = ( > = (
TraitExpressionBuilder.TraitsUniq<[ TraitExpressionBuilder.TraitsUniq<readonly [
...TraitExpressionBuilder.SpreadSupertraits<T>, ...TraitExpressionBuilder.SpreadSupertraits<T>,
...Traits, ...Traits,
]> ]>

View File

@@ -22,30 +22,30 @@ import { CommonKeys } from "."
// TODO: use OverrideProperties from type-fest? // TODO: use OverrideProperties from type-fest?
export type Extend<T extends readonly object[]> = ( export type Extend<T extends readonly object[]> = (
T extends [ T extends readonly [
infer Super, infer Super,
infer Self, infer Self,
...infer Rest extends object[], ...infer Rest extends readonly object[],
] ]
? Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>> ? Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>>
? Extend<[ ? Extend<readonly [
Omit<Super, CommonKeys<Self, Super>> & Self, Omit<Super, CommonKeys<Self, Super>> & Self,
...Rest, ...Rest,
]> ]>
: never : never
: T extends [infer Self] : T extends readonly [infer Self]
? Self ? Self
: {} : {}
) )
export type Extendable<T extends readonly object[]> = ( export type Extendable<T extends readonly object[]> = (
T extends [ T extends readonly [
infer Super, infer Super,
infer Self, infer Self,
...infer Rest extends object[], ...infer Rest extends readonly object[],
] ]
? Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>> ? Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>>
? Extendable<[ ? Extendable<readonly [
Omit<Super, CommonKeys<Self, Super>> & Self, Omit<Super, CommonKeys<Self, Super>> & Self,
...Rest, ...Rest,
]> ]>
@@ -54,16 +54,16 @@ export type Extendable<T extends readonly object[]> = (
) )
export type NonExtendableKeys<T extends readonly object[]> = ( export type NonExtendableKeys<T extends readonly object[]> = (
T extends [ T extends readonly [
infer Super extends object, infer Super extends object,
infer Self extends object, infer Self extends object,
...infer Rest extends object[], ...infer Rest extends readonly object[],
] ]
? {[K in keyof Super & keyof Self]: Self[K] extends Super[K] ? {[K in keyof Super & keyof Self]: Self[K] extends Super[K]
? never ? never
: K : K
}[keyof Super & keyof Self] }[keyof Super & keyof Self]
| NonExtendableKeys<[ | NonExtendableKeys<readonly [
Super & Self, Super & Self,
...Rest, ...Rest,
]> ]>