1- /* Copy pasted (without typescript) from https://raw.githubusercontent.com/ardatan/graphql-toolkit/master/src/epoxy/resolvers-mergers/merge-resolvers.ts, the package doesn't work with webpack (missing fs) */
1+ /* Simplified version of https://raw.githubusercontent.com/ardatan/graphql-toolkit/master/src/epoxy/resolvers-mergers/merge-resolvers.ts, the package doesn't work with webpack (missing fs) */
22
33import * as deepMerge from "deepmerge" ;
44import { GraphQLScalarType } from "graphql" ;
@@ -23,42 +23,35 @@ const isMergeableObject = target => {
2323 return true ;
2424} ;
2525
26- function mergeResolvers ( resolversDefinitions , options ) {
26+ // IMPORTANT: When converting object to function, always return a copy of the resolver instead of the resolver:
27+ // mergeObjects mutates the resolver which would result in strange behaviours
28+
29+ // (addMockFunctionsToSchema -> mergeMocks -> mergeObjects)
30+ function convertObjectTypesToFunctions ( resolvers ) {
31+ return Object . keys ( resolvers ) . reduce ( ( acc , key ) => {
32+ if ( typeof resolvers [ key ] === "function" ) {
33+ acc [ key ] = resolvers [ key ] ;
34+ return acc ;
35+ } else if ( typeof resolvers [ key ] === "object" ) {
36+ acc [ key ] = ( ) => ( { ...resolvers [ key ] } ) ; // See top function comment
37+ return acc ;
38+ } else {
39+ throw new Error ( "Mock entry must be object or function" ) ;
40+ }
41+ } , { } ) ;
42+ }
43+
44+ // TODO PR Explain the magic
45+ function mergeResolvers ( resolversDefinitions ) {
2746 if ( ! resolversDefinitions || resolversDefinitions . length === 0 ) {
2847 return { } ;
2948 }
3049 if ( resolversDefinitions . length === 1 ) {
3150 return resolversDefinitions [ 0 ] ;
3251 }
33- const resolversFactories = [ ] ;
34- const resolvers = [ ] ;
35- for ( const resolversDefinition of resolversDefinitions ) {
36- if ( typeof resolversDefinition === "function" ) {
37- resolversFactories . push ( resolversDefinition ) ;
38- } else if ( typeof resolversDefinition === "object" ) {
39- resolvers . push ( resolversDefinition ) ;
40- }
41- }
42- let result = { } ;
43- if ( resolversFactories . length ) {
44- result = ( ...args ) => {
45- const resultsOfFactories = resolversFactories . map ( factory => factory ( ...args ) ) ;
46- return deepMerge . all ( [ ...resolvers , ...resultsOfFactories ] , { isMergeableObject } ) ;
47- } ;
48- } else {
49- result = deepMerge . all ( resolvers , { isMergeableObject } ) ;
50- }
51- if ( options && options . exclusions ) {
52- for ( const exclusion of options . exclusions ) {
53- const [ typeName , fieldName ] = exclusion . split ( "." ) ;
54- if ( ! fieldName || fieldName === "*" ) {
55- delete result [ typeName ] ;
56- } else if ( result [ typeName ] ) {
57- delete result [ typeName ] [ fieldName ] ;
58- }
59- }
60- }
61- return result ;
52+ const resolvers = deepMerge . all ( resolversDefinitions , { isMergeableObject } ) ;
53+
54+ return convertObjectTypesToFunctions ( resolvers ) ;
6255}
6356
6457export default mergeResolvers ;
0 commit comments