| @@ -15,7 +15,7 export class ContainerBuilder<S extends | |||||
| 15 | this._services = Object.create(parentServices ? parentServices : null) as object; |
|
15 | this._services = Object.create(parentServices ? parentServices : null) as object; | |
| 16 | } |
|
16 | } | |
| 17 |
|
17 | |||
| 18 | createServiceBuilder<K extends keyof S>(name: K): IDescriptorBuilder<S, NonNullable<S[K]>, object> { |
|
18 | createServiceBuilder<K extends keyof S>(name: K): IDescriptorBuilder<ContainerServices<S>, NonNullable<S[K]>, object, keyof S> { | |
| 19 | return new DescriptorBuilder(this._lifetimeManager, this._register(name), this._fail); |
|
19 | return new DescriptorBuilder(this._lifetimeManager, this._register(name), this._fail); | |
| 20 | } |
|
20 | } | |
| 21 |
|
21 | |||
| @@ -8,7 +8,7 import { each, isKey, isPromise, isStrin | |||||
| 8 | * @template {S} ΠΠ°ΡΡΠ° Π΄ΠΎΡΡΡΠΏΠ½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ `ContainerServices` |
|
8 | * @template {S} ΠΠ°ΡΡΠ° Π΄ΠΎΡΡΡΠΏΠ½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ `ContainerServices` | |
| 9 | * @template {T} Π’ΠΈΠΏ ΡΠ΅ΡΠ²ΠΈΡΠ° |
|
9 | * @template {T} Π’ΠΈΠΏ ΡΠ΅ΡΠ²ΠΈΡΠ° | |
| 10 | */ |
|
10 | */ | |
| 11 |
export class DescriptorBuilder<S extends object, T, R extends object |
|
11 | export class DescriptorBuilder<S extends object, T, R extends object, O extends keyof S> implements IDescriptorBuilder<S, T, R, O> { | |
| 12 | private readonly _lifetimeManager: LifetimeManager; |
|
12 | private readonly _lifetimeManager: LifetimeManager; | |
| 13 | private readonly _cb: (d: Descriptor<S, T>) => void; |
|
13 | private readonly _cb: (d: Descriptor<S, T>) => void; | |
| 14 |
|
14 | |||
| @@ -51,7 +51,7 export class DescriptorBuilder<S extends | |||||
| 51 | X[k] extends keyof S ? NonNullable<S[X[k]]> : |
|
51 | X[k] extends keyof S ? NonNullable<S[X[k]]> : | |
| 52 | X[k] extends Ref<infer K, infer L, infer D> ? Resolved<S, K & keyof S, L, D> : |
|
52 | X[k] extends Ref<infer K, infer L, infer D> ? Resolved<S, K & keyof S, L, D> : | |
| 53 | never; |
|
53 | never; | |
| 54 | }> { |
|
54 | }, O> { | |
| 55 |
|
55 | |||
| 56 | each(refs, (v, k) => this._refs[k] = v); |
|
56 | each(refs, (v, k) => this._refs[k] = v); | |
| 57 |
|
57 | |||
| @@ -60,7 +60,7 export class DescriptorBuilder<S extends | |||||
| 60 | X[k] extends keyof S ? NonNullable<S[X[k]]> : |
|
60 | X[k] extends keyof S ? NonNullable<S[X[k]]> : | |
| 61 | X[k] extends Ref<infer K, infer L, infer D> ? Resolved<S, K & keyof S, L, D> : |
|
61 | X[k] extends Ref<infer K, infer L, infer D> ? Resolved<S, K & keyof S, L, D> : | |
| 62 | never; |
|
62 | never; | |
| 63 | }>; |
|
63 | }, O>; | |
| 64 | } |
|
64 | } | |
| 65 | factory(f: (refs: R) => T): void { |
|
65 | factory(f: (refs: R) => T): void { | |
| 66 | this._assertBuilding(); |
|
66 | this._assertBuilding(); | |
| @@ -79,9 +79,9 export class DescriptorBuilder<S extends | |||||
| 79 | this._finalized = true; |
|
79 | this._finalized = true; | |
| 80 | } |
|
80 | } | |
| 81 |
|
81 | |||
| 82 |
override<K extends |
|
82 | override<K extends O>(name: K, builder: RegistrationBuilder<S, NonNullable<S[K]>>): this; | |
| 83 |
override<K extends |
|
83 | override<K extends O>(services: { [k in K]: RegistrationBuilder<S, NonNullable<S[k]>> }): this; | |
| 84 |
override<K extends |
|
84 | override<K extends O>(nameOrServices: K | { [name in K]: RegistrationBuilder<S, NonNullable<S[K]>> }, builder?: RegistrationBuilder<S, NonNullable<S[K]>>): this { | |
| 85 | this._assertBuilding(); |
|
85 | this._assertBuilding(); | |
| 86 | const guard = (v: void | Promise<void>) => { |
|
86 | const guard = (v: void | Promise<void>) => { | |
| 87 | if (isPromise(v)) |
|
87 | if (isPromise(v)) | |
| @@ -91,7 +91,7 export class DescriptorBuilder<S extends | |||||
| 91 | if (isKey(nameOrServices)) { |
|
91 | if (isKey(nameOrServices)) { | |
| 92 | if (builder) { |
|
92 | if (builder) { | |
| 93 | this._defer(); |
|
93 | this._defer(); | |
| 94 | const d = new DescriptorBuilder<S, NonNullable<S[K]>>( |
|
94 | const d = new DescriptorBuilder<S, NonNullable<S[K]>, object, O>( | |
| 95 | this._lifetimeManager, |
|
95 | this._lifetimeManager, | |
| 96 | result => { |
|
96 | result => { | |
| 97 | this._overrides[nameOrServices] = result; |
|
97 | this._overrides[nameOrServices] = result; | |
| @@ -1,8 +1,7 | |||||
| 1 |
import { Descriptor, ILifetime |
|
1 | import { Descriptor, ILifetime, DepsMap, Ref, IActivationContext } from "./interfaces"; | |
| 2 | import { ActivationContext } from "./ActivationContext"; |
|
|||
| 3 | import { each, isKey, key } from "./traits"; |
|
2 | import { each, isKey, key } from "./traits"; | |
| 4 |
|
3 | |||
| 5 |
export type RegistrationOverridesMap<S extends object> = { [k in |
|
4 | export type RegistrationOverridesMap<S extends object> = { [k in keyof S]?: Descriptor<S, NonNullable<S[k]>> }; | |
| 6 |
|
5 | |||
| 7 | export interface DescriptorImplArgs<S extends object, T> { |
|
6 | export interface DescriptorImplArgs<S extends object, T> { | |
| 8 | lifetime: ILifetime<T>; |
|
7 | lifetime: ILifetime<T>; | |
| @@ -1,4 +1,3 | |||||
| 1 | import { ActivationContext } from "./ActivationContext"; |
|
|||
| 2 |
|
|
1 | import { key } from "./traits"; | |
| 3 |
|
2 | |||
| 4 | export interface IDestroyable { |
|
3 | export interface IDestroyable { | |
| @@ -35,7 +34,7 export type Ref<K extends key, L extends | |||||
| 35 | export type Resolved<S, K extends keyof S, L, D> = |
|
34 | export type Resolved<S, K extends keyof S, L, D> = | |
| 36 | L extends true ? () => NonNullable<S[K]> | (unknown extends D ? never : D) : NonNullable<S[K]> | (unknown extends D ? never : D); |
|
35 | L extends true ? () => NonNullable<S[K]> | (unknown extends D ? never : D) : NonNullable<S[K]> | (unknown extends D ? never : D); | |
| 37 |
|
36 | |||
| 38 |
export interface IDescriptorBuilder<S extends object, T, R extends object |
|
37 | export interface IDescriptorBuilder<S extends object, T, R extends object, O extends keyof S> { | |
| 39 |
|
38 | |||
| 40 | /** |
|
39 | /** | |
| 41 | * |
|
40 | * | |
| @@ -49,10 +48,10 export interface IDescriptorBuilder<S ex | |||||
| 49 | X[k] extends keyof S ? NonNullable<S[X[k]]> : |
|
48 | X[k] extends keyof S ? NonNullable<S[X[k]]> : | |
| 50 | X[k] extends Ref<infer K, infer L, infer D> ? Resolved<S, K & keyof S, L, D> : |
|
49 | X[k] extends Ref<infer K, infer L, infer D> ? Resolved<S, K & keyof S, L, D> : | |
| 51 | never |
|
50 | never | |
| 52 | }> |
|
51 | }, O> | |
| 53 |
|
52 | |||
| 54 |
override<K extends |
|
53 | override<K extends O>(name: K, builder: RegistrationBuilder<S, NonNullable<S[K]>>): this; | |
| 55 |
override<K extends |
|
54 | override<K extends O>(services: { [name in K]: RegistrationBuilder<S, NonNullable<S[K]>> }): this; | |
| 56 |
|
55 | |||
| 57 | lifetime(lifetime: "singleton", typeId: string | number | object): this; |
|
56 | lifetime(lifetime: "singleton", typeId: string | number | object): this; | |
| 58 | lifetime(lifetime: ILifetime<T> | Exclude<ActivationType, "singleton">): this; |
|
57 | lifetime(lifetime: ILifetime<T> | Exclude<ActivationType, "singleton">): this; | |
| @@ -62,9 +61,9 export interface IDescriptorBuilder<S ex | |||||
| 62 | value(v: T): void; |
|
61 | value(v: T): void; | |
| 63 | } |
|
62 | } | |
| 64 |
|
63 | |||
| 65 | export type RegistrationBuilder<S extends object, T> = (d: IDescriptorBuilder<S, T>) => void; |
|
64 | export type RegistrationBuilder<S extends object, T> = (d: IDescriptorBuilder<S, T, object, ConfigurableKeys<S>>) => void; | |
| 66 |
|
65 | |||
| 67 |
export type RegistrationBuildersMap<S extends |
|
66 | export type RegistrationBuildersMap<S extends Configurable<S>, K extends keyof S = keyof S> = { | |
| 68 | [k in K]-?: RegistrationBuilder<ContainerServices<S>, NonNullable<S[k]>> |
|
67 | [k in K]-?: RegistrationBuilder<ContainerServices<S>, NonNullable<S[k]>> | |
| 69 | }; |
|
68 | }; | |
| 70 |
|
69 | |||
| @@ -78,8 +77,6 export interface IActivationContext<S ex | |||||
| 78 | createContainerLifetime<T>(): ILifetime<T>; |
|
77 | createContainerLifetime<T>(): ILifetime<T>; | |
| 79 | } |
|
78 | } | |
| 80 |
|
79 | |||
| 81 | export type ConfigurableDescriptor<S extends object, K extends ConfigurableKeys<S>> = Descriptor<ContainerServices<S>, S[K]>; |
|
|||
| 82 |
|
||||
| 83 | export type RegistrationMap<S extends object, K extends keyof S = keyof S> = { |
|
80 | export type RegistrationMap<S extends object, K extends keyof S = keyof S> = { | |
| 84 | [k in K]-?: Descriptor<S, S[k]>; |
|
81 | [k in K]-?: Descriptor<S, S[k]>; | |
| 85 | }; |
|
82 | }; | |
| @@ -119,7 +116,7 export interface ServiceContainer<S exte | |||||
| 119 | } |
|
116 | } | |
| 120 |
|
117 | |||
| 121 | export interface IContainerBuilder<S extends Configurable<S>> { |
|
118 | export interface IContainerBuilder<S extends Configurable<S>> { | |
| 122 | createServiceBuilder<K extends keyof S>(name: K): IDescriptorBuilder<S, NonNullable<S[K]>>; |
|
119 | createServiceBuilder<K extends keyof S>(name: K): IDescriptorBuilder<S, NonNullable<S[K]>, object, keyof S>; | |
| 123 |
|
120 | |||
| 124 | build(): ServiceContainer<S>; |
|
121 | build(): ServiceContainer<S>; | |
| 125 | } |
|
122 | } | |
General Comments 0
You need to be logged in to leave comments.
Login now
