Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
yaacovCR committed Jul 16, 2020
1 parent 7f1fe27 commit a2ac7d7
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 113 deletions.
151 changes: 73 additions & 78 deletions packages/wrap/src/transforms/MapLeafValues.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export interface MapLeafValuesTransformationContext {
transformedRequest: Request;
}

export default class MapLeafValues implements Transform {
export default class MapLeafValues implements Transform<MapLeafValuesTransformationContext> {
private readonly inputValueTransformer: LeafValueTransformer;
private readonly outputValueTransformer: LeafValueTransformer;
private readonly resultVisitorMap: ResultVisitorMap;
Expand Down Expand Up @@ -60,8 +60,8 @@ export default class MapLeafValues implements Transform {

public transformRequest(
originalRequest: Request,
_delegationContext: Record<string, any>,
transformationContext: MapLeafValuesTransformationContext
_delegationContext?: Record<string, any>,
transformationContext?: MapLeafValuesTransformationContext
): Request {
const document = originalRequest.document;
const variableValues = originalRequest.variables;
Expand All @@ -73,7 +73,7 @@ export default class MapLeafValues implements Transform {
def => def.kind === Kind.FRAGMENT_DEFINITION
) as Array<FragmentDefinitionNode>;

const newOperations = transformOperations(operations, this.inputValueTransformer, this.typeInfo, variableValues);
const newOperations = this.transformOperations(operations, variableValues);

const transformedRequest = {
...originalRequest,
Expand All @@ -91,8 +91,8 @@ export default class MapLeafValues implements Transform {

public transformResult(
originalResult: ExecutionResult,
_delegationContext: Record<string, any>,
transformationContext: MapLeafValuesTransformationContext
_delegationContext?: Record<string, any>,
transformationContext?: MapLeafValuesTransformationContext
) {
return visitResult(
originalResult,
Expand All @@ -101,87 +101,82 @@ export default class MapLeafValues implements Transform {
this.resultVisitorMap
);
}
}

function transformOperations(
operations: Array<OperationDefinitionNode>,
inputValueTransformer: LeafValueTransformer,
typeInfo: TypeInfo,
variableValues: Record<string, any>
): Array<OperationDefinitionNode> {
return operations.map((operation: OperationDefinitionNode) => {
const variableDefinitionMap: Record<string, VariableDefinitionNode> = operation.variableDefinitions.reduce(
(prev, def) => ({
...prev,
[def.variable.name.value]: def,
}),
{}
);

const newOperation = visit(
operation,
visitWithTypeInfo(typeInfo, {
[Kind.FIELD]: node =>
transformFieldNode(node, inputValueTransformer, typeInfo, variableDefinitionMap, variableValues),
})
);

return {
...newOperation,
variableDefinitions: Object.keys(variableDefinitionMap).map(varName => variableDefinitionMap[varName]),
};
});
}

function transformFieldNode(
field: FieldNode,
inputValueTransformer: LeafValueTransformer,
typeInfo: TypeInfo,
variableDefinitionMap: Record<string, VariableDefinitionNode>,
variableValues: Record<string, any>
): FieldNode {
const targetField = typeInfo.getFieldDef();

if (!targetField.name.startsWith('__')) {
const argumentNodes = field.arguments;
if (argumentNodes != null) {
const argumentNodeMap: Record<string, ArgumentNode> = argumentNodes.reduce(
(prev, argument) => ({
private transformOperations(
operations: Array<OperationDefinitionNode>,
variableValues: Record<string, any>
): Array<OperationDefinitionNode> {
return operations.map((operation: OperationDefinitionNode) => {
const variableDefinitionMap: Record<string, VariableDefinitionNode> = operation.variableDefinitions.reduce(
(prev, def) => ({
...prev,
[argument.name.value]: argument,
[def.variable.name.value]: def,
}),
Object.create(null)
{}
);

targetField.args.forEach((argument: GraphQLArgument) => {
const argName = argument.name;
const argType = argument.type;

const argumentNode = argumentNodeMap[argName];
const argValue = argumentNode?.value;
const newOperation = visit(
operation,
visitWithTypeInfo(this.typeInfo, {
[Kind.FIELD]: node => this.transformFieldNode(node, variableDefinitionMap, variableValues),
})
);

let value: any;
if (argValue != null) {
value = valueFromAST(argValue, argType, variableValues);
}
return {
...newOperation,
variableDefinitions: Object.keys(variableDefinitionMap).map(varName => variableDefinitionMap[varName]),
};
});
}

updateArgument(
argName,
argType,
argumentNodeMap,
variableDefinitionMap,
variableValues,
transformInputValue(argType, value, (t, v) => {
const newValue = inputValueTransformer(t.name, v);
return newValue === undefined ? v : newValue;
})
private transformFieldNode(
field: FieldNode,
variableDefinitionMap: Record<string, VariableDefinitionNode>,
variableValues: Record<string, any>
): FieldNode {
const targetField = this.typeInfo.getFieldDef();

if (!targetField.name.startsWith('__')) {
const argumentNodes = field.arguments;
if (argumentNodes != null) {
const argumentNodeMap: Record<string, ArgumentNode> = argumentNodes.reduce(
(prev, argument) => ({
...prev,
[argument.name.value]: argument,
}),
Object.create(null)
);
});

return {
...field,
arguments: Object.keys(argumentNodeMap).map(argName => argumentNodeMap[argName]),
};
targetField.args.forEach((argument: GraphQLArgument) => {
const argName = argument.name;
const argType = argument.type;

const argumentNode = argumentNodeMap[argName];
const argValue = argumentNode?.value;

let value: any;
if (argValue != null) {
value = valueFromAST(argValue, argType, variableValues);
}

updateArgument(
argName,
argType,
argumentNodeMap,
variableDefinitionMap,
variableValues,
transformInputValue(argType, value, (t, v) => {
const newValue = this.inputValueTransformer(t.name, v);
return newValue === undefined ? v : newValue;
})
);
});

return {
...field,
arguments: Object.keys(argumentNodeMap).map(argName => argumentNodeMap[argName]),
};
}
}
}
}
60 changes: 25 additions & 35 deletions packages/wrap/src/transforms/TransformEnumValues.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { EnumValueTransformer, LeafValueTransformer } from '../types';

import MapLeafValues, { MapLeafValuesTransformationContext } from './MapLeafValues';

export default class TransformEnumValues implements Transform {
export default class TransformEnumValues implements Transform<MapLeafValuesTransformationContext> {
private readonly enumValueTransformer: EnumValueTransformer;
private readonly transformer: MapLeafValues;
private transformedSchema: GraphQLSchema;
Expand All @@ -31,57 +31,47 @@ export default class TransformEnumValues implements Transform {
const transformedSchema = this.transformer.transformSchema(originalSchema);
this.transformedSchema = mapSchema(transformedSchema, {
[MapperKind.ENUM_VALUE]: (valueConfig, typeName, _schema, externalValue) =>
transformEnumValue(
typeName,
externalValue,
valueConfig,
this.enumValueTransformer,
this.mapping,
this.reverseMapping
),
this.transformEnumValue(typeName, externalValue, valueConfig),
});
return this.transformedSchema;
}

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

public transformResult(
originalResult: ExecutionResult,
delegationContext: Record<string, any>,
transformationContext: MapLeafValuesTransformationContext
delegationContext?: Record<string, any>,
transformationContext?: MapLeafValuesTransformationContext
) {
return this.transformer.transformResult(originalResult, delegationContext, transformationContext);
}
}

function transformEnumValue(
typeName: string,
externalValue: string,
enumValueConfig: GraphQLEnumValueConfig,
enumValueTransformer: EnumValueTransformer,
mapping: Record<string, Record<string, string>>,
reverseMapping: Record<string, Record<string, string>>
): GraphQLEnumValueConfig | [string, GraphQLEnumValueConfig] {
const transformedEnumValue = enumValueTransformer(typeName, externalValue, enumValueConfig);
if (Array.isArray(transformedEnumValue)) {
const newExternalValue = transformedEnumValue[0];
private transformEnumValue(
typeName: string,
externalValue: string,
enumValueConfig: GraphQLEnumValueConfig
): GraphQLEnumValueConfig | [string, GraphQLEnumValueConfig] {
const transformedEnumValue = this.enumValueTransformer(typeName, externalValue, enumValueConfig);
if (Array.isArray(transformedEnumValue)) {
const newExternalValue = transformedEnumValue[0];

if (newExternalValue !== externalValue) {
if (!(typeName in mapping)) {
mapping[typeName] = Object.create(null);
reverseMapping[typeName] = Object.create(null);
if (newExternalValue !== externalValue) {
if (!(typeName in this.mapping)) {
this.mapping[typeName] = Object.create(null);
this.reverseMapping[typeName] = Object.create(null);
}
this.mapping[typeName][externalValue] = newExternalValue;
this.reverseMapping[typeName][newExternalValue] = externalValue;
}
mapping[typeName][externalValue] = newExternalValue;
reverseMapping[typeName][newExternalValue] = externalValue;
}
return transformedEnumValue;
}
return transformedEnumValue;
}

function mapEnumValues(typeName: string, value: string, mapping: Record<string, Record<string, string>>): string {
Expand All @@ -91,11 +81,11 @@ function mapEnumValues(typeName: string, value: string, mapping: Record<string,

function generateValueTransformer(
valueTransformer: LeafValueTransformer,
reverseMapping: Record<string, Record<string, string>>
mapping: Record<string, Record<string, string>>
): LeafValueTransformer {
if (valueTransformer == null) {
return (typeName, value) => mapEnumValues(typeName, value, reverseMapping);
return (typeName, value) => mapEnumValues(typeName, value, mapping);
} else {
return (typeName, value) => mapEnumValues(typeName, valueTransformer(typeName, value), reverseMapping);
return (typeName, value) => mapEnumValues(typeName, valueTransformer(typeName, value), mapping);
}
}

0 comments on commit a2ac7d7

Please sign in to comment.