1.1.0 • Published 4 years ago

graphql-connection-resolver v1.1.0

Weekly downloads
2
License
MIT
Repository
github
Last release
4 years ago

🔗 GraphQL Connection Resolver

npm.io npm.io

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 🙏

1.1.0

4 years ago

1.0.0

4 years ago

0.1.1

4 years ago

0.1.0

4 years ago