Files
reffuse/packages/reffuse/src/Reffuse.ts
Julien Valverdé d8d6e87a12
Some checks failed
Lint / lint (push) Failing after 13s
Refactoring
2025-04-20 05:26:31 +02:00

49 lines
1.5 KiB
TypeScript

import type * as ReffuseContext from "./ReffuseContext.js"
import type * as ReffuseExtension from "./ReffuseExtension.js"
import * as ReffuseNamespace from "./ReffuseNamespace.js"
import type { Merge, StaticType } from "./utils.js"
export class Reffuse extends ReffuseNamespace.makeClass() {}
export const withContexts = <R2 extends Array<unknown>>(
...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext<R2[K]> }]
) => (
<
BaseClass extends ReffuseNamespace.ReffuseNamespaceClass<R1>,
R1
>(
self: BaseClass & ReffuseNamespace.ReffuseNamespaceClass<R1>
): (
{
new(): Merge<
InstanceType<BaseClass>,
{ constructor: ReffuseNamespace.ReffuseNamespaceClass<R1 | R2[number]> }
>
} &
Merge<
StaticType<BaseClass>,
StaticType<ReffuseNamespace.ReffuseNamespaceClass<R1 | R2[number]>>
>
) => class extends self {
static readonly contexts = [...self.contexts, ...contexts]
} as any
)
export const withExtension = <A extends object>(extension: ReffuseExtension.ReffuseExtension<A>) => (
<
BaseClass extends ReffuseNamespace.ReffuseNamespaceClass<R>,
R
>(
self: BaseClass & ReffuseNamespace.ReffuseNamespaceClass<R>
): (
{ new(): Merge<InstanceType<BaseClass>, A> } &
StaticType<BaseClass>
) => {
const class_ = class extends self {}
Object.assign(class_.prototype, extension())
return class_ as any
}
)