Skip to content

Commit 720f0ba

Browse files
committed
feat(MongoID): allow to override build-in MongoID type
```js schemaComposer.set('MongoID', YOUR_TYPE_IMPLEMENTATION); const UserTC = composeWithMongoose(UserModel, { schemaComposer }); ``` Related #98
1 parent 44a9a5c commit 720f0ba

17 files changed

+49
-38
lines changed

src/__tests__/fieldConverter-test.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,38 @@ describe('fieldConverter', () => {
118118
};
119119
expect(convertFieldToGraphQL(mongooseField, '', schemaComposer)).toBe('String');
120120
});
121+
122+
it('should add GraphQLMongoID to schemaComposer', () => {
123+
schemaComposer.clear();
124+
expect(schemaComposer.has('MongoID')).toBeFalsy();
125+
const mongooseField = {
126+
path: 'strFieldName',
127+
instance: 'ObjectID',
128+
};
129+
expect(convertFieldToGraphQL(mongooseField, '', schemaComposer)).toBe('MongoID');
130+
expect(schemaComposer.get('MongoID')).toBe(GraphQLMongoID);
131+
});
132+
133+
it('should use existed GraphQLMongoID in schemaComposer', () => {
134+
schemaComposer.clear();
135+
expect(schemaComposer.has('MongoID')).toBeFalsy();
136+
schemaComposer.set('MongoID', ('MockGraphQLType': any));
137+
const mongooseField = {
138+
path: 'strFieldName',
139+
instance: 'ObjectID',
140+
};
141+
expect(convertFieldToGraphQL(mongooseField, '', schemaComposer)).toBe('MongoID');
142+
expect(schemaComposer.get('MongoID')).toBe('MockGraphQLType');
143+
schemaComposer.delete('MongoID');
144+
});
121145
});
122146

