UNPKG

@cran/gql.core

Version:

Cran/GraphQL Core Utilities

56 lines (55 loc) 1.79 kB
/* eslint-disable prefer-template */ import { GraphQLScalarType } from "graphql"; import { parseError, parseLiteral } from "./parse"; function getTypeof(value) { return (value instanceof Array ? "array" : typeof value); } // eslint-disable-next-line max-lines-per-function export function createScalar(name, description, casts, serialize) { // eslint-disable-next-line complexity 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); throw new Error(); // invariant }); } else if (cast) { switch (type) { case "object": case "array": result = JSON.stringify(value); break; // eslint-disable-next-line @typescript-eslint/no-base-to-string default: result = "" + value; } } } catch { /* */ } if (null === result) { parseError(name, ast || value); } return result; } return { typeDefs: `scalar ${name}`, resolvers: { [name]: new GraphQLScalarType({ name, description, serialize, parseValue: asType, parseLiteral(ast, variables) { return asType(parseLiteral(name, ast, variables)); }, }), }, }; }