| @@ -56,24 +56,7 interface Declaration<S extends object> | |||
|
|
56 | 56 | dependency<K extends keyof S>(name: K, opts?: DependencyOptions<S[K]>): DependencyRegistration<S, K>; |
|
|
57 | 57 | |
|
|
58 | 58 | $type<T, P extends any[], C extends new (...args: ExtractDependency<P, S>) => T>(target: C, ...params: P): StrictTypeRegistration<C, S>; |
|
|
59 | ||
|
|
60 | configure(): Config<S>; | |
|
|
61 | 59 | } |
|
|
62 | 60 | |
|
|
63 | type ServiceModule<T, S extends object, M extends string = "service"> = { | |
|
|
64 | [m in M]: Builder<T, S>; | |
|
|
65 | }; | |
|
|
66 | ||
|
|
67 | type PromiseOrValue<T> = PromiseLike<T> | T; | |
|
|
68 | ||
|
|
69 | 61 | |
|
|
70 | export interface Config<S extends object, Y extends keyof S = keyof S> { | |
|
|
71 | register<K extends Y>(name: K, m: { $from: Promise<ServiceModule<S[K], S>> }): Config<S, Exclude<Y, K>>; | |
|
|
72 | register<K extends Y, M extends string>(name: K, m: { $from: Promise<ServiceModule<S[K], S, M>>, service: M }): Config<S, Exclude<Y, K>>; | |
|
|
73 | ||
|
|
74 | register<K extends Y>(name: K, m: Registration<S[K], S>): Config<S, Exclude<Y, K>>; | |
|
|
75 | registerType<K extends Y, P extends any[]>( | |
|
|
76 | name: K, $type: new (...args: ExtractDependency<P, S>) => S[K], ...params: P): Config<S, Exclude<Y, K>>; | |
|
|
77 | } | |
|
|
78 | ||
|
|
79 | 62 | export declare function declare<S extends object>(): Declaration<S>; |
| @@ -1,5 +1,6 | |||
|
|
1 | 1 | import { primitive } from "../../safe"; |
|
|
2 | 2 | import { ActivationType } from "../interfaces"; |
|
|
3 | import { Builder } from "../Annotations"; | |
|
|
3 | 4 | |
|
|
4 | 5 | type ExtractService<K, S> = K extends keyof S ? S[K] : K; |
|
|
5 | 6 | |
| @@ -12,11 +13,19 type ExtractDependency<D, S> = D extends | |||
|
|
12 | 13 | type WalkDependencies<D, S> = D extends primitive ? D : |
|
|
13 | 14 | { [K in keyof D]: ExtractDependency<D[K], S> }; |
|
|
14 | 15 | |
|
|
16 | type ServiceModule<T, S extends object, M extends keyof any = "service"> = { | |
|
|
17 | [m in M]: Builder<T, S>; | |
|
|
18 | }; | |
|
|
19 | ||
|
|
20 | type PromiseOrValue<T> = T | PromiseLike<T>; | |
|
|
21 | ||
|
|
15 | 22 | export interface TypeBuilder<T, S extends object> { |
|
|
16 | 23 | type<P extends any[], C extends new (...args: ExtractDependency<P, S>) => T>( |
|
|
17 | 24 | target: C, ...params: P): ConstructorBuilder<C, S>; |
|
|
18 | 25 | factory<P extends any[], F extends (...args: ExtractDependency<P, S>) => T>( |
|
|
19 | 26 | target: F, ...params: P): FactoryBuilder<F, S>; |
|
|
27 | wire<M extends keyof any>(module: PromiseOrValue<ServiceModule<T, S, M>>, m: M): ServiceBuilder<T, S>; | |
|
|
28 | wire(module: PromiseOrValue<ServiceModule<T, S>>): ServiceBuilder<T, S>; | |
|
|
20 | 29 | } |
|
|
21 | 30 | |
|
|
22 | 31 | export interface ServiceBuilder<T, S extends object> { |
| @@ -2,15 +2,17 import { configure, dependency, Services | |||
|
|
2 | 2 | import { Foo } from "./Foo"; |
|
|
3 | 3 | import { Bar } from "./Bar"; |
|
|
4 | 4 | import { Box } from "./Box"; |
|
|
5 | import { declare } from "../di/Annotations"; | |
|
|
6 | 5 | import { ConfigBuilder, TypeBuilder } from "../di/fluent/interfaces"; |
|
|
7 | 6 | |
|
|
8 | 7 | export declare function build<T>(): TypeBuilder<T, Services>; |
|
|
9 | 8 | |
|
|
10 | 9 | export declare const config: ConfigBuilder<Services>; |
|
|
11 | 10 | config |
|
|
12 | //.register("bar", { $from: import("./Bar"), service: "service" }) | |
|
|
13 | // .register("box", { $from: import("./Box") }) | |
|
|
11 | .register("bar", s => s | |
|
|
12 | .wire(import("./Bar"), "service") | |
|
|
13 | .inject("setName", "heell") | |
|
|
14 | ) | |
|
|
15 | .register("box", s => s.wire(import("./Box"))) | |
|
|
14 | 16 |
|
|
|
15 | 17 | // .registerType("bar2", Bar, [{ foo: dependency("foo"), host: "" }]); |
|
|
16 | 18 | .register("bar2", s => s.type(Bar, |
General Comments 0
You need to be logged in to leave comments.
Login now
