1 | import {Injector, ReflectiveInjector, Type} from '@angular/core';
|
2 |
|
3 | import {isInjectable} from '../platform/module/metadata/decorators';
|
4 |
|
5 | export type InjectorFunction<R> = (injector: Injector, ...args) => R;
|
6 |
|
7 | export const typeToInjectorFunction = <T, R>(classOrFunction: Type<T> | InjectorFunction<R>, execute: (instance: T) => R): InjectorFunction<R> => {
|
8 | try {
|
9 | if (isInjectable(classOrFunction as Type<T>) === false) {
|
10 | return <InjectorFunction<R>> classOrFunction;
|
11 | }
|
12 | else {
|
13 | return instantiator<T, R>(classOrFunction as Type<T>, execute);
|
14 | }
|
15 | }
|
16 | catch (exception) {
|
17 | return <InjectorFunction<R>> classOrFunction;
|
18 | }
|
19 | };
|
20 |
|
21 | const instantiator = <T, R>(type: Type<T>, execute: (instance: T) => R): (injector: Injector) => R => {
|
22 | return (injector: Injector) => {
|
23 | const descendantInjector = ReflectiveInjector.resolveAndCreate([type], injector);
|
24 |
|
25 | const reader = descendantInjector.get(type);
|
26 |
|
27 | return execute(reader);
|
28 | };
|
29 | };
|