# Static page generator for documenting GraphQL Schema
[](https://github.com/2fd/graphdoc/actions?query=workflow%3Abuild+branch%3Amaster+)
[](https://coveralls.io/github/2fd/graphdoc?branch=master)


- [demos](#demos)
- [install](#install)
- [use](#use)
- [plugin](#plugin)
- [template](#template)
- [contributors](#contributors)
## Demos
- Facebook Test [Star Wars](https://2fd.github.io/graphdoc/star-wars)
- [Github V4 API](https://2fd.github.io/graphdoc/github)
- [Shopify API](https://2fd.github.io/graphdoc/shopify/)
- [Pokemon GraphQL](https://2fd.github.io/graphdoc/pokemon)
## Install
```bash
npm install -g @2fd/graphdoc
```
## Use
### Generate documentation from live endpoint
```bash
> graphdoc -e http://localhost:8080/graphql -o ./doc/schema
```
### Generate documentation from IDL file
```bash
> graphdoc -s ./schema.graphql -o ./doc/schema
```
### Generate documentation from for the ["modularized schema"](http://dev.apollodata.com/tools/graphql-tools/generate-schema.html#modularizing) of graphql-tools
```bash
> graphdoc -s ./schema.js -o ./doc/schema
```
> [`./schema.graphql`](https://github.com/2fd/graphdoc/blob/master/test/starwars.graphql) must be able to be interpreted
> with [graphql-js/utilities#buildSchema](http://graphql.org/graphql-js/utilities/#buildschema)
### Generate documentation from json file
```bash
> graphdoc -s ./schema.json -o ./doc/schema
```
> `./schema.json` contains the result of [GraphQL introspection
> query](https://github.com/2fd/graphdoc/blob/gh-pages/introspection.graphql)
### Puts the options in your `package.json`
```javascript
// package.json
{
"name": "project",
"graphdoc": {
"endpoint": "http://localhost:8080/graphql",
"output": "./doc/schema",
}
}
```
And execute
```bash
> graphdoc
```
### Help
```bash
> graphdoc -h
Static page generator for documenting GraphQL Schema v2.4.0
Usage: node bin/graphdoc.js [OPTIONS]
[OPTIONS]:
-c, --config Configuration file [./package.json].
-e, --endpoint Graphql http endpoint ["https://domain.com/graphql"].
-x, --header HTTP header for request (use with --endpoint). ["Authorization: Token cb8795e7"].
-q, --query HTTP querystring for request (use with --endpoint) ["token=cb8795e7"].
-s, --schema, --schema-file Graphql Schema file ["./schema.json"].
-p, --plugin Use plugins [default=graphdoc/plugins/default].
-t, --template Use template [default=graphdoc/template/slds].
-o, --output Output directory.
-d, --data Inject custom data.
-b, --base-url Base url for templates.
-f, --force Delete outputDirectory if exists.
-v, --verbose Output more information.
-V, --version Show graphdoc version.
-h, --help Print this help
```
## Plugin
In graphdoc a plugin is simply an object that controls the content that is displayed
on every page of your document.
This object should only implement the
[`PluginInterface`](https://github.com/2fd/graphdoc/blob/master/lib/interface.d.ts#L12-L117).
### Make a Plugin
To create your own plugin you should only create it as a `plain object`
or a `constructor` and export it as `default`
If you export your plugin as a constructor, when going to be initialized,
will receive three parameters
- `schema`: The full the result of [GraphQL introspection query](https://github.com/2fd/graphdoc/blob/gh-pages/introspection.graphql)
- `projectPackage`: The content of `package.json` of current project (or the content of file defined with `--config`
flag).
- `graphdocPackage`: The content of `package.json` of graphdoc.
> For performance reasons all plugins receive the reference to the same object
> and therefore should not modify them directly as it could affect the behavior
> of other plugins (unless of course that is your intention)
#### Examples
```typescript
// es2015 export constructor
export default class MyPlugin {
constructor(schema, projectPackage, graphdocPackage) {}
getAssets() {
/* ... */
}
}
```
```typescript
// es2015 export plain object
export default cost myPlugin = {
getAssets() {
/* ... */
},
}
```
```javascript
// export constructor
function MyPlugin(schema, projectPackage, graphdocPackage) {
/* ... */
}
MyPlugin.prototype.getAssets = function() {
/* ... */
};
exports.default = MyPlugin;
```
```javascript
// export plain object
exports.default = {
getAssets: function() {
/* ... */
}
};
```
### Use plugin
You can use the plugins in 2 ways.
#### Use plugins with command line
```bash
> graphdoc -p graphdoc/plugins/default \
-p some-dependencies/plugin \
-p ./lib/plugin/my-own-plugin \
-s ./schema.json -o ./doc/schema
```
#### Use plugins with `package.json`
```javascript
// package.json
{
"name": "project",
"graphdoc": {
"endpoint": "http://localhost:8080/graphql",
"output": "./doc/schema",
"plugins": [
"graphdoc/plugins/default",
"some-dependencie/plugin",
"./lib/plugin/my-own-plugin"
]
}
}
```
### Build-in plugin
> TODO
## Template
> TODO
## Contributors
- [
dependabot-preview[bot]](https://github.com/apps/dependabot-preview)
- [
bitliner](https://github.com/bitliner)
- [
kbariotis](https://github.com/kbariotis)
- [
0xflotus](https://github.com/0xflotus)
- [
Joatin](https://github.com/Joatin)
- [
shiroyuki](https://github.com/shiroyuki)
- [
kristiehowboutdat](https://github.com/kristiehowboutdat)
- [
tony](https://github.com/tony)
- [
dnalborczyk](https://github.com/dnalborczyk)