diff --git a/modules/@angular/compiler/src/metadata_resolver.ts b/modules/@angular/compiler/src/metadata_resolver.ts index f128b420e0..f590ec4148 100644 --- a/modules/@angular/compiler/src/metadata_resolver.ts +++ b/modules/@angular/compiler/src/metadata_resolver.ts @@ -8,12 +8,10 @@ import {AnimationAnimateMetadata, AnimationEntryMetadata, AnimationGroupMetadata, AnimationKeyframesSequenceMetadata, AnimationMetadata, AnimationStateDeclarationMetadata, AnimationStateMetadata, AnimationStateTransitionMetadata, AnimationStyleMetadata, AnimationWithStepsMetadata, Attribute, ChangeDetectionStrategy, Component, Host, Inject, Injectable, ModuleWithProviders, Optional, Provider, Query, SchemaMetadata, Self, SkipSelf, Type, resolveForwardRef} from '@angular/core'; -import {StringMapWrapper} from '../src/facade/collection'; - import {assertArrayOfStrings, assertInterpolationSymbols} from './assertions'; import * as cpl from './compile_metadata'; import {DirectiveResolver} from './directive_resolver'; -import {StringWrapper, isArray, isBlank, isPresent, isString, stringify} from './facade/lang'; +import {isBlank, isPresent, isString, stringify} from './facade/lang'; import {Identifiers, resolveIdentifierToken} from './identifiers'; import {hasLifecycleHook} from './lifecycle_reflector'; import {NgModuleResolver} from './ng_module_resolver'; @@ -42,7 +40,7 @@ export class CompileMetadataResolver { if (identifier.indexOf('(') >= 0) { // case: anonymous functions! let found = this._anonymousTypes.get(token); - if (isBlank(found)) { + if (!found) { this._anonymousTypes.set(token, this._anonymousTypeIndex++); found = this._anonymousTypes.get(token); } @@ -67,18 +65,21 @@ export class CompileMetadataResolver { } getAnimationEntryMetadata(entry: AnimationEntryMetadata): cpl.CompileAnimationEntryMetadata { - var defs = entry.definitions.map(def => this.getAnimationStateMetadata(def)); + const defs = entry.definitions.map(def => this.getAnimationStateMetadata(def)); return new cpl.CompileAnimationEntryMetadata(entry.name, defs); } getAnimationStateMetadata(value: AnimationStateMetadata): cpl.CompileAnimationStateMetadata { if (value instanceof AnimationStateDeclarationMetadata) { - var styles = this.getAnimationStyleMetadata(value.styles); + const styles = this.getAnimationStyleMetadata(value.styles); return new cpl.CompileAnimationStateDeclarationMetadata(value.stateNameExpr, styles); - } else if (value instanceof AnimationStateTransitionMetadata) { + } + + if (value instanceof AnimationStateTransitionMetadata) { return new cpl.CompileAnimationStateTransitionMetadata( value.stateChangeExpr, this.getAnimationMetadata(value.steps)); } + return null; } @@ -89,21 +90,28 @@ export class CompileMetadataResolver { getAnimationMetadata(value: AnimationMetadata): cpl.CompileAnimationMetadata { if (value instanceof AnimationStyleMetadata) { return this.getAnimationStyleMetadata(value); - } else if (value instanceof AnimationKeyframesSequenceMetadata) { + } + + if (value instanceof AnimationKeyframesSequenceMetadata) { return new cpl.CompileAnimationKeyframesSequenceMetadata( value.steps.map(entry => this.getAnimationStyleMetadata(entry))); - } else if (value instanceof AnimationAnimateMetadata) { - let animateData = + } + + if (value instanceof AnimationAnimateMetadata) { + const animateData = this .getAnimationMetadata(value.styles); return new cpl.CompileAnimationAnimateMetadata(value.timings, animateData); - } else if (value instanceof AnimationWithStepsMetadata) { - var steps = value.steps.map(step => this.getAnimationMetadata(step)); + } + + if (value instanceof AnimationWithStepsMetadata) { + const steps = value.steps.map(step => this.getAnimationMetadata(step)); + if (value instanceof AnimationGroupMetadata) { return new cpl.CompileAnimationGroupMetadata(steps); - } else { - return new cpl.CompileAnimationSequenceMetadata(steps); } + + return new cpl.CompileAnimationSequenceMetadata(steps); } return null; } @@ -111,47 +119,49 @@ export class CompileMetadataResolver { getDirectiveMetadata(directiveType: Type, throwIfNotFound = true): cpl.CompileDirectiveMetadata { directiveType = resolveForwardRef(directiveType); - var meta = this._directiveCache.get(directiveType); - if (isBlank(meta)) { - var dirMeta = this._directiveResolver.resolve(directiveType, throwIfNotFound); + let meta = this._directiveCache.get(directiveType); + if (!meta) { + const dirMeta = this._directiveResolver.resolve(directiveType, throwIfNotFound); if (!dirMeta) { return null; } - var templateMeta: cpl.CompileTemplateMetadata = null; - var changeDetectionStrategy: ChangeDetectionStrategy = null; - var viewProviders: Array = []; - var moduleUrl = staticTypeModuleUrl(directiveType); - var entryComponentMetadata: cpl.CompileTypeMetadata[] = []; + let templateMeta: cpl.CompileTemplateMetadata = null; + let changeDetectionStrategy: ChangeDetectionStrategy = null; + let viewProviders: Array = []; + let moduleUrl = staticTypeModuleUrl(directiveType); + let entryComponentMetadata: cpl.CompileTypeMetadata[] = []; let selector = dirMeta.selector; + if (dirMeta instanceof Component) { - var cmpMeta = dirMeta; - assertArrayOfStrings('styles', cmpMeta.styles); - assertInterpolationSymbols('interpolation', cmpMeta.interpolation); - var animations = isPresent(cmpMeta.animations) ? - cmpMeta.animations.map(e => this.getAnimationEntryMetadata(e)) : + // Component + assertArrayOfStrings('styles', dirMeta.styles); + assertArrayOfStrings('styleUrls', dirMeta.styleUrls); + assertInterpolationSymbols('interpolation', dirMeta.interpolation); + + const animations = dirMeta.animations ? + dirMeta.animations.map(e => this.getAnimationEntryMetadata(e)) : null; - assertArrayOfStrings('styles', cmpMeta.styles); - assertArrayOfStrings('styleUrls', cmpMeta.styleUrls); templateMeta = new cpl.CompileTemplateMetadata({ - encapsulation: cmpMeta.encapsulation, - template: cmpMeta.template, - templateUrl: cmpMeta.templateUrl, - styles: cmpMeta.styles, - styleUrls: cmpMeta.styleUrls, + encapsulation: dirMeta.encapsulation, + template: dirMeta.template, + templateUrl: dirMeta.templateUrl, + styles: dirMeta.styles, + styleUrls: dirMeta.styleUrls, animations: animations, - interpolation: cmpMeta.interpolation + interpolation: dirMeta.interpolation }); - changeDetectionStrategy = cmpMeta.changeDetection; - if (isPresent(dirMeta.viewProviders)) { + + changeDetectionStrategy = dirMeta.changeDetection; + if (dirMeta.viewProviders) { viewProviders = this.getProvidersMetadata( dirMeta.viewProviders, entryComponentMetadata, `viewProviders for "${stringify(directiveType)}"`); } - moduleUrl = componentModuleUrl(this._reflector, directiveType, cmpMeta); - if (cmpMeta.entryComponents) { + moduleUrl = componentModuleUrl(this._reflector, directiveType, dirMeta); + if (dirMeta.entryComponents) { entryComponentMetadata = - flattenArray(cmpMeta.entryComponents) + flattenArray(dirMeta.entryComponents) .map((type) => this.getTypeMetadata(type, staticTypeModuleUrl(type))) .concat(entryComponentMetadata); } @@ -159,27 +169,29 @@ export class CompileMetadataResolver { selector = this._schemaRegistry.getDefaultComponentElementName(); } } else { + // Directive if (!selector) { throw new Error(`Directive ${stringify(directiveType)} has no selector, please add it!`); } } - var providers: Array = []; + let providers: Array = []; if (isPresent(dirMeta.providers)) { providers = this.getProvidersMetadata( dirMeta.providers, entryComponentMetadata, `providers for "${stringify(directiveType)}"`); } - var queries: cpl.CompileQueryMetadata[] = []; - var viewQueries: cpl.CompileQueryMetadata[] = []; + let queries: cpl.CompileQueryMetadata[] = []; + let viewQueries: cpl.CompileQueryMetadata[] = []; if (isPresent(dirMeta.queries)) { queries = this.getQueriesMetadata(dirMeta.queries, false, directiveType); viewQueries = this.getQueriesMetadata(dirMeta.queries, true, directiveType); } + meta = cpl.CompileDirectiveMetadata.create({ selector: selector, exportAs: dirMeta.exportAs, - isComponent: isPresent(templateMeta), + isComponent: !!templateMeta, type: this.getTypeMetadata(directiveType, moduleUrl), template: templateMeta, changeDetection: changeDetectionStrategy, @@ -199,7 +211,7 @@ export class CompileMetadataResolver { getNgModuleMetadata(moduleType: any, throwIfNotFound = true): cpl.CompileNgModuleMetadata { moduleType = resolveForwardRef(moduleType); - var compileMeta = this._ngModuleCache.get(moduleType); + let compileMeta = this._ngModuleCache.get(moduleType); if (!compileMeta) { const meta = this._ngModuleResolver.resolve(moduleType, throwIfNotFound); if (!meta) { @@ -230,8 +242,9 @@ export class CompileMetadataResolver { `provider for the NgModule '${stringify(importedModuleType)}'`)); } } + if (importedModuleType) { - let importedMeta = this.getNgModuleMetadata(importedModuleType, false); + const importedMeta = this.getNgModuleMetadata(importedModuleType, false); if (importedMeta === null) { throw new Error( `Unexpected ${this._getTypeDescriptor(importedType)} '${stringify(importedType)}' imported by the module '${stringify(moduleType)}'`); @@ -298,11 +311,13 @@ export class CompileMetadataResolver { meta.providers, entryComponents, `provider for the NgModule '${stringify(moduleType)}'`)); } + if (meta.entryComponents) { entryComponents.push( ...flattenArray(meta.entryComponents) .map(type => this.getTypeMetadata(type, staticTypeModuleUrl(type)))); } + if (meta.bootstrap) { const typeMetadata = flattenArray(meta.bootstrap).map(type => { if (!isValidType(type)) { @@ -313,7 +328,9 @@ export class CompileMetadataResolver { }); bootstrapComponents.push(...typeMetadata); } + entryComponents.push(...bootstrapComponents); + if (meta.schemas) { schemas.push(...flattenArray(meta.schemas)); } @@ -323,19 +340,20 @@ export class CompileMetadataResolver { compileMeta = new cpl.CompileNgModuleMetadata({ type: this.getTypeMetadata(moduleType, staticTypeModuleUrl(moduleType)), - providers: providers, - entryComponents: entryComponents, - bootstrapComponents: bootstrapComponents, - schemas: schemas, - declaredDirectives: declaredDirectives, - exportedDirectives: exportedDirectives, - declaredPipes: declaredPipes, - exportedPipes: exportedPipes, - importedModules: importedModules, - exportedModules: exportedModules, - transitiveModule: transitiveModule, + providers, + entryComponents, + bootstrapComponents, + schemas, + declaredDirectives, + exportedDirectives, + declaredPipes, + exportedPipes, + importedModules, + exportedModules, + transitiveModule, id: meta.id, }); + transitiveModule.modules.push(compileMeta); this._verifyModule(compileMeta); this._ngModuleCache.set(moduleType, compileMeta); @@ -351,6 +369,7 @@ export class CompileMetadataResolver { `Can't export directive ${stringify(dirMeta.type.reference)} from ${stringify(moduleMeta.type.reference)} as it was neither declared nor imported!`); } }); + moduleMeta.exportedPipes.forEach((pipeMeta) => { if (!moduleMeta.transitiveModule.pipesSet.has(pipeMeta.type.reference)) { throw new Error( @@ -362,15 +381,21 @@ export class CompileMetadataResolver { private _getTypeDescriptor(type: Type): string { if (this._directiveResolver.resolve(type, false) !== null) { return 'directive'; - } else if (this._pipeResolver.resolve(type, false) !== null) { - return 'pipe'; - } else if (this._ngModuleResolver.resolve(type, false) !== null) { - return 'module'; - } else if ((type as any).provide) { - return 'provider'; - } else { - return 'value'; } + + if (this._pipeResolver.resolve(type, false) !== null) { + return 'pipe'; + } + + if (this._ngModuleResolver.resolve(type, false) !== null) { + return 'module'; + } + + if ((type as any).provide) { + return 'provider'; + } + + return 'value'; } private _addTypeToModule(type: Type, moduleType: Type) { @@ -434,7 +459,7 @@ export class CompileMetadataResolver { type = resolveForwardRef(type); return new cpl.CompileTypeMetadata({ name: this.sanitizeTokenName(type), - moduleUrl: moduleUrl, + moduleUrl, reference: type, diDeps: this.getDependenciesMetadata(type, dependencies), lifecycleHooks: LIFECYCLE_HOOKS_VALUES.filter(hook => hasLifecycleHook(hook, type)), @@ -446,7 +471,7 @@ export class CompileMetadataResolver { factory = resolveForwardRef(factory); return new cpl.CompileFactoryMetadata({ name: this.sanitizeTokenName(factory), - moduleUrl: moduleUrl, + moduleUrl, reference: factory, diDeps: this.getDependenciesMetadata(factory, dependencies) }); @@ -454,12 +479,13 @@ export class CompileMetadataResolver { getPipeMetadata(pipeType: Type, throwIfNotFound = true): cpl.CompilePipeMetadata { pipeType = resolveForwardRef(pipeType); - var meta = this._pipeCache.get(pipeType); - if (isBlank(meta)) { - var pipeMeta = this._pipeResolver.resolve(pipeType, throwIfNotFound); + let meta = this._pipeCache.get(pipeType); + if (!meta) { + const pipeMeta = this._pipeResolver.resolve(pipeType, throwIfNotFound); if (!pipeMeta) { return null; } + meta = new cpl.CompilePipeMetadata({ type: this.getTypeMetadata(pipeType, staticTypeModuleUrl(pipeType)), name: pipeMeta.name, @@ -473,10 +499,8 @@ export class CompileMetadataResolver { getDependenciesMetadata(typeOrFunc: Type|Function, dependencies: any[]): cpl.CompileDiDependencyMetadata[] { let hasUnknownDeps = false; - let params = isPresent(dependencies) ? dependencies : this._reflector.parameters(typeOrFunc); - if (isBlank(params)) { - params = []; - } + let params = dependencies || this._reflector.parameters(typeOrFunc) || []; + let dependenciesMetadata: cpl.CompileDiDependencyMetadata[] = params.map((param) => { let isAttribute = false; let isHost = false; @@ -486,8 +510,8 @@ export class CompileMetadataResolver { let query: Query = null; let viewQuery: Query = null; var token: any = null; - if (isArray(param)) { - (param).forEach((paramEntry) => { + if (Array.isArray(param)) { + param.forEach((paramEntry) => { if (paramEntry instanceof Host) { isHost = true; } else if (paramEntry instanceof Self) { @@ -518,14 +542,15 @@ export class CompileMetadataResolver { hasUnknownDeps = true; return null; } + return new cpl.CompileDiDependencyMetadata({ - isAttribute: isAttribute, - isHost: isHost, - isSelf: isSelf, - isSkipSelf: isSkipSelf, - isOptional: isOptional, - query: isPresent(query) ? this.getQueryMetadata(query, null, typeOrFunc) : null, - viewQuery: isPresent(viewQuery) ? this.getQueryMetadata(viewQuery, null, typeOrFunc) : null, + isAttribute, + isHost, + isSelf, + isSkipSelf, + isOptional, + query: query ? this.getQueryMetadata(query, null, typeOrFunc) : null, + viewQuery: viewQuery ? this.getQueryMetadata(viewQuery, null, typeOrFunc) : null, token: this.getTokenMetadata(token) }); @@ -533,8 +558,7 @@ export class CompileMetadataResolver { if (hasUnknownDeps) { let depsTokens = - dependenciesMetadata.map((dep) => { return dep ? stringify(dep.token) : '?'; }) - .join(', '); + dependenciesMetadata.map((dep) => dep ? stringify(dep.token) : '?').join(', '); throw new Error( `Can't resolve all parameters for ${stringify(typeOrFunc)}: (${depsTokens}).`); } @@ -544,7 +568,7 @@ export class CompileMetadataResolver { getTokenMetadata(token: any): cpl.CompileTokenMetadata { token = resolveForwardRef(token); - var compileToken: any /** TODO #9100 */; + let compileToken: cpl.CompileTokenMetadata; if (isString(token)) { compileToken = new cpl.CompileTokenMetadata({value: token}); } else { @@ -569,7 +593,7 @@ export class CompileMetadataResolver { provider = new cpl.ProviderMeta(provider.provide, provider); } let compileProvider: cpl.CompileProviderMetadata|cpl.CompileTypeMetadata|any[]; - if (isArray(provider)) { + if (Array.isArray(provider)) { compileProvider = this.getProvidersMetadata(provider, targetEntryComponents, debugInfo); } else if (provider instanceof cpl.ProviderMeta) { let tokenMeta = this.getTokenMetadata(provider.token); @@ -607,17 +631,20 @@ export class CompileMetadataResolver { } private _getEntryComponentsFromProvider(provider: cpl.ProviderMeta): cpl.CompileTypeMetadata[] { - let components: cpl.CompileTypeMetadata[] = []; - let collectedIdentifiers: cpl.CompileIdentifierMetadata[] = []; + const components: cpl.CompileTypeMetadata[] = []; + const collectedIdentifiers: cpl.CompileIdentifierMetadata[] = []; + if (provider.useFactory || provider.useExisting || provider.useClass) { throw new Error(`The ANALYZE_FOR_ENTRY_COMPONENTS token only supports useValue!`); } + if (!provider.multi) { throw new Error(`The ANALYZE_FOR_ENTRY_COMPONENTS token only supports 'multi = true'!`); } + convertToCompileValue(provider.useValue, collectedIdentifiers); collectedIdentifiers.forEach((identifier) => { - let dirMeta = this.getDirectiveMetadata(identifier.reference, false); + const dirMeta = this.getDirectiveMetadata(identifier.reference, false); if (dirMeta) { components.push(dirMeta.type); } @@ -626,15 +653,15 @@ export class CompileMetadataResolver { } getProviderMetadata(provider: cpl.ProviderMeta): cpl.CompileProviderMetadata { - var compileDeps: cpl.CompileDiDependencyMetadata[]; - var compileTypeMetadata: cpl.CompileTypeMetadata = null; - var compileFactoryMetadata: cpl.CompileFactoryMetadata = null; + let compileDeps: cpl.CompileDiDependencyMetadata[]; + let compileTypeMetadata: cpl.CompileTypeMetadata = null; + let compileFactoryMetadata: cpl.CompileFactoryMetadata = null; - if (isPresent(provider.useClass)) { + if (provider.useClass) { compileTypeMetadata = this.getTypeMetadata( provider.useClass, staticTypeModuleUrl(provider.useClass), provider.dependencies); compileDeps = compileTypeMetadata.diDeps; - } else if (isPresent(provider.useFactory)) { + } else if (provider.useFactory) { compileFactoryMetadata = this.getFactoryMetadata( provider.useFactory, staticTypeModuleUrl(provider.useFactory), provider.dependencies); compileDeps = compileFactoryMetadata.diDeps; @@ -645,8 +672,7 @@ export class CompileMetadataResolver { useClass: compileTypeMetadata, useValue: convertToCompileValue(provider.useValue, []), useFactory: compileFactoryMetadata, - useExisting: isPresent(provider.useExisting) ? this.getTokenMetadata(provider.useExisting) : - null, + useExisting: provider.useExisting ? this.getTokenMetadata(provider.useExisting) : null, deps: compileDeps, multi: provider.multi }); @@ -655,38 +681,38 @@ export class CompileMetadataResolver { getQueriesMetadata( queries: {[key: string]: Query}, isViewQuery: boolean, directiveType: Type): cpl.CompileQueryMetadata[] { - var res: cpl.CompileQueryMetadata[] = []; - StringMapWrapper.forEach(queries, (query: Query, propertyName: string) => { + const res: cpl.CompileQueryMetadata[] = []; + + Object.keys(queries).forEach((propertyName: string) => { + const query = queries[propertyName]; if (query.isViewQuery === isViewQuery) { res.push(this.getQueryMetadata(query, propertyName, directiveType)); } }); + return res; } - private _queryVarBindings(selector: any): string[] { - return StringWrapper.split(selector, /\s*,\s*/g); - } - + private _queryVarBindings(selector: any): string[] { return selector.split(/\s*,\s*/); } getQueryMetadata(q: Query, propertyName: string, typeOrFunc: Type|Function): cpl.CompileQueryMetadata { var selectors: cpl.CompileTokenMetadata[]; - if (isString(q.selector)) { + if (typeof q.selector === 'string') { selectors = this._queryVarBindings(q.selector).map(varName => this.getTokenMetadata(varName)); } else { - if (!isPresent(q.selector)) { + if (!q.selector) { throw new Error( `Can't construct a query for the property "${propertyName}" of "${stringify(typeOrFunc)}" since the query selector wasn't defined.`); } selectors = [this.getTokenMetadata(q.selector)]; } + return new cpl.CompileQueryMetadata({ - selectors: selectors, + selectors, first: q.first, - descendants: q.descendants, - propertyName: propertyName, - read: isPresent(q.read) ? this.getTokenMetadata(q.read) : null + descendants: q.descendants, propertyName, + read: q.read ? this.getTokenMetadata(q.read) : null }); } } @@ -713,9 +739,9 @@ function getTransitiveModules( function flattenArray(tree: any[], out: Array = []): Array { if (tree) { - for (var i = 0; i < tree.length; i++) { - var item = resolveForwardRef(tree[i]); - if (isArray(item)) { + for (let i = 0; i < tree.length; i++) { + const item = resolveForwardRef(tree[i]); + if (Array.isArray(item)) { flattenArray(item, out); } else { out.push(item); @@ -733,16 +759,15 @@ function staticTypeModuleUrl(value: any): string { return cpl.isStaticSymbol(value) ? value.filePath : null; } -function componentModuleUrl(reflector: ReflectorReader, type: any, cmpMetadata: Component): string { +function componentModuleUrl(reflector: ReflectorReader, type: Type, cmpMetadata: Component): string { if (cpl.isStaticSymbol(type)) { return staticTypeModuleUrl(type); } if (isPresent(cmpMetadata.moduleId)) { - var moduleId = cmpMetadata.moduleId; - var scheme = getUrlScheme(moduleId); - return isPresent(scheme) && scheme.length > 0 ? moduleId : - `package:${moduleId}${MODULE_SUFFIX}`; + const moduleId = cmpMetadata.moduleId; + const scheme = getUrlScheme(moduleId); + return scheme ? moduleId : `package:${moduleId}${MODULE_SUFFIX}`; } return reflector.importUri(type); diff --git a/modules/@angular/compiler/test/metadata_resolver_spec.ts b/modules/@angular/compiler/test/metadata_resolver_spec.ts index 9e0b0acb85..80050c8758 100644 --- a/modules/@angular/compiler/test/metadata_resolver_spec.ts +++ b/modules/@angular/compiler/test/metadata_resolver_spec.ts @@ -7,7 +7,7 @@ */ import {TEST_COMPILER_PROVIDERS} from '@angular/compiler/testing/test_bindings'; -import {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, ChangeDetectionStrategy, Component, Directive, DoCheck, Injectable, NgModule, OnChanges, OnDestroy, OnInit, Pipe, SimpleChanges, ViewEncapsulation} from '@angular/core'; +import {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, ChangeDetectionStrategy, Component, DoCheck, Injectable, NgModule, OnChanges, OnDestroy, OnInit, Pipe, SimpleChanges, ViewEncapsulation} from '@angular/core'; import {LIFECYCLE_HOOKS_VALUES} from '@angular/core/src/metadata/lifecycle_hooks'; import {TestBed, inject} from '@angular/core/testing'; @@ -23,7 +23,7 @@ export function main() { describe('getDirectiveMetadata', () => { it('should read metadata', inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => { - var meta = resolver.getDirectiveMetadata(ComponentWithEverything); + const meta = resolver.getDirectiveMetadata(ComponentWithEverything); expect(meta.selector).toEqual('someSelector'); expect(meta.exportAs).toEqual('someExportAs'); expect(meta.isComponent).toBe(true); @@ -175,14 +175,6 @@ export function main() { }); } -@Directive({selector: 'a-directive'}) -class ADirective { -} - -@Directive({selector: 'someSelector'}) -class SomeDirective { -} - @Component({selector: 'someComponent', template: ''}) class ComponentWithoutModuleId { }