@@ -12,11 +12,11 @@ export class MetadataStorage {
12
12
// Private properties
13
13
// -------------------------------------------------------------------------
14
14
15
- private validationMetadatas : ValidationMetadata [ ] = [ ] ;
16
- private constraintMetadatas : ConstraintMetadata [ ] = [ ] ;
15
+ private validationMetadatas : Map < any , ValidationMetadata [ ] > = new Map ( ) ;
16
+ private constraintMetadatas : Map < any , ConstraintMetadata [ ] > = new Map ( ) ;
17
17
18
18
get hasValidationMetaData ( ) : boolean {
19
- return ! ! this . validationMetadatas . length ;
19
+ return ! ! this . validationMetadatas . size ;
20
20
}
21
21
22
22
// -------------------------------------------------------------------------
@@ -35,14 +35,26 @@ export class MetadataStorage {
35
35
* Adds a new validation metadata.
36
36
*/
37
37
addValidationMetadata ( metadata : ValidationMetadata ) : void {
38
- this . validationMetadatas . push ( metadata ) ;
38
+ const existingMetadata = this . validationMetadatas . get ( metadata . target ) ;
39
+
40
+ if ( existingMetadata ) {
41
+ existingMetadata . push ( metadata ) ;
42
+ } else {
43
+ this . validationMetadatas . set ( metadata . target , [ metadata ] ) ;
44
+ }
39
45
}
40
46
41
47
/**
42
48
* Adds a new constraint metadata.
43
49
*/
44
50
addConstraintMetadata ( metadata : ConstraintMetadata ) : void {
45
- this . constraintMetadatas . push ( metadata ) ;
51
+ const existingMetadata = this . constraintMetadatas . get ( metadata . target ) ;
52
+
53
+ if ( existingMetadata ) {
54
+ existingMetadata . push ( metadata ) ;
55
+ } else {
56
+ this . constraintMetadatas . set ( metadata . target , [ metadata ] ) ;
57
+ }
46
58
}
47
59
48
60
/**
@@ -91,7 +103,8 @@ export class MetadataStorage {
91
103
} ;
92
104
93
105
// get directly related to a target metadatas
94
- const originalMetadatas = this . validationMetadatas . filter ( metadata => {
106
+ const filteredForOriginalMetadatasSearch = this . validationMetadatas . get ( targetConstructor ) || [ ] ;
107
+ const originalMetadatas = filteredForOriginalMetadatasSearch . filter ( metadata => {
95
108
if ( metadata . target !== targetConstructor && metadata . target !== targetSchema ) return false ;
96
109
if ( includeMetadataBecauseOfAlwaysOption ( metadata ) ) return true ;
97
110
if ( excludeMetadataBecauseOfStrictGroupsOption ( metadata ) ) return false ;
@@ -102,7 +115,13 @@ export class MetadataStorage {
102
115
} ) ;
103
116
104
117
// get metadatas for inherited classes
105
- const inheritedMetadatas = this . validationMetadatas . filter ( metadata => {
118
+ const filteredForInheritedMetadatasSearch = [ ] ;
119
+ for ( const [ key , value ] of this . validationMetadatas . entries ( ) ) {
120
+ if ( targetConstructor . prototype instanceof key ) {
121
+ filteredForInheritedMetadatasSearch . push ( ...value ) ;
122
+ }
123
+ }
124
+ const inheritedMetadatas = filteredForInheritedMetadatasSearch . filter ( metadata => {
106
125
// if target is a string it's means we validate against a schema, and there is no inheritance support for schemas
107
126
if ( typeof metadata . target === 'string' ) return false ;
108
127
if ( metadata . target === targetConstructor ) return false ;
@@ -133,7 +152,7 @@ export class MetadataStorage {
133
152
* Gets all validator constraints for the given object.
134
153
*/
135
154
getTargetValidatorConstraints ( target : Function ) : ConstraintMetadata [ ] {
136
- return this . constraintMetadatas . filter ( metadata => metadata . target === target ) ;
155
+ return this . constraintMetadatas . get ( target ) || [ ] ;
137
156
}
138
157
}
139
158
0 commit comments