Skip to content

Commit c997bb0

Browse files
committed
pass tests
1 parent d9f728a commit c997bb0

2 files changed

Lines changed: 25 additions & 37 deletions

File tree

packages/resolvers-composition/src/resolvers-composition.ts

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ function resolveRelevantMappings<Resolvers extends Record<string, any> = Record<
4242
const fieldName = split[1];
4343

4444
if (typeName === '*') {
45+
if (!resolvers) {
46+
return [];
47+
}
4548
return flatten(
4649
Object.keys(resolvers).map(typeName =>
4750
resolveRelevantMappings(resolvers, `${typeName}.${fieldName}`, allMappings)
@@ -50,14 +53,12 @@ function resolveRelevantMappings<Resolvers extends Record<string, any> = Record<
5053
}
5154

5255
if (fieldName === '*') {
53-
const endpoints = resolvers[typeName];
54-
if (!endpoints) {
55-
return []
56+
const fieldMap = resolvers[typeName];
57+
if (!fieldMap) {
58+
return [];
5659
}
5760
return flatten(
58-
Object.keys(endpoints).map(field =>
59-
resolveRelevantMappings(resolvers, `${typeName}.${field}`, allMappings)
60-
)
61+
Object.keys(fieldMap).map(field => resolveRelevantMappings(resolvers, `${typeName}.${field}`, allMappings))
6162
).filter(mapItem => !allMappings[mapItem]);
6263
} else {
6364
const paths = [];
@@ -81,8 +82,13 @@ function resolveRelevantMappings<Resolvers extends Record<string, any> = Record<
8182
} else if (split.length === 1) {
8283
const typeName = split[0];
8384

85+
const fieldMap = resolvers[typeName];
86+
if (!fieldMap) {
87+
return [];
88+
}
89+
8490
return flatten(
85-
Object.keys(resolvers[typeName]).map(fieldName =>
91+
Object.keys(fieldMap).map(fieldName =>
8692
resolveRelevantMappings(resolvers, `${typeName}.${fieldName}`, allMappings)
8793
)
8894
);
@@ -106,15 +112,16 @@ export function composeResolvers<Resolvers extends Record<string, any>>(
106112
const mappingResult: { [path: string]: ((...args: any[]) => any)[] } = {};
107113

108114
Object.keys(mapping).forEach((resolverPath: string) => {
109-
if (mapping[resolverPath] instanceof Array || typeof mapping[resolverPath] === 'function') {
110-
const composeFns = mapping[resolverPath] as ResolversComposition | ResolversComposition[];
115+
const resolverPathMapping = mapping[resolverPath];
116+
if (resolverPathMapping instanceof Array || typeof resolverPathMapping === 'function') {
117+
const composeFns = resolverPathMapping as ResolversComposition | ResolversComposition[];
111118
const relevantFields = resolveRelevantMappings(resolvers, resolverPath, mapping);
112119

113120
relevantFields.forEach((path: string) => {
114121
mappingResult[path] = asArray(composeFns);
115122
});
116-
} else {
117-
Object.keys(mapping[resolverPath]).forEach(fieldName => {
123+
} else if (resolverPathMapping) {
124+
Object.keys(resolverPathMapping).forEach(fieldName => {
118125
const composeFns = mapping[resolverPath][fieldName];
119126
const relevantFields = resolveRelevantMappings(resolvers, resolverPath + '.' + fieldName, mapping);
120127

packages/resolvers-composition/tests/resolvers-composition.spec.ts

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import gql from 'graphql-tag';
22
import { composeResolvers, ResolversComposerMapping } from '../src';
33
import { makeExecutableSchema } from '@graphql-tools/schema';
44
import { execute, GraphQLScalarType, Kind } from 'graphql';
5+
import { IResolvers } from 'packages/graphql-tools/src';
56

67
function createAsyncIterator<T>(array: T[]): AsyncIterator<T, T, T> {
78
let i = 0;
@@ -292,40 +293,20 @@ describe('Resolvers composition', () => {
292293

293294
it('should handle nullish properties correctly', async () => {
294295
const getFoo = () => 'FOO';
295-
const typeDefs = gql`
296-
type Query {
297-
foo: String
298-
bar: String
299-
}
300-
`;
301-
const resolvers = {
296+
const resolvers: IResolvers = {
302297
Query: {
303-
foo: async () => getFoo()
298+
foo: async () => getFoo(),
299+
bar: undefined,
304300
},
301+
Mutation: undefined
305302
};
306303
const resolversComposition: ResolversComposerMapping = {
307304
'Query.foo': (next: (arg0: any, arg1: any, arg2: any, arg3: any) => void) => async (root: any, args: any, context: any, info: any) => {
308305
const prevResult = await next(root, args, context, info);
309306
return getFoo() + prevResult;
310307
},
311-
'Query.bar': null,
308+
'Query.bar': undefined
312309
};
313-
const composedResolvers = composeResolvers(resolvers, resolversComposition);
314-
const schema = makeExecutableSchema({
315-
typeDefs,
316-
resolvers: composedResolvers,
317-
});
318-
319-
const result = await execute({
320-
schema,
321-
322-
document: gql`
323-
query {
324-
foo
325-
}
326-
`,
327-
});
328-
expect(result.errors).toBeFalsy();
329-
expect(result.data.foo).toBe('FOOFOO');
310+
expect(() => composeResolvers(resolvers, resolversComposition)).not.toThrow();
330311
})
331312
});

0 commit comments

Comments
 (0)