##// END OF EJS Templates
working on fluent configuration
cin -
r128:882b53b2ba5b ioc ts support
parent child
Show More
@@ -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 { PromiseOrValue } from "../../interfaces";
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: PromiseOrValue<ServiceModule<T, S, M>>, m: M): RegistrationBuilder<T, S>;
36 wired<M extends keyof any>(module: ServiceModule<T, S, M>, m: M): RegistrationBuilder<T, S>;
37 wired(module: PromiseOrValue<ServiceModule<T, S>>): RegistrationBuilder<T, S>;
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] | ((t: ServiceBuilder<S[K], S>) => any)): this;
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: S[K] | ((t: ServiceBuilder<S[K], S>) => any)): ConfigBuilder<S, Exclude<Y, K>>;
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