From ae1b596e9b5dba2a448b53e38b3e70916a7fde95 Mon Sep 17 00:00:00 2001 From: zazido Date: Tue, 1 Jan 2019 21:24:54 +0800 Subject: [PATCH] perf(core): do not deeply resolve an input type more than once (#373) Relates to #310 --- packages/graphqlgen/src/generators/common.spec.ts | 1 - packages/graphqlgen/src/generators/common.ts | 15 ++++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/graphqlgen/src/generators/common.spec.ts b/packages/graphqlgen/src/generators/common.spec.ts index 27b3c2bd..50c76520 100644 --- a/packages/graphqlgen/src/generators/common.spec.ts +++ b/packages/graphqlgen/src/generators/common.spec.ts @@ -141,7 +141,6 @@ Array [ "B", "D", "C", - "D", ] `) }) diff --git a/packages/graphqlgen/src/generators/common.ts b/packages/graphqlgen/src/generators/common.ts index 7f11148e..ff81c94d 100644 --- a/packages/graphqlgen/src/generators/common.ts +++ b/packages/graphqlgen/src/generators/common.ts @@ -239,9 +239,18 @@ export function deepResolveInputTypes( const childTypes = type.fields .filter(t => t.type.isInput && !seen[t.type.name]) .map(t => t.type.name) - .map(name => - deepResolveInputTypes(inputTypesMap, name, { ...seen, [name]: true }), - ) + .map(name => { + /** + * Mutate so that we track state across tree branches. + * + * Example, only visit "C" once: + * A + * ├── B ── C + * └── D ── C + */ + seen[name] = true + return deepResolveInputTypes(inputTypesMap, name, seen) + }) .reduce(concat, []) return [typeName, ...childTypes] } else {