Skip to content
This repository was archived by the owner on Sep 3, 2021. It is now read-only.

Initial support for #88 #99

Merged
merged 3 commits into from
Aug 30, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 43 additions & 3 deletions src/augmentSchema.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { makeExecutableSchema } from 'graphql-tools';
import { neo4jgraphql } from './index';
import { print } from 'graphql';
import { print, parse } from 'graphql';

export const makeAugmentedSchema = (typeMap, queryResolvers, mutationResolvers) => {
export const augmentedSchema = (typeMap, queryResolvers, mutationResolvers) => {
const augmentedTypeMap = augmentTypeMap(typeMap);
const augmentedResolvers = augmentResolvers(queryResolvers, mutationResolvers, augmentedTypeMap);
return makeExecutableSchema({
Expand All @@ -14,7 +14,47 @@ export const makeAugmentedSchema = (typeMap, queryResolvers, mutationResolvers)
});
}

export const extractAstNodesFromSchema = (schema) => {
export const makeAugmentedExecutableSchema = ({
typeDefs,
resolvers,
logger,
allowUndefinedInResolve,
resolverValidationOptions,
directiveResolvers,
schemaDirectives,
parseOptions,
inheritResolversFromInterfaces
}) => {
const typeMap = extractTypeMapFromTypeDefs(typeDefs);
const augmentedTypeMap = augmentTypeMap(typeMap);
const queryResolvers = resolvers && resolvers.Query ? resolvers.Query : {};
const mutationResolvers = resolvers && resolvers.Mutation ? resolvers.Mutation : {};
const augmentedResolvers = augmentResolvers(queryResolvers, mutationResolvers, augmentedTypeMap);
resolverValidationOptions.requireResolversForResolveType = false;
return makeExecutableSchema({
typeDefs: printTypeMap(augmentedTypeMap),
resolvers: augmentedResolvers,
logger: logger,
allowUndefinedInResolve: allowUndefinedInResolve,
resolverValidationOptions: resolverValidationOptions,
directiveResolvers: directiveResolvers,
schemaDirectives: schemaDirectives,
parseOptions: parseOptions,
inheritResolversFromInterfaces: inheritResolversFromInterfaces
});
}

const extractTypeMapFromTypeDefs = (typeDefs) => {
// TODO: accept alternative typeDefs formats (arr of strings, ast, etc.)
// into a single string for parse, add validatation
const astNodes = parse(typeDefs).definitions;
return astNodes.reduce( (acc, t) => {
acc[t.name.value] = t;
return acc;
}, {});
}

export const extractTypeMapFromSchema = (schema) => {
const typeMap = schema.getTypeMap();
let astNode = {};
return Object.keys(typeMap).reduce( (acc, t) => {
Expand Down
40 changes: 36 additions & 4 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@ import {
} from './utils';
import { buildCypherSelection } from './selections';
import {
extractAstNodesFromSchema,
extractTypeMapFromSchema,
extractResolvers,
makeAugmentedSchema
augmentedSchema,
makeAugmentedExecutableSchema
} from './augmentSchema';
import { checkRequestError } from './auth';

Expand Down Expand Up @@ -440,8 +441,39 @@ RETURN ${fromVar} {${subQuery}} AS ${fromVar};`;
}

export const augmentSchema = (schema) => {
let typeMap = extractAstNodesFromSchema(schema);
let typeMap = extractTypeMapFromSchema(schema);
let queryResolvers = extractResolvers(schema.getQueryType());
let mutationResolvers = extractResolvers(schema.getMutationType());
return makeAugmentedSchema(typeMap, queryResolvers, mutationResolvers);
return augmentedSchema(typeMap, queryResolvers, mutationResolvers);
}

export const makeAugmentedSchema = ({
schema,
typeDefs,
resolvers,
logger,
allowUndefinedInResolve=false,
resolverValidationOptions={},
directiveResolvers=null,
schemaDirectives=null,
parseOptions={},
inheritResolversFromInterfaces=false
}) => {
if(schema) {
return augmentSchema(schema);
}
if(!typeDefs) throw new Error(
'Must provide typeDefs'
);
return makeAugmentedExecutableSchema({
typeDefs,
resolvers,
logger,
allowUndefinedInResolve,
resolverValidationOptions,
directiveResolvers,
schemaDirectives,
parseOptions,
inheritResolversFromInterfaces
});
}