@@ -8,11 +8,34 @@ import {
88import { isSome } from '@graphql-tools/utils' ;
99import { Config } from './merge-typedefs.js' ;
1010
11+ const isLinkDirective = ( directive : DirectiveNode ) : boolean => directive . name . value === 'link' ;
12+
13+ const getLinkDirectiveURL = ( directive : DirectiveNode ) : string | undefined => {
14+ const stringValue = isLinkDirective ( directive )
15+ ? directive . arguments ?. find ( arg => arg . name . value === 'url' ) ?. value
16+ : undefined ;
17+ return stringValue ?. kind === 'StringValue' ? stringValue . value : undefined ;
18+ } ;
19+
20+ /**
21+ * Directives are considered distinct if they have different names, or, if they
22+ * are link directives with different URLs.
23+ */
24+ const isDirectiveMetadataDistinct = ( directiveA : DirectiveNode , directiveB : DirectiveNode ) => {
25+ const isLinkPair = isLinkDirective ( directiveA ) && isLinkDirective ( directiveB ) ;
26+ return isLinkPair ? getLinkDirectiveURL ( directiveA ) !== getLinkDirectiveURL ( directiveB ) : true ;
27+ } ;
28+
29+ const isMatchingDirective = ( a : DirectiveNode , b : DirectiveNode ) => a . name . value === b . name . value ;
30+
1131function directiveAlreadyExists (
1232 directivesArr : ReadonlyArray < DirectiveNode > ,
1333 otherDirective : DirectiveNode ,
1434) : boolean {
15- return ! ! directivesArr . find ( directive => directive . name . value === otherDirective . name . value ) ;
35+ return ! ! directivesArr . find ( directive => {
36+ const isDirectiveNameMatching = directive . name . value === otherDirective . name . value ;
37+ return isDirectiveNameMatching && ! isDirectiveMetadataDistinct ( directive , otherDirective ) ;
38+ } ) ;
1639}
1740
1841function isRepeatableDirective (
@@ -98,7 +121,7 @@ export function mergeDirectives(
98121 directiveAlreadyExists ( result , directive ) &&
99122 ! isRepeatableDirective ( directive , directives )
100123 ) {
101- const existingDirectiveIndex = result . findIndex ( d => d . name . value === directive . name . value ) ;
124+ const existingDirectiveIndex = result . findIndex ( it => isMatchingDirective ( it , directive ) ) ;
102125 const existingDirective = result [ existingDirectiveIndex ] ;
103126 ( result [ existingDirectiveIndex ] as any ) . arguments = mergeArguments (
104127 directive . arguments || [ ] ,
0 commit comments