Skip to content

Commit 33d30f7

Browse files
committed
feat: use existed PaginationInfo type if it's already present in schemaComposer
1 parent 0945eab commit 33d30f7

12 files changed

+193
-264
lines changed

Diff for: package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
},
2525
"homepage": "https://github.com/graphql-compose/graphql-compose-pagination",
2626
"peerDependencies": {
27-
"graphql-compose": ">=4.0.0 || >=3.0.0"
27+
"graphql-compose": ">=4.0.0 || >=3.0.2"
2828
},
2929
"devDependencies": {
3030
"babel-cli": "^6.26.0",

Diff for: src/__mocks__/userTypeComposer.js renamed to src/__mocks__/User.js

+20-44
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,16 @@
22
/* eslint-disable no-param-reassign */
33

44
import { TypeComposer, Resolver } from 'graphql-compose';
5-
import {
6-
GraphQLString,
7-
GraphQLObjectType,
8-
GraphQLInputObjectType,
9-
GraphQLEnumType,
10-
GraphQLInt,
11-
} from 'graphql-compose/lib/graphql';
12-
13-
export const UserType = new GraphQLObjectType({
14-
name: 'User',
15-
fields: {
16-
id: {
17-
type: GraphQLInt,
18-
},
19-
name: {
20-
type: GraphQLString,
21-
},
22-
age: {
23-
type: GraphQLInt,
24-
},
25-
gender: {
26-
type: GraphQLString,
27-
},
28-
},
29-
});
30-
31-
export const userTypeComposer = new TypeComposer(UserType);
5+
import { GraphQLEnumType } from 'graphql-compose/lib/graphql';
6+
7+
export const UserTC = TypeComposer.create(`
8+
type User {
9+
id: Int
10+
name: String
11+
age: Int
12+
gender: String
13+
}
14+
`);
3215

3316
export const userList = [
3417
{ id: 1, name: 'user01', age: 11, gender: 'm' },
@@ -50,17 +33,10 @@ export const userList = [
5033

5134
const filterArgConfig = {
5235
name: 'filter',
53-
type: new GraphQLInputObjectType({
54-
name: 'FilterUserInput',
55-
fields: {
56-
gender: {
57-
type: GraphQLString,
58-
},
59-
age: {
60-
type: GraphQLInt,
61-
},
62-
},
63-
}),
36+
type: `input FilterUserInput {
37+
gender: String
38+
age: Int
39+
}`,
6440
};
6541

6642
function filteredUserList(list, filter = {}) {
@@ -121,7 +97,7 @@ function prepareFilterFromArgs(resolveParams = {}) {
12197
export const findManyResolver = new Resolver({
12298
name: 'findMany',
12399
kind: 'query',
124-
type: UserType,
100+
type: UserTC,
125101
args: {
126102
filter: filterArgConfig,
127103
sort: new GraphQLEnumType({
@@ -133,8 +109,8 @@ export const findManyResolver = new Resolver({
133109
AGE_DESC: { name: 'AGE_DESC', value: { age: -1 } },
134110
},
135111
}),
136-
limit: GraphQLInt,
137-
skip: GraphQLInt,
112+
limit: 'Int',
113+
skip: 'Int',
138114
},
139115
resolve: resolveParams => {
140116
const args = resolveParams.args || {};
@@ -155,17 +131,17 @@ export const findManyResolver = new Resolver({
155131
return Promise.resolve(list);
156132
},
157133
});
158-
userTypeComposer.setResolver('findMany', findManyResolver);
134+
UserTC.setResolver('findMany', findManyResolver);
159135

160136
export const countResolver = new Resolver({
161137
name: 'count',
162138
kind: 'query',
163-
type: GraphQLInt,
139+
type: 'Int',
164140
args: {
165141
filter: filterArgConfig,
166142
},
167143
resolve: resolveParams => {
168144
return Promise.resolve(filteredUserList(userList, prepareFilterFromArgs(resolveParams)).length);
169145
},
170146
});
171-
userTypeComposer.setResolver('count', countResolver);
147+
UserTC.setResolver('count', countResolver);

Diff for: src/__mocks__/rootQueryTypeComposer.js

-10
This file was deleted.

Diff for: src/__tests__/composeWithPagination-test.js

+13-20
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
/* @flow */
22
/* eslint-disable no-param-reassign */
33

4-
import { TypeComposer } from 'graphql-compose';
5-
import { GraphQLSchema, GraphQLList, graphql } from 'graphql-compose/lib/graphql';
4+
import { TypeComposer, schemaComposer } from 'graphql-compose';
5+
import { GraphQLList, graphql } from 'graphql-compose/lib/graphql';
66
import { composeWithPagination } from '../composeWithPagination';
7-
import { userTypeComposer } from '../__mocks__/userTypeComposer';
8-
import { rootQueryTypeComposer as rootQueryTC } from '../__mocks__/rootQueryTypeComposer';
7+
import { UserTC } from '../__mocks__/User';
98

109
describe('composeWithRelay', () => {
11-
const userComposer = composeWithPagination(userTypeComposer, {
10+
const userComposer = composeWithPagination(UserTC, {
1211
countResolverName: 'count',
1312
findResolverName: 'findMany',
1413
perPage: 5,
@@ -28,7 +27,7 @@ describe('composeWithRelay', () => {
2827

2928
it('should throw error if options are empty', () => {
3029
expect(() => {
31-
const args: any = [userTypeComposer];
30+
const args: any = [UserTC];
3231
composeWithPagination(...args);
3332
}).toThrowError('should provide non-empty options');
3433
});
@@ -69,10 +68,8 @@ describe('composeWithRelay', () => {
6968

7069
describe('fragments fields projection of graphql-compose', () => {
7170
it('should return object', async () => {
72-
rootQueryTC.setField('userPagination', userTypeComposer.getResolver('pagination'));
73-
const schema = new GraphQLSchema({
74-
query: rootQueryTC.getType(),
75-
});
71+
schemaComposer.Query.setField('userPagination', UserTC.getResolver('pagination'));
72+
const schema = schemaComposer.buildSchema();
7673
const query = `{
7774
userPagination(page: 1, perPage: 2) {
7875
count,
@@ -126,17 +123,15 @@ describe('composeWithRelay', () => {
126123
it('should pass `countResolveParams` to top resolverParams', async () => {
127124
let topResolveParams: any = {};
128125

129-
rootQueryTC.setField(
126+
schemaComposer.Query.setField(
130127
'userPagination',
131-
userTypeComposer.getResolver('pagination').wrapResolve(next => rp => {
128+
UserTC.getResolver('pagination').wrapResolve(next => rp => {
132129
const result = next(rp);
133130
topResolveParams = rp;
134131
return result;
135132
})
136133
);
137-
const schema = new GraphQLSchema({
138-
query: rootQueryTC.getType(),
139-
});
134+
const schema = schemaComposer.buildSchema();
140135
const query = `{
141136
userPagination(filter: { age: 45 }) {
142137
count
@@ -155,17 +150,15 @@ describe('composeWithRelay', () => {
155150
it('should pass `findManyResolveParams` to top resolverParams', async () => {
156151
let topResolveParams: any = {};
157152

158-
rootQueryTC.setField(
153+
schemaComposer.Query.setField(
159154
'userPagination',
160-
userTypeComposer.getResolver('pagination').wrapResolve(next => rp => {
155+
UserTC.getResolver('pagination').wrapResolve(next => rp => {
161156
const result = next(rp);
162157
topResolveParams = rp;
163158
return result;
164159
})
165160
);
166-
const schema = new GraphQLSchema({
167-
query: rootQueryTC.getType(),
168-
});
161+
const schema = schemaComposer.buildSchema();
169162
const query = `{
170163
userPagination(filter: { age: 45 }) {
171164
count

Diff for: src/__tests__/mocks-userTypeComposer-test.js

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
/* @flow */
22
/* eslint-disable no-param-reassign */
33

4-
import { userTypeComposer } from '../__mocks__/userTypeComposer';
4+
import { UserTC } from '../__mocks__/User';
55

6-
describe('mocks/userTypeComposer', () => {
7-
it('userTypeComposer should have `count` resolver', async () => {
8-
const cnt = await userTypeComposer.getResolver('count').resolve({});
6+
describe('mocks/UserTC', () => {
7+
it('UserTC should have `count` resolver', async () => {
8+
const cnt = await UserTC.getResolver('count').resolve({});
99
expect(cnt).toBe(15);
1010
});
1111

12-
it('userTypeComposer should have `findMany` resolver', async () => {
13-
const res = await userTypeComposer.getResolver('findMany').resolve({});
12+
it('UserTC should have `findMany` resolver', async () => {
13+
const res = await UserTC.getResolver('findMany').resolve({});
1414
expect(res).toHaveLength(15);
1515
});
1616

17-
it('userTypeComposer should have `findMany` resolver with working `filter` arg', async () => {
18-
const res = await userTypeComposer.getResolver('findMany').resolve({
17+
it('UserTC should have `findMany` resolver with working `filter` arg', async () => {
18+
const res = await UserTC.getResolver('findMany').resolve({
1919
args: {
2020
filter: {
2121
gender: 'm',
@@ -35,8 +35,8 @@ describe('mocks/userTypeComposer', () => {
3535
expect(res).toEqual([{ id: 9, name: 'user09', age: 19, gender: 'm' }]);
3636
});
3737

38-
it('userTypeComposer should have `findMany` resolver with working `sort` arg', async () => {
39-
const res = await userTypeComposer.getResolver('findMany').resolve({
38+
it('UserTC should have `findMany` resolver with working `sort` arg', async () => {
39+
const res = await UserTC.getResolver('findMany').resolve({
4040
args: {
4141
sort: {
4242
age: -1,

Diff for: src/__tests__/paginationResolver-test.js

+22-26
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33

44
import { Resolver } from 'graphql-compose';
55
import { GraphQLInt } from 'graphql-compose/lib/graphql';
6-
import { userTypeComposer } from '../__mocks__/userTypeComposer';
6+
import { UserTC } from '../__mocks__/User';
77
import { preparePaginationResolver } from '../paginationResolver';
88

99
describe('paginationResolver', () => {
10-
const spyFindManyResolve = jest.spyOn(userTypeComposer.getResolver('findMany'), 'resolve');
11-
const spyCountResolve = jest.spyOn(userTypeComposer.getResolver('count'), 'resolve');
12-
const paginationResolver = preparePaginationResolver(userTypeComposer, {
10+
const spyFindManyResolve = jest.spyOn(UserTC.getResolver('findMany'), 'resolve');
11+
const spyCountResolve = jest.spyOn(UserTC.getResolver('count'), 'resolve');
12+
const paginationResolver = preparePaginationResolver(UserTC, {
1313
countResolverName: 'count',
1414
findResolverName: 'findMany',
1515
perPage: 5,
@@ -29,14 +29,14 @@ describe('paginationResolver', () => {
2929

3030
it('should throw error if opts.countResolverName are empty', () => {
3131
expect(() => {
32-
const args: any = [userTypeComposer, {}];
32+
const args: any = [UserTC, {}];
3333
preparePaginationResolver(...args);
3434
}).toThrowError('should have option `opts.countResolverName`');
3535
});
3636

3737
it('should throw error if resolver opts.countResolverName does not exists', () => {
3838
expect(() =>
39-
preparePaginationResolver(userTypeComposer, {
39+
preparePaginationResolver(UserTC, {
4040
countResolverName: 'countDoesNotExists',
4141
findResolverName: 'findMany',
4242
})
@@ -45,14 +45,14 @@ describe('paginationResolver', () => {
4545

4646
it('should throw error if opts.findResolverName are empty', () => {
4747
expect(() => {
48-
const args: any = [userTypeComposer, { countResolverName: 'count' }];
48+
const args: any = [UserTC, { countResolverName: 'count' }];
4949
preparePaginationResolver(...args);
5050
}).toThrowError('should have option `opts.findResolverName`');
5151
});
5252

5353
it('should throw error if resolver opts.countResolverName does not exists', () => {
5454
expect(() =>
55-
preparePaginationResolver(userTypeComposer, {
55+
preparePaginationResolver(UserTC, {
5656
countResolverName: 'count',
5757
findResolverName: 'findManyDoesNotExists',
5858
})
@@ -70,7 +70,7 @@ describe('paginationResolver', () => {
7070
});
7171

7272
it('should have type to be ConnectionType', () => {
73-
expect((paginationResolver.type: any).name).toBe('UserPagination');
73+
expect((paginationResolver.type: any).getTypeName()).toBe('UserPagination');
7474
});
7575
});
7676

@@ -93,23 +93,19 @@ describe('paginationResolver', () => {
9393
beforeEach(() => {
9494
findManyResolverCalled = false;
9595
countResolverCalled = false;
96-
const mockedFindMany = userTypeComposer
97-
.getResolver('findMany')
98-
.wrapResolve(next => resolveParams => {
99-
findManyResolverCalled = true;
100-
spyResolveParams = resolveParams;
101-
return next(resolveParams);
102-
});
103-
const mockedCount = userTypeComposer
104-
.getResolver('findMany')
105-
.wrapResolve(next => resolveParams => {
106-
countResolverCalled = true;
107-
spyResolveParams = resolveParams;
108-
return next(resolveParams);
109-
});
110-
userTypeComposer.setResolver('mockedFindMany', mockedFindMany);
111-
userTypeComposer.setResolver('mockedCount', mockedCount);
112-
mockedpaginationResolver = preparePaginationResolver(userTypeComposer, {
96+
const mockedFindMany = UserTC.getResolver('findMany').wrapResolve(next => resolveParams => {
97+
findManyResolverCalled = true;
98+
spyResolveParams = resolveParams;
99+
return next(resolveParams);
100+
});
101+
const mockedCount = UserTC.getResolver('findMany').wrapResolve(next => resolveParams => {
102+
countResolverCalled = true;
103+
spyResolveParams = resolveParams;
104+
return next(resolveParams);
105+
});
106+
UserTC.setResolver('mockedFindMany', mockedFindMany);
107+
UserTC.setResolver('mockedCount', mockedCount);
108+
mockedpaginationResolver = preparePaginationResolver(UserTC, {
113109
countResolverName: 'mockedCount',
114110
findResolverName: 'mockedFindMany',
115111
});

Diff for: src/paginationResolver.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import type {
99
} from 'graphql-compose';
1010
import type { GraphQLResolveInfo } from 'graphql-compose/lib/graphql';
1111
import type { ComposeWithPaginationOpts } from './composeWithPagination';
12-
import preparePaginationType from './types/paginationType';
12+
import { preparePaginationTC } from './types/preparePaginationType';
1313

1414
const DEFAULT_PER_PAGE = 20;
1515

@@ -98,7 +98,7 @@ export function preparePaginationResolver(
9898
}
9999

100100
return new tc.constructor.schemaComposer.Resolver({
101-
type: preparePaginationType(tc),
101+
type: preparePaginationTC(tc),
102102
name: 'pagination',
103103
kind: 'query',
104104
args: {
@@ -113,7 +113,7 @@ export function preparePaginationResolver(
113113
},
114114
...(additionalArgs: any),
115115
},
116-
// eslint-disable-next-line
116+
// prettier-ignore
117117
resolve: async /* :: <TContext> */(
118118
rp /* : $Shape<PaginationResolveParams<TContext>> */
119119
) => {
@@ -194,6 +194,6 @@ export function preparePaginationResolver(
194194
};
195195
return result;
196196
});
197-
},
197+
}
198198
});
199199
}

0 commit comments

Comments
 (0)