UNPKG

2.49 kBJavaScriptView Raw
1'use strict';
2
3const Assert = require('assert');
4const ForceArray = require('force-array');
5const { graphql } = require('graphi');
6const Hasha = require('hasha');
7
8
9exports.toNameValues = (obj) => {
10 if (!obj) {
11 return [];
12 }
13
14 return Object.keys(obj).map((name) => {
15 const value = obj[name];
16 return {
17 id: Hasha(JSON.stringify({ name, value })),
18 name,
19 value
20 };
21 });
22};
23
24exports.fromNameValues = (nameValues, prefix = '') => {
25 return ForceArray(nameValues).reduce((accumulator, { name, value }) => {
26 return Object.assign(accumulator, {
27 [prefix + name]: name === 'triton.cns.disable' ? JSON.parse(value) : value
28 });
29 }, {});
30};
31
32exports.toPage = ({ res = {}, payload, offset, limit }) => {
33 const headers = res.headers || {};
34 return {
35 offset: offset || 0,
36 limit: limit || 0,
37 total: parseInt(headers['x-resource-count'], 10) || 0,
38 results: payload
39 };
40};
41
42
43// Inspired by graphql-tools
44exports.makeExecutableSchema = ({ typeDefs, resolvers = {} }) => {
45 const parsed = graphql.parse(typeDefs);
46 const astSchema = graphql.buildASTSchema(parsed, { commentDescriptions: true });
47
48 for (const resolverName of Object.keys(resolvers)) {
49 const type = astSchema.getType(resolverName);
50 Assert(type || resolverName === '__schema', `Missing schema definition for resolver: ${resolverName}`);
51
52 const typeResolver = resolvers[resolverName];
53
54 // go through field resolvers for the parent resolver type
55 for (const fieldName of Object.keys(typeResolver)) {
56 const fieldResolver = typeResolver[fieldName];
57 Assert(typeof fieldResolver === 'function', `${resolverName}.${fieldName} resolver must be a function`);
58
59 if (type instanceof graphql.GraphQLScalarType) {
60 type[fieldName] = fieldResolver;
61 continue;
62 }
63
64 if (type instanceof graphql.GraphQLEnumType) {
65 const fieldType = type.getValue(fieldName);
66 Assert(fieldType, `${resolverName}.${fieldName} enum definition missing from schema`);
67 fieldType.value = fieldResolver;
68 continue;
69 }
70
71 // no need to set resolvers unless we are dealing with a type that needs resolvers
72 if (!(type instanceof graphql.GraphQLObjectType) && !(type instanceof graphql.GraphQLInterfaceType)) {
73 continue;
74 }
75
76 const fields = type.getFields();
77 if (!fields) {
78 continue;
79 }
80
81 fields[fieldName].resolve = fieldResolver;
82 }
83 }
84 return astSchema;
85};