This package provides the functionality of generating a GraphQL schema from type definitions annotated with @rest
directives.
yarn add @n1ru4l/graphql-schema-generator-rest
import { generateRestSchema } from '@n1ru4l/graphql-schema-generator-rest'
import { graphql } from 'graphql'
import gql from 'graphql-tag'
import fetch from 'node-fetch'
const typeDefs = gql`
type User {
id: ID!
login: String!
friends: [User]!
@rest(
route: "/users/:userId/friends"
provides: { userId: "id" } # map id from parent object to :userId route param
)
}
type Query {
user(id: ID!): User @rest(route: "/users/:id")
}
`
const schema = generateRestSchema({
typeDefs,
fetcher: fetch,
})
const query = `
query user {
user(id: "2") {
id
login
friends {
id
login
}
}
}
`
graphql(schema, query)
.then(console.log)
.catch(console.log)
Available options for generateRestSchema
:
typeDefs |
AST object for GraphQL type definitions generated by graphql-tag |
fetcher |
WHATWG Fetch Compatible fetch implementation |
queryMappers |
Object of queryMappers that manipulate the query params before a request is sent |
requestMappers |
Object of requestMappers that manipulate the request body object before a request is sent |
responseMappers |
Object of responseMappers that manipulate the response returned by a request |
type User {
id: ID!
login: String!
friends: [User]!
@rest(
route: "/users/:userId/friends"
provides: { userId: "id" } # map id from parent object to :userId route param
)
}
type Query {
user(id: ID!): User @rest(route: "/users/:id")
}
Available options for the rest
directive:
route |
The route which is called |
provides |
An object that maps fields from the parent object to the scope of the directive |
method |
The HTTP method that will be used (PUT , GET , POST , PATCH ) |
query |
An object that maps fields to the query params |
queryMapper |
The identifier of a a queryMapper that maniplates the query mappings |
body |
An object that maps fields to the request body |
requestMapper |
The identifier of a requestMapper that manipulates the request body |
responseMapper |
The identifier of a responseMapper that manipulates the response body returned by a request |
import { generateRestSchema } from '@n1ru4l/graphql-schema-generator-rest'
import { SchemaLink } from 'apollo-link-schema'
import { graphql, print } from 'graphql'
import gql from 'graphql-tag'
import fetch from 'node-fetch'
const typeDefs = gql`
type User {
id: ID!
login: String!
friends: [User]!
@rest(
route: "/users/:userId/friends"
provides: { userId: "id" } # map id from parent object to :userId route param
)
}
type Query {
user(id: ID!): User @rest(route: "/users/:id")
}
`
const schema = generateRestSchema({
typeDefs,
fetcher: fetch,
})
const link = new SchemaLink({ schema })
const query = gql`
query user {
user(id: "2") {
id
login
friends {
id
login
}
}
}
`
makePromise(execute(link, { operationName: `userProfile`, query }))
.then(console.log)
.catch(console.log)
import express from 'express'
import bodyParser from 'body-parser'
import { generateRestSchema } from '@n1ru4l/graphql-schema-generator-rest'
import { graphqlExpress, graphiqlExpress } from 'apollo-server-express'
import gql from 'graphql-tag'
import fetch from 'node-fetch'
const typeDefs = gql`
type User {
id: ID!
login: String!
friends: [User]!
@rest(
route: "/users/:userId/friends"
provides: { userId: "id" } # map id from parent object to :userId route param
)
}
type Query {
user(id: ID!): User @rest(route: "/users/:id")
}
`
const schema = generateRestSchema({
typeDefs,
fetcher: fetch,
})
const PORT = 3000
const app = express()
app.use('/graphql', bodyParser.json(), graphqlExpress({ schema }))
app.listen(PORT)
yarn test
For contributions please fork this repository.
git clone https://github.com/<your-login>/graphql-schema-generator-rest.git
cd graphql-schema-generator-rest
yarn install
Please use yarn cm
for commiting changes to git.