Skip to content

Commit 8a244cc

Browse files
committed
refactor: replace GraphQLInterfaceType by InterfaceTypeComposer
1 parent 1b39922 commit 8a244cc

File tree

4 files changed

+52
-51
lines changed

4 files changed

+52
-51
lines changed

src/__tests__/composeWithMongooseDiscriminators-test.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { GraphQLInterfaceType } from 'graphql';
1+
/* @flow */
2+
23
import {
34
graphql,
45
InputTypeComposer,
56
SchemaComposer,
67
schemaComposer,
78
TypeComposer,
9+
InterfaceTypeComposer,
810
} from 'graphql-compose';
911
import { getCharacterModels } from '../__mocks__/characterModels';
1012
import { MovieModel } from '../__mocks__/movieModel';
@@ -38,7 +40,7 @@ describe('composeWithMongooseDiscriminators ->', () => {
3840

3941
it('should have an interface, accessed with getDInterface', () => {
4042
const cDTC = composeWithMongooseDiscriminators(CharacterModel);
41-
expect(cDTC.getDInterface()).toBeInstanceOf(GraphQLInterfaceType);
43+
expect(cDTC.getDInterface()).toBeInstanceOf(InterfaceTypeComposer);
4244
});
4345
});
4446

@@ -196,8 +198,8 @@ describe('composeWithMongooseDiscriminators ->', () => {
196198
expect(
197199
characterDTC
198200
.getDInterface()
199-
.getFields()
200-
[fieldName].type.toString()
201+
.getFieldType(fieldName)
202+
.toString()
201203
).toEqual(fieldExtension.type);
202204
});
203205

src/discriminators/DiscriminatorTypeComposer.js

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import type { ComposeFieldConfigMap } from 'graphql-compose';
44
import {
55
EnumTypeComposer,
6-
graphql,
76
schemaComposer,
87
SchemaComposer,
98
TypeComposerClass,
9+
type InterfaceTypeComposerClass,
1010
} from 'graphql-compose';
1111
import type { GraphQLFieldConfigMap } from 'graphql-compose/lib/graphql';
1212
import type {
@@ -22,8 +22,6 @@ import { mergeCustomizationOptions } from './merge-customization-options';
2222
import { prepareBaseResolvers } from './prepare-resolvers/prepareBaseResolvers';
2323
import { reorderFields } from './utils';
2424

25-
const { GraphQLInterfaceType } = graphql;
26-
2725
export type Options = {
2826
reorderFields?: boolean | string[], // true order: _id, DKey, DInterfaceFields, DiscriminatorFields
2927
customizationOptions?: TypeConverterOpts,
@@ -69,44 +67,14 @@ function createAndSetDKeyETC(dTC: DiscriminatorTypeComposer<any>, discriminators
6967
return DKeyETC;
7068
}
7169

72-
function getBaseTCFieldsWithTypes(baseTC: TypeComposerClass<any>) {
73-
const baseFields = baseTC.getFieldNames();
74-
const baseFieldsWithTypes: GraphQLFieldConfigMap<any, any> = {};
75-
76-
for (const field of baseFields) {
77-
baseFieldsWithTypes[field] = baseTC.getFieldConfig(field);
78-
}
79-
80-
return baseFieldsWithTypes;
81-
}
82-
83-
function createDInterface(baseModelTC: DiscriminatorTypeComposer<any>): GraphQLInterfaceType {
84-
return new GraphQLInterfaceType({
85-
name: `${baseModelTC.getTypeName()}Interface`,
86-
87-
resolveType: (value: any) => {
88-
const childDName = value[baseModelTC.getDKey()];
89-
90-
if (childDName) {
91-
return baseModelTC.schemaComposer.getTC(childDName).getType();
92-
}
93-
94-
// as fallback return BaseModelTC
95-
return baseModelTC.schemaComposer.getTC(baseModelTC.getTypeName()).getType();
96-
},
97-
// hoisting issue solved, get at time :)
98-
fields: () => getBaseTCFieldsWithTypes(baseModelTC),
99-
});
100-
}
101-
10270
export class DiscriminatorTypeComposer<TContext> extends TypeComposerClass<TContext> {
10371
discriminatorKey: string;
10472

10573
DKeyETC: EnumTypeComposer;
10674

10775
opts: Options;
10876

109-
DInterface: GraphQLInterfaceType;
77+
DInterface: InterfaceTypeComposerClass<TContext>;
11078

11179
childTCs: TypeComposerClass<TContext>[];
11280

@@ -156,7 +124,7 @@ export class DiscriminatorTypeComposer<TContext> extends TypeComposerClass<TCont
156124

157125
reorderFields(baseDTC, (baseDTC.opts: any).reorderFields, baseDTC.discriminatorKey);
158126

159-
baseDTC.DInterface = createDInterface(baseDTC);
127+
baseDTC.DInterface = baseDTC._createDInterface(baseDTC);
160128
baseDTC.setInterfaces([baseDTC.DInterface]);
161129

162130
baseDTC.schemaComposer.addSchemaMustHaveType(baseDTC);
@@ -167,6 +135,31 @@ export class DiscriminatorTypeComposer<TContext> extends TypeComposerClass<TCont
167135
return baseDTC;
168136
}
169137

138+
_createDInterface(baseTC: DiscriminatorTypeComposer<any>): InterfaceTypeComposerClass<TContext> {
139+
return this.schemaComposer.InterfaceTypeComposer.create({
140+
name: `${baseTC.getTypeName()}Interface`,
141+
142+
resolveType: (value: any) => {
143+
const childDName = value[baseTC.getDKey()];
144+
145+
if (childDName) {
146+
return baseTC.schemaComposer.getTC(childDName).getType();
147+
}
148+
149+
// as fallback return BaseModelTC
150+
return baseTC.schemaComposer.getTC(baseTC.getTypeName()).getType();
151+
},
152+
fields: (): ComposeFieldConfigMap<any, TContext> => {
153+
const baseFields = baseTC.getFieldNames();
154+
const interfaceFields = {};
155+
for (const field of baseFields) {
156+
interfaceFields[field] = baseTC.getFieldConfig(field);
157+
}
158+
return interfaceFields;
159+
},
160+
});
161+
}
162+
170163
getDKey(): string {
171164
return this.discriminatorKey;
172165
}

src/discriminators/prepare-resolvers/__tests__/recomposeBaseResolvers-test.js

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
/* @flow */
2+
13
import { graphql } from 'graphql-compose';
24
import { getCharacterModels } from '../../../__mocks__/characterModels';
35
import { composeWithMongooseDiscriminators } from '../../../composeWithMongooseDiscriminators';
@@ -75,54 +77,58 @@ describe('recomposeBaseResolvers()', () => {
7577

7678
it('should set resolver type to DInterface List, findMany', () => {
7779
expect(CharacterDTC.getResolver('findMany').getType()).toEqual(
78-
graphql.GraphQLList(CharacterDTC.getDInterface())
80+
graphql.GraphQLList(CharacterDTC.getDInterface().getType())
7981
);
8082
});
8183

8284
it('should set resolver type to DInterface List, findByIds', () => {
8385
expect(CharacterDTC.getResolver('findByIds').getType()).toEqual(
84-
graphql.GraphQLList(CharacterDTC.getDInterface())
86+
graphql.GraphQLList(CharacterDTC.getDInterface().getType())
8587
);
8688
});
8789

8890
it('should set resolver type to DInterface, findOne', () => {
89-
expect(CharacterDTC.getResolver('findOne').getType()).toEqual(CharacterDTC.getDInterface());
91+
expect(CharacterDTC.getResolver('findOne').getType()).toEqual(
92+
CharacterDTC.getDInterface().getType()
93+
);
9094
});
9195

9296
it('should set resolver type to DInterface, findById', () => {
93-
expect(CharacterDTC.getResolver('findById').getType()).toEqual(CharacterDTC.getDInterface());
97+
expect(CharacterDTC.getResolver('findById').getType()).toEqual(
98+
CharacterDTC.getDInterface().getType()
99+
);
94100
});
95101

96102
it('should set resolver record field type to DInterface, createOne', () => {
97103
expect(
98104
CharacterDTC.getResolver('createOne')
99105
.getTypeComposer()
100106
.getFieldType('record')
101-
).toEqual(CharacterDTC.getDInterface());
107+
).toEqual(CharacterDTC.getDInterface().getType());
102108
});
103109

104110
it('should set resolver record field type to DInterface, updateOne', () => {
105111
expect(
106112
CharacterDTC.getResolver('updateOne')
107113
.getTypeComposer()
108114
.getFieldType('record')
109-
).toEqual(CharacterDTC.getDInterface());
115+
).toEqual(CharacterDTC.getDInterface().getType());
110116
});
111117

112118
it('should set resolver record field type to DInterface, updateById', () => {
113119
expect(
114120
CharacterDTC.getResolver('updateById')
115121
.getTypeComposer()
116122
.getFieldType('record')
117-
).toEqual(CharacterDTC.getDInterface());
123+
).toEqual(CharacterDTC.getDInterface().getType());
118124
});
119125

120126
it('should set resolver record field type to DInterface, ', () => {
121127
expect(
122128
CharacterDTC.getResolver('removeById')
123129
.getTypeComposer()
124130
.getFieldType('record')
125-
).toEqual(CharacterDTC.getDInterface());
131+
).toEqual(CharacterDTC.getDInterface().getType());
126132
});
127133

