Skip to content

Commit 82e0d2b

Browse files
committed
refactor: get rid of TC.getResolver() method
BREAKING CHANGE: were changed config options. Get rid of `TC.getResolver()` method where were used resolver names as string. Now you need to pass Resolver `findMany` & `count` instances explicitly.
1 parent 4e2b5b0 commit 82e0d2b

17 files changed

+659
-818
lines changed

README.md

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,15 @@ Modules `graphql` and `graphql-compose` are in `peerDependencies`, so should be
2929

3030
## Example
3131

32+
Implementation details of `findManyResolver` and `countResolver` can be found in [this file](./src/__mocks__/User.ts).
33+
3234
```js
33-
import composeWithConnection from 'graphql-compose-connection';
34-
import userTC from './user.js';
35+
import { prepareConnectionResolver } from 'graphql-compose-connection';
36+
import { UserTC, findManyResolver, countResolver } from './user';
3537

36-
composeWithConnection(userTC, {
37-
connectionResolverName: 'connection', // Default
38-
findResolverName: 'findMany',
39-
countResolverName: 'count',
38+
prepareConnectionResolver(userTC, {
39+
findManyResolver,
40+
countResolver,
4041
sort: {
4142
// Sorting key, visible for users in GraphQL Schema
4243
_ID_ASC: {
@@ -108,13 +109,6 @@ composeWithConnection(userTC, {
108109

109110
<img width="1249" alt="screen shot 2016-07-20 at 12 20 08" src="https://cloud.githubusercontent.com/assets/1946920/16976899/67a5e0f8-4e74-11e6-87e5-fc4574deaaab.png">
110111

111-
## Requirements
112-
113-
Types should have following resolvers:
114-
115-
- `count` - for counting records
116-
- `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.
117-
118112
## Used in plugins
119113

