graphql-compose-mongoose
Version:
Plugin for `graphql-compose` which derive a graphql types from a mongoose model.
114 lines (92 loc) • 3.74 kB
JavaScript
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
import { schemaComposer } from 'graphql-compose';
/* eslint-disable no-use-before-define, no-param-reassign, global-require */
import { convertModelToGraphQL } from './fieldsConverter';
import * as resolvers from './resolvers';
import { prepareConnectionResolver } from './prepareConnectionResolver';
import MongoID from './types/mongoid';
export function composeWithMongoose(model, // MongooseModel, TODO use Model from mongoose_v4.x.x definition when it will be public
opts = {}) {
const name = opts && opts.name || model.modelName;
const sc = opts.schemaComposer || schemaComposer;
sc.set('MongoID', MongoID);
const tc = convertModelToGraphQL(model, name, sc);
if (opts.description) {
tc.setDescription(opts.description);
}
if (opts.fields) {
prepareFields(tc, opts.fields);
}
tc.setRecordIdFn(source => source ? `${source._id}` : '');
createInputType(tc, opts.inputType);
if (!{}.hasOwnProperty.call(opts, 'resolvers') || opts.resolvers !== false) {
createResolvers(model, tc, opts.resolvers || {});
}
tc.makeFieldNonNull('_id');
return tc;
}
export function prepareFields(tc, opts) {
if (Array.isArray(opts.only)) {
const onlyFieldNames = opts.only;
const removeFields = Object.keys(tc.getFields()).filter(fName => onlyFieldNames.indexOf(fName) === -1);
tc.removeField(removeFields);
}
if (opts.remove) {
tc.removeField(opts.remove);
}
}
export function prepareInputFields(inputTypeComposer, inputFieldsOpts) {
if (Array.isArray(inputFieldsOpts.only)) {
const onlyFieldNames = inputFieldsOpts.only;
const removeFields = Object.keys(inputTypeComposer.getFields()).filter(fName => onlyFieldNames.indexOf(fName) === -1);
inputTypeComposer.removeField(removeFields);
}
if (inputFieldsOpts.remove) {
inputTypeComposer.removeField(inputFieldsOpts.remove);
}
if (inputFieldsOpts.required) {
inputTypeComposer.makeRequired(inputFieldsOpts.required);
}
}
export function createInputType(tc, inputTypeOpts = {}) {
const inputTypeComposer = tc.getInputTypeComposer();
if (inputTypeOpts.name) {
inputTypeComposer.setTypeName(inputTypeOpts.name);
}
if (inputTypeOpts.description) {
inputTypeComposer.setDescription(inputTypeOpts.description);
}
if (inputTypeOpts.fields) {
prepareInputFields(inputTypeComposer, inputTypeOpts.fields);
}
}
export function createResolvers(model, tc, opts) {
const names = resolvers.getAvailableNames();
names.forEach(resolverName => {
if (!{}.hasOwnProperty.call(opts, resolverName) || opts[resolverName] !== false) {
const createResolverFn = resolvers[resolverName];
if (createResolverFn) {
const resolver = createResolverFn(model, tc, opts[resolverName] || {});
tc.setResolver(resolverName, resolver);
}
}
});
if (!{}.hasOwnProperty.call(opts, 'connection') || opts.connection !== false) {
prepareConnectionResolver(model, tc, opts.connection ? opts.connection : {});
}
if (!{}.hasOwnProperty.call(opts, 'pagination') || opts.pagination !== false) {
preparePaginationResolver(tc, opts.pagination || {});
}
}
export function preparePaginationResolver(tc, opts) {
try {
require.resolve('graphql-compose-pagination');
} catch (e) {
return;
}
const composeWithPagination = require('graphql-compose-pagination').default;
composeWithPagination(tc, _extends({
findResolverName: 'findMany',
countResolverName: 'count'
}, opts));
}