Files
traitify-ts/src/tests.ts
Julien Valverdé 45ec2dd0e3
Some checks failed
continuous-integration/drone/push Build is failing
Tests
2024-02-18 03:33:36 +01:00

103 lines
2.8 KiB
TypeScript

import { AbstractClass } from "type-fest"
import { Trait, TraitClass } from "./Trait"
import { trait } from "./TraitBuilder"
import { Implements, ImplementsStatic, TraitExpression } from "./TraitExpression"
import { expression } from "./TraitExpressionBuilder"
import { ExtendPlain, StaticMembers } from "./util"
const PrintsHelloOnNew = trait
.implement(Super => class PrintsHelloOnNew extends Super {
static readonly isPrintsHelloOnNew = true
constructor(...args: any[]) {
super(...args)
console.log("Hello!")
}
})
.build()
type PrintsHelloOnNewClass = TraitClass<typeof PrintsHelloOnNew>
const Identifiable = <ID>() => trait
.abstract(Super => class extends Super {
declare readonly id: ID
})
.implement(Super => class Identifiable extends Super {
equals(el: Identifiable) {
return this.id === el.id
}
})
.build()
const StatefulSubscription = trait
.abstract(Super => class extends Super {
declare readonly isStatefulSubscription: true
declare readonly status: (
{ _tag: "awaitingPayment" } |
{ _tag: "active", activeSince: Date, expiresAt?: Date } |
{ _tag: "expired", expiredSince: Date }
)
})
.build()
type StatefulSubscriptionClass = TraitClass<typeof StatefulSubscription>
const ActiveStatefulSubscription = expression
.expresses(StatefulSubscription)
.build()
.subtrait()
.abstract(Super => class extends Super {
declare readonly isActiveStatefulSubscription: true
declare readonly status: { _tag: "active", activeSince: Date, expiresAt?: Date }
})
.build()
type ActiveStatefulSubscriptionClass = TraitClass<typeof ActiveStatefulSubscription>
class TestSuperclass {
// id: number = 69
static test = 69
}
const exp = expression
.extends(TestSuperclass)
.expresses(
PrintsHelloOnNew,
Identifiable<bigint>(),
// Identifiable<number>(),
ActiveStatefulSubscription,
)
.build()
type Abs = Implements<typeof exp>
type AbsStatic = ImplementsStatic<typeof exp>
@exp.implementsStatic
class User extends exp.extends implements Implements<typeof exp> {
readonly isStatefulSubscription: true = true
readonly isActiveStatefulSubscription: true = true
declare status: { _tag: "active"; activeSince: Date; expiresAt?: Date | undefined }
id: bigint = -1n
}
console.log(new User())
type ExpectsObjectArray<T extends readonly object[]> = T
type MapStaticMembers<T extends readonly any[]> = {
[K in keyof T]: StaticMembers<T[K]>
}
type MapClasses<Classes extends AbstractClass<any>[]> = (
ExpectsObjectArray<
MapStaticMembers<
Classes
>
>
)
type Output = MapClasses<[typeof User]>