Co-authored-by: Julien Valverdé <julien.valverde@mailo.com> Reviewed-on: https://git.jvalver.de/Thilawyn/traitify-ts/pulls/22
This commit was merged in pull request #22.
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@thilawyn/traitify-ts",
|
"name": "@thilawyn/traitify-ts",
|
||||||
"version": "0.1.21",
|
"version": "0.1.22",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"registry": "https://git.jvalver.de/api/packages/thilawyn/npm/"
|
"registry": "https://git.jvalver.de/api/packages/thilawyn/npm/"
|
||||||
@@ -30,12 +30,12 @@
|
|||||||
"default": "./dist/effect/lib.cjs"
|
"default": "./dist/effect/lib.cjs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"./traitsUnique-CJ9oW-Fc": {
|
"./traitsUnique-h-N6REho": {
|
||||||
"import": {
|
"import": {
|
||||||
"types": "./dist/traitsUnique-CJ9oW-Fc.d.ts"
|
"types": "./dist/traitsUnique-h-N6REho.d.ts"
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"types": "./dist/traitsUnique-CJ9oW-Fc.d.ts"
|
"types": "./dist/traitsUnique-h-N6REho.d.ts"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
10
src/Trait.ts
10
src/Trait.ts
@@ -1,4 +1,4 @@
|
|||||||
import { AbstractClass, Class, Simplify } from "type-fest"
|
import { AbstractConstructor, Constructor, Simplify } from "type-fest"
|
||||||
import { TraitExpression } from "./TraitExpression"
|
import { TraitExpression } from "./TraitExpression"
|
||||||
import { Extend, StaticMembers } from "./util"
|
import { Extend, StaticMembers } from "./util"
|
||||||
|
|
||||||
@@ -10,13 +10,13 @@ export class Trait<
|
|||||||
>,
|
>,
|
||||||
Abstract extends object,
|
Abstract extends object,
|
||||||
StaticAbstract extends object,
|
StaticAbstract extends object,
|
||||||
ImplClass extends AbstractClass<object, []>,
|
ImplClass extends AbstractConstructor<object, []>,
|
||||||
> {
|
> {
|
||||||
constructor(
|
constructor(
|
||||||
readonly superExpression: SuperExpression,
|
readonly superExpression: SuperExpression,
|
||||||
readonly abstract: Abstract,
|
readonly abstract: Abstract,
|
||||||
readonly staticAbstract: StaticAbstract,
|
readonly staticAbstract: StaticAbstract,
|
||||||
readonly apply: (Super: AbstractClass<object>) => ImplClass,
|
readonly apply: (Super: AbstractConstructor<object>) => ImplClass,
|
||||||
) {}
|
) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,12 +118,12 @@ export namespace TraitTuple {
|
|||||||
|
|
||||||
|
|
||||||
export type TraitClass<T extends Trait<any, any, any, any>> = (
|
export type TraitClass<T extends Trait<any, any, any, any>> = (
|
||||||
AbstractClass<TraitInstance<T>, any[]> &
|
AbstractConstructor<TraitInstance<T>, any[]> &
|
||||||
TraitStaticMembers<T>
|
TraitStaticMembers<T>
|
||||||
)
|
)
|
||||||
|
|
||||||
export type TraitConcreteClass<T extends Trait<any, any, any, any>> = (
|
export type TraitConcreteClass<T extends Trait<any, any, any, any>> = (
|
||||||
Class<TraitInstance<T>, any[]> &
|
Constructor<TraitInstance<T>, any[]> &
|
||||||
TraitStaticMembers<T>
|
TraitStaticMembers<T>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { AbstractClass, Class, Simplify } from "type-fest"
|
import { AbstractConstructor, Constructor, Simplify } from "type-fest"
|
||||||
import { Trait } from "./Trait"
|
import { Trait } from "./Trait"
|
||||||
import { TraitExpression } from "./TraitExpression"
|
import { TraitExpression } from "./TraitExpression"
|
||||||
import { Extend, StaticMembers } from "./util"
|
import { Extend, StaticMembers } from "./util"
|
||||||
@@ -14,22 +14,20 @@ export class TraitBuilder<
|
|||||||
>,
|
>,
|
||||||
Abstract extends object,
|
Abstract extends object,
|
||||||
StaticAbstract extends object,
|
StaticAbstract extends object,
|
||||||
ImplClass extends AbstractClass<object, []>,
|
ImplClass extends AbstractConstructor<object, []>,
|
||||||
> {
|
> {
|
||||||
declare ["constructor"]: typeof TraitBuilder
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
readonly traitSuperExpression: SuperExpression,
|
readonly traitSuperExpression: SuperExpression,
|
||||||
readonly traitAbstract: Abstract,
|
readonly traitAbstract: Abstract,
|
||||||
readonly traitStaticAbstract: StaticAbstract,
|
readonly traitStaticAbstract: StaticAbstract,
|
||||||
readonly traitApply: (Super: AbstractClass<object>) => ImplClass,
|
readonly traitApply: (Super: AbstractConstructor<object>) => ImplClass,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
|
|
||||||
abstract<A extends Abstract>(
|
abstract<A extends Abstract>(
|
||||||
_: (Super: AbstractClass<Abstract>) => AbstractClass<A, []>
|
_: (Super: AbstractConstructor<Abstract>) => AbstractConstructor<A, []>
|
||||||
) {
|
) {
|
||||||
return new this.constructor(
|
return new TraitBuilder(
|
||||||
this.traitSuperExpression,
|
this.traitSuperExpression,
|
||||||
{} as Simplify<A>,
|
{} as Simplify<A>,
|
||||||
this.traitStaticAbstract,
|
this.traitStaticAbstract,
|
||||||
@@ -38,9 +36,9 @@ export class TraitBuilder<
|
|||||||
}
|
}
|
||||||
|
|
||||||
staticAbstract<A extends StaticAbstract>(
|
staticAbstract<A extends StaticAbstract>(
|
||||||
_: (Super: AbstractClass<StaticAbstract>) => AbstractClass<A, []>
|
_: (Super: AbstractConstructor<StaticAbstract>) => AbstractConstructor<A, []>
|
||||||
) {
|
) {
|
||||||
return new this.constructor(
|
return new TraitBuilder(
|
||||||
this.traitSuperExpression,
|
this.traitSuperExpression,
|
||||||
this.traitAbstract,
|
this.traitAbstract,
|
||||||
{} as Simplify<A>,
|
{} as Simplify<A>,
|
||||||
@@ -53,13 +51,13 @@ export class TraitBuilder<
|
|||||||
>(
|
>(
|
||||||
apply: (Super: TraitBuilder.ImplSuper<typeof this>) => ImplClassWithAbstract
|
apply: (Super: TraitBuilder.ImplSuper<typeof this>) => ImplClassWithAbstract
|
||||||
) {
|
) {
|
||||||
return new this.constructor(
|
return new TraitBuilder(
|
||||||
this.traitSuperExpression,
|
this.traitSuperExpression,
|
||||||
this.traitAbstract,
|
this.traitAbstract,
|
||||||
this.traitStaticAbstract,
|
this.traitStaticAbstract,
|
||||||
|
|
||||||
apply as unknown as (Super: AbstractClass<object>) => (
|
apply as unknown as (Super: AbstractConstructor<object>) => (
|
||||||
AbstractClass<
|
AbstractConstructor<
|
||||||
Simplify<
|
Simplify<
|
||||||
Omit<
|
Omit<
|
||||||
InstanceType<ImplClassWithAbstract>,
|
InstanceType<ImplClassWithAbstract>,
|
||||||
@@ -98,7 +96,7 @@ export namespace TraitBuilder {
|
|||||||
infer ImplClass
|
infer ImplClass
|
||||||
>
|
>
|
||||||
? (
|
? (
|
||||||
AbstractClass<
|
AbstractConstructor<
|
||||||
Simplify<
|
Simplify<
|
||||||
Extend<[
|
Extend<[
|
||||||
Abstract,
|
Abstract,
|
||||||
@@ -121,7 +119,7 @@ export namespace TraitBuilder {
|
|||||||
|
|
||||||
|
|
||||||
export type ImplStatic<
|
export type ImplStatic<
|
||||||
ImplClass extends AbstractClass<object> & { readonly [implSuperSymbol]: true }
|
ImplClass extends AbstractConstructor<object> & { readonly [implSuperSymbol]: true }
|
||||||
> = (
|
> = (
|
||||||
Simplify<
|
Simplify<
|
||||||
Omit<StaticMembers<ImplClass>, typeof implSuperSymbol>
|
Omit<StaticMembers<ImplClass>, typeof implSuperSymbol>
|
||||||
@@ -129,14 +127,14 @@ export type ImplStatic<
|
|||||||
)
|
)
|
||||||
|
|
||||||
export function implStaticThis<
|
export function implStaticThis<
|
||||||
ImplClass extends AbstractClass<object> & { readonly [implSuperSymbol]: true },
|
ImplClass extends AbstractConstructor<object> & { readonly [implSuperSymbol]: true },
|
||||||
This extends AbstractClass<object>,
|
This extends AbstractConstructor<object>,
|
||||||
>(
|
>(
|
||||||
_Impl: ImplClass,
|
_Impl: ImplClass,
|
||||||
thisArg: This,
|
thisArg: This,
|
||||||
) {
|
) {
|
||||||
return thisArg as unknown as (
|
return thisArg as unknown as (
|
||||||
AbstractClass<
|
AbstractConstructor<
|
||||||
InstanceType<ImplClass> & InstanceType<This>,
|
InstanceType<ImplClass> & InstanceType<This>,
|
||||||
ConstructorParameters<This>
|
ConstructorParameters<This>
|
||||||
> &
|
> &
|
||||||
@@ -146,14 +144,14 @@ export function implStaticThis<
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function implStaticInstantiableThis<
|
export function implStaticInstantiableThis<
|
||||||
ImplClass extends AbstractClass<object> & { readonly [implSuperSymbol]: true },
|
ImplClass extends AbstractConstructor<object> & { readonly [implSuperSymbol]: true },
|
||||||
This extends Class<object>,
|
This extends Constructor<object>,
|
||||||
>(
|
>(
|
||||||
_Impl: ImplClass,
|
_Impl: ImplClass,
|
||||||
thisArg: This,
|
thisArg: This,
|
||||||
) {
|
) {
|
||||||
return thisArg as unknown as (
|
return thisArg as unknown as (
|
||||||
Class<
|
Constructor<
|
||||||
InstanceType<ImplClass> & InstanceType<This>,
|
InstanceType<ImplClass> & InstanceType<This>,
|
||||||
ConstructorParameters<This>
|
ConstructorParameters<This>
|
||||||
> &
|
> &
|
||||||
@@ -167,5 +165,5 @@ export const trait = new TraitBuilder(
|
|||||||
new TraitExpression(TraitExpression.NullSuperclass, []),
|
new TraitExpression(TraitExpression.NullSuperclass, []),
|
||||||
{} as object,
|
{} as object,
|
||||||
{} as object,
|
{} as object,
|
||||||
Super => class extends Super {} as AbstractClass<object>,
|
Super => class extends Super {} as AbstractConstructor<object>,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { AbstractClass, Class, Simplify } from "type-fest"
|
import { AbstractConstructor, Constructor, Simplify } from "type-fest"
|
||||||
import { Trait, TraitTuple } from "./Trait"
|
import { Trait, TraitTuple } from "./Trait"
|
||||||
import { TraitBuilder } from "./TraitBuilder"
|
import { TraitBuilder } from "./TraitBuilder"
|
||||||
import { Extend, StaticMembers } from "./util"
|
import { Extend, StaticMembers } from "./util"
|
||||||
|
|
||||||
|
|
||||||
export type TraitExpressionLike<
|
export type TraitExpressionLike<
|
||||||
Superclass extends AbstractClass<object>,
|
Superclass extends AbstractConstructor<object>,
|
||||||
Traits extends readonly Trait<any, any, any, any>[],
|
Traits extends readonly Trait<any, any, any, any>[],
|
||||||
> = {
|
> = {
|
||||||
readonly superclass: Superclass,
|
readonly superclass: Superclass,
|
||||||
@@ -14,7 +14,7 @@ export type TraitExpressionLike<
|
|||||||
|
|
||||||
|
|
||||||
export class TraitExpression<
|
export class TraitExpression<
|
||||||
Superclass extends AbstractClass<object>,
|
Superclass extends AbstractConstructor<object>,
|
||||||
const Traits extends readonly Trait<any, any, any, any>[],
|
const Traits extends readonly Trait<any, any, any, any>[],
|
||||||
>
|
>
|
||||||
implements TraitExpressionLike<Superclass, Traits> {
|
implements TraitExpressionLike<Superclass, Traits> {
|
||||||
@@ -25,7 +25,7 @@ implements TraitExpressionLike<Superclass, Traits> {
|
|||||||
|
|
||||||
|
|
||||||
get extends(): (
|
get extends(): (
|
||||||
AbstractClass<
|
AbstractConstructor<
|
||||||
InstanceType<Superclass> & // Keep the instance of the superclass outside of any kind of type manipulation
|
InstanceType<Superclass> & // Keep the instance of the superclass outside of any kind of type manipulation
|
||||||
// as it can accidentely remove abstract properties
|
// as it can accidentely remove abstract properties
|
||||||
Simplify<
|
Simplify<
|
||||||
@@ -69,7 +69,7 @@ implements TraitExpressionLike<Superclass, Traits> {
|
|||||||
Extend<TraitTuple.MapStaticAbstract<Traits>>
|
Extend<TraitTuple.MapStaticAbstract<Traits>>
|
||||||
>,
|
>,
|
||||||
|
|
||||||
AbstractClass<
|
AbstractConstructor<
|
||||||
Simplify<
|
Simplify<
|
||||||
Extend<TraitTuple.MapImplInstance<Traits>>
|
Extend<TraitTuple.MapImplInstance<Traits>>
|
||||||
>
|
>
|
||||||
@@ -135,7 +135,7 @@ export type StaticImplements<
|
|||||||
export type TraitExpressionClass<
|
export type TraitExpressionClass<
|
||||||
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
|
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
|
||||||
> = (
|
> = (
|
||||||
AbstractClass<
|
AbstractConstructor<
|
||||||
TraitExpressionInstance<Exp>,
|
TraitExpressionInstance<Exp>,
|
||||||
ConstructorParameters<TraitExpression.Superclass<Exp>>
|
ConstructorParameters<TraitExpression.Superclass<Exp>>
|
||||||
> &
|
> &
|
||||||
@@ -145,7 +145,7 @@ export type TraitExpressionClass<
|
|||||||
export type TraitExpressionConcreteClass<
|
export type TraitExpressionConcreteClass<
|
||||||
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
|
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
|
||||||
> = (
|
> = (
|
||||||
Class<
|
Constructor<
|
||||||
TraitExpressionInstance<Exp>,
|
TraitExpressionInstance<Exp>,
|
||||||
ConstructorParameters<TraitExpression.Superclass<Exp>>
|
ConstructorParameters<TraitExpression.Superclass<Exp>>
|
||||||
> &
|
> &
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { AbstractClass } from "type-fest"
|
import { AbstractConstructor } from "type-fest"
|
||||||
import { Trait, TraitTuple } from "./Trait"
|
import { Trait, TraitTuple } from "./Trait"
|
||||||
import { TraitExpression } from "./TraitExpression"
|
import { TraitExpression } from "./TraitExpression"
|
||||||
import { SpreadSupertraits, spreadSupertraits } from "./spreadSupertraits"
|
import { SpreadSupertraits, spreadSupertraits } from "./spreadSupertraits"
|
||||||
@@ -7,7 +7,7 @@ import { Extendable, StaticMembers } from "./util"
|
|||||||
|
|
||||||
|
|
||||||
export class TraitExpressionBuilder<
|
export class TraitExpressionBuilder<
|
||||||
Superclass extends AbstractClass<object>,
|
Superclass extends AbstractConstructor<object>,
|
||||||
const Traits extends readonly Trait<any, any, any, any>[],
|
const Traits extends readonly Trait<any, any, any, any>[],
|
||||||
> {
|
> {
|
||||||
constructor(
|
constructor(
|
||||||
@@ -17,7 +17,7 @@ export class TraitExpressionBuilder<
|
|||||||
|
|
||||||
|
|
||||||
extends<
|
extends<
|
||||||
Super extends AbstractClass<object>
|
Super extends AbstractConstructor<object>
|
||||||
>(
|
>(
|
||||||
superclass: Super
|
superclass: Super
|
||||||
) {
|
) {
|
||||||
@@ -125,7 +125,7 @@ export namespace TraitExpressionBuilder {
|
|||||||
)
|
)
|
||||||
|
|
||||||
export type BuildTraitExpression<
|
export type BuildTraitExpression<
|
||||||
Superclass extends AbstractClass<object>,
|
Superclass extends AbstractConstructor<object>,
|
||||||
Traits extends readonly Trait<any, any, any, any>[],
|
Traits extends readonly Trait<any, any, any, any>[],
|
||||||
> = (
|
> = (
|
||||||
Extendable<TraitTuple.MapAbstract<Traits>> extends false
|
Extendable<TraitTuple.MapAbstract<Traits>> extends false
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { Schema as S } from "@effect/schema"
|
import { Schema as S } from "@effect/schema"
|
||||||
import { Implements } from "../TraitExpression"
|
import { Implements } from "../TraitExpression"
|
||||||
import { EffectSchemaTraitExpression } from "./EffectSchemaTraitExpression"
|
|
||||||
import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder"
|
import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { AbstractClass } from "type-fest"
|
import { AbstractConstructor } from "type-fest"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -10,8 +10,8 @@ export type CommonKeys<A, B> = Extract<keyof A, keyof B>
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the static members of a class.
|
* Represents the static members of a class.
|
||||||
* @template Class - A class extending AbstractClass.
|
* @template Class - A class.
|
||||||
*/
|
*/
|
||||||
export type StaticMembers<Class extends AbstractClass<any>> = (
|
export type StaticMembers<Class extends AbstractConstructor<any>> = (
|
||||||
Omit<Class, "prototype">
|
Omit<Class, "prototype">
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user