Skip to content

Commit 2967c37

Browse files
committed
Allow for providing a resolution function for nodes
This allows for the decoupling of creating the connection from fulfilling the nodes themselves, which is especially useful for arrayConnection where the array may be a list of IDs or URLs instead of the fulfilled items.
1 parent f1918b5 commit 2967c37

File tree

2 files changed

+21
-14
lines changed

2 files changed

+21
-14
lines changed

src/connection/__tests__/connection.js

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ import { expect } from 'chai';
3030
import { describe, it } from 'mocha';
3131

3232
var allUsers = [
33-
{ name: 'Dan' },
34-
{ name: 'Nick' },
35-
{ name: 'Lee' },
36-
{ name: 'Joe' },
37-
{ name: 'Tim' },
33+
{ name: 'Dan', friends: [ 1, 2, 3, 4 ] },
34+
{ name: 'Nick', friends: [ 0, 2, 3, 4 ] },
35+
{ name: 'Lee', friends: [ 0, 1, 3, 4 ] },
36+
{ name: 'Joe', friends: [ 0, 1, 2, 4 ] },
37+
{ name: 'Tim', friends: [ 0, 1, 2, 3 ] },
3838
];
3939

4040
var userType = new GraphQLObjectType({
@@ -46,24 +46,25 @@ var userType = new GraphQLObjectType({
4646
friends: {
4747
type: friendConnection,
4848
args: connectionArgs,
49-
resolve: (user, args) => connectionFromArray(allUsers, args),
49+
resolve: (user, args) => connectionFromArray(user.friends, args),
5050
},
5151
friendsForward: {
5252
type: friendConnection,
5353
args: forwardConnectionArgs,
54-
resolve: (user, args) => connectionFromArray(allUsers, args),
54+
resolve: (user, args) => connectionFromArray(user.friends, args),
5555
},
5656
friendsBackward: {
5757
type: friendConnection,
5858
args: backwardConnectionArgs,
59-
resolve: (user, args) => connectionFromArray(allUsers, args),
59+
resolve: (user, args) => connectionFromArray(user.friends, args),
6060
},
6161
}),
6262
});
6363

6464
var {connectionType: friendConnection} = connectionDefinitions({
6565
name: 'Friend',
6666
nodeType: userType,
67+
resolveNode: edge => allUsers[edge.node],
6768
edgeFields: () => ({
6869
friendshipTime: {
6970
type: GraphQLString,
@@ -73,7 +74,7 @@ var {connectionType: friendConnection} = connectionDefinitions({
7374
connectionFields: () => ({
7475
totalCount: {
7576
type: GraphQLInt,
76-
resolve: () => allUsers.length
77+
resolve: () => allUsers.length - 1
7778
}
7879
}),
7980
});
@@ -112,18 +113,18 @@ describe('connectionDefinition()', () => {
112113
var expected = {
113114
user: {
114115
friends: {
115-
totalCount: 5,
116+
totalCount: 4,
116117
edges: [
117118
{
118119
friendshipTime: 'Yesterday',
119120
node: {
120-
name: 'Dan'
121+
name: 'Nick'
121122
}
122123
},
123124
{
124125
friendshipTime: 'Yesterday',
125126
node: {
126-
name: 'Nick'
127+
name: 'Lee'
127128
}
128129
},
129130
]
@@ -154,12 +155,12 @@ describe('connectionDefinition()', () => {
154155
edges: [
155156
{
156157
node: {
157-
name: 'Dan'
158+
name: 'Nick'
158159
}
159160
},
160161
{
161162
node: {
162-
name: 'Nick'
163+
name: 'Lee'
163164
}
164165
},
165166
]

src/connection/connection.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ export var connectionArgs: GraphQLFieldConfigArgumentMap = {
6060
type ConnectionConfig = {
6161
name: string,
6262
nodeType: GraphQLObjectType,
63+
resolveNode?: ?Function,
64+
resolveCursor?: ?Function,
6365
edgeFields?: ?(() => GraphQLFieldConfigMap) | ?GraphQLFieldConfigMap,
6466
connectionFields?: ?(() => GraphQLFieldConfigMap) | ?GraphQLFieldConfigMap,
6567
}
@@ -83,16 +85,20 @@ export function connectionDefinitions(
8385
var {name, nodeType} = config;
8486
var edgeFields = config.edgeFields || {};
8587
var connectionFields = config.connectionFields || {};
88+
var resolveNode = config.resolveNode;
89+
var resolveCursor = config.resolveCursor;
8690
var edgeType = new GraphQLObjectType({
8791
name: name + 'Edge',
8892
description: 'An edge in a connection.',
8993
fields: () => ({
9094
node: {
9195
type: nodeType,
96+
resolve: resolveNode,
9297
description: 'The item at the end of the edge',
9398
},
9499
cursor: {
95100
type: new GraphQLNonNull(GraphQLString),
101+
resolve: resolveCursor,
96102
description: 'A cursor for use in pagination'
97103
},
98104
...resolveMaybeThunk(edgeFields)

0 commit comments

Comments
 (0)