| 
									
										
										
										
											2017-05-15 13:12:10 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {Injector} from '../di/injector'; | 
					
						
							| 
									
										
										
										
											2017-10-27 17:04:11 -07:00
										 |  |  | import {ComponentFactory} from '../linker/component_factory'; | 
					
						
							| 
									
										
										
										
											2017-05-15 13:12:10 -07:00
										 |  |  | import {NgModuleFactory, NgModuleRef} from '../linker/ng_module_factory'; | 
					
						
							|  |  |  | import {Type} from '../type'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {initServicesIfNeeded} from './services'; | 
					
						
							| 
									
										
										
										
											2018-07-22 00:05:53 -07:00
										 |  |  | import {NgModuleDefinition, NgModuleDefinitionFactory, NgModuleProviderDef, ProviderOverride, Services, ViewDefinition} from './types'; | 
					
						
							| 
									
										
										
										
											2017-05-15 13:12:10 -07:00
										 |  |  | import {resolveDefinition} from './util'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function overrideProvider(override: ProviderOverride) { | 
					
						
							|  |  |  |   initServicesIfNeeded(); | 
					
						
							|  |  |  |   return Services.overrideProvider(override); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-27 17:04:11 -07:00
										 |  |  | export function overrideComponentView(comp: Type<any>, componentFactory: ComponentFactory<any>) { | 
					
						
							| 
									
										
										
										
											2017-05-15 13:12:10 -07:00
										 |  |  |   initServicesIfNeeded(); | 
					
						
							| 
									
										
										
										
											2017-10-27 17:04:11 -07:00
										 |  |  |   return Services.overrideComponentView(comp, componentFactory); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function clearOverrides() { | 
					
						
							|  |  |  |   initServicesIfNeeded(); | 
					
						
							|  |  |  |   return Services.clearOverrides(); | 
					
						
							| 
									
										
										
										
											2017-05-15 13:12:10 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Attention: this function is called as top level function.
 | 
					
						
							|  |  |  | // Putting any logic in here will destroy closure tree shaking!
 | 
					
						
							|  |  |  | export function createNgModuleFactory( | 
					
						
							|  |  |  |     ngModuleType: Type<any>, bootstrapComponents: Type<any>[], | 
					
						
							|  |  |  |     defFactory: NgModuleDefinitionFactory): NgModuleFactory<any> { | 
					
						
							|  |  |  |   return new NgModuleFactory_(ngModuleType, bootstrapComponents, defFactory); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-22 00:05:53 -07:00
										 |  |  | function cloneNgModuleDefinition(def: NgModuleDefinition): NgModuleDefinition { | 
					
						
							|  |  |  |   const providers = Array.from(def.providers); | 
					
						
							|  |  |  |   const modules = Array.from(def.modules); | 
					
						
							|  |  |  |   const providersByKey: {[tokenKey: string]: NgModuleProviderDef} = {}; | 
					
						
							|  |  |  |   for (const key in def.providersByKey) { | 
					
						
							|  |  |  |     providersByKey[key] = def.providersByKey[key]; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     factory: def.factory, | 
					
						
							|  |  |  |     isRoot: def.isRoot, providers, modules, providersByKey, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-15 13:12:10 -07:00
										 |  |  | class NgModuleFactory_ extends NgModuleFactory<any> { | 
					
						
							|  |  |  |   constructor( | 
					
						
							|  |  |  |       public readonly moduleType: Type<any>, private _bootstrapComponents: Type<any>[], | 
					
						
							|  |  |  |       private _ngModuleDefFactory: NgModuleDefinitionFactory) { | 
					
						
							|  |  |  |     // Attention: this ctor is called as top level function.
 | 
					
						
							|  |  |  |     // Putting any logic in here will destroy closure tree shaking!
 | 
					
						
							|  |  |  |     super(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   create(parentInjector: Injector|null): NgModuleRef<any> { | 
					
						
							|  |  |  |     initServicesIfNeeded(); | 
					
						
							| 
									
										
										
										
											2018-07-22 00:05:53 -07:00
										 |  |  |     // Clone the NgModuleDefinition so that any tree shakeable provider definition
 | 
					
						
							|  |  |  |     // added to this instance of the NgModuleRef doesn't affect the cached copy.
 | 
					
						
							|  |  |  |     // See https://github.com/angular/angular/issues/25018.
 | 
					
						
							|  |  |  |     const def = cloneNgModuleDefinition(resolveDefinition(this._ngModuleDefFactory)); | 
					
						
							| 
									
										
										
										
											2017-05-15 13:12:10 -07:00
										 |  |  |     return Services.createNgModuleRef( | 
					
						
							|  |  |  |         this.moduleType, parentInjector || Injector.NULL, this._bootstrapComponents, def); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |