herbs2gql
herbs2gql creates GraphQL types based on herbs entities (gotu) and usecases (buchu), based on Apollo GraphQL.
Installing
$ npm install herbs2gql
Using
All methods returns a string in GraphQL format representing the type based (gql) and a resolver (when expected).
GraphQL Type
To convert a Herbs Entity to GraphQL Type:
const { entity2type } = require('herbs2gql')
const entity = entity('User', {
id: field(String),
name: field(String),
document: field(String),
age: field(Number),
active: field(Boolean),
})
const gql = entity2type(entity)
GraphQL Input
To convert a Herbs Entity to GraphQL Input:
const { entity2input } = require('herbs2gql')
const entity = entity('UserFilter', {
name: field(String),
age: field(Number),
})
const gql = entity2input(entity)
GraphQL Query
To convert a Herbs Use Case to GraphQL Query:
const { usecase2query } = require('herbs2gql')
const usecase = usecase('Get User', {
request: {
id: Number,
document: String
},
response: User
})
const resolverFunc = (parent, args, context, info) => { }
const [gql, resolver] = usecase2query(usecase, resolverFunc)
GraphQL Mutation
To convert a Herbs Use Case to GraphQL Mutation:
const { usecase2mutation } = require('herbs2gql')
const usecase = usecase('Update User', {
request: {
id: Number,
name: String,
age: Number,
active: Boolean
},
response: User
})
const resolverFunc = (parent, args, context, info) => { }
const [gql, resolver] = usecase2mutation(usecase, resolverFunc)
GraphQL Subscription
To convert a Herbs Use Case to GraphQL Subscription:
const { usecase2subscription } = require('herbs2gql')
const usecase = usecase('New User Notification', {
request: {
id: Number,
},
response: UserMessage
})
const resolverFunc = () => { }
const [gql, resolver] = usecase2subscription(usecase, resolverFunc)
GraphQL Resolvers
herbs2gql
provides a generic resolver implementation for mutations and queries.
const { defaultResolver } = require('herbs2gql')
const updateUser = (injection) => usecase('Update User', {
request: {
id: Number,
name: String,
age: Number,
active: Boolean
},
response: User
})
const [gql, resolver] = usecase2mutation(updateUser(), defaultResolver(updateUser))
In case you need to implement your own resolver:
const usecase = usecase('Update User', {
request: {
id: Number,
name: String,
age: Number,
active: Boolean
},
response: User
})
const resolverFunc = (parent, args, context, info) => { }
const [gql, resolver] = usecase2mutation(usecase, resolverFunc)
Or you can use herbs2gql
defaultResolver
implementation as a reference.
Custom Names or Conventions
In Herbs it is possible to include personalized names for queries, mutations, inputs and types custom names are always prioritized
Custom Names
const options = { inputName: 'An-Entity' }
// for entity2input
const gql = entity2input(givenAnInput, options)
// for entity2type
const gql = entity2type(givenAnEntity, options)
//for mutation, query or subscription example using mutation
const [gql, resolver] = usecase2mutation(givenAnUseCase, resolverFunc, options)
Conventions
At the convention, a function must be sent, it must return a text formatted according to the sended convention
const options = { convention: { inputNameRule: (str) => `snake_case_returned` }}
// for entity2input
const gql = entity2input(givenAnInput, options)
// for entity2type
const gql = entity2type(givenAnEntity, options)
//for mutation, query or subscription example using mutation
const [gql, resolver] = usecase2mutation(givenAnUseCase, resolverFunc, options)
Example
Additionally you can view a simple demo application of this library in todolist-on-herbs.
How to contribute
CONTRIBUTING
If you would like to help contribute to this repository, please see
License