123147
describe('scalarToGraphQL()', () => {
124148
it('should properly convert mongoose scalar type to default graphQL types', () => {
125149
expect(scalarToGraphQL({ instance: 'String' })).toBe('String');
126150
expect(scalarToGraphQL({ instance: 'Number' })).toBe('Float');
127151
expect(scalarToGraphQL({ instance: 'Boolean' })).toBe('Boolean');
128-
expect(scalarToGraphQL({ instance: 'ObjectID' })).toBe(GraphQLMongoID);
152+
expect(scalarToGraphQL({ instance: 'ObjectID' })).toBe('MongoID');
129153
});
130154

131155
it('should properly convert mongoose scalar type to scalar graphql-compose types', () => {
@@ -196,7 +220,7 @@ describe('fieldConverter', () => {
196220

197221
describe('referenceToGraphQL()', () => {
198222
it('should return type of field', () => {
199-
expect(referenceToGraphQL(fields.user)).toBe(GraphQLMongoID);
223+
expect(referenceToGraphQL(fields.user)).toBe('MongoID');
200224
});
201225
});
202226
});

src/composeWithMongoose.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type {
1414
SortHelperArgsOpts,
1515
RecordHelperArgsOpts,
1616
} from './resolvers/helpers';
17+
import MongoID from './types/mongoid';
1718

1819
export type TypeConverterOpts = {
1920
schemaComposer?: SchemaComposer<any>,
@@ -120,6 +121,7 @@ export function composeWithMongoose(
120121
const name: string = (opts && opts.name) || model.modelName;
121122

122123
const sc = opts.schemaComposer || schemaComposer;
124+
sc.set('MongoID', MongoID);
123125
const tc = convertModelToGraphQL(model, name, sc);
124126

125127
if (opts.description) {

src/fieldsConverter.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,10 @@ export function convertFieldToGraphQL(
188188
prefix?: string = '',
189189
schemaComposer: SchemaComposer<any>
190190
): ComposeOutputType {
191+
if (!schemaComposer.has('MongoID')) {
192+
schemaComposer.set('MongoID', GraphQLMongoID);
193+
}
194+
191195
const complexType = deriveComplexType(field);
192196
switch (complexType) {
193197
case ComplexTypes.SCALAR:
@@ -257,7 +261,7 @@ export function scalarToGraphQL(field: MongooseFieldT): ComposeScalarType {
257261
case 'Boolean':
258262
return 'Boolean';
259263
case 'ObjectID':
260-
return GraphQLMongoID;
264+
return 'MongoID';
261265
default:
262266
return 'JSON';
263267
}

src/resolvers/__tests__/createOne-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ describe('createOne() ->', () => {
3333
describe('Resolver.args', () => {
3434
it('should have required `record` arg', () => {
3535
const resolver = createOne(UserModel, UserTC);
36-
const argConfig: any = resolver.getArg('record');
36+
const argConfig: any = resolver.getArgConfig('record');
3737
expect(argConfig.type).toBeInstanceOf(GraphQLNonNull);
3838
expect(argConfig.type.ofType.name).toBe('CreateOneUserInput');
3939
});

src/resolvers/__tests__/findById-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ describe('findById() ->', () => {
4848
it('should have non-null `_id` arg', () => {
4949
const resolver = findById(UserModel, UserTC);
5050
expect(resolver.hasArg('_id')).toBe(true);
51-
const argConfig: any = resolver.getArg('_id');
51+
const argConfig: any = resolver.getArgConfig('_id');
5252
expect(argConfig.type).toBeInstanceOf(GraphQLNonNull);
5353
expect(argConfig.type.ofType).toBe(GraphQLMongoID);
5454
});

src/resolvers/__tests__/findByIds-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ describe('findByIds() ->', () => {
5858
it('should have non-null `_ids` arg', () => {
5959
const resolver = findByIds(UserModel, UserTC);
6060
expect(resolver.hasArg('_ids')).toBe(true);
61-
const argConfig: any = resolver.getArg('_ids');
61+
const argConfig: any = resolver.getArgConfig('_ids');
6262
expect(argConfig.type).toBeInstanceOf(GraphQLNonNull);
6363
expect(argConfig.type.ofType).toBeInstanceOf(GraphQLList);
6464
expect(argConfig.type.ofType.ofType).toBe(GraphQLMongoID);

src/resolvers/__tests__/removeById-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ describe('removeById() ->', () => {
4545
it('should have non-null `_id` arg', () => {
4646
const resolver = removeById(UserModel, UserTC);
4747
expect(resolver.hasArg('_id')).toBe(true);
48-
const argConfig: any = resolver.getArg('_id');
48+
const argConfig: any = resolver.getArgConfig('_id');
4949
expect(argConfig.type).toBeInstanceOf(GraphQLNonNull);
5050
expect(argConfig.type.ofType).toBe(GraphQLMongoID);
5151
});

src/resolvers/__tests__/updateById-test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,14 @@ describe('updateById() ->', () => {
5656
describe('Resolver.args', () => {
5757
it('should have `record` arg', () => {
5858
const resolver = updateById(UserModel, UserTC);
59-
const argConfig: any = resolver.getArg('record');
59+
const argConfig: any = resolver.getArgConfig('record');
6060
expect(argConfig.type).toBeInstanceOf(GraphQLNonNull);
6161
expect(argConfig.type.ofType.name).toBe('UpdateByIdUserInput');
6262
});
6363

6464
it('should have `record._id` required arg', () => {
6565
const resolver = updateById(UserModel, UserTC);
66-
const argConfig: any = resolver.getArg('record') || {};
66+
const argConfig: any = resolver.getArgConfig('record') || {};
6767
expect(argConfig.type.ofType).toBeInstanceOf(GraphQLInputObjectType);
6868
if (argConfig.type && argConfig.type.ofType) {
6969
const _idFieldType = new InputTypeComposer(argConfig.type.ofType).getFieldType('_id');

src/resolvers/__tests__/updateMany-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ describe('updateMany() ->', () => {
7070

7171
it('should have `record` arg', () => {
7272
const resolver = updateMany(UserModel, UserTC);
73-
const argConfig: any = resolver.getArg('record');
73+
const argConfig: any = resolver.getArgConfig('record');
7474
expect(argConfig.type).toBeInstanceOf(GraphQLNonNull);
7575
expect(argConfig.type.ofType.name).toBe('UpdateManyUserInput');
7676
});

src/resolvers/__tests__/updateOne-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ describe('updateOne() ->', () => {
6767

6868
it('should have required `record` arg', () => {
6969
const resolver = updateOne(UserModel, UserTC);
70-
const argConfig: any = resolver.getArg('record');
70+
const argConfig: any = resolver.getArgConfig('record');
7171
expect(argConfig.type).toBeInstanceOf(GraphQLNonNull);
7272
expect(argConfig.type.ofType.name).toBe('UpdateOneUserInput');
7373
});

src/resolvers/createOne.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import type { Resolver, TypeComposer } from 'graphql-compose';
55
import type { MongooseModel } from 'mongoose';
66
import { recordHelperArgs } from './helpers';
7-
import GraphQLMongoID from '../types/mongoid';
87
import type { ExtendedResolveParams, GenResolverOpts } from './index';
98

109
export default function createOne(
@@ -24,7 +23,7 @@ export default function createOne(
2423
const outputType = tc.constructor.schemaComposer.getOrCreateTC(outputTypeName, t => {
2524
t.addFields({
2625
recordId: {
27-
type: GraphQLMongoID,
26+
type: 'MongoID',
2827
description: 'Created document ID',
2928
},
3029
record: {

src/resolvers/findById.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import type { Resolver, TypeComposer } from 'graphql-compose';
44
import type { MongooseModel } from 'mongoose';
5-
import { GraphQLNonNull } from 'graphql-compose/lib/graphql';
6-
import GraphQLMongoID from '../types/mongoid';
75
import { projectionHelper } from './helpers';
86
import type { ExtendedResolveParams, GenResolverOpts } from './index';
97

@@ -25,10 +23,7 @@ export default function findById(
2523
name: 'findById',
2624
kind: 'query',
2725
args: {
28-
_id: {
29-
name: '_id',
30-
type: new GraphQLNonNull(GraphQLMongoID),
31-
},
26+
_id: 'MongoID!',
3227
},
3328
resolve: (resolveParams: ExtendedResolveParams) => {
3429
const args = resolveParams.args || {};

src/resolvers/findByIds.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import type { Resolver, TypeComposer } from 'graphql-compose';
44
import type { MongooseModel } from 'mongoose';
5-
import { GraphQLNonNull, GraphQLList } from 'graphql-compose/lib/graphql';
6-
import GraphQLMongoID from '../types/mongoid';
75
import {
86
limitHelper,
97
limitHelperArgs,
@@ -31,10 +29,7 @@ export default function findByIds(
3129
name: 'findByIds',
3230
kind: 'query',
3331
args: {
34-
_ids: {
35-
name: '_ids',
36-
type: new GraphQLNonNull(new GraphQLList(GraphQLMongoID)),
37-
},
32+
_ids: '[MongoID]!',
3833
...limitHelperArgs({
3934
...(opts && opts.limit),
4035
}),

src/resolvers/removeById.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33

44
import type { Resolver, TypeComposer } from 'graphql-compose';
55
import type { MongooseModel } from 'mongoose';
6-
import { GraphQLNonNull } from 'graphql-compose/lib/graphql';
76
import findById from './findById';
8-
import GraphQLMongoID from '../types/mongoid';
97
import type { ExtendedResolveParams, GenResolverOpts } from './index';
108

119
export default function removeById(
@@ -27,7 +25,7 @@ export default function removeById(
2725
const outputType = tc.constructor.schemaComposer.getOrCreateTC(outputTypeName, t => {
2826
t.addFields({
2927
recordId: {
30-
type: GraphQLMongoID,
28+
type: 'MongoID',
3129
description: 'Removed document ID',
3230
},
3331
record: {
@@ -46,10 +44,7 @@ export default function removeById(
4644
'2) Return removed document.',
4745
type: outputType,
4846
args: {
49-
_id: {
50-
name: '_id',
51-
type: new GraphQLNonNull(GraphQLMongoID),
52-
},
47+
_id: 'MongoID!',
5348
},
5449
resolve: async (resolveParams: ExtendedResolveParams) => {
5550
const args = resolveParams.args || {};

src/resolvers/removeOne.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
import type { Resolver, TypeComposer } from 'graphql-compose';
55
import type { MongooseModel } from 'mongoose';
6-
import GraphQLMongoID from '../types/mongoid';
76
import { filterHelperArgs, sortHelperArgs } from './helpers';
87
import findOne from './findOne';
98
import type { ExtendedResolveParams, GenResolverOpts } from './index';
@@ -27,7 +26,7 @@ export default function removeOne(
2726
const outputType = tc.constructor.schemaComposer.getOrCreateTC(outputTypeName, t => {
2827
t.addFields({
2928
recordId: {
30-
type: GraphQLMongoID,
29+
type: 'MongoID',
3130
description: 'Removed document ID',
3231
},
3332
record: {

src/resolvers/updateById.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import type { Resolver, TypeComposer } from 'graphql-compose';
55
import type { MongooseModel } from 'mongoose';
66
import { recordHelperArgs } from './helpers/record';
77
import findById from './findById';
8-
import GraphQLMongoID from '../types/mongoid';
98

109
import type { ExtendedResolveParams, GenResolverOpts } from './index';
1110

@@ -28,7 +27,7 @@ export default function updateById(
2827
const outputType = tc.constructor.schemaComposer.getOrCreateTC(outputTypeName, t => {
2928
t.addFields({
3029
recordId: {
31-
type: GraphQLMongoID,
30+
type: 'MongoID',
3231
description: 'Updated document ID',
3332
},
3433
record: {

src/resolvers/updateOne.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import type { MongooseModel } from 'mongoose';
66
import type { ExtendedResolveParams, GenResolverOpts } from './index';
77
import { skipHelperArgs, recordHelperArgs, filterHelperArgs, sortHelperArgs } from './helpers';
88
import findOne from './findOne';
9-
import GraphQLMongoID from '../types/mongoid';
109

1110
export default function updateOne(
1211
model: MongooseModel,
@@ -26,7 +25,7 @@ export default function updateOne(
2625
const outputType = tc.constructor.schemaComposer.getOrCreateTC(outputTypeName, t => {
2726
t.addFields({
2827
recordId: {
29-
type: GraphQLMongoID,
28+
type: 'MongoID',
3029
description: 'Updated document ID',
3130
},
3231
record: {

0 commit comments

Comments
 (0)