@cran/gql.core
Version:
Cran/GraphQL Core Utilities
60 lines (59 loc) • 1.96 kB
JavaScript
;
/* eslint-disable prefer-template */
Object.defineProperty(exports, "__esModule", { value: true });
exports.createScalar = void 0;
const graphql_1 = require("graphql");
const parse_1 = require("./parse");
function getTypeof(value) {
return (value instanceof Array ? "array" : typeof value);
}
// eslint-disable-next-line max-lines-per-function
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) {
(0, parse_1.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) {
(0, parse_1.parseError)(name, ast || value);
}
return result;
}
return {
typeDefs: `scalar ${name}`,
resolvers: {
[name]: new graphql_1.GraphQLScalarType({
name,
description,
serialize,
parseValue: asType,
parseLiteral(ast, variables) {
return asType((0, parse_1.parseLiteral)(name, ast, variables));
},
}),
},
};
}
exports.createScalar = createScalar;