@cran/lib.gql.core
Version:
GQL Core Functionality
56 lines (55 loc) • 1.71 kB
JavaScript
import { parseError, parseLiteral } from "./parse";
import { GraphQLScalarType, } from "graphql";
function getTypeOf(value) {
return (value instanceof Array ? "array" : typeof value);
}
export function createScalar(name, description, casts, serialize) {
const asType = createScalarCast(name, casts);
return {
typeDefs: `scalar ${name}`,
resolvers: {
[name]: new GraphQLScalarType({
name,
description,
serialize: serialize,
parseValue: asType,
parseLiteral(ast, variables) {
return asType(parseLiteral(name, ast, variables));
},
}),
},
};
}
export function createScalarCast(name, casts) {
return function asType(value, ast) {
if (null === value) {
return null;
}
const type = getTypeOf(value);
let result = null;
try {
const cast = casts[type];
if (cast instanceof Function) {
result = cast(value, function invalid(reason) {
parseError(type, ast ?? value, reason);
});
}
else if (cast) {
switch (type) {
case "object":
case "array":
result = JSON.stringify(value);
break;
default:
result = String(value);
break;
}
}
}
catch { /* ignored */ }
if (null === result) {
parseError(name, ast ?? value);
}
return result;
};
}