11import { ClassType } from '@slicky/lang' ;
2- import { stringify , isFunction , forEach , exists , camelCaseToHyphens , flatten , map , unique , merge , find } from '@slicky/utils' ;
2+ import { stringify , isFunction , forEach , exists , camelCaseToHyphens , map , unique , merge , find , clone } from '@slicky/utils' ;
33import { findAnnotation , getPropertiesMetadata } from '@slicky/reflection' ;
44import { RenderableTemplateFactory , TemplateEncapsulation } from '@slicky/templates/templates' ;
55import { DirectiveAnnotationDefinition } from './directive' ;
@@ -14,6 +14,7 @@ import {ChildrenDirectiveDefinition} from './childrenDirective';
1414import { FilterInterface } from '../filters' ;
1515import { ExtensionsManager } from '../extensions' ;
1616import { FilterMetadata , FilterMetadataLoader } from './filterMetadataLoader' ;
17+ import { ModuleMetadataLoader , ModuleMetadata } from './moduleMetadataLoader' ;
1718
1819
1920const STATIC_DIRECTIVE_METADATA_STORAGE = '__slicky__directive__metadata__' ;
@@ -124,13 +125,16 @@ export class DirectiveMetadataLoader
124125
125126 private filterMetadataLoader : FilterMetadataLoader ;
126127
128+ private moduleMetadataLoader : ModuleMetadataLoader ;
129+
127130 private globalFilters : Array < ClassType < FilterInterface > > = [ ] ;
128131
129132
130133 constructor ( extensions : ExtensionsManager )
131134 {
132135 this . extensions = extensions ;
133136 this . filterMetadataLoader = new FilterMetadataLoader ;
137+ this . moduleMetadataLoader = new ModuleMetadataLoader ;
134138 }
135139
136140
@@ -183,6 +187,10 @@ export class DirectiveMetadataLoader
183187 type = DirectiveDefinitionType . Component ;
184188 }
185189
190+ const modules = map ( annotation . modules , ( moduleType : ClassType < any > ) => {
191+ return this . moduleMetadataLoader . loadModule ( moduleType ) ;
192+ } ) ;
193+
186194 const name = stringify ( directiveType ) ;
187195
188196 const metadata : DirectiveDefinition = {
@@ -195,7 +203,7 @@ export class DirectiveMetadataLoader
195203 onTemplateInit : isFunction ( directiveType . prototype . onTemplateInit ) ,
196204 onUpdate : isFunction ( directiveType . prototype . onUpdate ) ,
197205 onAttach : isFunction ( directiveType . prototype . onAttach ) ,
198- directives : this . loadDirectivesMetadata ( directiveType , annotation ) ,
206+ directives : this . loadDirectivesMetadata ( directiveType , annotation , modules ) ,
199207 inputs : [ ] ,
200208 outputs : [ ] ,
201209 elements : [ ] ,
@@ -232,11 +240,19 @@ export class DirectiveMetadataLoader
232240 }
233241
234242
235- private loadDirectivesMetadata ( directiveType : ClassType < any > , annotation : DirectiveAnnotationDefinition ) : Array < DirectiveDefinitionInnerDirective >
243+ private loadDirectivesMetadata ( directiveType : ClassType < any > , annotation : DirectiveAnnotationDefinition , modules : Array < ModuleMetadata > ) : Array < DirectiveDefinitionInnerDirective >
236244 {
237245 const attachedDirectives = { } ;
238246
239- const directives = map ( unique ( flatten ( annotation . directives ) ) , ( innerDirectiveType : ClassType < any > ) : DirectiveDefinitionInnerDirective => {
247+ let allDirectives : Array < ClassType < any > > = clone ( annotation . directives ) ;
248+
249+ forEach ( modules , ( module : ModuleMetadata ) => {
250+ allDirectives = merge ( allDirectives , module . directives ) ;
251+ } ) ;
252+
253+ allDirectives = unique ( allDirectives ) ;
254+
255+ const directives = map ( allDirectives , ( innerDirectiveType : ClassType < any > ) : DirectiveDefinitionInnerDirective => {
240256 const metadata = this . loadDirective ( innerDirectiveType ) ;
241257
242258 attachedDirectives [ metadata . id ] = innerDirectiveType ;
0 commit comments