Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
3 changes: 1 addition & 2 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -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
16 changes: 15 additions & 1 deletion lib/resolvers/field.js
Original file line number Diff line number Diff line change
@@ -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
4 changes: 2 additions & 2 deletions lib/resolvers/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const fieldResolver = require('./field')
const registerAliasFieldResolvers = require('./field')
const createRootResolvers = require('./root')

module.exports = {
fieldResolver,
registerAliasFieldResolvers,
createRootResolvers
}
3 changes: 2 additions & 1 deletion lib/schema/index.js
Original file line number Diff line number Diff line change
@@ -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) {
Expand All @@ -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
}

Expand Down