UNPKG

@cran/lib.gql.core

Version:

GQL Core Functionality

56 lines (55 loc) 1.71 kB
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; }; }