interfaces.ts
137 lines
| 6.0 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r1 | import { ActivationContext } from "./ActivationContext"; | ||
|
|
r4 | import { key } from "./traits"; | ||
|
|
r1 | |||
|
|
r0 | export type primitive = number | string | null | undefined | symbol; | ||
| export interface IDestroyable { | ||||
| destroy(): void; | ||||
| } | ||||
|
|
r1 | /** | ||
| * @template S Карта доступных зависимостей | ||||
| */ | ||||
|
|
r0 | export interface Resolver<S extends object> { | ||
|
|
r1 | /** | ||
| * Функция для разрешения зависимостей, поддерживает создание фабричных методов, | ||||
| * отложенную активацию и значение по-умолчанию для сервисов | ||||
| * @template K Ключ сервиса из {@link S} | ||||
| * @template O Тип параметра {@link opts} используется для выведения типа | ||||
| * возвращаемого значения. | ||||
| * @param name Ключ сервиса, который будет разрешен. | ||||
| * @param {boolean=} opts.lazy Признак того, что требуется отложенная активация, | ||||
| * будет возвращен фабричный метод для получения зависимости. Если не указан, | ||||
| * то считается `false`. | ||||
| * @param {any=} opts.default Значение по умолчанию, если в контейнере указанный | ||||
| * сервис не зарегистрирован | ||||
| * @returns Либо фабричный метод для получения зависимости, либо значение зависимости | ||||
| * @throws Error Если зависимость не найдена и не предоставлено значение по-умолчанию | ||||
| */ | ||||
| <K extends keyof S, O extends { lazy: true; default?: unknown }>(name: K, opts?: O): () => (O extends { default: infer T } ? T : never) | NonNullable<S[K]>; | ||||
| <K extends keyof S, O extends { lazy?: false; default?: unknown }>(name: K, opts?: O): (O extends { default: infer T } ? T : never) | NonNullable<S[K]>; | ||||
|
|
r0 | } | ||
|
|
r4 | export type DepsMap<K extends key, SK extends key> = { [k in K]: SK | Ref<SK, boolean, unknown> }; | ||
| export type Ref<K extends key, L extends boolean, D> = { name: K, lazy?: L} | { name: K, lazy?: L, default: D }; | ||||
| export type Resolved<S, K extends keyof S, L, D> = | ||||
| L extends true ? () => NonNullable<S[K]> | (unknown extends D ? never : D) : NonNullable<S[K]> | (unknown extends D ? never : D); | ||||
| export interface IDescriptorBuilder<S extends object, T, R extends object = object> { | ||||
|
|
r1 | |||
| /** | ||||
| * | ||||
| * @param f | ||||
| */ | ||||
|
|
r4 | factory(f: (refs: R) => T): void; | ||
| wants<X extends DepsMap<Exclude<key, keyof R>, keyof S>>(refs: X): | ||||
| IDescriptorBuilder<S, T, R & { | ||||
| [k in keyof X]: | ||||
| X[k] extends keyof S ? NonNullable<S[X[k]]> : | ||||
| X[k] extends Ref<infer K, infer L, infer D> ? Resolved<S,K & keyof S,L,D>: | ||||
| never | ||||
| }> | ||||
|
|
r0 | |||
|
|
r1 | override<K extends ConfigurableKeys<S>>(name: K, builder: RegistrationBuilder<S, NonNullable<S[K]>>): this; | ||
| override<K extends ConfigurableKeys<S>>(services: { [name in K]: RegistrationBuilder<S, NonNullable<S[K]>> }): this; | ||||
|
|
r0 | |||
|
|
r1 | lifetime(lifetime: "singleton", typeId: string | number | object): this; | ||
| lifetime(lifetime: ILifetime<T> | Exclude<ActivationType, "singleton">): this; | ||||
|
|
r0 | |||
| cleanup(cb: (item: T) => void): this; | ||||
| value(v: T): void; | ||||
| } | ||||
|
|
r4 | export type RegistrationBuilder<S extends object, T> = (d: IDescriptorBuilder<S, T>) => void; | ||
|
|
r0 | |||
|
|
r1 | export type RegistrationBuildersMap<S extends object, K extends ConfigurableKeys<S> = ConfigurableKeys<S>> = { | ||
| [k in K]-?: RegistrationBuilder<ContainerServices<S>, NonNullable<ConfigurableServices<S>[k]>> | ||||
| }; | ||||
|
|
r0 | |||
|
|
r1 | export interface Descriptor<S extends object, T> { | ||
|
|
r0 | activate(context: ActivationContext<S>): T; | ||
| } | ||||
|
|
r1 | export type ConfigurableDescriptor<S extends object, K extends ConfigurableKeys<S>> = Descriptor<ContainerServices<S>, ConfigurableServices<S>[K]>; | ||
|
|
r0 | |||
|
|
r1 | export type RegistrationMap<S extends object, K extends keyof S = keyof S> = { | ||
| [k in K]-?: Descriptor<S, S[k]>; | ||||
|
|
r0 | }; | ||
|
|
r1 | export interface ProvidedServices<S extends object> { | ||
| container: ServiceLocator<ContainerServices<S>>; | ||||
| childContainer: ServiceContainer<S>; | ||||
| } | ||||
| export type ProvidedKeys = keyof ProvidedServices<object>; | ||||
| export type ContainerKeys<S extends object> = keyof ContainerServices<S>; | ||||
| export type Mix<S, X> = { [k in keyof (S & X)]: k extends keyof X ? X[k] : S[k & keyof S] }; | ||||
| export type ContainerServices<S extends object> = Mix<S, ProvidedServices<S>>; | ||||
| export type ConfigurableKeys<S extends object> = Exclude<keyof S, ProvidedKeys>; | ||||
| export type ConfigurableServices<S extends object> = Pick<S, ConfigurableKeys<S>>; | ||||
|
|
r0 | |||
| export interface ServiceLocator<S extends object> { | ||||
|
|
r1 | resolve<K extends keyof S>(name: K): NonNullable<S[K]>; | ||
| resolve<K extends keyof S, T>(name: K, def: T): NonNullable<S[K]> | T; | ||||
|
|
r0 | } | ||
|
|
r1 | export interface LifetimeContainer { | ||
| createLifetime<T>(): ILifetime<T>; | ||||
| } | ||||
| export interface ServiceContainer<S extends object> extends ServiceLocator<ContainerServices<S>>, LifetimeContainer, IDestroyable { | ||||
| register<K extends ConfigurableKeys<S>>(name: K, service: ConfigurableDescriptor<S, K>): void; | ||||
| register<K extends ConfigurableKeys<S>>(services: { [k in K]: ConfigurableDescriptor<S, K> }): void; | ||||
|
|
r0 | |||
| createChildContainer(): ServiceContainer<S>; | ||||
| } | ||||
| export type ActivationType = "singleton" | "container" | "hierarchy" | "context" | "call"; | ||||
| /** | ||||
| * Интерфейс для управления жизнью экземпляра объекта. Каждая регистрация имеет | ||||
| * свой собственный объект `ILifetime`, который создается при первой активации | ||||
| */ | ||||
|
|
r1 | export interface ILifetime<T> { | ||
|
|
r0 | /** Проверяет, что уже создан экземпляр объекта */ | ||
| has(): boolean; | ||||
|
|
r1 | get(): T; | ||
| initialize(context: ActivationContext<object>): void; | ||||
|
|
r0 | |||
|
|
r1 | store(item: T, cleanup?: (item: T) => void): void; | ||
| } | ||||
|
|
r0 | |||
|
|
r2 | export type ExtractRequired<T, K extends keyof T = keyof T> = { [p in K as (undefined extends T[p] ? never : p)]-?: T[p] }; | ||
|
|
r1 | |||
