|
1 |
| -import { global, isArray, isString, isType } from '../../facade/lang'; |
| 1 | +import { global } from '../../facade/lang'; |
2 | 2 | import { reflector } from '../reflection/reflection';
|
3 | 3 | import { ComponentMetadata } from '../directives/metadata_directives';
|
4 | 4 | import { getInjectableName, provide } from '../di/provider';
|
5 |
| -import { isProviderLiteral, createProvider, ProviderLiteral } from '../di/provider_util'; |
6 |
| -import { resolveReflectiveProvider } from '../di/reflective_provider'; |
7 |
| -import { getNgModuleMethodByType } from '../di/provider'; |
| 5 | +import { _isTypeRegistered, _normalizeProviders, _getNgModuleMetadataByType } from '../di/reflective_provider'; |
| 6 | +import { ListWrapper } from '../../facade/collections'; |
8 | 7 |
|
9 |
| -export function bundle( ComponentClass: Type, otherProviders: any[] = [], Module?: ng.IModule ): ng.IModule { |
| 8 | +export function bundle( ComponentClass: Type, otherProviders: any[] = [], NgModule?: ng.IModule ): ng.IModule { |
10 | 9 |
|
11 | 10 | const ngModuleName = getInjectableName( ComponentClass );
|
12 |
| - const ngModule = Module || global.angular.module( ngModuleName, [] ); |
| 11 | + const ngModule = NgModule || global.angular.module( ngModuleName, [] ); |
13 | 12 | const annotations = reflector.annotations( ComponentClass );
|
14 | 13 | const cmpAnnotation: ComponentMetadata = annotations[ 0 ];
|
15 | 14 | const { directives = [], pipes = [], providers = [], viewProviders = [] }={} = cmpAnnotation;
|
16 | 15 |
|
17 |
| - // console.log( 'directives:', directives ); |
18 |
| - // console.log( 'pipes:', pipes ); |
19 |
| - // console.log( 'providers:', providers ); |
20 |
| - // console.log( 'viewProviders:', viewProviders ); |
21 |
| - |
22 |
| - |
23 | 16 | // process component
|
24 |
| - const cmpProvider = provide( ComponentClass ); |
| 17 | + const [cmpName,cmpFactoryFn] = provide( ComponentClass ); |
| 18 | + const { providerName, providerMethod, moduleMethod } = _getNgModuleMetadataByType( ComponentClass ); |
25 | 19 |
|
26 |
| - if ( isTypeRegistered( cmpProvider[ 0 ], ngModule, '$compileProvider', 'directive' ) ) { |
| 20 | + if ( _isTypeRegistered( cmpName, ngModule, providerName, providerMethod ) ) { |
27 | 21 | return ngModule;
|
28 | 22 | }
|
29 | 23 |
|
30 |
| - ngModule.directive( cmpProvider[ 0 ], cmpProvider[ 1 ] ); |
31 |
| - |
32 |
| - |
33 |
| - // 1. process component tree |
34 |
| - |
35 |
| - // step through all providers |
36 |
| - providers.forEach( ( ProviderType ) => { |
37 |
| - |
38 |
| - // @TODO |
39 |
| - // recursive |
40 |
| - if ( isArray( ProviderType ) ) { |
41 |
| - return; |
42 |
| - } |
43 |
| - |
44 |
| - if ( isString( ProviderType ) ) { |
45 |
| - ngModule.requires.push( ProviderType ); |
46 |
| - return; |
47 |
| - } |
48 |
| - |
49 |
| - if ( isProviderLiteral( ProviderType ) ) { |
50 |
| - const provider = createProvider( ProviderType ); |
51 |
| - const { method, name, value } = resolveReflectiveProvider( provider ); |
52 |
| - if ( !isTypeRegistered( name, ngModule, '$provide', method ) ) { |
53 |
| - ngModule[ method ]( name, value ); |
54 |
| - } |
55 |
| - return; |
56 |
| - } |
57 |
| - |
58 |
| - const serviceProvider = provide( ProviderType ); |
59 |
| - if ( !isTypeRegistered( serviceProvider[ 0 ], ngModule, '$provide', 'service' ) ) { |
60 |
| - ngModule.service( ...provide( ProviderType ) ); |
61 |
| - } |
62 |
| - |
63 |
| - } ); |
64 |
| - // step through all viewProviders |
65 |
| - viewProviders.forEach( ( ViewProviderType ) => { |
66 |
| - |
67 |
| - // @TODO |
68 |
| - // recursive |
69 |
| - if ( isArray( ViewProviderType ) ) { |
70 |
| - return; |
71 |
| - } |
72 |
| - |
73 |
| - if ( isString( ViewProviderType ) ) { |
74 |
| - ngModule.requires.push( ViewProviderType ); |
75 |
| - return; |
76 |
| - } |
| 24 | + ngModule[moduleMethod]( cmpName, cmpFactoryFn ); |
77 | 25 |
|
78 |
| - if ( isProviderLiteral( ViewProviderType ) ) { |
79 |
| - const provider = createProvider( ViewProviderType ); |
80 |
| - const { method, name, value } = resolveReflectiveProvider( provider ); |
81 |
| - if ( !isTypeRegistered( name, ngModule, '$provide', method ) ) { |
82 |
| - ngModule[ method ]( name, value ); |
83 |
| - } |
84 |
| - return; |
85 |
| - } |
| 26 | + // 1. process component/directive decorator providers/viewProviders/pipes |
| 27 | + _normalizeProviders( ngModule, providers ); |
| 28 | + _normalizeProviders( ngModule, viewProviders ); |
| 29 | + _normalizeProviders( ngModule, pipes ); |
86 | 30 |
|
87 |
| - const serviceProvider = provide( ViewProviderType ); |
88 |
| - if ( !isTypeRegistered( serviceProvider[ 0 ], ngModule, '$provide', 'service' ) ) { |
89 |
| - ngModule.service( ...provide( ViewProviderType ) ); |
90 |
| - } |
91 | 31 |
|
92 |
| - } ); |
93 |
| - // step through all pipes |
94 |
| - pipes.forEach( ( PipeType: Type ) => { |
95 |
| - // @TODO |
96 |
| - // recursive |
97 |
| - if ( isArray( PipeType ) ) { |
98 |
| - return; |
99 |
| - } |
100 |
| - |
101 |
| - const pipeProvider = provide( PipeType ); |
102 |
| - if ( !isTypeRegistered( pipeProvider[ 0 ], ngModule, '$filterProvider', 'register' ) ) { |
103 |
| - ngModule.filter( ...provide( PipeType ) ); |
104 |
| - } |
105 |
| - } ); |
106 | 32 | // step through all directives
|
107 |
| - directives.forEach( ( directiveType: Type ) => { |
108 |
| - return bundle( directiveType, [], ngModule ); |
| 33 | + ListWrapper.flattenDeep(directives).forEach( ( directiveType: Type ) => { |
| 34 | + bundle( directiveType, [], ngModule ); |
109 | 35 | } );
|
110 | 36 |
|
111 | 37 | // 2. process otherProviders argument
|
112 | 38 | // - providers can be string(ngModule reference), Type, StringMap(providerLiteral)
|
113 |
| - otherProviders.forEach( ( providerType: string|Type|ProviderLiteral|any[] ) => { |
114 |
| - if ( isString( providerType ) ) { |
115 |
| - ngModule.requires.push( providerType ); |
116 |
| - } |
117 |
| - if ( isType( providerType ) ) { |
118 |
| - ngModule[ getNgModuleMethodByType(providerType) ]( ...provide(providerType) ); |
119 |
| - } |
120 |
| - if ( isProviderLiteral( providerType ) ) { |
121 |
| - const provider = createProvider( providerType ); |
122 |
| - const { method, name, value } = resolveReflectiveProvider( provider ); |
123 |
| - ngModule[ method ]( name, value ); |
124 |
| - } |
125 |
| - // @TODO |
126 |
| - // recursive |
127 |
| - if ( isArray( providerType ) ) { |
128 |
| - |
129 |
| - } |
130 |
| - } ); |
| 39 | + // - directives can't be registered as via global providers only @Injectable,@Pipe,{provide:any,use*:any} |
| 40 | + // registerProviders(ngModule, otherProviders); |
| 41 | + _normalizeProviders( ngModule, otherProviders ); |
131 | 42 |
|
132 | 43 | return ngModule;
|
133 |
| - |
134 |
| -} |
135 |
| - |
136 |
| -function isTypeRegistered( |
137 |
| - findRegisteredType: string, |
138 |
| - ngModule: ng.IModule, |
139 |
| - instanceType: string, |
140 |
| - methodName: string |
141 |
| -): boolean { |
142 |
| - const invokeQueue: any[] = (ngModule as any)._invokeQueue; |
143 |
| - const types = invokeQueue |
144 |
| - .filter( ( [type,fnName]:[string,string] ) => { |
145 |
| - return type === instanceType && fnName === methodName; |
146 |
| - } ) |
147 |
| - .map( ( [type,fnName, registeredProvider]:[string,string,[string,any]] ) => { |
148 |
| - return registeredProvider |
149 |
| - } ); |
150 |
| - |
151 |
| - return types.some( ( [typeName,typeFn] )=> { |
152 |
| - return findRegisteredType === typeName; |
153 |
| - } ) |
154 |
| -} |
155 |
| - |
156 |
| -function registerProvider( ngModule: ng.IModule, provider: any ): void { |
157 |
| - |
158 | 44 | }
|
0 commit comments