@@ -40,6 +40,7 @@ import {
40
40
import { type InterfaceClassMetadata } from "@/metadata/definitions/interface-class-metadata" ;
41
41
import { type ObjectClassMetadata } from "@/metadata/definitions/object-class-metadata" ;
42
42
import { getMetadataStorage } from "@/metadata/getMetadataStorage" ;
43
+ import { MetadataStorage } from "@/metadata/metadata-storage" ;
43
44
import {
44
45
createAdvancedFieldResolver ,
45
46
createBasicFieldResolver ,
@@ -118,10 +119,15 @@ export abstract class SchemaGenerator {
118
119
119
120
private static usedInterfaceTypes = new Set < Function > ( ) ;
120
121
122
+ private static metadataStorage : MetadataStorage ;
123
+
121
124
static generateFromMetadata ( options : SchemaGeneratorOptions ) : GraphQLSchema {
125
+ this . metadataStorage = Object . assign ( new MetadataStorage ( ) , getMetadataStorage ( ) ) ;
126
+ this . metadataStorage . build ( options ) ;
127
+
122
128
this . checkForErrors ( options ) ;
123
129
BuildContext . create ( options ) ;
124
- getMetadataStorage ( ) . build ( options ) ;
130
+
125
131
this . buildTypesInfo ( options . resolvers ) ;
126
132
127
133
const orphanedTypes = options . orphanedTypes ?? [ ] ;
@@ -152,7 +158,7 @@ export abstract class SchemaGenerator {
152
158
153
159
private static checkForErrors ( options : SchemaGeneratorOptions ) {
154
160
ensureInstalledCorrectGraphQLPackage ( ) ;
155
- if ( getMetadataStorage ( ) . authorizedFields . length !== 0 && options . authChecker === undefined ) {
161
+ if ( this . metadataStorage . authorizedFields . length !== 0 && options . authChecker === undefined ) {
156
162
throw new Error (
157
163
"You need to provide `authChecker` function for `@Authorized` decorator usage!" ,
158
164
) ;
@@ -189,7 +195,7 @@ export abstract class SchemaGenerator {
189
195
}
190
196
191
197
private static buildTypesInfo ( resolvers : Function [ ] ) {
192
- this . unionTypesInfo = getMetadataStorage ( ) . unions . map < UnionTypeInfo > ( unionMetadata => {
198
+ this . unionTypesInfo = this . metadataStorage . unions . map < UnionTypeInfo > ( unionMetadata => {
193
199
// use closure to capture values from this selected schema build
194
200
const unionObjectTypesInfo : ObjectTypeInfo [ ] = [ ] ;
195
201
// called once after building all `objectTypesInfo`
@@ -232,7 +238,7 @@ export abstract class SchemaGenerator {
232
238
} ;
233
239
} ) ;
234
240
235
- this . enumTypesInfo = getMetadataStorage ( ) . enums . map < EnumTypeInfo > ( enumMetadata => {
241
+ this . enumTypesInfo = this . metadataStorage . enums . map < EnumTypeInfo > ( enumMetadata => {
236
242
const enumMap = getEnumValuesMap ( enumMetadata . enumObj ) ;
237
243
return {
238
244
enumObj : enumMetadata . enumObj ,
@@ -253,7 +259,7 @@ export abstract class SchemaGenerator {
253
259
} ;
254
260
} ) ;
255
261
256
- this . objectTypesInfo = getMetadataStorage ( ) . objectTypes . map < ObjectTypeInfo > ( objectType => {
262
+ this . objectTypesInfo = this . metadataStorage . objectTypes . map < ObjectTypeInfo > ( objectType => {
257
263
const objectSuperClass = Object . getPrototypeOf ( objectType . target ) ;
258
264
const hasExtended = objectSuperClass . prototype !== undefined ;
259
265
const getSuperClassType = ( ) => {
@@ -300,7 +306,7 @@ export abstract class SchemaGenerator {
300
306
// support for implicitly implementing interfaces
301
307
// get fields from interfaces definitions
302
308
if ( objectType . interfaceClasses ) {
303
- const implementedInterfaces = getMetadataStorage ( ) . interfaceTypes . filter ( it =>
309
+ const implementedInterfaces = this . metadataStorage . interfaceTypes . filter ( it =>
304
310
objectType . interfaceClasses ! . includes ( it . target ) ,
305
311
) ;
306
312
implementedInterfaces . forEach ( it => {
@@ -312,7 +318,7 @@ export abstract class SchemaGenerator {
312
318
313
319
let fields = fieldsMetadata . reduce < GraphQLFieldConfigMap < any , any > > (
314
320
( fieldsMap , field ) => {
315
- const { fieldResolvers } = getMetadataStorage ( ) ;
321
+ const { fieldResolvers } = this . metadataStorage ;
316
322
const filteredFieldResolversMetadata = fieldResolvers . filter (
317
323
it => it . kind === "internal" || resolvers . includes ( it . target ) ,
318
324
) ;
@@ -369,7 +375,7 @@ export abstract class SchemaGenerator {
369
375
} ;
370
376
} ) ;
371
377
372
- this . interfaceTypesInfo = getMetadataStorage ( ) . interfaceTypes . map < InterfaceTypeInfo > (
378
+ this . interfaceTypesInfo = this . metadataStorage . interfaceTypes . map < InterfaceTypeInfo > (
373
379
interfaceType => {
374
380
const interfaceSuperClass = Object . getPrototypeOf ( interfaceType . target ) ;
375
381
const hasExtended = interfaceSuperClass . prototype !== undefined ;
@@ -381,8 +387,8 @@ export abstract class SchemaGenerator {
381
387
} ;
382
388
383
389
// fetch ahead the subset of object types that implements this interface
384
- const implementingObjectTypesTargets = getMetadataStorage ( )
385
- . objectTypes . filter (
390
+ const implementingObjectTypesTargets = this . metadataStorage . objectTypes
391
+ . filter (
386
392
objectType =>
387
393
objectType . interfaceClasses &&
388
394
objectType . interfaceClasses . includes ( interfaceType . target ) ,
@@ -419,7 +425,7 @@ export abstract class SchemaGenerator {
419
425
// support for implicitly implementing interfaces
420
426
// get fields from interfaces definitions
421
427
if ( interfaceType . interfaceClasses ) {
422
- const implementedInterfacesMetadata = getMetadataStorage ( ) . interfaceTypes . filter (
428
+ const implementedInterfacesMetadata = this . metadataStorage . interfaceTypes . filter (
423
429
it => interfaceType . interfaceClasses ! . includes ( it . target ) ,
424
430
) ;
425
431
implementedInterfacesMetadata . forEach ( it => {
@@ -431,7 +437,7 @@ export abstract class SchemaGenerator {
431
437
432
438
let fields = fieldsMetadata ! . reduce < GraphQLFieldConfigMap < any , any > > (
433
439
( fieldsMap , field ) => {
434
- const fieldResolverMetadata = getMetadataStorage ( ) . fieldResolvers . find (
440
+ const fieldResolverMetadata = this . metadataStorage . fieldResolvers . find (
435
441
resolver =>
436
442
resolver . getObjectType ! ( ) === field . target &&
437
443
resolver . methodName === field . name ,
@@ -490,7 +496,7 @@ export abstract class SchemaGenerator {
490
496
} ,
491
497
) ;
492
498
493
- this . inputTypesInfo = getMetadataStorage ( ) . inputTypes . map < InputObjectTypeInfo > ( inputType => {
499
+ this . inputTypesInfo = this . metadataStorage . inputTypes . map < InputObjectTypeInfo > ( inputType => {
494
500
const objectSuperClass = Object . getPrototypeOf ( inputType . target ) ;
495
501
const getSuperClassType = ( ) => {
496
502
const superClassTypeInfo = this . inputTypesInfo . find (
@@ -549,7 +555,7 @@ export abstract class SchemaGenerator {
549
555
}
550
556
551
557
private static buildRootQueryType ( resolvers : Function [ ] ) : GraphQLObjectType {
552
- const queriesHandlers = this . filterHandlersByResolvers ( getMetadataStorage ( ) . queries , resolvers ) ;
558
+ const queriesHandlers = this . filterHandlersByResolvers ( this . metadataStorage . queries , resolvers ) ;
553
559
554
560
return new GraphQLObjectType ( {
555
561
name : "Query" ,
@@ -559,7 +565,7 @@ export abstract class SchemaGenerator {
559
565
560
566
private static buildRootMutationType ( resolvers : Function [ ] ) : GraphQLObjectType | undefined {
561
567
const mutationsHandlers = this . filterHandlersByResolvers (
562
- getMetadataStorage ( ) . mutations ,
568
+ this . metadataStorage . mutations ,
563
569
resolvers ,
564
570
) ;
565
571
if ( mutationsHandlers . length === 0 ) {
@@ -574,7 +580,7 @@ export abstract class SchemaGenerator {
574
580
575
581
private static buildRootSubscriptionType ( resolvers : Function [ ] ) : GraphQLObjectType | undefined {
576
582
const subscriptionsHandlers = this . filterHandlersByResolvers (
577
- getMetadataStorage ( ) . subscriptions ,
583
+ this . metadataStorage . subscriptions ,
578
584
resolvers ,
579
585
) ;
580
586
if ( subscriptionsHandlers . length === 0 ) {
@@ -735,8 +741,8 @@ export abstract class SchemaGenerator {
735
741
input . index ,
736
742
input . name ,
737
743
) ;
738
- const argDirectives = getMetadataStorage ( )
739
- . argumentDirectives . filter (
744
+ const argDirectives = this . metadataStorage . argumentDirectives
745
+ . filter (
740
746
it =>
741
747
it . target === target &&
742
748
it . fieldName === propertyName &&
@@ -752,7 +758,7 @@ export abstract class SchemaGenerator {
752
758
astNode : getInputValueDefinitionNode ( input . name , type , argDirectives ) ,
753
759
} ;
754
760
} else if ( param . kind === "args" ) {
755
- const argumentType = getMetadataStorage ( ) . argumentTypes . find (
761
+ const argumentType = this . metadataStorage . argumentTypes . find (
756
762
it => it . target === param . getType ( ) ,
757
763
) ;
758
764
if ( ! argumentType ) {
@@ -771,7 +777,7 @@ export abstract class SchemaGenerator {
771
777
inheritanceChainClasses . push ( superClass ) ;
772
778
}
773
779
for ( const argsTypeClass of inheritanceChainClasses . reverse ( ) ) {
774
- const inheritedArgumentType = getMetadataStorage ( ) . argumentTypes . find (
780
+ const inheritedArgumentType = this . metadataStorage . argumentTypes . find (
775
781
it => it . target === argsTypeClass ,
776
782
) ;
777
783
if ( inheritedArgumentType ) {
0 commit comments