| @@ -0,0 +1,37 | |||||
|
|
1 | import { ServiceRecordBuilder, ExtractDependency, RegistrationVisitor } from "./interfaces"; | |||
|
|
2 | import { ActivationType } from "../interfaces"; | |||
|
|
3 | ||||
|
|
4 | export class RegistrationBuilder<T, S extends object> { | |||
|
|
5 | private _activationType: ActivationType = "call"; | |||
|
|
6 | ||||
|
|
7 | private _overrides: { [m in keyof S]?: (...args: any) => void } | undefined; | |||
|
|
8 | ||||
|
|
9 | ||||
|
|
10 | override<K extends keyof S>(name: K, builder: S[K], raw: true): this; | |||
|
|
11 | override<K extends keyof S>(name: K, builder: (t: ServiceRecordBuilder<S[K], S>) => void): this; | |||
|
|
12 | override<K extends keyof S, V>(name: S[K] extends ExtractDependency<V, S> ? K : never, value: V): this; | |||
|
|
13 | override<K extends keyof S>(name: K, builder: S[K] | ((t: ServiceRecordBuilder<S[K], S>) => void), raw: boolean = false) { | |||
|
|
14 | if (!this._overrides) | |||
|
|
15 | this._overrides = {}; | |||
|
|
16 | if (raw) { | |||
|
|
17 | ||||
|
|
18 | } else if (builder instanceof Function) { | |||
|
|
19 | ||||
|
|
20 | } else { | |||
|
|
21 | ||||
|
|
22 | } | |||
|
|
23 | return this; | |||
|
|
24 | } | |||
|
|
25 | ||||
|
|
26 | activate(activation: ActivationType) { | |||
|
|
27 | this._activationType = activation; | |||
|
|
28 | return this; | |||
|
|
29 | } | |||
|
|
30 | inject<M extends keyof T, P extends any[]>(member: T[M] extends (...params: ExtractDependency<P, S>) => any ? M : never, ...params: P) { | |||
|
|
31 | return this; | |||
|
|
32 | } | |||
|
|
33 | ||||
|
|
34 | visit(visitor: RegistrationVisitor<S>) { | |||
|
|
35 | ||||
|
|
36 | } | |||
|
|
37 | } No newline at end of file | |||
| @@ -2,7 +2,7 import { primitive } from "../../safe"; | |||||
| 2 | import { ActivationType } from "../interfaces"; |
|
2 | import { ActivationType } from "../interfaces"; | |
| 3 | import { AnnotaionBuilder } from "../Annotations"; |
|
3 | import { AnnotaionBuilder } from "../Annotations"; | |
| 4 | import { LazyDependencyRegistration, DependencyRegistration } from "../Configuration"; |
|
4 | import { LazyDependencyRegistration, DependencyRegistration } from "../Configuration"; | |
| 5 |
import { |
|
5 | import { Container } from "../Container"; | |
| 6 |
|
6 | |||
| 7 | export interface DependencyOptions<T> { |
|
7 | export interface DependencyOptions<T> { | |
| 8 | optional?: boolean; |
|
8 | optional?: boolean; | |
| @@ -28,19 +28,37 export type ServiceModule<T, S extends o | |||||
| 28 | [m in M]: AnnotaionBuilder<T, S>; |
|
28 | [m in M]: AnnotaionBuilder<T, S>; | |
| 29 | }; |
|
29 | }; | |
| 30 |
|
30 | |||
| 31 | export interface ServiceBuilder<T, S extends object> { |
|
31 | export interface ServiceRecordBuilder<T, S extends object> { | |
| 32 | type<P extends any[], C extends new (...args: ExtractDependency<P, S>) => T>( |
|
32 | type<P extends any[], C extends new (...args: ExtractDependency<P, S>) => T>( | |
| 33 | target: C, ...params: P): ConstructorBuilder<C, S>; |
|
33 | target: C, ...params: P): ConstructorBuilder<C, S>; | |
| 34 | factory<P extends any[], F extends (...args: ExtractDependency<P, S>) => T>( |
|
34 | factory<P extends any[], F extends (...args: ExtractDependency<P, S>) => T>( | |
| 35 | target: F, ...params: P): FactoryBuilder<F, S>; |
|
35 | target: F, ...params: P): FactoryBuilder<F, S>; | |
| 36 |
wired<M extends keyof any>(module: |
|
36 | wired<M extends keyof any>(module: ServiceModule<T, S, M>, m: M): RegistrationBuilder<T, S>; | |
| 37 |
wired(module: |
|
37 | wired(module: ServiceModule<T, S>): RegistrationBuilder<T, S>; | |
|
|
38 | } | |||
|
|
39 | ||||
|
|
40 | export interface RegistrationVisitor<S extends object> { | |||
|
|
41 | visitDependency(): void; | |||
|
|
42 | ||||
|
|
43 | visitObject(): void; | |||
|
|
44 | ||||
|
|
45 | visitTypeRegistration(): void; | |||
|
|
46 | ||||
|
|
47 | visitFactoryRegistration(): void; | |||
|
|
48 | ||||
|
|
49 | visitBuilder<T>(builder: (t: ServiceRecordBuilder<T, S>) => void): void; | |||
|
|
50 | ||||
| 38 | } |
|
51 | } | |
| 39 |
|
52 | |||
| 40 | export interface RegistrationBuilder<T, S extends object> { |
|
53 | export interface RegistrationBuilder<T, S extends object> { | |
| 41 |
override<K extends keyof S>(name: K, builder: S[K] |
|
54 | override<K extends keyof S>(name: K, builder: S[K], raw: true): this; | |
|
|
55 | override<K extends keyof S>(name: K, builder: (t: ServiceRecordBuilder<S[K], S>) => void): this; | |||
|
|
56 | override<K extends keyof S, V>(name: S[K] extends ExtractDependency<V, S> ? K : never, value: V): this; | |||
|
|
57 | ||||
| 42 | activate(activation: ActivationType): this; |
|
58 | activate(activation: ActivationType): this; | |
| 43 | inject<M extends keyof T, P extends any[]>(member: T[M] extends (...params: ExtractDependency<P, S>) => any ? M : never, ...params: P): this; |
|
59 | inject<M extends keyof T, P extends any[]>(member: T[M] extends (...params: ExtractDependency<P, S>) => any ? M : never, ...params: P): this; | |
|
|
60 | ||||
|
|
61 | visit(visitor: RegistrationVisitor<S>): void; | |||
| 44 | } |
|
62 | } | |
| 45 |
|
63 | |||
| 46 | export interface ConstructorBuilder<C extends new (...args: any[]) => any, S extends object> extends RegistrationBuilder<InstanceType<C>, S> { |
|
64 | export interface ConstructorBuilder<C extends new (...args: any[]) => any, S extends object> extends RegistrationBuilder<InstanceType<C>, S> { | |
| @@ -52,11 +70,15 export interface FactoryBuilder<F extend | |||||
| 52 | } |
|
70 | } | |
| 53 |
|
71 | |||
| 54 | export interface ConfigBuilder<S extends object, Y extends keyof S = keyof S> { |
|
72 | export interface ConfigBuilder<S extends object, Y extends keyof S = keyof S> { | |
| 55 |
register<K extends Y>(name: K, builder: |
|
73 | register<K extends Y>(name: K, builder: (t: ServiceRecordBuilder<S[K], S>) => void | Promise<void>): ConfigBuilder<S, Exclude<Y, K>>; | |
|
|
74 | register<K extends Y, V>(name: S[K] extends ExtractDependency<V, S> ? K : never, value: V): ConfigBuilder<S, Exclude<Y, K>>; | |||
|
|
75 | register<K extends Y>(name: K, value: S[K], raw: true): ConfigBuilder<S, Exclude<Y, K>>; | |||
|
|
76 | ||||
|
|
77 | apply(container: Container<S>): Promise<void>; | |||
| 56 | } |
|
78 | } | |
| 57 |
|
79 | |||
| 58 | interface ServicesDeclaration<S extends object> { |
|
80 | interface ServicesDeclaration<S extends object> { | |
| 59 | build<T>(this: void): ServiceBuilder<T, S>; |
|
81 | build<T>(this: void): ServiceRecordBuilder<T, S>; | |
| 60 | annotate<T>(this: void): AnnotaionBuilder<T, S>; |
|
82 | annotate<T>(this: void): AnnotaionBuilder<T, S>; | |
| 61 |
|
83 | |||
| 62 | dependency<K extends keyof S>(this: void, name: K, opts: LazyDependencyOptions<S[K]>): LazyDependencyRegistration<S, K>; |
|
84 | dependency<K extends keyof S>(this: void, name: K, opts: LazyDependencyOptions<S[K]>): LazyDependencyRegistration<S, K>; | |
| @@ -1,28 +1,17 | |||||
| 1 | import { configure, dependency, build } from "./services"; |
|
1 | import { configure, dependency, build } from "./services"; | |
| 2 | import { Foo } from "./Foo"; |
|
|||
| 3 | import { Bar } from "./Bar"; |
|
|||
| 4 | import { Box } from "./Box"; |
|
|||
| 5 |
|
2 | |||
| 6 | export const config = configure() |
|
3 | export const config = configure() | |
| 7 | .register("bar", s => s |
|
4 | .register("bar", async s => s.wired(await import("./Bar"), "service")) | |
| 8 | .wired(import("./Bar"), "service") |
|
5 | .register("box", s => import("./Box").then(m => s.wired(m))) | |
| 9 | .inject("setName", "heell") |
|
|||
| 10 | ) |
|
|||
| 11 | .register("box", s => s.wired(import("./Box"))) |
|
|||
| 12 | .register("host", "example.com") |
|
6 | .register("host", "example.com") | |
| 13 | // .registerType("bar2", Bar, [{ foo: dependency("foo"), host: "" }]); |
|
7 | // .registerType("bar2", Bar, [{ foo: dependency("foo"), host: "" }]); | |
| 14 | .register("bar2", s => s.type(Bar, |
|
8 | .register("bar2", async s => s.type((await import("./Bar")).Bar, | |
| 15 | { |
|
9 | { | |
| 16 | foo: build().type(Foo) |
|
10 | foo: build().type((await import("./Foo")).Foo) | |
| 17 | .activate("context"), |
|
11 | .activate("context"), | |
| 18 | nested: { lazy: dependency("foo", {lazy: true}) }, |
|
12 | nested: { lazy: dependency("foo", { lazy: true }) }, | |
| 19 | host: dependency("host") |
|
13 | host: dependency("host") | |
| 20 | }, |
|
14 | }, | |
| 21 | "") |
|
15 | "") | |
| 22 | .inject("setName", dependency("host")) |
|
16 | .inject("setName", dependency("host")) | |
| 23 | ) |
|
|||
| 24 | .register("box", s => s |
|
|||
| 25 | .type(Box, dependency("bar")) |
|
|||
| 26 | .activate("context") |
|
|||
| 27 | ); |
|
17 | ); | |
| 28 |
|
||||
General Comments 0
You need to be logged in to leave comments.
Login now
