Skip to content

Commit d40d54e

Browse files
committed
feat(ResolveParams): Added findManyResolveParams and countResolveParams to the top `resolveParam
It allows to get params from sub resolvers for debug purposes
1 parent b7b769c commit d40d54e

File tree

5 files changed

+233
-186
lines changed

5 files changed

+233
-186
lines changed

package.json

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,30 +28,30 @@
2828
"graphql-compose": ">=1.0.0"
2929
},
3030
"devDependencies": {
31-
"babel-cli": "6.14.0",
32-
"babel-core": "6.14.0",
33-
"babel-eslint": "6.1.2",
31+
"babel-cli": "6.16.0",
32+
"babel-core": "6.17.0",
33+
"babel-eslint": "7.0.0",
3434
"babel-plugin-syntax-async-functions": "6.13.0",
35-
"babel-plugin-transform-class-properties": "6.11.5",
35+
"babel-plugin-transform-class-properties": "6.16.0",
3636
"babel-plugin-transform-flow-strip-types": "6.14.0",
37-
"babel-plugin-transform-object-rest-spread": "6.8.0",
38-
"babel-plugin-transform-regenerator": "6.14.0",
37+
"babel-plugin-transform-object-rest-spread": "6.16.0",
38+
"babel-plugin-transform-regenerator": "6.16.1",
3939
"babel-plugin-transform-runtime": "6.15.0",
40-
"babel-preset-es2015": "6.14.0",
40+
"babel-preset-es2015": "6.16.0",
4141
"chai": "3.5.0",
42-
"chai-as-promised": "5.3.0",
42+
"chai-as-promised": "6.0.0",
4343
"chai-spies": "0.7.1",
4444
"cz-conventional-changelog": "1.2.0",
45-
"eslint": "3.4.0",
46-
"eslint-config-airbnb": "10.0.1",
47-
"eslint-plugin-flowtype": "2.15.0",
48-
"eslint-plugin-import": "1.14.0",
49-
"eslint-plugin-jsx-a11y": "2.2.1",
50-
"eslint-plugin-react": "6.2.0",
51-
"flow-bin": "0.32.0",
45+
"eslint": "3.7.1",
46+
"eslint-config-airbnb": "11.0.0",
47+
"eslint-plugin-flowtype": "2.20.0",
48+
"eslint-plugin-import": "1.16.0",
49+
"eslint-plugin-jsx-a11y": "2.2.3",
50+
"eslint-plugin-react": "6.4.1",
51+
"flow-bin": "0.33.0",
5252
"ghooks": "1.3.2",
53-
"mocha": "3.0.2",
54-
"nyc": "8.1.0",
53+
"mocha": "3.1.2",
54+
"nyc": "8.3.1",
5555
"rimraf": "2.5.4",
5656
"sane": "1.4.1",
5757
"semantic-release": "4.3.5"
@@ -86,6 +86,7 @@
8686
"test": "babel-node ./node_modules/.bin/_mocha --compilers js:babel-core/register --reporter dot --require ./resources/mocha-bootload src/**/__tests__/**/*-test.js",
8787
"watch": "babel-node ./resources/watch.js",
8888
"link": "npm link graphql && npm link graphql-compose && npm link",
89+
"unlink": "npm unlink graphql && npm unlink graphql-compose && npm install graphql graphql-compose",
8990
"semantic-release": "semantic-release pre && npm publish && semantic-release post"
9091
}
9192
}

src/__mocks__/userTypeComposer.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ const filterArgConfig = {
5555
gender: {
5656
type: GraphQLString,
5757
},
58+
age: {
59+
type: GraphQLInt,
60+
},
5861
_operators: {
5962
type: new GraphQLInputObjectType({
6063
name: 'OperatorsFilterUserInput',

src/__tests__/composeWithConnection-test.js

Lines changed: 66 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
import { TypeComposer } from 'graphql-compose';
99
import { composeWithConnection } from '../composeWithConnection';
1010
import { userTypeComposer, sortOptions } from '../__mocks__/userTypeComposer';
11-
import { rootQueryTypeComposer } from '../__mocks__/rootQueryTypeComposer';
11+
import { rootQueryTypeComposer as rootQueryTC } from '../__mocks__/rootQueryTypeComposer';
1212

1313

1414
describe('composeWithRelay', () => {
@@ -34,11 +34,11 @@ describe('composeWithRelay', () => {
3434
});
3535

3636
it('should apply first sort ID_ASC by default', async () => {
37-
rootQueryTypeComposer.addField('userConnection',
37+
rootQueryTC.addField('userConnection',
3838
userTypeComposer.getResolver('connection').getFieldConfig()
3939
);
4040
const schema = new GraphQLSchema({
41-
query: rootQueryTypeComposer.getType(),
41+
query: rootQueryTC.getType(),
4242
});
4343
const query = `{
4444
userConnection(last: 3) {
@@ -86,11 +86,11 @@ describe('composeWithRelay', () => {
8686
});
8787

8888
it('should able to change `sort` on AGE_ID_DESC', async () => {
89-
rootQueryTypeComposer.addField('userConnection',
89+
rootQueryTC.addField('userConnection',
9090
userTypeComposer.getResolver('connection').getFieldConfig()
9191
);
9292
const schema = new GraphQLSchema({
93-
query: rootQueryTypeComposer.getType(),
93+
query: rootQueryTC.getType(),
9494
});
9595
const query = `{
9696
userConnection(first: 3, sort: AGE_ID_DESC) {
@@ -140,11 +140,11 @@ describe('composeWithRelay', () => {
140140

141141
describe('fragments fields projection of graphql-compose', () => {
142142
it('should return object', async () => {
143-
rootQueryTypeComposer.addField('userConnection',
143+
rootQueryTC.addField('userConnection',
144144
userTypeComposer.getResolver('connection').getFieldConfig()
145145
);
146146
const schema = new GraphQLSchema({
147-
query: rootQueryTypeComposer.getType(),
147+
query: rootQueryTC.getType(),
148148
});
149149
const query = `{
150150
userConnection(first: 1) {
@@ -201,4 +201,63 @@ describe('composeWithRelay', () => {
201201
});
202202
});
203203
});
204+
205+
it('should pass `countResolveParams` to top resolverParams', async () => {
206+
let topResolveParams;
207+
208+
rootQueryTC.addField('userConnection',
209+
userTypeComposer
210+
.getResolver('connection')
211+
.wrapResolve((next) => (rp) => {
212+
const result = next(rp);
213+
topResolveParams = rp;
214+
return result;
215+
})
216+
.getFieldConfig()
217+
);
218+
const schema = new GraphQLSchema({
219+
query: rootQueryTC.getType(),
220+
});
221+
const query = `{
222+
userConnection(first: 1, filter: { age: 45 }) {
223+
count
224+
}
225+
}`;
226+
const result = await graphql(schema, query);
227+
expect(topResolveParams).has.property('countResolveParams');
228+
expect(topResolveParams.countResolveParams)
229+
.to.contain.all.keys(['source', 'args', 'context', 'info', 'projection']);
230+
expect(topResolveParams.countResolveParams.args)
231+
.deep.equal({ filter: { age: 45 } });
232+
});
233+
234+
235+
it('should pass `findManyResolveParams` to top resolverParams', async () => {
236+
let topResolveParams;
237+
238+
rootQueryTC.addField('userConnection',
239+
userTypeComposer
240+
.getResolver('connection')
241+
.wrapResolve((next) => (rp) => {
242+
const result = next(rp);
243+
topResolveParams = rp;
244+
return result;
245+
})
246+
.getFieldConfig()
247+
);
248+
const schema = new GraphQLSchema({
249+
query: rootQueryTC.getType(),
250+
});
251+
const query = `{
252+
userConnection(first: 1, filter: { age: 45 }) {
253+
count
254+
}
255+
}`;
256+
const result = await graphql(schema, query);
257+
expect(topResolveParams).has.property('findManyResolveParams');
258+
expect(topResolveParams.findManyResolveParams)
259+
.to.contain.all.keys(['source', 'args', 'context', 'info', 'projection']);
260+
expect(topResolveParams.findManyResolveParams.args)
261+
.deep.equal({ filter: { age: 45 }, limit: 2, sort: { id: 1 } });
262+
});
204263
});

src/connectionResolver.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,21 @@ export function prepareConnectionResolver(
115115
throw new Error('Argument `last` should be non-negative number.');
116116
}
117117

118+
// pass count ResolveParams to top resolver
119+
resolveParams.countResolveParams = {
120+
...findManyParams,
121+
args: {
122+
filter: Object.assign({}, findManyParams.args.filter),
123+
},
124+
};
118125
if (projection.count) {
119-
countPromise = countResolve(findManyParams);
126+
countPromise = countResolve(resolveParams.countResolveParams);
120127
} else if (!first && last) {
121-
countPromise = countResolve(findManyParams);
128+
countPromise = countResolve(resolveParams.countResolveParams);
122129
} else {
123130
countPromise = Promise.resolve(0);
131+
// count resolver not called, so remove it from top params
132+
delete resolveParams.countResolveParams;
124133
}
125134

126135
if (!first && last) {
@@ -136,6 +145,9 @@ export function prepareConnectionResolver(
136145
findManyParams.args.skip = skip;
137146
}
138147

148+
// pass findMany ResolveParams to top resolver
149+
resolveParams.findManyResolveParams = Object.assign({}, findManyParams);
150+
139151
const filterDataForCursor = (record) => {
140152
const result = {};
141153
sortOptions.uniqueFields.forEach(fieldName => {
@@ -144,7 +156,7 @@ export function prepareConnectionResolver(
144156
return result;
145157
};
146158

147-
return Promise.all([findManyResolve(findManyParams), countPromise])
159+
return Promise.all([findManyResolve(resolveParams.findManyResolveParams), countPromise])
148160
.then(([recordList, count]) => {
149161
const edges = [];
150162
// transform record to object { cursor, node }

0 commit comments

Comments
 (0)