graphql-connection-resolver
TypeScript icon, indicating that this package has built-in type declarations

1.1.0 • Public • Published

🔗 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 🙏

Package Sidebar

Install

npm i graphql-connection-resolver

Weekly Downloads

12

Version

1.1.0

License

MIT

Unpacked Size

16.7 kB

Total Files

8

Last publish

Collaborators

  • tonyfromundefined