Skip to content

Commit

Permalink
refactor(Transform): move type to delegate package
Browse files Browse the repository at this point in the history
includes also changes to transform method arguments
see #1614
  • Loading branch information
yaacovCR committed Aug 31, 2020
1 parent 8aab6a1 commit f384ab9
Show file tree
Hide file tree
Showing 59 changed files with 386 additions and 226 deletions.
5 changes: 2 additions & 3 deletions packages/delegate/src/Subschema.ts
@@ -1,10 +1,9 @@
import { GraphQLSchema } from 'graphql';

import { Transform, applySchemaTransforms } from '@graphql-tools/utils';

import { SubschemaConfig, MergedTypeConfig, CreateProxyingResolverFn, Subscriber, Executor } from './types';
import { SubschemaConfig, Transform, MergedTypeConfig, CreateProxyingResolverFn, Subscriber, Executor } from './types';

import { FIELD_SUBSCHEMA_MAP_SYMBOL, OBJECT_SUBSCHEMA_SYMBOL } from './symbols';
import { applySchemaTransforms } from './applySchemaTransforms';

export function getSubschema(result: any, responseKey: string): GraphQLSchema | SubschemaConfig {
const subschema = result[FIELD_SUBSCHEMA_MAP_SYMBOL] && result[FIELD_SUBSCHEMA_MAP_SYMBOL][responseKey];
Expand Down
4 changes: 2 additions & 2 deletions packages/delegate/src/Transformer.ts
@@ -1,6 +1,6 @@
import { Transform, Request, ExecutionResult } from '@graphql-tools/utils';
import { Request, ExecutionResult } from '@graphql-tools/utils';

import { DelegationContext, DelegationBinding } from './types';
import { DelegationContext, DelegationBinding, Transform } from './types';

import { defaultDelegationBinding } from './delegationBindings';

Expand Down
13 changes: 13 additions & 0 deletions packages/delegate/src/applySchemaTransforms.ts
@@ -0,0 +1,13 @@
import { GraphQLSchema } from 'graphql';

import { cloneSchema } from '@graphql-tools/utils';

import { Transform } from './types';

export function applySchemaTransforms(originalSchema: GraphQLSchema, transforms: Array<Transform>): GraphQLSchema {
return transforms.reduce(
(schema: GraphQLSchema, transform: Transform) =>
transform.transformSchema != null ? transform.transformSchema(cloneSchema(schema)) : schema,
originalSchema
);
}
10 changes: 8 additions & 2 deletions packages/delegate/src/delegateToSchema.ts
Expand Up @@ -15,9 +15,15 @@ import {

import isPromise from 'is-promise';

import { mapAsyncIterator, Transform, ExecutionResult } from '@graphql-tools/utils';
import { mapAsyncIterator, ExecutionResult } from '@graphql-tools/utils';

import { IDelegateToSchemaOptions, IDelegateRequestOptions, SubschemaConfig, ExecutionParams } from './types';
import {
IDelegateToSchemaOptions,
IDelegateRequestOptions,
SubschemaConfig,
ExecutionParams,
Transform,
} from './types';

import { isSubschemaConfig } from './Subschema';
import { createRequestFromInfo, getDelegatingOperation } from './createRequest';
Expand Down
4 changes: 1 addition & 3 deletions packages/delegate/src/delegationBindings.ts
@@ -1,6 +1,4 @@
import { Transform } from '@graphql-tools/utils';

import { StitchingInfo, DelegationContext } from './types';
import { Transform, StitchingInfo, DelegationContext } from './types';

import AddSelectionSets from './transforms/AddSelectionSets';
import ExpandAbstractTypes from './transforms/ExpandAbstractTypes';
Expand Down
1 change: 1 addition & 0 deletions packages/delegate/src/index.ts
Expand Up @@ -5,6 +5,7 @@ export { createMergedResolver } from './createMergedResolver';
export { handleResult } from './results/handleResult';
export { Subschema, isSubschema, isSubschemaConfig, getSubschema } from './Subschema';

export * from './applySchemaTransforms';
export * from './delegationBindings';
export * from './transforms';
export * from './types';
10 changes: 8 additions & 2 deletions packages/delegate/src/transforms/AddArgumentsAsVariables.ts
Expand Up @@ -12,7 +12,9 @@ import {
VariableDefinitionNode,
} from 'graphql';

import { Transform, Request, serializeInputValue, updateArgument } from '@graphql-tools/utils';
import { Request, serializeInputValue, updateArgument } from '@graphql-tools/utils';

import { Transform, DelegationContext } from '../types';

export default class AddArgumentsAsVariables implements Transform {
private readonly targetSchema: GraphQLSchema;
Expand All @@ -29,7 +31,11 @@ export default class AddArgumentsAsVariables implements Transform {
);
}

public transformRequest(originalRequest: Request): Request {
public transformRequest(
originalRequest: Request,
_delegationContext: DelegationContext,
_transformationContext: Record<string, any>
): Request {
const { document, variables } = addVariablesToRootField(this.targetSchema, originalRequest, this.args);

return {
Expand Down
10 changes: 8 additions & 2 deletions packages/delegate/src/transforms/AddFragmentsByField.ts
Expand Up @@ -10,7 +10,9 @@ import {
InlineFragmentNode,
} from 'graphql';

import { Transform, Request } from '@graphql-tools/utils';
import { Request } from '@graphql-tools/utils';

import { Transform, DelegationContext } from '../types';

export default class AddFragmentsByField implements Transform {
private readonly targetSchema: GraphQLSchema;
Expand All @@ -21,7 +23,11 @@ export default class AddFragmentsByField implements Transform {
this.mapping = mapping;
}

public transformRequest(originalRequest: Request): Request {
public transformRequest(
originalRequest: Request,
_delegationContext: DelegationContext,
_transformationContext: Record<string, any>
): Request {
const document = addFragmentsByField(this.targetSchema, originalRequest.document, this.mapping);
return {
...originalRequest,
Expand Down
11 changes: 8 additions & 3 deletions packages/delegate/src/transforms/AddSelectionSets.ts
Expand Up @@ -9,8 +9,9 @@ import {
print,
} from 'graphql';

import { Transform, Request } from '@graphql-tools/utils';
import { Request } from '@graphql-tools/utils';

import { Transform, DelegationContext } from '../types';
import { memoize2 } from '../memoize';

import VisitSelectionSets from './VisitSelectionSets';
Expand All @@ -30,8 +31,12 @@ export default class AddSelectionSets implements Transform {
);
}

public transformRequest(originalRequest: Request): Request {
return this.transformer.transformRequest(originalRequest);
public transformRequest(
originalRequest: Request,
delegationContext: DelegationContext,
transformationContext: Record<string, any>
): Request {
return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext);
}
}

Expand Down
10 changes: 8 additions & 2 deletions packages/delegate/src/transforms/AddSelectionSetsByField.ts
Expand Up @@ -9,7 +9,9 @@ import {
visitWithTypeInfo,
} from 'graphql';

import { Transform, Request } from '@graphql-tools/utils';
import { Request } from '@graphql-tools/utils';

import { Transform, DelegationContext } from '../types';

export default class AddSelectionSetsByField implements Transform {
private readonly schema: GraphQLSchema;
Expand All @@ -20,7 +22,11 @@ export default class AddSelectionSetsByField implements Transform {
this.mapping = mapping;
}

public transformRequest(originalRequest: Request): Request {
public transformRequest(
originalRequest: Request,
_delegationContext: DelegationContext,
_transformationContext: Record<string, any>
): Request {
const document = addSelectionSetsByField(this.schema, originalRequest.document, this.mapping);
return {
...originalRequest,
Expand Down
10 changes: 8 additions & 2 deletions packages/delegate/src/transforms/AddSelectionSetsByType.ts
Expand Up @@ -9,7 +9,9 @@ import {
visitWithTypeInfo,
} from 'graphql';

import { Transform, Request } from '@graphql-tools/utils';
import { Request } from '@graphql-tools/utils';

import { Transform, DelegationContext } from '../types';

export default class AddSelectionSetsByType implements Transform {
private readonly targetSchema: GraphQLSchema;
Expand All @@ -20,7 +22,11 @@ export default class AddSelectionSetsByType implements Transform {
this.mapping = mapping;
}

public transformRequest(originalRequest: Request): Request {
public transformRequest(
originalRequest: Request,
_delegationContext: DelegationContext,
_transformationContext: Record<string, any>
): Request {
const document = addSelectionSetsByType(this.targetSchema, originalRequest.document, this.mapping);
return {
...originalRequest,
Expand Down
10 changes: 8 additions & 2 deletions packages/delegate/src/transforms/AddTypenameToAbstract.ts
Expand Up @@ -10,7 +10,9 @@ import {
isAbstractType,
} from 'graphql';

import { Transform, Request } from '@graphql-tools/utils';
import { Request } from '@graphql-tools/utils';

import { Transform, DelegationContext } from '../types';

export default class AddTypenameToAbstract implements Transform {
private readonly targetSchema: GraphQLSchema;
Expand All @@ -19,7 +21,11 @@ export default class AddTypenameToAbstract implements Transform {
this.targetSchema = targetSchema;
}

public transformRequest(originalRequest: Request): Request {
public transformRequest(
originalRequest: Request,
_delegationContext: DelegationContext,
_transformationContext: Record<string, any>
): Request {
const document = addTypenameToAbstract(this.targetSchema, originalRequest.document);
return {
...originalRequest,
Expand Down
12 changes: 8 additions & 4 deletions packages/delegate/src/transforms/CheckResultAndHandleErrors.ts
@@ -1,8 +1,8 @@
import { GraphQLResolveInfo, GraphQLOutputType, GraphQLSchema } from 'graphql';

import { Transform, getResponseKeyFromInfo, ExecutionResult } from '@graphql-tools/utils';
import { getResponseKeyFromInfo, ExecutionResult } from '@graphql-tools/utils';
import { handleResult } from '../results/handleResult';
import { SubschemaConfig } from '../types';
import { SubschemaConfig, Transform, DelegationContext } from '../types';

export default class CheckResultAndHandleErrors implements Transform {
private readonly context?: Record<string, any>;
Expand All @@ -28,9 +28,13 @@ export default class CheckResultAndHandleErrors implements Transform {
this.typeMerge = typeMerge;
}

public transformResult(result: any): any {
public transformResult(
originalResult: ExecutionResult,
_delegationContext: DelegationContext,
_transformationContext: Record<string, any>
): ExecutionResult {
return checkResultAndHandleErrors(
result,
originalResult,
this.context != null ? this.context : {},
this.info,
this.fieldName,
Expand Down
10 changes: 8 additions & 2 deletions packages/delegate/src/transforms/ExpandAbstractTypes.ts
Expand Up @@ -15,7 +15,9 @@ import {
visitWithTypeInfo,
} from 'graphql';

import { implementsAbstractType, Transform, Request } from '@graphql-tools/utils';
import { implementsAbstractType, Request } from '@graphql-tools/utils';

import { Transform, DelegationContext } from '../types';

export default class ExpandAbstractTypes implements Transform {
private readonly targetSchema: GraphQLSchema;
Expand All @@ -31,7 +33,11 @@ export default class ExpandAbstractTypes implements Transform {
this.interfaceExtensionsMap = interfaceExtensionsMap;
}

public transformRequest(originalRequest: Request): Request {
public transformRequest(
originalRequest: Request,
_delegationContext: DelegationContext,
_transformationContext: Record<string, any>
): Request {
const document = expandAbstractTypes(
this.targetSchema,
this.possibleTypesMap,
Expand Down
10 changes: 8 additions & 2 deletions packages/delegate/src/transforms/FilterToSchema.ts
Expand Up @@ -21,7 +21,9 @@ import {
isInterfaceType,
} from 'graphql';

import { Transform, Request, implementsAbstractType, TypeMap } from '@graphql-tools/utils';
import { Request, implementsAbstractType, TypeMap } from '@graphql-tools/utils';

import { Transform, DelegationContext } from '../types';

export default class FilterToSchema implements Transform {
private readonly targetSchema: GraphQLSchema;
Expand All @@ -30,7 +32,11 @@ export default class FilterToSchema implements Transform {
this.targetSchema = targetSchema;
}

public transformRequest(originalRequest: Request): Request {
public transformRequest(
originalRequest: Request,
_delegationContext: DelegationContext,
_transformationContext: Record<string, any>
): Request {
return {
...originalRequest,
...filterToSchema(this.targetSchema, originalRequest.document, originalRequest.variables),
Expand Down
10 changes: 8 additions & 2 deletions packages/delegate/src/transforms/ReplaceFieldWithFragment.ts
Expand Up @@ -12,7 +12,9 @@ import {
visitWithTypeInfo,
} from 'graphql';

import { concatInlineFragments, Transform, Request } from '@graphql-tools/utils';
import { concatInlineFragments, Request } from '@graphql-tools/utils';

import { Transform, DelegationContext } from '../types';

export default class ReplaceFieldWithFragment implements Transform {
private readonly targetSchema: GraphQLSchema;
Expand Down Expand Up @@ -44,7 +46,11 @@ export default class ReplaceFieldWithFragment implements Transform {
}
}

public transformRequest(originalRequest: Request): Request {
public transformRequest(
originalRequest: Request,
_delegationContext: DelegationContext,
_transformationContext: Record<string, any>
): Request {
const document = replaceFieldsWithFragments(this.targetSchema, originalRequest.document, this.mapping);
return {
...originalRequest,
Expand Down
10 changes: 8 additions & 2 deletions packages/delegate/src/transforms/VisitSelectionSets.ts
Expand Up @@ -13,7 +13,9 @@ import {
DefinitionNode,
} from 'graphql';

import { Transform, Request, collectFields, GraphQLExecutionContext } from '@graphql-tools/utils';
import { Request, collectFields, GraphQLExecutionContext } from '@graphql-tools/utils';

import { Transform, DelegationContext } from '../types';

export default class VisitSelectionSets implements Transform {
private readonly schema: GraphQLSchema;
Expand All @@ -30,7 +32,11 @@ export default class VisitSelectionSets implements Transform {
this.visitor = visitor;
}

public transformRequest(originalRequest: Request): Request {
public transformRequest(
originalRequest: Request,
_delegationContext: DelegationContext,
_transformationContext: Record<string, any>
): Request {
const document = visitSelectionSets(originalRequest, this.schema, this.initialType, this.visitor);
return {
...originalRequest,
Expand Down
10 changes: 8 additions & 2 deletions packages/delegate/src/transforms/WrapConcreteTypes.ts
Expand Up @@ -12,7 +12,9 @@ import {
FieldNode,
} from 'graphql';

import { Transform, Request } from '@graphql-tools/utils';
import { Request } from '@graphql-tools/utils';

import { Transform, DelegationContext } from '../types';

// For motivation, see https://github.com/ardatan/graphql-tools/issues/751

Expand All @@ -25,7 +27,11 @@ export default class WrapConcreteTypes implements Transform {
this.targetSchema = targetSchema;
}

public transformRequest(originalRequest: Request): Request {
public transformRequest(
originalRequest: Request,
_delegationContext: DelegationContext,
_transformationContext: Record<string, any>
): Request {
const document = wrapConcreteTypes(this.returnType, this.targetSchema, originalRequest.document);
return {
...originalRequest,
Expand Down
20 changes: 19 additions & 1 deletion packages/delegate/src/types.ts
Expand Up @@ -13,10 +13,28 @@ import {
OperationTypeNode,
} from 'graphql';

import { Operation, Transform, Request, TypeMap, ExecutionResult } from '@graphql-tools/utils';
import { Operation, Request, TypeMap, ExecutionResult } from '@graphql-tools/utils';

import { Subschema } from './Subschema';

export type SchemaTransform = (originalSchema: GraphQLSchema) => GraphQLSchema;
export type RequestTransform<T = Record<string, any>> = (
originalRequest: Request,
delegationContext: DelegationContext,
transformationContext: T
) => Request;
export type ResultTransform<T = Record<string, any>> = (
originalResult: ExecutionResult,
delegationContext: DelegationContext,
transformationContext: T
) => ExecutionResult;

export interface Transform<T = Record<string, any>> {
transformSchema?: SchemaTransform;
transformRequest?: RequestTransform<T>;
transformResult?: ResultTransform<T>;
}

export interface DelegationContext {
subschema: GraphQLSchema | SubschemaConfig;
targetSchema: GraphQLSchema;
Expand Down

0 comments on commit f384ab9

Please sign in to comment.