11import { camelCase } from 'lodash'
22import { CreateResolversArgs } from 'gatsby'
33import { GraphQLFieldResolver } from 'gatsby/graphql'
4- import { GatsbyResolverMap , GatsbyGraphQLContext } from '../types/gatsby'
4+ import { GatsbyResolverMap , GatsbyGraphQLContext , GatsbyNodeModel } from '../types/gatsby'
55import { TypeMap , FieldDef } from './remoteGraphQLSchema'
66import { resolveReferences } from './resolveReferences'
77import { PluginConfig } from './validateConfig'
8+ import { getConflictFreeFieldName , getTypeName } from './normalize'
9+ import { SanityRef } from '../types/sanity'
810
911export function getGraphQLResolverMap (
1012 typeMap : TypeMap ,
@@ -16,6 +18,19 @@ export function getGraphQLResolverMap(
1618 const objectType = typeMap . objects [ typeName ]
1719 const fieldNames = Object . keys ( objectType . fields )
1820
21+ // Add resolvers for lists
22+ resolvers [ objectType . name ] = fieldNames
23+ . map ( ( fieldName ) => ( { fieldName, ...objectType . fields [ fieldName ] } ) )
24+ . filter ( ( field ) => field . isList )
25+ . reduce ( ( fields , field ) => {
26+ const targetField = objectType . isDocument
27+ ? getConflictFreeFieldName ( field . fieldName , pluginConfig . typePrefix )
28+ : field . fieldName
29+
30+ fields [ targetField ] = { resolve : getResolver ( field , pluginConfig . typePrefix ) }
31+ return fields
32+ } , resolvers [ objectType . name ] || { } )
33+
1934 // Add raw resolvers
2035 resolvers [ objectType . name ] = fieldNames
2136 . map ( ( fieldName ) => ( { fieldName, ...objectType . fields [ fieldName ] } ) )
@@ -29,6 +44,39 @@ export function getGraphQLResolverMap(
2944 return resolvers
3045}
3146
47+ function getResolver (
48+ field : FieldDef & { fieldName : string } ,
49+ typePrefix ?: string ,
50+ ) : GraphQLFieldResolver < { [ key : string ] : any } , GatsbyGraphQLContext > {
51+ return ( source , args , context ) => {
52+ if ( field . isList ) {
53+ const items : SanityRef [ ] = source [ field . fieldName ] || [ ]
54+ return items && Array . isArray ( items )
55+ ? items . map ( ( item ) => maybeResolveReference ( item , context . nodeModel , typePrefix ) )
56+ : [ ]
57+ }
58+
59+ const item : SanityRef | undefined = source [ field . fieldName ]
60+ return maybeResolveReference ( item , context . nodeModel , typePrefix )
61+ }
62+ }
63+
64+ function maybeResolveReference (
65+ item : { _ref ?: string ; _type ?: string ; internal ?: { } } | undefined ,
66+ nodeModel : GatsbyNodeModel ,
67+ typePrefix ?: string ,
68+ ) {
69+ if ( item && typeof item . _ref === 'string' ) {
70+ return nodeModel . getNodeById ( { id : item . _ref } )
71+ }
72+
73+ if ( item && typeof item . _type === 'string' && ! item . internal ) {
74+ return { ...item , internal : { type : getTypeName ( item . _type , typePrefix ) } }
75+ }
76+
77+ return item
78+ }
79+
3280function getRawResolver (
3381 field : FieldDef & { fieldName : string } ,
3482 pluginConfig : PluginConfig ,
0 commit comments