Co-authored-by: Julien Valverdé <julien.valverde@mailo.com> Reviewed-on: https://git.jvalver.de/Thilawyn/traitify-ts/pulls/12
This commit was merged in pull request #12.
This commit is contained in:
@@ -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/"
|
||||||
|
|||||||
14
src/Trait.ts
14
src/Trait.ts
@@ -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]>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
]>
|
]>
|
||||||
|
|||||||
@@ -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,
|
||||||
]>
|
]>
|
||||||
|
|||||||
Reference in New Issue
Block a user