Skip to content

Commit e587dce

Browse files
authored
fix: use resolver for lists (#248)
1 parent e572add commit e587dce

File tree

1 file changed

+49
-1
lines changed

1 file changed

+49
-1
lines changed

src/util/getGraphQLResolverMap.ts

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import {camelCase} from 'lodash'
22
import {CreateResolversArgs} from 'gatsby'
33
import {GraphQLFieldResolver} from 'gatsby/graphql'
4-
import {GatsbyResolverMap, GatsbyGraphQLContext} from '../types/gatsby'
4+
import {GatsbyResolverMap, GatsbyGraphQLContext, GatsbyNodeModel} from '../types/gatsby'
55
import {TypeMap, FieldDef} from './remoteGraphQLSchema'
66
import {resolveReferences} from './resolveReferences'
77
import {PluginConfig} from './validateConfig'
8+
import {getConflictFreeFieldName, getTypeName} from './normalize'
9+
import {SanityRef} from '../types/sanity'
810

911
export 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+
3280
function getRawResolver(
3381
field: FieldDef & {fieldName: string},
3482
pluginConfig: PluginConfig,

0 commit comments

Comments
 (0)