1.1.0 • Published 5 years ago
graphql-connection-resolver v1.1.0
🔗 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-resolverExample
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
firstorlast, 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 🙏