From 9d8e7e221111f1c32f7ed6fe4f09612c0f9fa5c8 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Wed, 1 Apr 2020 16:39:08 +0200 Subject: [PATCH] Fix circular dependencies (#1326) --- src/delegate/checkResultAndHandleErrors.ts | 245 +-------------------- src/delegate/delegateToSchema.ts | 18 +- src/delegate/results/handleList.ts | 85 +++++++ src/delegate/results/handleNull.ts | 49 +++++ src/delegate/results/handleObject.ts | 128 +++++++++++ src/polyfills/extendSchema.ts | 2 +- src/stitch/defaultMergedResolver.ts | 3 +- src/stitch/errors.ts | 27 +++ src/stitch/mergeInfo.ts | 3 +- src/stitch/mergeSchemas.ts | 2 +- src/stitch/proxiedResult.ts | 69 +----- src/stitch/subSchema.ts | 22 ++ src/stitch/symbols.ts | 14 ++ src/test/errors.test.ts | 4 +- src/utils/clone.ts | 3 +- src/utils/filterSchema.ts | 2 +- src/utils/getResolversFromSchema.ts | 2 +- src/utils/map.ts | 5 +- src/wrap/resolvers.ts | 3 +- src/wrap/wrapSchema.ts | 4 +- 20 files changed, 367 insertions(+), 323 deletions(-) create mode 100644 src/delegate/results/handleList.ts create mode 100644 src/delegate/results/handleNull.ts create mode 100644 src/delegate/results/handleObject.ts create mode 100644 src/stitch/subSchema.ts create mode 100644 src/stitch/symbols.ts diff --git a/src/delegate/checkResultAndHandleErrors.ts b/src/delegate/checkResultAndHandleErrors.ts index 99c2e9e06b7..b812182ccaa 100644 --- a/src/delegate/checkResultAndHandleErrors.ts +++ b/src/delegate/checkResultAndHandleErrors.ts @@ -6,34 +6,17 @@ import { isLeafType, isListType, ExecutionResult, - GraphQLCompositeType, GraphQLError, - GraphQLList, GraphQLOutputType, - GraphQLType, GraphQLSchema, - FieldNode, - isAbstractType, - GraphQLObjectType, } from 'graphql'; -import { collectFields, ExecutionContext } from 'graphql/execution/execute'; -import { - SubschemaConfig, - IGraphQLToolsResolveInfo, - isSubschemaConfig, - MergedTypeInfo, -} from '../Interfaces'; - -import { - relocatedError, - combineErrors, - getErrorsByPathSegment, -} from '../stitch/errors'; +import { SubschemaConfig, IGraphQLToolsResolveInfo } from '../Interfaces'; import { getResponseKeyFromInfo } from '../stitch/getResponseKeyFromInfo'; -import resolveFromParentTypename from '../stitch/resolveFromParentTypename'; -import { setErrors, setObjectSubschema } from '../stitch/proxiedResult'; -import { mergeFields } from '../stitch/mergeFields'; + +import { handleNull } from './results/handleNull'; +import { handleObject } from './results/handleObject'; +import { handleList } from './results/handleList'; export function checkResultAndHandleErrors( result: ExecutionResult, @@ -97,221 +80,3 @@ export function handleResult( ); } } - -function handleList( - type: GraphQLList, - list: Array, - errors: ReadonlyArray, - subschema: GraphQLSchema | SubschemaConfig, - context: Record, - info: IGraphQLToolsResolveInfo, - skipTypeMerging?: boolean, -) { - const childErrors = getErrorsByPathSegment(errors); - - return list.map((listMember, index) => - handleListMember( - getNullableType(type.ofType), - listMember, - index, - childErrors[index] != null ? childErrors[index] : [], - subschema, - context, - info, - skipTypeMerging, - ), - ); -} - -function handleListMember( - type: GraphQLType, - listMember: any, - index: number, - errors: ReadonlyArray, - subschema: GraphQLSchema | SubschemaConfig, - context: Record, - info: IGraphQLToolsResolveInfo, - skipTypeMerging?: boolean, -): any { - if (listMember == null) { - return handleNull( - info.fieldNodes, - [...responsePathAsArray(info.path), index], - errors, - ); - } - - if (isLeafType(type)) { - return type.parseValue(listMember); - } else if (isCompositeType(type)) { - return handleObject( - type, - listMember, - errors, - subschema, - context, - info, - skipTypeMerging, - ); - } else if (isListType(type)) { - return handleList( - type, - listMember, - errors, - subschema, - context, - info, - skipTypeMerging, - ); - } -} - -export function handleObject( - type: GraphQLCompositeType, - object: any, - errors: ReadonlyArray, - subschema: GraphQLSchema | SubschemaConfig, - context: Record, - info: IGraphQLToolsResolveInfo, - skipTypeMerging?: boolean, -) { - setErrors( - object, - errors.map((error) => - relocatedError( - error, - error.nodes, - error.path != null ? error.path.slice(1) : undefined, - ), - ), - ); - - setObjectSubschema(object, subschema); - - if (skipTypeMerging || !info.mergeInfo) { - return object; - } - - const typeName = isAbstractType(type) - ? info.schema.getTypeMap()[resolveFromParentTypename(object)].name - : type.name; - const mergedTypeInfo = info.mergeInfo.mergedTypes[typeName]; - let targetSubschemas: Array; - - if (mergedTypeInfo != null) { - targetSubschemas = mergedTypeInfo.subschemas; - } - - if (!targetSubschemas) { - return object; - } - - targetSubschemas = targetSubschemas.filter((s) => s !== subschema); - if (!targetSubschemas.length) { - return object; - } - - const subFields = collectSubFields(info, object.__typename); - - const selections = getFieldsNotInSubschema( - subFields, - subschema, - mergedTypeInfo, - object.__typename, - ); - - return mergeFields( - mergedTypeInfo, - typeName, - object, - selections, - [subschema as SubschemaConfig], - targetSubschemas, - context, - info, - ); -} - -function collectSubFields(info: IGraphQLToolsResolveInfo, typeName: string) { - let subFieldNodes: Record> = Object.create(null); - const visitedFragmentNames = Object.create(null); - info.fieldNodes.forEach((fieldNode) => { - subFieldNodes = collectFields( - ({ - schema: info.schema, - variableValues: info.variableValues, - fragments: info.fragments, - } as unknown) as ExecutionContext, - info.schema.getType(typeName) as GraphQLObjectType, - fieldNode.selectionSet, - subFieldNodes, - visitedFragmentNames, - ); - }); - return subFieldNodes; -} - -function getFieldsNotInSubschema( - subFieldNodes: Record>, - subschema: GraphQLSchema | SubschemaConfig, - mergedTypeInfo: MergedTypeInfo, - typeName: string, -): Array { - const typeMap = isSubschemaConfig(subschema) - ? mergedTypeInfo.typeMaps.get(subschema) - : subschema.getTypeMap(); - const fields = (typeMap[typeName] as GraphQLObjectType).getFields(); - - const fieldsNotInSchema: Array = []; - Object.keys(subFieldNodes).forEach((responseName) => { - subFieldNodes[responseName].forEach((subFieldNode) => { - if (!fields[subFieldNode.name.value]) { - fieldsNotInSchema.push(subFieldNode); - } - }); - }); - - return fieldsNotInSchema; -} - -export function handleNull( - fieldNodes: ReadonlyArray, - path: Array, - errors: ReadonlyArray, -) { - if (errors.length) { - if (errors.some((error) => !error.path || error.path.length < 2)) { - return relocatedError(combineErrors(errors), fieldNodes, path); - } else if (errors.some((error) => typeof error.path[1] === 'string')) { - const childErrors = getErrorsByPathSegment(errors); - - const result = Object.create(null); - Object.keys(childErrors).forEach((pathSegment) => { - result[pathSegment] = handleNull( - fieldNodes, - [...path, pathSegment], - childErrors[pathSegment], - ); - }); - - return result; - } - - const childErrors = getErrorsByPathSegment(errors); - - const result: Array = []; - Object.keys(childErrors).forEach((pathSegment) => { - result.push( - handleNull( - fieldNodes, - [...path, parseInt(pathSegment, 10)], - childErrors[pathSegment], - ), - ); - }); - - return result; - } - - return null; -} diff --git a/src/delegate/delegateToSchema.ts b/src/delegate/delegateToSchema.ts index 0fd2387483d..9fc53a1aeb0 100644 --- a/src/delegate/delegateToSchema.ts +++ b/src/delegate/delegateToSchema.ts @@ -20,18 +20,18 @@ import { IGraphQLToolsResolveInfo, Transform, } from '../Interfaces'; +import ExpandAbstractTypes from '../wrap/transforms/ExpandAbstractTypes'; +import FilterToSchema from '../wrap/transforms/FilterToSchema'; +import AddReplacementSelectionSets from '../wrap/transforms/AddReplacementSelectionSets'; +import AddReplacementFragments from '../wrap/transforms/AddReplacementFragments'; +import AddMergedTypeSelectionSets from '../wrap/transforms/AddMergedTypeSelectionSets'; +import AddTypenameToAbstract from '../wrap/transforms/AddTypenameToAbstract'; +import CheckResultAndHandleErrors from '../wrap/transforms/CheckResultAndHandleErrors'; +import AddArgumentsAsVariables from '../wrap/transforms/AddArgumentsAsVariables'; import { - ExpandAbstractTypes, - FilterToSchema, - AddReplacementSelectionSets, - AddReplacementFragments, - AddMergedTypeSelectionSets, - AddTypenameToAbstract, - CheckResultAndHandleErrors, applyRequestTransforms, applyResultTransforms, - AddArgumentsAsVariables, -} from '../wrap/index'; +} from '../wrap/transforms'; import linkToFetcher from '../stitch/linkToFetcher'; import { observableToAsyncIterable } from '../stitch/observableToAsyncIterable'; diff --git a/src/delegate/results/handleList.ts b/src/delegate/results/handleList.ts new file mode 100644 index 00000000000..55240d074d8 --- /dev/null +++ b/src/delegate/results/handleList.ts @@ -0,0 +1,85 @@ +import { + GraphQLList, + GraphQLSchema, + GraphQLError, + getNullableType, + GraphQLType, + responsePathAsArray, + isLeafType, + isCompositeType, + isListType, +} from 'graphql'; + +import { SubschemaConfig, IGraphQLToolsResolveInfo } from '../../Interfaces'; +import { getErrorsByPathSegment } from '../../stitch/errors'; + +import { handleNull } from './handleNull'; +import { handleObject } from './handleObject'; + +export function handleList( + type: GraphQLList, + list: Array, + errors: ReadonlyArray, + subschema: GraphQLSchema | SubschemaConfig, + context: Record, + info: IGraphQLToolsResolveInfo, + skipTypeMerging?: boolean, +) { + const childErrors = getErrorsByPathSegment(errors); + + return list.map((listMember, index) => + handleListMember( + getNullableType(type.ofType), + listMember, + index, + childErrors[index] != null ? childErrors[index] : [], + subschema, + context, + info, + skipTypeMerging, + ), + ); +} + +function handleListMember( + type: GraphQLType, + listMember: any, + index: number, + errors: ReadonlyArray, + subschema: GraphQLSchema | SubschemaConfig, + context: Record, + info: IGraphQLToolsResolveInfo, + skipTypeMerging?: boolean, +): any { + if (listMember == null) { + return handleNull( + info.fieldNodes, + [...responsePathAsArray(info.path), index], + errors, + ); + } + + if (isLeafType(type)) { + return type.parseValue(listMember); + } else if (isCompositeType(type)) { + return handleObject( + type, + listMember, + errors, + subschema, + context, + info, + skipTypeMerging, + ); + } else if (isListType(type)) { + return handleList( + type, + listMember, + errors, + subschema, + context, + info, + skipTypeMerging, + ); + } +} diff --git a/src/delegate/results/handleNull.ts b/src/delegate/results/handleNull.ts new file mode 100644 index 00000000000..c83cb92245f --- /dev/null +++ b/src/delegate/results/handleNull.ts @@ -0,0 +1,49 @@ +import { FieldNode, GraphQLError } from 'graphql'; + +import { + getErrorsByPathSegment, + combineErrors, + relocatedError, +} from '../../stitch/errors'; + +export function handleNull( + fieldNodes: ReadonlyArray, + path: Array, + errors: ReadonlyArray, +) { + if (errors.length) { + if (errors.some((error) => !error.path || error.path.length < 2)) { + return relocatedError(combineErrors(errors), fieldNodes, path); + } else if (errors.some((error) => typeof error.path[1] === 'string')) { + const childErrors = getErrorsByPathSegment(errors); + + const result = Object.create(null); + Object.keys(childErrors).forEach((pathSegment) => { + result[pathSegment] = handleNull( + fieldNodes, + [...path, pathSegment], + childErrors[pathSegment], + ); + }); + + return result; + } + + const childErrors = getErrorsByPathSegment(errors); + + const result: Array = []; + Object.keys(childErrors).forEach((pathSegment) => { + result.push( + handleNull( + fieldNodes, + [...path, parseInt(pathSegment, 10)], + childErrors[pathSegment], + ), + ); + }); + + return result; + } + + return null; +} diff --git a/src/delegate/results/handleObject.ts b/src/delegate/results/handleObject.ts new file mode 100644 index 00000000000..d1fa0d97323 --- /dev/null +++ b/src/delegate/results/handleObject.ts @@ -0,0 +1,128 @@ +import { + GraphQLCompositeType, + GraphQLError, + GraphQLSchema, + isAbstractType, + FieldNode, + GraphQLObjectType, +} from 'graphql'; +import { collectFields, ExecutionContext } from 'graphql/execution/execute'; + +import { + SubschemaConfig, + IGraphQLToolsResolveInfo, + MergedTypeInfo, + isSubschemaConfig, +} from '../../Interfaces'; +import { setErrors, relocatedError } from '../../stitch/errors'; +import { setObjectSubschema } from '../../stitch/subSchema'; +import resolveFromParentTypename from '../../stitch/resolveFromParentTypename'; +import { mergeFields } from '../../stitch/mergeFields'; + +export function handleObject( + type: GraphQLCompositeType, + object: any, + errors: ReadonlyArray, + subschema: GraphQLSchema | SubschemaConfig, + context: Record, + info: IGraphQLToolsResolveInfo, + skipTypeMerging?: boolean, +) { + setErrors( + object, + errors.map((error) => + relocatedError( + error, + error.nodes, + error.path != null ? error.path.slice(1) : undefined, + ), + ), + ); + + setObjectSubschema(object, subschema); + + if (skipTypeMerging || !info.mergeInfo) { + return object; + } + + const typeName = isAbstractType(type) + ? info.schema.getTypeMap()[resolveFromParentTypename(object)].name + : type.name; + const mergedTypeInfo = info.mergeInfo.mergedTypes[typeName]; + let targetSubschemas: Array; + + if (mergedTypeInfo != null) { + targetSubschemas = mergedTypeInfo.subschemas; + } + + if (!targetSubschemas) { + return object; + } + + targetSubschemas = targetSubschemas.filter((s) => s !== subschema); + if (!targetSubschemas.length) { + return object; + } + + const subFields = collectSubFields(info, object.__typename); + + const selections = getFieldsNotInSubschema( + subFields, + subschema, + mergedTypeInfo, + object.__typename, + ); + + return mergeFields( + mergedTypeInfo, + typeName, + object, + selections, + [subschema as SubschemaConfig], + targetSubschemas, + context, + info, + ); +} + +function collectSubFields(info: IGraphQLToolsResolveInfo, typeName: string) { + let subFieldNodes: Record> = Object.create(null); + const visitedFragmentNames = Object.create(null); + info.fieldNodes.forEach((fieldNode) => { + subFieldNodes = collectFields( + ({ + schema: info.schema, + variableValues: info.variableValues, + fragments: info.fragments, + } as unknown) as ExecutionContext, + info.schema.getType(typeName) as GraphQLObjectType, + fieldNode.selectionSet, + subFieldNodes, + visitedFragmentNames, + ); + }); + return subFieldNodes; +} + +function getFieldsNotInSubschema( + subFieldNodes: Record>, + subschema: GraphQLSchema | SubschemaConfig, + mergedTypeInfo: MergedTypeInfo, + typeName: string, +): Array { + const typeMap = isSubschemaConfig(subschema) + ? mergedTypeInfo.typeMaps.get(subschema) + : subschema.getTypeMap(); + const fields = (typeMap[typeName] as GraphQLObjectType).getFields(); + + const fieldsNotInSchema: Array = []; + Object.keys(subFieldNodes).forEach((responseName) => { + subFieldNodes[responseName].forEach((subFieldNode) => { + if (!fields[subFieldNode.name.value]) { + fieldsNotInSchema.push(subFieldNode); + } + }); + }); + + return fieldsNotInSchema; +} diff --git a/src/polyfills/extendSchema.ts b/src/polyfills/extendSchema.ts index 89a67aae6cc..a626b5b817c 100644 --- a/src/polyfills/extendSchema.ts +++ b/src/polyfills/extendSchema.ts @@ -4,7 +4,7 @@ import { extendSchema as graphqlExtendSchema, } from 'graphql'; -import { getResolversFromSchema } from '../utils/index'; +import { getResolversFromSchema } from '../utils/getResolversFromSchema'; import { IResolverOptions } from '../Interfaces'; // polyfill for graphql < v14.2 which does not support subscriptions diff --git a/src/stitch/defaultMergedResolver.ts b/src/stitch/defaultMergedResolver.ts index 5a55cd40491..4cb64c237cc 100644 --- a/src/stitch/defaultMergedResolver.ts +++ b/src/stitch/defaultMergedResolver.ts @@ -3,8 +3,9 @@ import { defaultFieldResolver } from 'graphql'; import { IGraphQLToolsResolveInfo } from '../Interfaces'; import { handleResult } from '../delegate/checkResultAndHandleErrors'; -import { getErrors, getSubschema } from './proxiedResult'; +import { getSubschema } from './subSchema'; import { getResponseKeyFromInfo } from './getResponseKeyFromInfo'; +import { getErrors } from './errors'; /** * Resolver that knows how to: diff --git a/src/stitch/errors.ts b/src/stitch/errors.ts index 3076d7b0487..52aeb1a10a7 100644 --- a/src/stitch/errors.ts +++ b/src/stitch/errors.ts @@ -1,5 +1,7 @@ import { GraphQLError, ASTNode } from 'graphql'; +import { ERROR_SYMBOL } from './symbols'; + export function relocatedError( originalError: Error | GraphQLError, nodes: ReadonlyArray, @@ -95,3 +97,28 @@ export function combineErrors( errors, ); } + +export function setErrors(result: any, errors: Array) { + result[ERROR_SYMBOL] = errors; +} + +export function getErrors( + result: any, + pathSegment: string, +): Array { + const errors = result != null ? result[ERROR_SYMBOL] : result; + + if (!Array.isArray(errors)) { + return null; + } + + const fieldErrors = []; + + for (const error of errors) { + if (!error.path || error.path[0] === pathSegment) { + fieldErrors.push(error); + } + } + + return fieldErrors; +} diff --git a/src/stitch/mergeInfo.ts b/src/stitch/mergeInfo.ts index dd83913ecab..2a8a6de949d 100644 --- a/src/stitch/mergeInfo.ts +++ b/src/stitch/mergeInfo.ts @@ -20,7 +20,8 @@ import { MergedTypeInfo, Transform, } from '../Interfaces'; -import { ExpandAbstractTypes, AddReplacementFragments } from '../wrap/index'; +import ExpandAbstractTypes from '../wrap/transforms/ExpandAbstractTypes'; +import AddReplacementFragments from '../wrap/transforms/AddReplacementFragments'; import { parseFragmentToInlineFragment, concatInlineFragments, diff --git a/src/stitch/mergeSchemas.ts b/src/stitch/mergeSchemas.ts index b8c6bd39457..bf53f1bfcf3 100644 --- a/src/stitch/mergeSchemas.ts +++ b/src/stitch/mergeSchemas.ts @@ -33,7 +33,7 @@ import { extractExtensionDefinitions, addResolversToSchema, } from '../generate/index'; -import { wrapSchema } from '../wrap/index'; +import { wrapSchema } from '../wrap/wrapSchema'; import { SchemaDirectiveVisitor, cloneDirective, diff --git a/src/stitch/proxiedResult.ts b/src/stitch/proxiedResult.ts index a1972731a41..f319e75521a 100644 --- a/src/stitch/proxiedResult.ts +++ b/src/stitch/proxiedResult.ts @@ -1,72 +1,21 @@ -import { GraphQLError, GraphQLSchema, responsePathAsArray } from 'graphql'; +import { GraphQLError, responsePathAsArray } from 'graphql'; import { SubschemaConfig, IGraphQLToolsResolveInfo } from '../Interfaces'; import { mergeDeep } from '../utils/index'; -import { handleNull } from '../delegate/checkResultAndHandleErrors'; +import { handleNull } from '../delegate/results/handleNull'; -import { relocatedError } from './errors'; - -const hasSymbol = - (typeof global !== 'undefined' && 'Symbol' in global) || - // eslint-disable-next-line no-undef - (typeof window !== 'undefined' && 'Symbol' in window); - -export const OBJECT_SUBSCHEMA_SYMBOL = hasSymbol - ? Symbol('initialSubschema') - : '@@__initialSubschema'; -export const FIELD_SUBSCHEMA_MAP_SYMBOL = hasSymbol - ? Symbol('subschemaMap') - : '@@__subschemaMap'; -export const ERROR_SYMBOL = hasSymbol - ? Symbol('subschemaErrors') - : '@@__subschemaErrors'; +import { relocatedError, setErrors, getErrors } from './errors'; +import { + ERROR_SYMBOL, + FIELD_SUBSCHEMA_MAP_SYMBOL, + OBJECT_SUBSCHEMA_SYMBOL, +} from './symbols'; +import { getSubschema, setObjectSubschema } from './subSchema'; export function isProxiedResult(result: any) { return result != null ? result[ERROR_SYMBOL] : result; } -export function getSubschema( - result: any, - responseKey: string, -): GraphQLSchema | SubschemaConfig { - const subschema = - result[FIELD_SUBSCHEMA_MAP_SYMBOL] && - result[FIELD_SUBSCHEMA_MAP_SYMBOL][responseKey]; - return subschema ? subschema : result[OBJECT_SUBSCHEMA_SYMBOL]; -} - -export function setObjectSubschema( - result: any, - subschema: GraphQLSchema | SubschemaConfig, -) { - result[OBJECT_SUBSCHEMA_SYMBOL] = subschema; -} - -export function setErrors(result: any, errors: Array) { - result[ERROR_SYMBOL] = errors; -} - -export function getErrors( - result: any, - pathSegment: string, -): Array { - const errors = result != null ? result[ERROR_SYMBOL] : result; - - if (!Array.isArray(errors)) { - return null; - } - - const fieldErrors = []; - - for (const error of errors) { - if (!error.path || error.path[0] === pathSegment) { - fieldErrors.push(error); - } - } - - return fieldErrors; -} - export function unwrapResult( parent: any, info: IGraphQLToolsResolveInfo, diff --git a/src/stitch/subSchema.ts b/src/stitch/subSchema.ts new file mode 100644 index 00000000000..35f2998ea9e --- /dev/null +++ b/src/stitch/subSchema.ts @@ -0,0 +1,22 @@ +import { GraphQLSchema } from 'graphql'; + +import { SubschemaConfig } from '../Interfaces'; + +import { FIELD_SUBSCHEMA_MAP_SYMBOL, OBJECT_SUBSCHEMA_SYMBOL } from './symbols'; + +export function getSubschema( + result: any, + responseKey: string, +): GraphQLSchema | SubschemaConfig { + const subschema = + result[FIELD_SUBSCHEMA_MAP_SYMBOL] && + result[FIELD_SUBSCHEMA_MAP_SYMBOL][responseKey]; + return subschema ? subschema : result[OBJECT_SUBSCHEMA_SYMBOL]; +} + +export function setObjectSubschema( + result: any, + subschema: GraphQLSchema | SubschemaConfig, +) { + result[OBJECT_SUBSCHEMA_SYMBOL] = subschema; +} diff --git a/src/stitch/symbols.ts b/src/stitch/symbols.ts new file mode 100644 index 00000000000..5bb333084b1 --- /dev/null +++ b/src/stitch/symbols.ts @@ -0,0 +1,14 @@ +const hasSymbol = + (typeof global !== 'undefined' && 'Symbol' in global) || + // eslint-disable-next-line no-undef + (typeof window !== 'undefined' && 'Symbol' in window); + +export const OBJECT_SUBSCHEMA_SYMBOL = hasSymbol + ? Symbol('initialSubschema') + : '@@__initialSubschema'; +export const FIELD_SUBSCHEMA_MAP_SYMBOL = hasSymbol + ? Symbol('subschemaMap') + : '@@__subschemaMap'; +export const ERROR_SYMBOL = hasSymbol + ? Symbol('subschemaErrors') + : '@@__subschemaErrors'; diff --git a/src/test/errors.test.ts b/src/test/errors.test.ts index bc041cde543..ce772b75348 100644 --- a/src/test/errors.test.ts +++ b/src/test/errors.test.ts @@ -1,11 +1,11 @@ import { GraphQLError, graphql } from 'graphql'; -import { relocatedError } from '../stitch/errors'; -import { getErrors, ERROR_SYMBOL } from '../stitch/proxiedResult'; +import { relocatedError, getErrors } from '../stitch/errors'; import { checkResultAndHandleErrors } from '../delegate/checkResultAndHandleErrors'; import { makeExecutableSchema } from '../generate/index'; import { mergeSchemas } from '../stitch/index'; import { IGraphQLToolsResolveInfo } from '../Interfaces'; +import { ERROR_SYMBOL } from '../stitch/symbols'; class ErrorWithExtensions extends GraphQLError { constructor(message: string, code: string) { diff --git a/src/utils/clone.ts b/src/utils/clone.ts index 3154d692e6b..637349bd336 100644 --- a/src/utils/clone.ts +++ b/src/utils/clone.ts @@ -17,7 +17,8 @@ import { isScalarType, } from 'graphql'; -import { isSpecifiedScalarType, toConfig } from '../polyfills/index'; +import { isSpecifiedScalarType } from '../polyfills/isSpecifiedScalarType'; +import { toConfig } from '../polyfills/toConfig'; import { graphqlVersion } from './graphqlVersion'; import { mapSchema } from './map'; diff --git a/src/utils/filterSchema.ts b/src/utils/filterSchema.ts index 060e7009387..2b4dc88e8af 100644 --- a/src/utils/filterSchema.ts +++ b/src/utils/filterSchema.ts @@ -14,7 +14,7 @@ import { FieldFilter, RootFieldFilter, } from '../Interfaces'; -import { toConfig } from '../polyfills/index'; +import { toConfig } from '../polyfills/toConfig'; import { mapSchema } from './map'; diff --git a/src/utils/getResolversFromSchema.ts b/src/utils/getResolversFromSchema.ts index 05383782ca9..2cd6aa751f5 100644 --- a/src/utils/getResolversFromSchema.ts +++ b/src/utils/getResolversFromSchema.ts @@ -8,7 +8,7 @@ import { } from 'graphql'; import { IResolvers } from '../Interfaces'; -import { isSpecifiedScalarType } from '../polyfills/index'; +import { isSpecifiedScalarType } from '../polyfills/isSpecifiedScalarType'; import { cloneType } from './clone'; diff --git a/src/utils/map.ts b/src/utils/map.ts index 6e4c18b09ed..eb6bdbf8674 100644 --- a/src/utils/map.ts +++ b/src/utils/map.ts @@ -28,8 +28,9 @@ import { GraphQLObjectTypeConfig, } from 'graphql'; -import { toConfig, isSpecifiedScalarType } from '../polyfills/index'; -import { graphqlVersion } from '../utils/index'; +import { toConfig } from '../polyfills/toConfig'; +import { isSpecifiedScalarType } from '../polyfills/isSpecifiedScalarType'; +import { graphqlVersion } from '../utils/graphqlVersion'; import { SchemaMapper, MapperKind, diff --git a/src/wrap/resolvers.ts b/src/wrap/resolvers.ts index 9967bafc3a8..1583bd8b079 100644 --- a/src/wrap/resolvers.ts +++ b/src/wrap/resolvers.ts @@ -15,7 +15,8 @@ import { handleResult } from '../delegate/checkResultAndHandleErrors'; import { makeMergedType } from '../stitch/makeMergedType'; import { getResponseKeyFromInfo } from '../stitch/getResponseKeyFromInfo'; -import { getErrors, getSubschema } from '../stitch/proxiedResult'; +import { getSubschema } from '../stitch/subSchema'; +import { getErrors } from '../stitch/errors'; export type Mapping = { [typeName: string]: { diff --git a/src/wrap/wrapSchema.ts b/src/wrap/wrapSchema.ts index a60bb19c0b6..ee47a01c3cf 100644 --- a/src/wrap/wrapSchema.ts +++ b/src/wrap/wrapSchema.ts @@ -1,8 +1,8 @@ import { GraphQLSchema } from 'graphql'; -import { addResolversToSchema } from '../generate/index'; +import addResolversToSchema from '../generate/addResolversToSchema'; import { Transform, SubschemaConfig, isSubschemaConfig } from '../Interfaces'; -import { cloneSchema } from '../utils/index'; +import { cloneSchema } from '../utils/clone'; import { generateProxyingResolvers, stripResolvers } from './resolvers'; import { applySchemaTransforms } from './transforms';