@graphql-tools/utils
Version:
Common package containing utils and types for GraphQL tools
54 lines (53 loc) • 1.9 kB
JavaScript
import { getNullableType, isInputObjectType, isLeafType, isListType, } from 'graphql';
import { asArray } from './helpers.js';
export function transformInputValue(type, value, inputLeafValueTransformer = null, inputObjectValueTransformer = null) {
if (value == null) {
return value;
}
const nullableType = getNullableType(type);
if (isLeafType(nullableType)) {
return inputLeafValueTransformer != null
? inputLeafValueTransformer(nullableType, value)
: value;
}
else if (isListType(nullableType)) {
return asArray(value).map((listMember) => transformInputValue(nullableType.ofType, listMember, inputLeafValueTransformer, inputObjectValueTransformer));
}
else if (isInputObjectType(nullableType)) {
const fields = nullableType.getFields();
const newValue = {};
for (const key in value) {
const field = fields[key];
if (field != null) {
newValue[key] = transformInputValue(field.type, value[key], inputLeafValueTransformer, inputObjectValueTransformer);
}
}
return inputObjectValueTransformer != null
? inputObjectValueTransformer(nullableType, newValue)
: newValue;
}
// unreachable, no other possible return value
}
export function serializeInputValue(type, value) {
return transformInputValue(type, value, (t, v) => {
try {
return t.serialize(v);
}
catch {
return v;
}
});
}
export function parseInputValue(type, value) {
return transformInputValue(type, value, (t, v) => {
try {
return t.parseValue(v);
}
catch {
return v;
}
});
}
export function parseInputValueLiteral(type, value) {
return transformInputValue(type, value, (t, v) => t.parseLiteral(v, {}));
}