128134
it('should set resolver record arg field, DKey to NonNull DKeyETC type, createOne', () => {
@@ -138,7 +144,7 @@ describe('recomposeBaseResolvers()', () => {
138144
CharacterDTC.getResolver('pagination')
139145
.getTypeComposer()
140146
.getFieldType('items')
141-
).toEqual(graphql.GraphQLList(CharacterDTC.getDInterface()));
147+
).toEqual(graphql.GraphQLList(CharacterDTC.getDInterface().getType()));
142148
});
143149

144150
it('should clone, rename edges field on connection resolver, connection', () => {

src/discriminators/prepare-resolvers/prepareBaseResolvers.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export function prepareBaseResolvers(baseTC: DiscriminatorTypeComposer<any>) {
3939
switch (resolverName) {
4040
case EMCResolvers.findMany:
4141
case EMCResolvers.findByIds:
42-
resolver.setType(new GraphQLList(baseTC.getDInterface()));
42+
resolver.setType(new GraphQLList(baseTC.getDInterface().getType()));
4343
break;
4444

4545
case EMCResolvers.findById:
@@ -59,7 +59,7 @@ export function prepareBaseResolvers(baseTC: DiscriminatorTypeComposer<any>) {
5959

6060
case EMCResolvers.pagination:
6161
resolver.getTypeComposer().extendField('items', {
62-
type: new GraphQLList(baseTC.getDInterface()),
62+
type: new GraphQLList(baseTC.getDInterface().getType()),
6363
});
6464
break;
6565

@@ -70,7 +70,7 @@ export function prepareBaseResolvers(baseTC: DiscriminatorTypeComposer<any>) {
7070
.clone(`${baseTC.getTypeName()}Edge`);
7171

7272
edgesTC.extendField('node', {
73-
type: new GraphQLNonNull(baseTC.getDInterface()),
73+
type: new GraphQLNonNull(baseTC.getDInterface().getType()),
7474
});
7575

7676
resolver

0 commit comments

Comments
 (0)