From e9eac82fc16723a1549e15bdaf370063572052a6 Mon Sep 17 00:00:00 2001 From: Ryan Quinn Date: Fri, 7 Jul 2023 12:18:04 -0400 Subject: [PATCH] Remove uses of reduce/spread which causes significant latency to large middlewares (#567) --- src/applicator.ts | 53 +++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/src/applicator.ts b/src/applicator.ts index 61512f27..eb3679e7 100644 --- a/src/applicator.ts +++ b/src/applicator.ts @@ -45,11 +45,10 @@ function parseField( ) { const { isDeprecated, ...restData } = field const argsMap = field.args.reduce( - (acc, cur) => ({ - ...acc, - [cur.name]: cur, - }), - {} as Record, + (acc, cur) => { + acc[cur.name] = cur; + return acc; + }, {} as Record, ) return { ...restData, @@ -138,28 +137,28 @@ function applyMiddlewareToType( if (isMiddlewareFunction(middleware)) { const resolvers = Object.keys(fieldMap).reduce( - (resolvers, fieldName) => ({ - ...resolvers, - [fieldName]: applyMiddlewareToField( + (resolvers, fieldName) => { + resolvers[fieldName] = applyMiddlewareToField( fieldMap[fieldName], options, middleware as IMiddlewareFunction, - ), - }), + ); + return resolvers; + }, {}, ) return resolvers } else { const resolvers = Object.keys(middleware).reduce( - (resolvers, field) => ({ - ...resolvers, - [field]: applyMiddlewareToField( - fieldMap[field], + (resolvers, fieldName) => { + resolvers[fieldName] = applyMiddlewareToField( + fieldMap[fieldName], options, - middleware[field], - ), - }), + middleware[fieldName], + ); + return resolvers; + }, {}, ) @@ -181,14 +180,14 @@ function applyMiddlewareToSchema( !isIntrospectionType(typeMap[type]), ) .reduce( - (resolvers, type) => ({ - ...resolvers, - [type]: applyMiddlewareToType( + (resolvers, type) => { + resolvers[type] = applyMiddlewareToType( typeMap[type] as GraphQLObjectType, options, middleware, - ), - }), + ); + return resolvers; + }, {}, ) @@ -216,14 +215,14 @@ export function generateResolverFromSchemaAndMiddleware< const typeMap = schema.getTypeMap() const resolvers = Object.keys(middleware).reduce( - (resolvers, type) => ({ - ...resolvers, - [type]: applyMiddlewareToType( + (resolvers, type) => { + resolvers[type] = applyMiddlewareToType( typeMap[type] as GraphQLObjectType, options, middleware[type], - ), - }), + ); + return resolvers; + }, {}, )