Skip to content

Commit 34e1744

Browse files
committed
feat(FieldsConverter): DocumentArray return defined early TypeComposer if it exists, instead of generating new one
See src/__mocks__/languageSchema.js where type name `Language` is pre-defined via `convertSchemaToGraphQL(LanguageSchema, 'Language');`. Otherwise genereted type may has different names for different models where it is used. By default, name for DocumentArray is `${ParentSchemaName}${ParentSchemaFieldName}`.
1 parent c5aad84 commit 34e1744

File tree

4 files changed

+27
-22
lines changed

4 files changed

+27
-22
lines changed

src/__mocks__/languagesSchema.js renamed to src/__mocks__/languageSchema.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Schema } from './mongooseCommon';
2+
import { convertSchemaToGraphQL } from '../fieldsConverter';
23

34
// name: 'EnumLanguageName',
45
// description: 'Language names (https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)',
@@ -14,7 +15,7 @@ const enumLanguageSkill = {
1415
native: { description: 'since birth' },
1516
};
1617

17-
const LanguagesSchema = new Schema(
18+
const LanguageSchema = new Schema(
1819
{
1920
ln: {
2021
type: String,
@@ -29,4 +30,8 @@ const LanguagesSchema = new Schema(
2930
}
3031
);
3132

32-
export default LanguagesSchema;
33+
export default LanguageSchema;
34+
35+
// Such way we can set Type name for Schema which is used in another schema.
36+
// Otherwise by default it will have name `${ParentSchemaName}${ParentSchemaFieldName}`
37+
convertSchemaToGraphQL(LanguageSchema, 'Language');

src/__mocks__/userModel.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { mongoose, Schema } from './mongooseCommon';
22
import ContactsSchema from './contactsSchema';
33
import enumEmployment from './enumEmployment';
4-
import LanguagesSchema from './languagesSchema';
4+
import LanguageSchema from './languageSchema';
55

66
const UserSchema = new Schema(
77
{
@@ -65,7 +65,7 @@ const UserSchema = new Schema(
6565
},
6666

6767
languages: {
68-
type: [LanguagesSchema],
68+
type: [LanguageSchema],
6969
default: [],
7070
description: 'Knowledge of languages',
7171
},

src/__tests__/fieldConverter-test.js

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* eslint-disable no-unused-expressions */
1+
/* eslint-disable no-unused-expressions, no-template-curly-in-string */
22

33
import { expect } from 'chai';
44
import {
@@ -130,55 +130,49 @@ describe('fieldConverter', () => {
130130
});
131131

132132
describe('arrayToGraphQL()', () => {
133-
const skillsType = arrayToGraphQL(fields.skills);
134-
135133
it('should produce GraphQLList', () => {
134+
const skillsType = arrayToGraphQL(fields.skills);
136135
expect(skillsType).to.be.instanceof(GraphQLList);
137136
});
138137

139138
it('should has string in ofType', () => {
139+
const skillsType = arrayToGraphQL(fields.skills);
140140
expect(skillsType.ofType.name).to.equal('String');
141141
});
142142
});
143143

144144
describe('enumToGraphQL()', () => {
145-
const genderEnum = enumToGraphQL(fields.gender);
146-
147145
it('should be instance of GraphQLEnumType', () => {
146+
const genderEnum = enumToGraphQL(fields.gender);
148147
expect(genderEnum).be.instanceof(GraphQLEnumType);
149148
});
150149

151150
it('should have type name `Enum${FieldName}`', () => {
151+
const genderEnum = enumToGraphQL(fields.gender);
152152
expect(genderEnum.name).to.equal('EnumGender');
153153
});
154154

155155
it('should pass all enum values to GQ type', () => {
156+
const genderEnum = enumToGraphQL(fields.gender);
156157
expect(genderEnum._values.length).to.equal(fields.gender.enumValues.length);
157158
expect(genderEnum._values[0].value).to.equal(fields.gender.enumValues[0]);
158159
});
159160
});
160161

161162
describe('embeddedToGraphQL()', () => {
162-
const embeddedType = embeddedToGraphQL(fields.contacts);
163-
const embeddedFields = embeddedType._typeConfig.fields();
164-
165163
it('should set name to graphql type', () => {
166-
expect(embeddedType.name).to.equal('Contacts');
164+
const embeddedType = embeddedToGraphQL(fields.contacts);
165+
expect(embeddedType.name).to.equal('UserContacts');
167166
});
168167

169168
it('should have embedded fields', () => {
169+
const embeddedType = embeddedToGraphQL(fields.contacts);
170+
const embeddedFields = embeddedType._typeConfig.fields();
170171
expect(embeddedFields.email).to.be.ok;
171-
});
172-
173-
it('should have embedded fields with MongoID type, except pseudoID', () => {
174172
expect(embeddedFields.locationId).to.be.ok;
175173
expect(embeddedFields._id).to.be.undefined;
176174
});
177175

178-
it('should skip pseudo mongoose _id field', () => {
179-
expect(embeddedFields._id).to.be.undefined;
180-
});
181-
182176
it('should return null if subdocument is empty', async () => {
183177
const UserTC = composeWithMongoose(UserModel);
184178
const schema = new GraphQLSchema({
@@ -263,8 +257,9 @@ describe('fieldConverter', () => {
263257
expect(languagesType).to.be.instanceof(GraphQLList);
264258
});
265259

266-
it('should has Languages type in ofType', () => {
267-
expect(languagesType.ofType.name).to.equal('Languages');
260+
it('should has Language type in ofType', () => {
261+
// see src/__mocks__/languageSchema.js where type name `Language` is defined
262+
expect(languagesType.ofType.name).to.equal('Language');
268263
});
269264

270265
it('should skip pseudo mongoose _id field in document', () => {

src/fieldsConverter.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,11 @@ export function convertModelToGraphQL(
127127
model: MongooseModelT | MongoosePseudoModelT,
128128
typeName: string
129129
): TypeComposer {
130+
// if model already has generated TypeComposer early, then return it
131+
if (model.schema && model.schema._gqcTypeComposer instanceof TypeComposer) {
132+
return model.schema._gqcTypeComposer;
133+
}
134+
130135
if (!typeName) {
131136
throw new Error('You provide empty name for type. '
132137
+ '`name` argument should be non-empty string.');

0 commit comments

Comments
 (0)