120114
[graphql-compose-mongoose](https://github.com/graphql-compose/graphql-compose-mongoose) - converts mongoose models to graphql types

package.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,26 @@
2424
},
2525
"homepage": "https://github.com/graphql-compose/graphql-compose-connection",
2626
"peerDependencies": {
27-
"graphql-compose": "^7.0.4"
27+
"graphql-compose": "^7.15.0"
2828
},
2929
"devDependencies": {
3030
"@types/graphql": "14.5.0",
31-
"@types/jest": "26.0.10",
32-
"@typescript-eslint/eslint-plugin": "3.9.0",
33-
"@typescript-eslint/parser": "3.9.0",
34-
"eslint": "7.7.0",
31+
"@types/jest": "26.0.13",
32+
"@typescript-eslint/eslint-plugin": "4.1.0",
33+
"@typescript-eslint/parser": "4.1.0",
34+
"eslint": "7.9.0",
3535
"eslint-config-airbnb-base": "14.2.0",
3636
"eslint-config-prettier": "6.11.0",
3737
"eslint-plugin-import": "2.22.0",
3838
"eslint-plugin-prettier": "3.1.4",
3939
"graphql": "15.3.0",
40-
"graphql-compose": "7.19.4",
41-
"jest": "26.4.0",
42-
"prettier": "2.0.5",
40+
"graphql-compose": "7.21.1",
41+
"jest": "26.4.2",
42+
"prettier": "2.1.1",
4343
"rimraf": "3.0.2",
4444
"semantic-release": "17.1.1",
45-
"ts-jest": "26.2.0",
46-
"typescript": "3.9.7"
45+
"ts-jest": "26.3.0",
46+
"typescript": "4.0.2"
4747
},
4848
"scripts": {
4949
"build": "rimraf lib && tsc -p ./tsconfig.build.json",

src/__mocks__/userTC.ts renamed to src/__mocks__/User.ts

Lines changed: 50 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,24 @@
1+
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
12
import { schemaComposer, ResolverResolveParams } from 'graphql-compose';
2-
import {
3-
GraphQLString,
4-
GraphQLObjectType,
5-
GraphQLInputObjectType,
6-
GraphQLEnumType,
7-
GraphQLInt,
8-
} from 'graphql-compose/lib/graphql';
9-
import type { ConnectionSortMapOpts } from '../connectionResolver';
3+
import type { ConnectionSortMapOpts } from '../connection';
104

11-
export const UserType = new GraphQLObjectType({
12-
name: 'User',
13-
fields: {
14-
id: {
15-
type: GraphQLInt,
16-
},
17-
name: {
18-
type: GraphQLString,
19-
},
20-
age: {
21-
type: GraphQLInt,
22-
},
23-
gender: {
24-
type: GraphQLString,
25-
},
26-
},
27-
});
28-
29-
export const UserLinkType = new GraphQLObjectType({
30-
name: 'UserLink',
31-
fields: {
32-
id: {
33-
type: GraphQLInt,
34-
},
35-
type: {
36-
type: GraphQLString,
37-
},
38-
userId: {
39-
type: GraphQLInt,
40-
},
41-
otherUserId: {
42-
type: GraphQLInt,
43-
},
44-
},
45-
});
5+
export const UserTC = schemaComposer.createObjectTC(`
6+
type User {
7+
id: Int
8+
name: String
9+
age: Int
10+
gender: String
11+
}
12+
`);
4613

47-
export const userTC = schemaComposer.createObjectTC(UserType);
48-
export const userLinkTC = schemaComposer.createObjectTC(UserLinkType);
14+
export const UserLinkTC = schemaComposer.createObjectTC(`
15+
type UserLink {
16+
id: Int
17+
type: String
18+
userId: Int
19+
otherUserId: Int
20+
}
21+
`);
4922

5023
export const userList = [
5124
{ id: 1, name: 'user01', age: 11, gender: 'm' },
@@ -70,52 +43,29 @@ export const userLinkList = [
7043
{ id: 2, type: 'dislikes', userId: 2, otherUserId: 1 },
7144
];
7245

73-
const filterArgConfig = {
74-
name: 'filter',
75-
type: new GraphQLInputObjectType({
76-
name: 'FilterUserInput',
77-
fields: {
78-
gender: {
79-
type: GraphQLString,
80-
},
81-
age: {
82-
type: GraphQLInt,
83-
},
84-
},
85-
}),
86-
};
46+
const filterArgConfig = schemaComposer.createInputTC(`
47+
input FilterUserInput {
48+
gender: String
49+
age: Int
50+
}
51+
`);
8752

88-
const filterEdgeArgConfig = {
89-
name: 'filter',
90-
type: new GraphQLInputObjectType({
91-
name: 'FilterNodeEdgeUserInput',
92-
fields: {
93-
edge: {
94-
type: new GraphQLInputObjectType({
95-
name: 'FilterNodeEdgeEdgeUserInput',
96-
fields: {
97-
type: {
98-
type: GraphQLString,
99-
},
100-
},
101-
}),
102-
},
103-
node: {
104-
type: new GraphQLInputObjectType({
105-
name: 'FilterNodeNodeEdgeUserInput',
106-
fields: {
107-
gender: {
108-
type: GraphQLString,
109-
},
110-
age: {
111-
type: GraphQLInt,
112-
},
113-
},
114-
}),
115-
},
116-
},
117-
}),
118-
};
53+
const filterEdgeArgConfig = schemaComposer.createInputTC({
54+
name: 'FilterNodeEdgeUserInput',
55+
fields: {
56+
edge: `
57+
input FilterNodeEdgeEdgeUserInput {
58+
type: String
59+
}
60+
`,
61+
node: `
62+
input FilterNodeNodeEdgeUserInput {
63+
gender: String
64+
age: Int
65+
}
66+
`,
67+
},
68+
});
11969

12070
function filterUserLink(
12171
link: typeof userLinkList[0],
@@ -189,13 +139,13 @@ function prepareFilterFromArgs(resolveParams = {} as ResolverResolveParams<any,
189139
return filter;
190140
}
191141

192-
export const findManyResolver = schemaComposer.createResolver({
142+
export const findManyResolver = schemaComposer.createResolver<any, any>({
193143
name: 'findMany',
194144
kind: 'query',
195-
type: UserType,
145+
type: UserTC,
196146
args: {
197147
filter: filterArgConfig,
198-
sort: new GraphQLEnumType({
148+
sort: UserTC.schemaComposer.createEnumTC({
199149
name: 'SortUserInput',
200150
values: {
201151
ID_ASC: { value: { id: 1 } },
@@ -204,8 +154,8 @@ export const findManyResolver = schemaComposer.createResolver({
204154
AGE_DESC: { value: { age: -1 } },
205155
},
206156
}),
207-
limit: GraphQLInt,
208-
skip: GraphQLInt,
157+
limit: 'Int',
158+
skip: 'Int',
209159
},
210160
resolve: (resolveParams) => {
211161
const args = resolveParams.args || {};
@@ -226,20 +176,18 @@ export const findManyResolver = schemaComposer.createResolver({
226176
return Promise.resolve(list);
227177
},
228178
});
229-
userTC.setResolver('findMany', findManyResolver);
230179

231180
export const countResolver = schemaComposer.createResolver({
232181
name: 'count',
233182
kind: 'query',
234-
type: GraphQLInt,
183+
type: 'Int',
235184
args: {
236185
filter: filterArgConfig,
237186
},
238187
resolve: (resolveParams) => {
239188
return Promise.resolve(filteredUserList(userList, prepareFilterFromArgs(resolveParams)).length);
240189
},
241190
});
242-
userTC.setResolver('count', countResolver);
243191

244192
function getThroughLinkResolver(list: typeof userLinkList, filter: any) {
245193
const nodeFilter = filter ? filter.node : {};
@@ -255,11 +203,11 @@ function getThroughLinkResolver(list: typeof userLinkList, filter: any) {
255203
export const findManyThroughLinkResolver = schemaComposer.createResolver({
256204
name: 'findManyThroughLink',
257205
kind: 'query',
258-
type: UserType,
206+
type: UserTC,
259207
args: {
260208
filter: filterEdgeArgConfig,
261-
limit: GraphQLInt,
262-
skip: GraphQLInt,
209+
limit: 'Int',
210+
skip: 'Int',
263211
},
264212
resolve: async (resolveParams) => {
265213
const args = resolveParams.args || {};
@@ -277,12 +225,11 @@ export const findManyThroughLinkResolver = schemaComposer.createResolver({
277225
return getThroughLinkResolver(list, args.filter);
278226
},
279227
});
280-
userTC.setResolver('findManyThroughLink', findManyThroughLinkResolver);
281228

282229
export const countThroughLinkResolver = schemaComposer.createResolver({
283230
name: 'count',
284231
kind: 'query',
285-
type: GraphQLInt,
232+
type: 'Int',
286233
args: {
287234
filter: filterEdgeArgConfig,
288235
},
@@ -291,7 +238,6 @@ export const countThroughLinkResolver = schemaComposer.createResolver({
291238
return getThroughLinkResolver(userLinkList.slice(), args.filter).length;
292239
},
293240
});
294-
userTC.setResolver('countThroughLink', countThroughLinkResolver);
295241

296242
export const sortOptions: ConnectionSortMapOpts = {
297243
ID_ASC: {

src/__mocks__/rootQueryTC.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/__tests__/__snapshots__/connectionResolver-test.ts.snap

Lines changed: 0 additions & 76 deletions
This file was deleted.

0 commit comments

Comments
 (0)