/** * @internal * * Generates a fragment on the given type that fetches the minimal connection * fields in order to merge different pagination results together at runtime. */ function generateConnectionFragment( context: RelayCompilerContext, type: GraphQLType, ): InlineFragment { const compositeType = assertCompositeType( RelaySchemaUtils.getNullableType((type: $FlowFixMe)), ); const ast = GraphQL.parse( ` fragment ConnectionFragment on ${String(compositeType)} { ${EDGES} { ${CURSOR} ${NODE} { __typename # rely on GenerateRequisiteFieldTransform to add "id" } } ${PAGE_INFO} { ${END_CURSOR} ${HAS_NEXT_PAGE} ${HAS_PREV_PAGE} ${START_CURSOR} } } `, ); const fragmentAST = ast.definitions[0]; invariant( fragmentAST && fragmentAST.kind === 'FragmentDefinition', 'RelayConnectionTransform: Expected a fragment definition AST.', ); const fragment = RelayParser.transform(context.schema, fragmentAST); invariant( fragment && fragment.kind === 'Fragment', 'RelayConnectionTransform: Expected a connection fragment.', ); return { directives: [], kind: 'InlineFragment', metadata: null, selections: fragment.selections, typeCondition: compositeType, }; }
definitions.forEach(definition => { if (isOperationDefinitionAST(definition)) { nodes.push(RelayParser.transform(schema, definition)); } });