diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a1f912c..ffbcf3c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Register `aliasFieldResolver` during schema generation instead of passing it to the GraphQL server + ### Fixed - Fixed a server crash that occourred if an entity property is named `localized`. diff --git a/lib/index.js b/lib/index.js index fa30e2de..ae0e511d 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,11 +1,10 @@ const { graphqlHTTP } = require('express-graphql') const { generateSchema4 } = require('./schema') -const { fieldResolver } = require('./resolvers') function GraphQLAdapter(services, options) { const schema = generateSchema4(services) - return graphqlHTTP({ fieldResolver, schema, ...options }) + return graphqlHTTP({ schema, ...options }) } module.exports = GraphQLAdapter diff --git a/lib/resolvers/field.js b/lib/resolvers/field.js index 31f113a8..67131f31 100644 --- a/lib/resolvers/field.js +++ b/lib/resolvers/field.js @@ -1,5 +1,19 @@ +const { isObjectType, isIntrospectionType } = require('graphql') + // The GraphQL.js defaultFieldResolver does not support returning aliased values that resolve to fields with aliases -module.exports = (source, args, context, info) => { +function aliasFieldResolver(source, args, contextValue, info) { const responseKey = info.fieldNodes[0].alias ? info.fieldNodes[0].alias.value : info.fieldName return source[responseKey] } + +const registerAliasFieldResolvers = schema => { + for (const type of Object.values(schema.getTypeMap())) { + if (!isObjectType(type) || isIntrospectionType(type)) continue + + for (const field of Object.values(type.getFields())) { + if (!field.resolve) field.resolve = aliasFieldResolver + } + } +} + +module.exports = registerAliasFieldResolvers diff --git a/lib/resolvers/index.js b/lib/resolvers/index.js index 72f7a1f6..d3abda11 100644 --- a/lib/resolvers/index.js +++ b/lib/resolvers/index.js @@ -1,7 +1,7 @@ -const fieldResolver = require('./field') +const registerAliasFieldResolvers = require('./field') const createRootResolvers = require('./root') module.exports = { - fieldResolver, + registerAliasFieldResolvers, createRootResolvers } diff --git a/lib/schema/index.js b/lib/schema/index.js index d87f9748..a96e4701 100644 --- a/lib/schema/index.js +++ b/lib/schema/index.js @@ -1,7 +1,7 @@ const queryGenerator = require('./query') const mutationGenerator = require('./mutation') const { GraphQLSchema, printSchema } = require('graphql') -const { createRootResolvers } = require('../resolvers') +const { createRootResolvers, registerAliasFieldResolvers } = require('../resolvers') class SchemaGenerator { generate(services) { @@ -10,6 +10,7 @@ class SchemaGenerator { const query = queryGenerator(cache).generateQueryObjectType(services, resolvers.Query) const mutation = mutationGenerator(cache).generateMutationObjectType(services, resolvers.Mutation) this._schema = new GraphQLSchema({ query, mutation }) + registerAliasFieldResolvers(this._schema) return this }