Annotations.ts
79 lines
| 2.7 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r118 | import { primitive } from "../safe"; | ||
|
|
r124 | import { TypeRegistration, DependencyRegistration, LazyDependencyRegistration, Registration, StrictTypeRegistration } from "./Configuration"; | ||
|
|
r107 | |||
| export interface InjectOptions { | ||||
| lazy?: boolean; | ||||
| } | ||||
|
|
r119 | type Compatible<T1, T2> = T2 extends T1 ? any : never; | ||
|
|
r109 | |||
|
|
r111 | type ExtractService<K, S> = K extends keyof S ? S[K] : K; | ||
|
|
r109 | |||
|
|
r118 | type ExtractDependency<D, S> = D extends { $dependency: infer K } ? | ||
| D extends { lazy: true } ? () => ExtractService<K, S> : ExtractService<K, S> : | ||||
|
|
r124 | D extends { $type: new (...args: any[]) => infer I } ? I : | ||
|
|
r118 | WalkDependencies<D, S>; | ||
|
|
r109 | |||
|
|
r118 | type WalkDependencies<D, S> = D extends primitive ? D : | ||
| { [K in keyof D]: ExtractDependency<D[K], S> }; | ||||
|
|
r109 | |||
|
|
r120 | export class Builder<T, S extends object> { | ||
|
|
r119 | declare<P extends any[]>(...args: P) { | ||
|
|
r111 | return <C extends new (...args: ExtractDependency<P, S>) => T>(constructor: C) => { | ||
|
|
r120 | |||
|
|
r108 | }; | ||
| } | ||||
|
|
r118 | inject<P extends any[]>(...args: P) { | ||
| return <X extends { [m in M]: (...args: any) => any }, M extends keyof (T | X)>( | ||||
| target: X, | ||||
| memberName: M, | ||||
| descriptor: TypedPropertyDescriptor<Compatible<(...args: ExtractDependency<P, S>) => any, T[M]>> | ||||
| ) => { | ||||
|
|
r108 | |||
| }; | ||||
| } | ||||
|
|
r121 | getDescriptor(): TypeRegistration<new () => T, S> { | ||
|
|
r118 | throw new Error(); | ||
| } | ||||
|
|
r119 | } | ||
|
|
r121 | export interface DependencyOptions<T> { | ||
| optional?: boolean; | ||||
| default?: T; | ||||
| } | ||||
| export interface LazyDependencyOptions<T> extends DependencyOptions<T> { | ||||
| lazy: true; | ||||
| } | ||||
|
|
r120 | interface Declaration<S extends object> { | ||
|
|
r119 | define<T>(): Builder<T, S>; | ||
|
|
r124 | dependency<K extends keyof S>(name: K, opts: LazyDependencyOptions<S[K]>): LazyDependencyRegistration<S, K>; | ||
| dependency<K extends keyof S>(name: K, opts?: DependencyOptions<S[K]>): DependencyRegistration<S, K>; | ||||
| $type<P extends any[], C extends new (...args: ExtractDependency<P, S>) => any>(target: C, ...params: P): StrictTypeRegistration<C, S>; | ||||
|
|
r119 | |||
|
|
r123 | configure(): Config<S>; | ||
|
|
r119 | } | ||
|
|
r118 | |||
|
|
r120 | type ServiceModule<T, S extends object, M extends string = "service"> = { | ||
| [m in M]: Builder<T, S>; | ||||
| }; | ||||
|
|
r118 | |||
|
|
r122 | type PromiseOrValue<T> = PromiseLike<T> | T; | ||
|
|
r123 | |||
|
|
r120 | export interface Config<S extends object, Y extends keyof S = keyof S> { | ||
|
|
r124 | register<K extends Y>(name: K, m: { $from: Promise<ServiceModule<S[K], S>> }): Config<S, Exclude<Y, K>>; | ||
|
|
r123 | register<K extends Y, M extends string>(name: K, m: { $from: Promise<ServiceModule<S[K], S, M>>, service: M }): Config<S, Exclude<Y, K>>; | ||
|
|
r124 | |||
| register<K extends Y>(name: K, m: Registration<S[K], S>): Config<S, Exclude<Y, K>>; | ||||
| registerType<K extends Y, P extends any[]>( | ||||
| name: K, $type: new (...args: ExtractDependency<P, S>) => S[K], ...params: P): Config<S, Exclude<Y, K>>; | ||||
|
|
r108 | } | ||
|
|
r119 | |||
| export declare function declare<S extends object>(): Declaration<S>; | ||||
