@@ -242,7 +242,7 @@ export function getDirectiveNodes(
242
242
243
243
let directives : Array < DirectiveNode > ;
244
244
if ( directivesInExtensions != null ) {
245
- directives = makeDirectives ( schema , directivesInExtensions ) ;
245
+ directives = makeDirectiveNodes ( schema , directivesInExtensions ) ;
246
246
} else {
247
247
directives = [ ] . concat ( ...nodes . filter ( node => node . directives != null ) . map ( node => node . directives ) ) ;
248
248
}
@@ -262,7 +262,7 @@ export function getDeprecatableDirectiveNodes(
262
262
263
263
let directives : ReadonlyArray < DirectiveNode > ;
264
264
if ( directivesInExtensions != null ) {
265
- directives = makeDirectives ( schema , directivesInExtensions ) ;
265
+ directives = makeDirectiveNodes ( schema , directivesInExtensions ) ;
266
266
} else {
267
267
directives = entity . astNode ?. directives ;
268
268
}
@@ -449,6 +449,36 @@ export function astFromScalarType(
449
449
schema : GraphQLSchema ,
450
450
pathToDirectivesInExtensions : Array < string >
451
451
) : ScalarTypeDefinitionNode {
452
+ let directiveNodesBesidesSpecifiedBy : Array < DirectiveNode > = [ ] ;
453
+ let specifiedByDirectiveNode : DirectiveNode ;
454
+
455
+ const directivesInExtensions = getDirectivesInExtensions ( type , pathToDirectivesInExtensions ) ;
456
+
457
+ let allDirectives : ReadonlyArray < DirectiveNode > ;
458
+ if ( directivesInExtensions != null ) {
459
+ allDirectives = makeDirectiveNodes ( schema , directivesInExtensions ) ;
460
+ } else {
461
+ allDirectives = type . astNode ?. directives ;
462
+ }
463
+
464
+ if ( allDirectives != null ) {
465
+ directiveNodesBesidesSpecifiedBy = allDirectives . filter ( directive => directive . name . value !== 'specifiedBy' ) ;
466
+ if ( ( ( type as unknown ) as { specifiedByUrl : string } ) . specifiedByUrl != null ) {
467
+ specifiedByDirectiveNode = allDirectives . filter ( directive => directive . name . value === 'specifiedBy' ) ?. [ 0 ] ;
468
+ }
469
+ }
470
+
471
+ if ( ( ( type as unknown ) as { specifiedByUrl : string } ) . specifiedByUrl != null && specifiedByDirectiveNode == null ) {
472
+ specifiedByDirectiveNode = makeDirectiveNode ( 'specifiedBy' , {
473
+ url : ( ( type as unknown ) as { specifiedByUrl : string } ) . specifiedByUrl ,
474
+ } ) ;
475
+ }
476
+
477
+ const directives =
478
+ specifiedByDirectiveNode == null
479
+ ? directiveNodesBesidesSpecifiedBy
480
+ : [ specifiedByDirectiveNode ] . concat ( directiveNodesBesidesSpecifiedBy ) ;
481
+
452
482
return {
453
483
kind : Kind . SCALAR_TYPE_DEFINITION ,
454
484
description :
@@ -463,7 +493,7 @@ export function astFromScalarType(
463
493
kind : Kind . NAME ,
464
494
value : type . name ,
465
495
} ,
466
- directives : getDirectiveNodes ( type , schema , pathToDirectivesInExtensions ) ,
496
+ directives,
467
497
} ;
468
498
}
469
499
@@ -541,10 +571,14 @@ export function astFromEnumValue(
541
571
}
542
572
543
573
export function makeDeprecatedDirective ( deprecationReason : string ) : DirectiveNode {
544
- return makeDirective ( 'deprecated' , { reason : deprecationReason } , GraphQLDeprecatedDirective ) ;
574
+ return makeDirectiveNode ( 'deprecated' , { reason : deprecationReason } , GraphQLDeprecatedDirective ) ;
545
575
}
546
576
547
- export function makeDirective ( name : string , args : Record < string , any > , directive : GraphQLDirective ) : DirectiveNode {
577
+ export function makeDirectiveNode (
578
+ name : string ,
579
+ args : Record < string , any > ,
580
+ directive ?: GraphQLDirective
581
+ ) : DirectiveNode {
548
582
const directiveArguments : Array < ArgumentNode > = [ ] ;
549
583
550
584
if ( directive != null ) {
@@ -585,16 +619,16 @@ export function makeDirective(name: string, args: Record<string, any>, directive
585
619
} ;
586
620
}
587
621
588
- export function makeDirectives ( schema : GraphQLSchema , directiveValues : Record < string , any > ) : Array < DirectiveNode > {
622
+ export function makeDirectiveNodes ( schema : GraphQLSchema , directiveValues : Record < string , any > ) : Array < DirectiveNode > {
589
623
const directiveNodes : Array < DirectiveNode > = [ ] ;
590
624
Object . entries ( directiveValues ) . forEach ( ( [ directiveName , arrayOrSingleValue ] ) => {
591
625
const directive = schema . getDirective ( directiveName ) ;
592
626
if ( Array . isArray ( arrayOrSingleValue ) ) {
593
627
arrayOrSingleValue . forEach ( value => {
594
- directiveNodes . push ( makeDirective ( directiveName , value , directive ) ) ;
628
+ directiveNodes . push ( makeDirectiveNode ( directiveName , value , directive ) ) ;
595
629
} ) ;
596
630
} else {
597
- directiveNodes . push ( makeDirective ( directiveName , arrayOrSingleValue , directive ) ) ;
631
+ directiveNodes . push ( makeDirectiveNode ( directiveName , arrayOrSingleValue , directive ) ) ;
598
632
}
599
633
} ) ;
600
634
return directiveNodes ;
0 commit comments