| 
									
										
										
										
											2016-06-13 08:35:31 -07:00
										 |  |  | import {AnimationAnimateMetadata, AnimationEntryMetadata, AnimationGroupMetadata, AnimationKeyframesSequenceMetadata, AnimationMetadata, AnimationStateDeclarationMetadata, AnimationStateMetadata, AnimationStateTransitionMetadata, AnimationStyleMetadata, AnimationWithStepsMetadata, AttributeMetadata, ComponentMetadata, HostMetadata, Inject, InjectMetadata, Injectable, Optional, OptionalMetadata, Provider, QueryMetadata, SelfMetadata, SkipSelfMetadata, ViewMetadata, ViewQueryMetadata, resolveForwardRef} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | import {LIFECYCLE_HOOKS_VALUES, ReflectorReader, createProvider, isProviderLiteral, reflector} from '../core_private'; | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | import {StringMapWrapper} from '../src/facade/collection'; | 
					
						
							|  |  |  | import {BaseException} from '../src/facade/exceptions'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {Type, isArray, isBlank, isPresent, isString, isStringMap, stringify} from '../src/facade/lang'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {assertArrayOfStrings} from './assertions'; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  | import * as cpl from './compile_metadata'; | 
					
						
							| 
									
										
										
										
											2016-06-13 08:35:31 -07:00
										 |  |  | import {CompilerConfig} from './config'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {hasLifecycleHook} from './directive_lifecycle_reflector'; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  | import {DirectiveResolver} from './directive_resolver'; | 
					
						
							|  |  |  | import {PipeResolver} from './pipe_resolver'; | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | import {getUrlScheme} from './url_resolver'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {MODULE_SUFFIX, ValueTransformer, sanitizeIdentifier, visitValue} from './util'; | 
					
						
							|  |  |  | import {ViewResolver} from './view_resolver'; | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | @Injectable() | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  | export class CompileMetadataResolver { | 
					
						
							| 
									
										
										
										
											2015-12-02 10:35:51 -08:00
										 |  |  |   private _directiveCache = new Map<Type, cpl.CompileDirectiveMetadata>(); | 
					
						
							|  |  |  |   private _pipeCache = new Map<Type, cpl.CompilePipeMetadata>(); | 
					
						
							| 
									
										
										
										
											2016-03-29 17:15:07 -07:00
										 |  |  |   private _anonymousTypes = new Map<Object, number>(); | 
					
						
							|  |  |  |   private _anonymousTypeIndex = 0; | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |   private _reflector: ReflectorReader; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   constructor( | 
					
						
							|  |  |  |       private _directiveResolver: DirectiveResolver, private _pipeResolver: PipeResolver, | 
					
						
							| 
									
										
										
										
											2016-06-13 08:35:31 -07:00
										 |  |  |       private _viewResolver: ViewResolver, private _config: CompilerConfig, | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       _reflector?: ReflectorReader) { | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |     if (isPresent(_reflector)) { | 
					
						
							|  |  |  |       this._reflector = _reflector; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       this._reflector = reflector; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-20 18:10:19 -07:00
										 |  |  |   private sanitizeTokenName(token: any): string { | 
					
						
							|  |  |  |     let identifier = stringify(token); | 
					
						
							|  |  |  |     if (identifier.indexOf('(') >= 0) { | 
					
						
							|  |  |  |       // case: anonymous functions!
 | 
					
						
							|  |  |  |       let found = this._anonymousTypes.get(token); | 
					
						
							|  |  |  |       if (isBlank(found)) { | 
					
						
							|  |  |  |         this._anonymousTypes.set(token, this._anonymousTypeIndex++); | 
					
						
							|  |  |  |         found = this._anonymousTypes.get(token); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       identifier = `anonymous_token_${found}_`; | 
					
						
							| 
									
										
										
										
											2016-03-29 17:15:07 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-04-20 18:10:19 -07:00
										 |  |  |     return sanitizeIdentifier(identifier); | 
					
						
							| 
									
										
										
										
											2016-03-29 17:15:07 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-26 15:07:51 -07:00
										 |  |  |   getAnimationEntryMetadata(entry: AnimationEntryMetadata): cpl.CompileAnimationEntryMetadata { | 
					
						
							| 
									
										
										
										
											2016-05-25 12:46:22 -07:00
										 |  |  |     var defs = entry.definitions.map(def => this.getAnimationStateMetadata(def)); | 
					
						
							|  |  |  |     return new cpl.CompileAnimationEntryMetadata(entry.name, defs); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-26 15:07:51 -07:00
										 |  |  |   getAnimationStateMetadata(value: AnimationStateMetadata): cpl.CompileAnimationStateMetadata { | 
					
						
							|  |  |  |     if (value instanceof AnimationStateDeclarationMetadata) { | 
					
						
							| 
									
										
										
										
											2016-05-25 12:46:22 -07:00
										 |  |  |       var styles = this.getAnimationStyleMetadata(value.styles); | 
					
						
							|  |  |  |       return new cpl.CompileAnimationStateDeclarationMetadata(value.stateNameExpr, styles); | 
					
						
							| 
									
										
										
										
											2016-05-26 15:07:51 -07:00
										 |  |  |     } else if (value instanceof AnimationStateTransitionMetadata) { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       return new cpl.CompileAnimationStateTransitionMetadata( | 
					
						
							|  |  |  |           value.stateChangeExpr, this.getAnimationMetadata(value.steps)); | 
					
						
							| 
									
										
										
										
											2016-05-25 12:46:22 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-26 15:07:51 -07:00
										 |  |  |   getAnimationStyleMetadata(value: AnimationStyleMetadata): cpl.CompileAnimationStyleMetadata { | 
					
						
							| 
									
										
										
										
											2016-05-25 12:46:22 -07:00
										 |  |  |     return new cpl.CompileAnimationStyleMetadata(value.offset, value.styles); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-26 15:07:51 -07:00
										 |  |  |   getAnimationMetadata(value: AnimationMetadata): cpl.CompileAnimationMetadata { | 
					
						
							|  |  |  |     if (value instanceof AnimationStyleMetadata) { | 
					
						
							| 
									
										
										
										
											2016-05-25 12:46:22 -07:00
										 |  |  |       return this.getAnimationStyleMetadata(value); | 
					
						
							| 
									
										
										
										
											2016-05-26 15:07:51 -07:00
										 |  |  |     } else if (value instanceof AnimationKeyframesSequenceMetadata) { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       return new cpl.CompileAnimationKeyframesSequenceMetadata( | 
					
						
							|  |  |  |           value.steps.map(entry => this.getAnimationStyleMetadata(entry))); | 
					
						
							| 
									
										
										
										
											2016-05-26 15:07:51 -07:00
										 |  |  |     } else if (value instanceof AnimationAnimateMetadata) { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       let animateData = | 
					
						
							|  |  |  |           <cpl.CompileAnimationStyleMetadata|cpl.CompileAnimationKeyframesSequenceMetadata>this | 
					
						
							|  |  |  |               .getAnimationMetadata(value.styles); | 
					
						
							| 
									
										
										
										
											2016-05-25 12:46:22 -07:00
										 |  |  |       return new cpl.CompileAnimationAnimateMetadata(value.timings, animateData); | 
					
						
							| 
									
										
										
										
											2016-05-26 15:07:51 -07:00
										 |  |  |     } else if (value instanceof AnimationWithStepsMetadata) { | 
					
						
							| 
									
										
										
										
											2016-05-25 12:46:22 -07:00
										 |  |  |       var steps = value.steps.map(step => this.getAnimationMetadata(step)); | 
					
						
							| 
									
										
										
										
											2016-05-26 15:07:51 -07:00
										 |  |  |       if (value instanceof AnimationGroupMetadata) { | 
					
						
							| 
									
										
										
										
											2016-05-25 12:46:22 -07:00
										 |  |  |         return new cpl.CompileAnimationGroupMetadata(steps); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         return new cpl.CompileAnimationSequenceMetadata(steps); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-02 10:35:51 -08:00
										 |  |  |   getDirectiveMetadata(directiveType: Type): cpl.CompileDirectiveMetadata { | 
					
						
							|  |  |  |     var meta = this._directiveCache.get(directiveType); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |     if (isBlank(meta)) { | 
					
						
							| 
									
										
										
										
											2015-10-23 15:55:48 -07:00
										 |  |  |       var dirMeta = this._directiveResolver.resolve(directiveType); | 
					
						
							| 
									
										
										
										
											2016-06-11 21:23:37 -07:00
										 |  |  |       var templateMeta: cpl.CompileTemplateMetadata = null; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |       var changeDetectionStrategy: any /** TODO #9100 */ = null; | 
					
						
							|  |  |  |       var viewProviders: any[] /** TODO #9100 */ = []; | 
					
						
							| 
									
										
										
										
											2016-05-02 16:45:43 -07:00
										 |  |  |       var moduleUrl = staticTypeModuleUrl(directiveType); | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  |       if (dirMeta instanceof ComponentMetadata) { | 
					
						
							| 
									
										
										
										
											2016-03-09 14:55:27 -08:00
										 |  |  |         assertArrayOfStrings('styles', dirMeta.styles); | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  |         var cmpMeta = <ComponentMetadata>dirMeta; | 
					
						
							| 
									
										
										
										
											2015-10-23 15:55:48 -07:00
										 |  |  |         var viewMeta = this._viewResolver.resolve(directiveType); | 
					
						
							| 
									
										
										
										
											2016-03-09 14:55:27 -08:00
										 |  |  |         assertArrayOfStrings('styles', viewMeta.styles); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         var animations = isPresent(viewMeta.animations) ? | 
					
						
							|  |  |  |             viewMeta.animations.map(e => this.getAnimationEntryMetadata(e)) : | 
					
						
							|  |  |  |             null; | 
					
						
							| 
									
										
										
										
											2016-05-25 12:46:22 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         templateMeta = new cpl.CompileTemplateMetadata({ | 
					
						
							| 
									
										
										
										
											2015-10-23 15:55:48 -07:00
										 |  |  |           encapsulation: viewMeta.encapsulation, | 
					
						
							|  |  |  |           template: viewMeta.template, | 
					
						
							|  |  |  |           templateUrl: viewMeta.templateUrl, | 
					
						
							|  |  |  |           styles: viewMeta.styles, | 
					
						
							| 
									
										
										
										
											2016-05-25 12:46:22 -07:00
										 |  |  |           styleUrls: viewMeta.styleUrls, | 
					
						
							|  |  |  |           animations: animations | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2015-10-23 15:55:48 -07:00
										 |  |  |         changeDetectionStrategy = cmpMeta.changeDetection; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |         if (isPresent(dirMeta.viewProviders)) { | 
					
						
							|  |  |  |           viewProviders = this.getProvidersMetadata(dirMeta.viewProviders); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-05-02 16:45:43 -07:00
										 |  |  |         moduleUrl = componentModuleUrl(this._reflector, directiveType, cmpMeta); | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |       var providers: any[] /** TODO #9100 */ = []; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       if (isPresent(dirMeta.providers)) { | 
					
						
							|  |  |  |         providers = this.getProvidersMetadata(dirMeta.providers); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |       var queries: any[] /** TODO #9100 */ = []; | 
					
						
							|  |  |  |       var viewQueries: any[] /** TODO #9100 */ = []; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       if (isPresent(dirMeta.queries)) { | 
					
						
							| 
									
										
										
										
											2016-06-05 04:46:03 +02:00
										 |  |  |         queries = this.getQueriesMetadata(dirMeta.queries, false, directiveType); | 
					
						
							|  |  |  |         viewQueries = this.getQueriesMetadata(dirMeta.queries, true, directiveType); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |       meta = cpl.CompileDirectiveMetadata.create({ | 
					
						
							| 
									
										
										
										
											2015-10-23 15:55:48 -07:00
										 |  |  |         selector: dirMeta.selector, | 
					
						
							|  |  |  |         exportAs: dirMeta.exportAs, | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |         isComponent: isPresent(templateMeta), | 
					
						
							| 
									
										
										
										
											2016-05-02 16:45:43 -07:00
										 |  |  |         type: this.getTypeMetadata(directiveType, moduleUrl), | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |         template: templateMeta, | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         changeDetection: changeDetectionStrategy, | 
					
						
							| 
									
										
										
										
											2015-10-23 15:55:48 -07:00
										 |  |  |         inputs: dirMeta.inputs, | 
					
						
							|  |  |  |         outputs: dirMeta.outputs, | 
					
						
							|  |  |  |         host: dirMeta.host, | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |         lifecycleHooks: | 
					
						
							|  |  |  |             LIFECYCLE_HOOKS_VALUES.filter(hook => hasLifecycleHook(hook, directiveType)), | 
					
						
							|  |  |  |         providers: providers, | 
					
						
							|  |  |  |         viewProviders: viewProviders, | 
					
						
							|  |  |  |         queries: queries, | 
					
						
							|  |  |  |         viewQueries: viewQueries | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-12-02 10:35:51 -08:00
										 |  |  |       this._directiveCache.set(directiveType, meta); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return meta; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * @param someType a symbol which may or may not be a directive type | 
					
						
							|  |  |  |    * @returns {cpl.CompileDirectiveMetadata} if possible, otherwise null. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   maybeGetDirectiveMetadata(someType: Type): cpl.CompileDirectiveMetadata { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       return this.getDirectiveMetadata(someType); | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       if (e.message.indexOf('No Directive annotation') !== -1) { | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       throw e; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |   getTypeMetadata(type: Type, moduleUrl: string): cpl.CompileTypeMetadata { | 
					
						
							|  |  |  |     return new cpl.CompileTypeMetadata({ | 
					
						
							| 
									
										
										
										
											2016-04-20 18:10:19 -07:00
										 |  |  |       name: this.sanitizeTokenName(type), | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       moduleUrl: moduleUrl, | 
					
						
							|  |  |  |       runtime: type, | 
					
						
							|  |  |  |       diDeps: this.getDependenciesMetadata(type, null) | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   getFactoryMetadata(factory: Function, moduleUrl: string): cpl.CompileFactoryMetadata { | 
					
						
							|  |  |  |     return new cpl.CompileFactoryMetadata({ | 
					
						
							| 
									
										
										
										
											2016-04-20 18:10:19 -07:00
										 |  |  |       name: this.sanitizeTokenName(factory), | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       moduleUrl: moduleUrl, | 
					
						
							|  |  |  |       runtime: factory, | 
					
						
							|  |  |  |       diDeps: this.getDependenciesMetadata(factory, null) | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-02 10:35:51 -08:00
										 |  |  |   getPipeMetadata(pipeType: Type): cpl.CompilePipeMetadata { | 
					
						
							|  |  |  |     var meta = this._pipeCache.get(pipeType); | 
					
						
							|  |  |  |     if (isBlank(meta)) { | 
					
						
							|  |  |  |       var pipeMeta = this._pipeResolver.resolve(pipeType); | 
					
						
							|  |  |  |       meta = new cpl.CompilePipeMetadata({ | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |         type: this.getTypeMetadata(pipeType, staticTypeModuleUrl(pipeType)), | 
					
						
							| 
									
										
										
										
											2015-12-02 10:35:51 -08:00
										 |  |  |         name: pipeMeta.name, | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |         pure: pipeMeta.pure, | 
					
						
							|  |  |  |         lifecycleHooks: LIFECYCLE_HOOKS_VALUES.filter(hook => hasLifecycleHook(hook, pipeType)), | 
					
						
							| 
									
										
										
										
											2015-12-02 10:35:51 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  |       this._pipeCache.set(pipeType, meta); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |     return meta; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |   getViewDirectivesMetadata(component: Type): cpl.CompileDirectiveMetadata[] { | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |     var view = this._viewResolver.resolve(component); | 
					
						
							| 
									
										
										
										
											2016-06-13 08:35:31 -07:00
										 |  |  |     var directives = flattenDirectives(view, this._config.platformDirectives); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |     for (var i = 0; i < directives.length; i++) { | 
					
						
							| 
									
										
										
										
											2015-12-02 10:35:51 -08:00
										 |  |  |       if (!isValidType(directives[i])) { | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |         throw new BaseException( | 
					
						
							|  |  |  |             `Unexpected directive value '${stringify(directives[i])}' on the View of component '${stringify(component)}'`); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-12-02 10:35:51 -08:00
										 |  |  |     return directives.map(type => this.getDirectiveMetadata(type)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   getViewPipesMetadata(component: Type): cpl.CompilePipeMetadata[] { | 
					
						
							|  |  |  |     var view = this._viewResolver.resolve(component); | 
					
						
							| 
									
										
										
										
											2016-06-13 08:35:31 -07:00
										 |  |  |     var pipes = flattenPipes(view, this._config.platformPipes); | 
					
						
							| 
									
										
										
										
											2015-12-02 10:35:51 -08:00
										 |  |  |     for (var i = 0; i < pipes.length; i++) { | 
					
						
							|  |  |  |       if (!isValidType(pipes[i])) { | 
					
						
							|  |  |  |         throw new BaseException( | 
					
						
							|  |  |  |             `Unexpected piped value '${stringify(pipes[i])}' on the View of component '${stringify(component)}'`); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return pipes.map(type => this.getPipeMetadata(type)); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   getDependenciesMetadata(typeOrFunc: Type|Function, dependencies: any[]): | 
					
						
							|  |  |  |       cpl.CompileDiDependencyMetadata[] { | 
					
						
							| 
									
										
										
										
											2016-06-10 01:07:06 +02:00
										 |  |  |     let hasUnknownDeps = false; | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |     let params = isPresent(dependencies) ? dependencies : this._reflector.parameters(typeOrFunc); | 
					
						
							|  |  |  |     if (isBlank(params)) { | 
					
						
							|  |  |  |       params = []; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-06-10 01:07:06 +02:00
										 |  |  |     let dependenciesMetadata: cpl.CompileDiDependencyMetadata[] = params.map((param) => { | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |       if (isBlank(param)) { | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       let isAttribute = false; | 
					
						
							|  |  |  |       let isHost = false; | 
					
						
							|  |  |  |       let isSelf = false; | 
					
						
							|  |  |  |       let isSkipSelf = false; | 
					
						
							|  |  |  |       let isOptional = false; | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  |       let query: QueryMetadata = null; | 
					
						
							|  |  |  |       let viewQuery: ViewQueryMetadata = null; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |       var token: any /** TODO #9100 */ = null; | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |       if (isArray(param)) { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         (<any[]>param).forEach((paramEntry) => { | 
					
						
							|  |  |  |           if (paramEntry instanceof HostMetadata) { | 
					
						
							|  |  |  |             isHost = true; | 
					
						
							|  |  |  |           } else if (paramEntry instanceof SelfMetadata) { | 
					
						
							|  |  |  |             isSelf = true; | 
					
						
							|  |  |  |           } else if (paramEntry instanceof SkipSelfMetadata) { | 
					
						
							|  |  |  |             isSkipSelf = true; | 
					
						
							|  |  |  |           } else if (paramEntry instanceof OptionalMetadata) { | 
					
						
							|  |  |  |             isOptional = true; | 
					
						
							|  |  |  |           } else if (paramEntry instanceof AttributeMetadata) { | 
					
						
							|  |  |  |             isAttribute = true; | 
					
						
							|  |  |  |             token = paramEntry.attributeName; | 
					
						
							|  |  |  |           } else if (paramEntry instanceof QueryMetadata) { | 
					
						
							|  |  |  |             if (paramEntry.isViewQuery) { | 
					
						
							|  |  |  |               viewQuery = paramEntry; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |               query = paramEntry; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } else if (paramEntry instanceof InjectMetadata) { | 
					
						
							|  |  |  |             token = paramEntry.token; | 
					
						
							|  |  |  |           } else if (isValidType(paramEntry) && isBlank(token)) { | 
					
						
							|  |  |  |             token = paramEntry; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |         token = param; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |       if (isBlank(token)) { | 
					
						
							| 
									
										
										
										
											2016-06-10 01:07:06 +02:00
										 |  |  |         hasUnknownDeps = true; | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |         return null; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       } | 
					
						
							|  |  |  |       return new cpl.CompileDiDependencyMetadata({ | 
					
						
							|  |  |  |         isAttribute: isAttribute, | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |         isHost: isHost, | 
					
						
							|  |  |  |         isSelf: isSelf, | 
					
						
							|  |  |  |         isSkipSelf: isSkipSelf, | 
					
						
							|  |  |  |         isOptional: isOptional, | 
					
						
							| 
									
										
										
										
											2016-06-05 04:46:03 +02:00
										 |  |  |         query: isPresent(query) ? this.getQueryMetadata(query, null, typeOrFunc) : null, | 
					
						
							|  |  |  |         viewQuery: isPresent(viewQuery) ? this.getQueryMetadata(viewQuery, null, typeOrFunc) : null, | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |         token: this.getTokenMetadata(token) | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-06-10 01:07:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (hasUnknownDeps) { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       let depsTokens = | 
					
						
							|  |  |  |           dependenciesMetadata.map((dep) => { return dep ? stringify(dep.token) : '?'; }) | 
					
						
							|  |  |  |               .join(', '); | 
					
						
							|  |  |  |       throw new BaseException( | 
					
						
							|  |  |  |           `Can't resolve all parameters for ${stringify(typeOrFunc)}: (${depsTokens}).`); | 
					
						
							| 
									
										
										
										
											2016-06-10 01:07:06 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return dependenciesMetadata; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   getTokenMetadata(token: any): cpl.CompileTokenMetadata { | 
					
						
							|  |  |  |     token = resolveForwardRef(token); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |     var compileToken: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |     if (isString(token)) { | 
					
						
							|  |  |  |       compileToken = new cpl.CompileTokenMetadata({value: token}); | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2016-04-20 18:10:19 -07:00
										 |  |  |       compileToken = new cpl.CompileTokenMetadata({ | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |         identifier: new cpl.CompileIdentifierMetadata({ | 
					
						
							|  |  |  |           runtime: token, | 
					
						
							|  |  |  |           name: this.sanitizeTokenName(token), | 
					
						
							|  |  |  |           moduleUrl: staticTypeModuleUrl(token) | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2016-04-20 18:10:19 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |     } | 
					
						
							|  |  |  |     return compileToken; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   getProvidersMetadata(providers: any[]): | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       Array<cpl.CompileProviderMetadata|cpl.CompileTypeMetadata|any[]> { | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |     return providers.map((provider) => { | 
					
						
							|  |  |  |       provider = resolveForwardRef(provider); | 
					
						
							|  |  |  |       if (isArray(provider)) { | 
					
						
							|  |  |  |         return this.getProvidersMetadata(provider); | 
					
						
							|  |  |  |       } else if (provider instanceof Provider) { | 
					
						
							|  |  |  |         return this.getProviderMetadata(provider); | 
					
						
							| 
									
										
										
										
											2016-04-25 22:25:21 -07:00
										 |  |  |       } else if (isProviderLiteral(provider)) { | 
					
						
							|  |  |  |         return this.getProviderMetadata(createProvider(provider)); | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  |         return this.getTypeMetadata(provider, staticTypeModuleUrl(provider)); | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   getProviderMetadata(provider: Provider): cpl.CompileProviderMetadata { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |     var compileDeps: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |     if (isPresent(provider.useClass)) { | 
					
						
							|  |  |  |       compileDeps = this.getDependenciesMetadata(provider.useClass, provider.dependencies); | 
					
						
							|  |  |  |     } else if (isPresent(provider.useFactory)) { | 
					
						
							|  |  |  |       compileDeps = this.getDependenciesMetadata(provider.useFactory, provider.dependencies); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return new cpl.CompileProviderMetadata({ | 
					
						
							|  |  |  |       token: this.getTokenMetadata(provider.token), | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       useClass: isPresent(provider.useClass) ? | 
					
						
							|  |  |  |           this.getTypeMetadata(provider.useClass, staticTypeModuleUrl(provider.useClass)) : | 
					
						
							|  |  |  |           null, | 
					
						
							| 
									
										
										
										
											2016-04-30 16:13:03 -07:00
										 |  |  |       useValue: convertToCompileValue(provider.useValue), | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       useFactory: isPresent(provider.useFactory) ? | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           this.getFactoryMetadata(provider.useFactory, staticTypeModuleUrl(provider.useFactory)) : | 
					
						
							|  |  |  |           null, | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       useExisting: isPresent(provider.useExisting) ? this.getTokenMetadata(provider.useExisting) : | 
					
						
							|  |  |  |                                                      null, | 
					
						
							|  |  |  |       deps: compileDeps, | 
					
						
							|  |  |  |       multi: provider.multi | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   getQueriesMetadata( | 
					
						
							|  |  |  |       queries: {[key: string]: QueryMetadata}, isViewQuery: boolean, | 
					
						
							|  |  |  |       directiveType: Type): cpl.CompileQueryMetadata[] { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |     var compileQueries: any[] /** TODO #9100 */ = []; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     StringMapWrapper.forEach( | 
					
						
							|  |  |  |         queries, (query: any /** TODO #9100 */, propertyName: any /** TODO #9100 */) => { | 
					
						
							|  |  |  |           if (query.isViewQuery === isViewQuery) { | 
					
						
							|  |  |  |             compileQueries.push(this.getQueryMetadata(query, propertyName, directiveType)); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |     return compileQueries; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   getQueryMetadata(q: QueryMetadata, propertyName: string, typeOrFunc: Type|Function): | 
					
						
							|  |  |  |       cpl.CompileQueryMetadata { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |     var selectors: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |     if (q.isVarBindingQuery) { | 
					
						
							|  |  |  |       selectors = q.varBindings.map(varName => this.getTokenMetadata(varName)); | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2016-06-05 04:46:03 +02:00
										 |  |  |       if (!isPresent(q.selector)) { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         throw new BaseException( | 
					
						
							|  |  |  |             `Can't construct a query for the property "${propertyName}" of "${stringify(typeOrFunc)}" since the query selector wasn't defined.`); | 
					
						
							| 
									
										
										
										
											2016-06-05 04:46:03 +02:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |       selectors = [this.getTokenMetadata(q.selector)]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return new cpl.CompileQueryMetadata({ | 
					
						
							|  |  |  |       selectors: selectors, | 
					
						
							|  |  |  |       first: q.first, | 
					
						
							|  |  |  |       descendants: q.descendants, | 
					
						
							| 
									
										
										
										
											2016-04-18 13:24:42 -07:00
										 |  |  |       propertyName: propertyName, | 
					
						
							|  |  |  |       read: isPresent(q.read) ? this.getTokenMetadata(q.read) : null | 
					
						
							| 
									
										
										
										
											2016-01-06 14:13:44 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-09 14:33:22 -08:00
										 |  |  | function flattenDirectives(view: ViewMetadata, platformDirectives: any[]): Type[] { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   let directives: any[] /** TODO #9100 */ = []; | 
					
						
							| 
									
										
										
										
											2015-11-09 14:33:22 -08:00
										 |  |  |   if (isPresent(platformDirectives)) { | 
					
						
							|  |  |  |     flattenArray(platformDirectives, directives); | 
					
						
							| 
									
										
										
										
											2015-11-02 16:03:42 -08:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (isPresent(view.directives)) { | 
					
						
							|  |  |  |     flattenArray(view.directives, directives); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   return directives; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-02 10:35:51 -08:00
										 |  |  | function flattenPipes(view: ViewMetadata, platformPipes: any[]): Type[] { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   let pipes: any[] /** TODO #9100 */ = []; | 
					
						
							| 
									
										
										
										
											2015-12-02 10:35:51 -08:00
										 |  |  |   if (isPresent(platformPipes)) { | 
					
						
							|  |  |  |     flattenArray(platformPipes, pipes); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (isPresent(view.pipes)) { | 
					
						
							|  |  |  |     flattenArray(view.pipes, pipes); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return pipes; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | function flattenArray(tree: any[], out: Array<Type|any[]>): void { | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   for (var i = 0; i < tree.length; i++) { | 
					
						
							|  |  |  |     var item = resolveForwardRef(tree[i]); | 
					
						
							|  |  |  |     if (isArray(item)) { | 
					
						
							| 
									
										
										
										
											2015-11-02 16:03:42 -08:00
										 |  |  |       flattenArray(item, out); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |     } else { | 
					
						
							|  |  |  |       out.push(item); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  | function isStaticType(value: any): boolean { | 
					
						
							| 
									
										
										
										
											2016-05-02 09:38:46 -07:00
										 |  |  |   return isStringMap(value) && isPresent(value['name']) && isPresent(value['filePath']); | 
					
						
							| 
									
										
										
										
											2016-02-18 10:53:21 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function isValidType(value: any): boolean { | 
					
						
							|  |  |  |   return isStaticType(value) || (value instanceof Type); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function staticTypeModuleUrl(value: any): string { | 
					
						
							| 
									
										
										
										
											2016-05-02 09:38:46 -07:00
										 |  |  |   return isStaticType(value) ? value['filePath'] : null; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | function componentModuleUrl( | 
					
						
							|  |  |  |     reflector: ReflectorReader, type: any, cmpMetadata: ComponentMetadata): string { | 
					
						
							| 
									
										
										
										
											2016-04-28 21:54:02 -07:00
										 |  |  |   if (isStaticType(type)) { | 
					
						
							| 
									
										
										
										
											2016-05-02 09:38:46 -07:00
										 |  |  |     return staticTypeModuleUrl(type); | 
					
						
							| 
									
										
										
										
											2016-04-28 21:54:02 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (isPresent(cmpMetadata.moduleId)) { | 
					
						
							|  |  |  |     var moduleId = cmpMetadata.moduleId; | 
					
						
							| 
									
										
										
										
											2015-12-05 02:21:38 -08:00
										 |  |  |     var scheme = getUrlScheme(moduleId); | 
					
						
							|  |  |  |     return isPresent(scheme) && scheme.length > 0 ? moduleId : | 
					
						
							| 
									
										
										
										
											2016-05-01 22:50:37 -07:00
										 |  |  |                                                     `package:${moduleId}${MODULE_SUFFIX}`; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-04-28 21:54:02 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return reflector.importUri(type); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-04-30 16:13:03 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Only fill CompileIdentifierMetadata.runtime if needed...
 | 
					
						
							|  |  |  | function convertToCompileValue(value: any): any { | 
					
						
							|  |  |  |   return visitValue(value, new _CompileValueConverter(), null); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _CompileValueConverter extends ValueTransformer { | 
					
						
							|  |  |  |   visitOther(value: any, context: any): any { | 
					
						
							|  |  |  |     if (isStaticType(value)) { | 
					
						
							|  |  |  |       return new cpl.CompileIdentifierMetadata( | 
					
						
							|  |  |  |           {name: value['name'], moduleUrl: staticTypeModuleUrl(value)}); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       return new cpl.CompileIdentifierMetadata({runtime: value}); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |