rdio-scanner/server/graphql/index.js
2019-11-18 13:06:09 -05:00

64 lines
1.6 KiB
JavaScript

'use strict';
const camelCase = require('camelcase');
const fs = require('fs');
const { gql } = require('apollo-server-express');
const path = require('path');
function graphql({ pubsub, store }) {
const dataSources = require('./datasources')({ store });
const query = readDir('queries', pubsub);
const scalar = readDir('scalars', pubsub);
const subscription = readDir('subscriptions', pubsub);
const type = readDir('types', pubsub);
const typeDefs = gql([
scalar.schemas,
'type Query {', query.schemas, '}', '',
'type Subscription {', subscription.schemas, '}', '',
type.schemas
].join('\n'));
const resolvers = {
Query: query.resolvers,
Subscription: subscription.resolvers,
};
return {
dataSources,
resolvers,
typeDefs,
};
}
function readDir(dir, pubsub) {
let schemas = '';
const resolvers = {};
dir = path.resolve(__dirname, dir);
const filenames = fs.readdirSync(dir);
filenames.filter((file) => (file.slice(-4) === '.gql'))
.forEach((file) => {
const schema = fs.readFileSync(path.join(dir, file));
schemas += `${schema}\n`;
})
filenames.filter((file) => (file.indexOf('.') !== 0) && (file.slice(-3) === '.js'))
.map((file) => file.slice(0, -3))
.forEach((file) => {
const resolver = require(path.join(dir, file))({ pubsub });
const name = camelCase(file);
resolvers[name] = resolver;
});
return { resolvers, schemas };
}
module.exports = graphql;