graphile-build
Advanced tools
Comparing version 4.0.0-rc.11 to 4.0.0-rc.12
The MIT License (MIT) | ||
===================== | ||
Copyright © `2017` Benjie Gillam | ||
Copyright © `2018` Benjie Gillam | ||
@@ -6,0 +6,0 @@ Permission is hereby granted, free of charge, to any person |
@@ -26,6 +26,6 @@ "use strict"; | ||
// eslint-disable-next-line no-console | ||
console.warn(`Recoverable error occurred; use envvar 'DEBUG="graphile-build:warn"' for full error\n> ${errorSnippet}…`); | ||
console.warn(`Recoverable error occurred; use envvar 'DEBUG="graphile-build:warn"' for full error (see: http://graphile.org/postgraphile/debugging )\n> ${errorSnippet}…`); | ||
} else { | ||
// eslint-disable-next-line no-console | ||
console.warn(`Recoverable error occurred; use envvar 'DEBUG="graphile-build:warn"' for error`); | ||
console.warn(`Recoverable error occurred; use envvar 'DEBUG="graphile-build:warn"' for error (see: http://graphile.org/postgraphile/debugging )`); | ||
} | ||
@@ -32,0 +32,0 @@ debugWarn(e); |
{ | ||
"name": "graphile-build", | ||
"version": "4.0.0-rc.11", | ||
"version": "4.0.0-rc.12", | ||
"description": "Build a GraphQL schema from plugins", | ||
@@ -35,3 +35,3 @@ "main": "node8plus/index.js", | ||
"debug": ">=2 <3", | ||
"graphql-parse-resolve-info": "4.0.0-rc.11", | ||
"graphql-parse-resolve-info": "4.0.0-rc.12", | ||
"lodash": ">=4 <5", | ||
@@ -38,0 +38,0 @@ "lru-cache": ">=4 <5", |
147
README.md
# graphile-build | ||
graphile-build provides a framework to build high-performance extensible | ||
GraphQL APIs by combining plugins and using advanced query look-ahead features. | ||
Each plugin would typically have it's own small purpose (such as implementing | ||
the Node interface, or adding `query: Query` to mutation payloads, or watching | ||
an external source for schema changes) and by combining these plugins together | ||
you get a large, powerful, and manageable GraphQL schema. Plugins enable you | ||
to make broad changes to your GraphQL schema with minimal code and without | ||
sacrificing performance. | ||
<span class="badge-patreon"><a href="https://patreon.com/benjie" title="Support Graphile development on Patreon"><img src="https://img.shields.io/badge/donate-via%20Patreon-orange.svg" alt="Patreon donate button" /></a></span> | ||
[![Discord chat room](https://img.shields.io/discord/489127045289476126.svg)](http://discord.gg/graphile) | ||
[![Package on npm](https://img.shields.io/npm/v/graphile-build.svg?style=flat)](https://www.npmjs.com/package/graphile-build) | ||
![MIT license](https://img.shields.io/npm/l/graphile-build.svg) | ||
[![Follow](https://img.shields.io/badge/twitter-@GraphileHQ-blue.svg)](https://twitter.com/GraphileHQ) | ||
An example of an application built on `graphile-build` is [PostGraphile | ||
v4+](https://github.com/graphile/postgraphile) which allows you to run just one | ||
command to instantly get a fully working and secure GraphQL API up and running | ||
based on your PostgreSQL database schema. The `graphile-build-pg` module | ||
contains the plugins that are specific to PostgreSQL support (`graphile-build` | ||
itself does not know about databases). | ||
`graphile-build` is the core of Graphile Engine. It provides a framework to | ||
build high-performance extensible GraphQL APIs by combining plugins and using | ||
advanced query look-ahead features. Each plugin typically has its own small | ||
purpose (such as implementing the Node interface, adding `query: Query` to | ||
mutation payloads, or watching an external source for schema changes) and by | ||
combining these plugins together you get a large, powerful, and manageable | ||
GraphQL schema. Plugins enable you to make broad changes to your GraphQL | ||
schema with minimal code and without sacrificing performance. | ||
An example of an application built on `graphile-build` is | ||
[PostGraphile](https://github.com/graphile/postgraphile) which with one | ||
command connects to your PostgreSQL database and provides a full highly | ||
performant standards-compliant GraphQL API. The separate `graphile-build-pg` | ||
module contains the plugins that are specific to PostgreSQL support | ||
(`graphile-build` itself does not know about databases). | ||
**For in-depth documentation about `graphile-build`, please see [the graphile | ||
documentation website](https://www.graphile.org/).** The below just serves as a | ||
limited quick-reference for people already familiar with the library. | ||
documentation website at graphile.org](https://www.graphile.org/).** The | ||
below just serves as a limited quick-reference for people already familiar | ||
with the library. | ||
**Please note: rather than using the very raw plugin interface as shown below, | ||
you may want to use the helpers in `graphile-utils`.** | ||
## Usage | ||
The following [runnable example][] creates a plugin that hooks the | ||
'GraphQLObjectType:fields' event in the system and adds a 'random' field to | ||
every object everywhere (including the root Query). | ||
```js | ||
const { buildSchema, defaultPlugins } = require("graphile-build"); | ||
// or import { buildSchema, defaultPlugins } from 'graphile-build'; | ||
// Create a simple plugin that adds a random field to every GraphQLObject | ||
function MyRandomFieldPlugin( | ||
builder, | ||
{ myDefaultMin = 1, myDefaultMax = 100 } | ||
) { | ||
builder.hook("GraphQLObjectType:fields", (fields, build) => { | ||
const { | ||
extend, | ||
graphql: { GraphQLInt }, | ||
} = build; | ||
return extend(fields, { | ||
random: { | ||
type: GraphQLInt, | ||
args: { | ||
sides: { | ||
type: GraphQLInt, | ||
}, | ||
}, | ||
resolve(_, { sides = myDefaultMax }) { | ||
return ( | ||
Math.floor(Math.random() * (sides + 1 - myDefaultMin)) + | ||
myDefaultMin | ||
); | ||
}, | ||
}, | ||
}); | ||
}); | ||
} | ||
// ---------------------------------------- | ||
const { graphql } = require("graphql"); | ||
(async function() { | ||
// Create our GraphQL schema by applying all the plugins | ||
const schema = await buildSchema([...defaultPlugins, MyRandomFieldPlugin], { | ||
// ... options | ||
myDefaultMin: 1, | ||
myDefaultMax: 6, | ||
}); | ||
// Run our query | ||
const result = await graphql( | ||
schema, | ||
` | ||
query { | ||
random | ||
} | ||
`, | ||
null, | ||
{} | ||
); | ||
console.log(result); // { data: { random: 4 } } | ||
})().catch(e => { | ||
console.error(e); | ||
process.exit(1); | ||
}); | ||
``` | ||
## Plugins | ||
Plugins can be asynchronous functions (simply define them as `async function MyPlugin(builder, options) {...}` or return a Promise object). | ||
When a plugin first runs, it should do any of its asynchronous work, and then | ||
return. Schema generation itself (i.e. firing of hooks) is synchronous | ||
(deliberately). | ||
Most plugins will be of the form: | ||
```js | ||
function MyRandomPlugin(builder) { | ||
builder.hook("HOOK_NAME_HERE", ( | ||
// 'inputValue' - the value to replace with the return result | ||
inputValue, | ||
// 'build' - a frozen collection of utils and stores for this build, | ||
// not available during the 'build' event | ||
{ extend /* ... */ }, | ||
// 'context' - more information about the current object | ||
{ scope: { isMyRandomObject /* ... */ } /* ... */ } | ||
) => { | ||
if (!isMyRandomObject) { | ||
// Exit early if this doesn't have the scope we want | ||
return inputValue; | ||
} | ||
return extend(inputValue, { | ||
// add additional attributes here... | ||
}); | ||
}); | ||
} | ||
``` | ||
[runnable example]: examples/README-1.js | ||
**Please note: rather than using the raw plugin interface that | ||
`graphile-build` exposes, you may want to use the helpers in | ||
the `graphile-utils` module.** |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
252298
32
+ Addedgraphql-parse-resolve-info@4.0.0-rc.12(transitive)
- Removedgraphql-parse-resolve-info@4.0.0-rc.11(transitive)