4
4
Fragment ,
5
5
IRVisitor ,
6
6
LinkedField ,
7
+ Metadata ,
7
8
Root ,
8
9
ScalarField ,
9
10
Schema ,
@@ -363,8 +364,8 @@ function createVisitor(
363
364
customScalars : options . customScalars ,
364
365
enumsHasteModule : options . enumsHasteModule ,
365
366
existingFragmentNames : options . existingFragmentNames ,
366
- generatedInputObjectTypes : { } ,
367
367
generatedFragments : new Set ( ) ,
368
+ generatedInputObjectTypes : { } ,
368
369
hasConnectionResolver : false ,
369
370
optionalInputFields : options . optionalInputFields ,
370
371
usedEnums : { } ,
@@ -384,9 +385,7 @@ function createVisitor(
384
385
node ,
385
386
state
386
387
) ;
387
-
388
388
const inputObjectTypes = generateInputObjectTypes ( state ) ;
389
-
390
389
const responseType = exportType (
391
390
`${ node . name } Response` ,
392
391
selectionsToAST (
@@ -411,9 +410,7 @@ function createVisitor(
411
410
412
411
// Generate raw response type
413
412
let rawResponseType ;
414
-
415
413
const { normalizationIR } = options ;
416
-
417
414
if (
418
415
normalizationIR &&
419
416
node . directives . some ( d => d . name === DIRECTIVE_NAME )
@@ -423,14 +420,32 @@ function createVisitor(
423
420
createRawResponseTypeVisitor ( schema , state )
424
421
) ;
425
422
}
426
-
427
- const nodes = [
423
+ const refetchableFragmentName = getRefetchableQueryParentFragmentName (
424
+ state ,
425
+ node . metadata
426
+ ) ;
427
+ if ( state . hasConnectionResolver ) {
428
+ state . runtimeImports . add ( "ConnectionReference" ) ;
429
+ }
430
+ if ( refetchableFragmentName !== null ) {
431
+ state . runtimeImports . add ( "FragmentReference" ) ;
432
+ }
433
+ const nodes = [ ] ;
434
+ if ( state . runtimeImports . size ) {
435
+ nodes . push (
436
+ importTypes (
437
+ Array . from ( state . runtimeImports ) . sort ( ) ,
438
+ "relay-runtime"
439
+ )
440
+ ) ;
441
+ }
442
+ nodes . push (
428
443
...getFragmentRefsTypeImport ( state ) ,
429
444
...getEnumDefinitions ( schema , state ) ,
430
445
...inputObjectTypes ,
431
446
inputVariablesType ,
432
447
responseType
433
- ] ;
448
+ ) ;
434
449
435
450
if ( rawResponseType ) {
436
451
for ( const [ key , ast ] of state . matchFields ) {
@@ -1065,6 +1080,25 @@ function getEnumDefinitions(
1065
1080
} ) ;
1066
1081
}
1067
1082
1083
+ // If it's a @refetchable fragment, we generate the $fragmentRef in generated
1084
+ // query, and import it in the fragment to avoid circular dependencies
1085
+ function getRefetchableQueryParentFragmentName (
1086
+ state : State ,
1087
+ metadata : Metadata
1088
+ ) : string | null | undefined {
1089
+ if (
1090
+ ( metadata && ! metadata . isRefetchableQuery ) ||
1091
+ ( ! state . useHaste && ! state . useSingleArtifactDirectory )
1092
+ ) {
1093
+ return null ;
1094
+ }
1095
+ const derivedFrom = metadata && metadata . derivedFrom ;
1096
+ if ( derivedFrom !== null && typeof derivedFrom === "string" ) {
1097
+ return derivedFrom ;
1098
+ }
1099
+ return null ;
1100
+ }
1101
+
1068
1102
function stringLiteralTypeAnnotation ( name : string ) : ts . TypeNode {
1069
1103
return ts . createLiteralTypeNode ( ts . createLiteral ( name ) ) ;
1070
1104
}
0 commit comments