Skip to content

tonyfromundefined/graphql-connection-resolver

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔗 GraphQL Connection Resolver

Helps to easily implement the relay connection specification (inspired by Nexus.js Connection Plugin)

What is the Connection?

Install

$ yarn add graphql-connection-resolver

Example

Schema

scalar DateTime

type Query {
  chatRoom(id: String!): ChatRoom
}

type ChatRoom {
  id: ID!

  # if messages empty, returns null
  messages(
    first: Int
    last: Int
    before: Int
    after: Int
  ): ChatMessageConnection!
}

type ChatMessage {
  id: ID!
  createdAt: DateTime!
}

type ChatMessageConnection {
  edges: [ChatMessageEdge!]!
  pageInfo: PageInfo!
}

type ChatMessageEdge {
  node: ChatMessage!
  cursor: String!
}

type PageInfo {
  hasPreviousPage: Boolean!
  hasNextPage: Boolean!
  startCursor: String
  endCursor: String
}

Resolver

import { connection } from 'graphql-connection-resolver'

export const ChatRoom = {
  messages: connection({
    /**
     * returns a list of the model with `parent`, `args`, `ctx`
     * You must request one more than given by first and last.
     * Inside the library, if nodes return the same number as the given `first` or `last`, the next page is considered to not exist.
     * and if nodes return more than the given number, the next page is considered to exist.
     */
    async nodes(parent, args, ctx) {
      return [
        /* ... */
      ]
    },

    /**
     * Extract a string to be used as a cursor from node.
     * It automatically performs base64 encoding and decoding inside,
     * so just return plain text.
     */ 
    cursorFromNode(node) {
      return node.createdAt.toISOString()
    },
  }),
}

Note

  • You must request one more than given by first and last. Inside the library, if nodes return the same number as the given first or last, the next page is considered to not exist, and if nodes return more than the given number, the next page is considered to exist.

    connection({
      async nodes(args) {
        const items = await fetchItems({
          /* ... */,
          limit: args.first + 1,
        })
    
        /* ... */
      }
    })

References

If you have a feature request or a bug, please create a new issue. And also, pull requests are always welcome 🙏

About

Helps to easily implement the relay connection specification (inspired by Nexus.js Connection Plugin)

Topics

Resources

Stars

Watchers

Forks