/**
 * @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,
  };
}
Example #2
0
 definitions.forEach(definition => {
   if (isOperationDefinitionAST(definition)) {
     nodes.push(RelayParser.transform(schema, definition));
   }
 });