@graphql-tools/wrap
Version:
A set of utils for faster development of GraphQL tools
60 lines (59 loc) • 2.96 kB
JavaScript
import { MapperKind, mapSchema } from '@graphql-tools/utils';
import MapLeafValues from './MapLeafValues.js';
export default class TransformEnumValues {
constructor(enumValueTransformer, inputValueTransformer, outputValueTransformer) {
this.noTransformation = true;
this.enumValueTransformer = enumValueTransformer;
this.mapping = Object.create(null);
this.reverseMapping = Object.create(null);
this.transformer = new MapLeafValues(generateValueTransformer(inputValueTransformer, this.reverseMapping), generateValueTransformer(outputValueTransformer, this.mapping));
}
transformSchema(originalWrappingSchema, subschemaConfig) {
const mappingSchema = this.transformer.transformSchema(originalWrappingSchema, subschemaConfig);
this.transformedSchema = mapSchema(mappingSchema, {
[MapperKind.ENUM_VALUE]: (valueConfig, typeName, _schema, externalValue) => this.transformEnumValue(typeName, externalValue, valueConfig),
});
return this.transformedSchema;
}
transformRequest(originalRequest, delegationContext, transformationContext) {
if (this.noTransformation) {
return originalRequest;
}
return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext);
}
transformResult(originalResult, delegationContext, transformationContext) {
if (this.noTransformation) {
return originalResult;
}
return this.transformer.transformResult(originalResult, delegationContext, transformationContext);
}
transformEnumValue(typeName, externalValue, enumValueConfig) {
const transformedEnumValue = this.enumValueTransformer(typeName, externalValue, enumValueConfig);
if (Array.isArray(transformedEnumValue)) {
const newExternalValue = transformedEnumValue[0];
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;
this.noTransformation = false;
}
}
return transformedEnumValue;
}
}
function mapEnumValues(typeName, value, mapping) {
var _a;
const newExternalValue = (_a = mapping[typeName]) === null || _a === void 0 ? void 0 : _a[value];
return newExternalValue != null ? newExternalValue : value;
}
function generateValueTransformer(valueTransformer, mapping) {
if (valueTransformer == null) {
return (typeName, value) => mapEnumValues(typeName, value, mapping);
}
else {
return (typeName, value) => mapEnumValues(typeName, valueTransformer(typeName, value), mapping);
}
}