graphql-codegen-typescript-fabbrica icon indicating copy to clipboard operation
graphql-codegen-typescript-fabbrica copied to clipboard

Support `.buildConnection(...)`

Open mizdra opened this issue 1 year ago • 0 comments
trafficstars

Add a utility that allows users to build connections without defining XxxEdgeFactory or XxxConnectionFactory.

Example

import { defineBookFactory, dynamic } from '../__generated__/fabbrica';

const PageInfoFactory = definePageInfoFactory({
  defaultFields: {
    __typename: 'PageInfo',
  },
});
const BookFactory = defineBookFactory({
  defaultFields: {
    __typename: 'Book',
    id: dynamic(({ seq }) => `Book-${seq}`),
  },
  PageInfoFactory,
});

// Basic
const bookConnection1 = await BookFactory.connection(2);
expect(bookConnection1).toStrictEqual({
  __typename: 'BookConnection',
  edges: [
    { __typename: 'BookEdge', node: { __typename: 'Book', id: 'Book-1' }, cursor: 'BookEdge-1' },
    { __typename: 'BookEdge', node: { __typename: 'Book', id: 'Book-2' }, cursor: 'BookEdge-2' },
  ],
  pageInfo: {
    __typename: 'PageInfo',
    startCursor: 'BookEdge-1',
    endCursor: 'BookEdge-2',
  },
});
BookFactory.resetSequence();

// Override connection or edge fields
const bookConnection2 = await BookFactory.connection(2, {
  pageInfo: dynamic(
    () => PageInfoFactory.build({ hasPreviousPage: false, hasNextPage: true }),
  ),
});
expect(bookConnection2).toStrictEqual({
  __typename: 'BookConnection',
  edges: [
    { __typename: 'BookEdge', node: { __typename: 'Book', id: 'Book-1' }, cursor: 'BookEdge-1' },
    { __typename: 'BookEdge', node: { __typename: 'Book', id: 'Book-2' }, cursor: 'BookEdge-2' },
  ],
  pageInfo: {
    __typename: 'PageInfo',
    hasPreviousPage: false,
    hasNextPage: true,
    startCursor: 'BookEdge-1',
    endCursor: 'BookEdge-2',
  },
});
BookFactory.resetSequence();

// Custom Connection Fields (e.g. `totalCount`)
const bookConnection3 = await BookFactory.connection(2, {
  totalCount: 3, // Add
  pageInfo: dynamic(
    () => PageInfoFactory.build({ hasPreviousPage: false, hasNextPage: true }),
  ),
});
expect(bookConnection3).toStrictEqual({
  __typename: 'BookConnection',
  edges: [
    { __typename: 'BookEdge', node: { __typename: 'Book', id: 'Book-1' }, cursor: 'BookEdge-1' },
    { __typename: 'BookEdge', node: { __typename: 'Book', id: 'Book-2' }, cursor: 'BookEdge-2' },
  ],
  pageInfo: {
    __typename: 'PageInfo',
    hasPreviousPage: false,
    hasNextPage: true,
    startCursor: 'BookEdge-1',
    endCursor: 'BookEdge-2',
  },
  totalCount: 3, // Added
});
BookFactory.resetSequence();

Limitation

  • Default values for hasPreviousPage and totalCount cannot be set.
    • If you want to set default values, use defineXxxConnection or defineXxxEdge.

mizdra avatar Jan 22 '24 16:01 mizdra