graphql-compose-connection

This is a plugin for graphql-compose family, which adds to the TypeComposer connection resolver.
Live demo: https://graphql-compose.herokuapp.com/
This package completely follows to Relay Cursor Connections Specification (https://facebook.github.io/relay/graphql/connections.htm).
Besides standard connection arguments first, last, before and after, also added significant arguments:
filter arg - for filtering records
sort arg - for sorting records. Build in mechanism allows sort by any unique indexes (not only by id). Also supported compound sorting (by several fields).
CHANGELOG
Installation
npm install graphql graphql-compose graphql-compose-connection --save
Modules graphql and graphql-compose are in peerDependencies, so should be installed explicitly in your app. They should not installed as submodules, cause internally checks the classes instances.
Example
import composeWithConnection from 'graphql-compose-connection';
import userTypeComposer from './user.js';
composeWithConnection(userTypeComposer, {
findResolverName: 'findMany',
countResolverName: 'count',
sort: {
_ID_ASC: {
value: { _id: 1 },
cursorFields: ['_id'],
beforeCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery._id) rawQuery._id = {};
rawQuery._id.$lt = cursorData._id;
},
afterCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery._id) rawQuery._id = {};
rawQuery._id.$gt = cursorData._id;
},
},
_ID_DESC: {
value: { _id: -1 },
cursorFields: ['_id'],
beforeCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery._id) rawQuery._id = {};
rawQuery._id.$gt = cursorData._id;
},
afterCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery._id) rawQuery._id = {};
rawQuery._id.$lt = cursorData._id;
},
},
AGE_ID_ASC: {
value: { age: 1, _id: -1 },
cursorFields: ['age', '_id'],
beforeCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery.age) rawQuery.age = {};
if (!rawQuery._id) rawQuery._id = {};
rawQuery.age.$lt = cursorData.age;
rawQuery._id.$gt = cursorData._id;
},
afterCursorQuery: (rawQuery, cursorData, resolveParams) => {
if (!rawQuery.age) rawQuery.age = {};
if (!rawQuery._id) rawQuery._id = {};
rawQuery.age.$gt = cursorData.age;
rawQuery._id.$lt = cursorData._id;
},
}
},
});
Requirements
Types should have following resolvers:
count - for counting records
findMany - for filtering records. Also required that this resolver supports search with operators (lt, gt), which used in directionFilter option. Resolver findMany should have filter argument, which will be copied to connection. Also should have limit and skip args.
Used in plugins
graphql-compose-mongoose - converts mongoose models to graphql types
License
MIT