https://github.com/OneGraph/graphiql-code-exporter
https://github.com/OneGraph/graphiql-code-exporter
Last synced: 10 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/OneGraph/graphiql-code-exporter
- Owner: OneGraph
- License: mit
- Created: 2019-01-17T11:58:35.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2022-12-09T01:46:29.000Z (about 3 years ago)
- Last Synced: 2025-03-22T20:45:10.695Z (10 months ago)
- Language: JavaScript
- Size: 9.73 MB
- Stars: 82
- Watchers: 3
- Forks: 11
- Open Issues: 22
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-list - graphiql-code-exporter
README
# Code Exporter for GraphiQL
A GraphiQL addon that generates ready-to-run code for your queries and mutations.
It provides a wide range of default snippets, but is also extendable with custom snippets.
[](https://bundlephobia.com/result?p=graphiql-code-exporter)

> Read the [introduction blog post](https://www.onegraph.com/blog/2019/05/03_Filling_in_the_GraphQL_Pipeline_Ready_to_use_code_generation.html) to learn why and how we built it!
## Installation
```sh
# yarn
yarn add graphiql-code-exporter
# npm
npm i --save graphiql-code-exporter
```
## Built-in Snippets
- **JavaScript**
- fetch
- react-apollo
[ < your favorite language/framework/library > ](https://github.com/OneGraph/graphiql-code-exporter/pulls)
## Usage
```javascript
import React, { Component, Fragment } from 'react'
import GraphiQL from 'graphiql'
import CodeExporter from 'graphiql-code-exporter'
import 'graphiql-code-exporter/CodeExporter.css';
// Optional if you want to use a custom theme
import 'codemirror/theme/neo.css';
const serverUrl = /* your server url here */
export default class GraphiQLWithCodeExporter extends Component {
state = {
codeExporterIsVisible: false,
query: ''
}
toggleCodeExporter = () => this.setState({
codeExporterIsVisible: !this.state.codeExporterIsVisible
})
updateQuery = query => this.setState({
query
})
render() {
const { query, codeExporterIsVisible } = this.state
const codeExporter = codeExporterIsVisible ? (
) : null
return (
{codeExporter}
)
}
}
```
## Props
| Property | Type | Description |
| ---------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| hideCodeExporter | _Function_ | A callback function that is called when clicking the close (x) button in the upper right corner of the panel. |
| serverUrl | _URI_ | The server url for your GraphQL endpoint. |
| query | _string_ | A string containing the GraphQL query that is synced with the GraphiQL query editor. |
| snippets | _Snippet[]_ | A list of snippet objects that one can choose from to generate code snippets. |
| headers | _Object?_ | An optional object containing app specific HTTP headers |
| context | _Object?_ | An optional object containing any additional keys required to render app specific snippets |
| codeMirrorTheme | _string?_ | The name of the [CodeMirror theme](https://codemirror.net/demo/theme.html) you'd like to use e.g. `neo`. Make sure to also import the theme's css in your code (e.g. `import 'codemirror/theme/neo.css')` |
## Snippets
What we call **snippet** here, is actually an object with 4 required keys.
| Key | Type | Description |
|--------------------------|------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | _string_ | A name that is used to identify the snippet. |
| language | _string_ | A language string that is used to group the snippets by language. |
| codeMirrorMode | _string_ | A valid [CodeMirror mode](https://codemirror.net/mode/) used for syntax highlighting. Make sure to also require the mode (e.g. `import 'codemirror/mode/jsx/jsx'` |
| options | _Option[]_ | Options are rendered as checkboxes and can be used to customize snippets. They must have an unique id, a label and an initial value of either true or false. |
| generate | _Function_ | A function that returns the generated code as a single string. It receives below listed data as an object. |
| generateCodesandboxFiles | _Function_ | A function that returns a set of codesandbox files, e.g. `{'index.js': {content: 'console.log("hello world")'}}`. It receives below listed data as an object. |
#### Snippet Data
| Key | Type | Description |
| ---------- | ------------- | --------------------------------------------------------------------------------------- |
| serverUrl | _string_ | The passed GraphQL server url |
| operations | _Operation[]_ | A list of GraphQL operations where each operation has the [operation](#operation) keys. |
| options | *Object* | A map of option-boolean pairs providing whether an option is selected or not |
| headers | _Object?_ | The `headers` object that is passed to the CodeExporter component |
| context | _Object?_ | The `context` object that is passed to the CodeExporter component |
##### Operation
| Key | Type | Description |
| ------------ | ----------------------- | --------------------------------------------------------------------------------------------------------- |
| name | _string_ | The selected GraphQL operation name |
| type | _"query" \| "mutation"_ | The selected operation's type |
| query | *string* | A formatted string containing the GraphQL operation | |
| variableName | _string_ | The operation name but in UPPER_CASE as that's the common way to declare GraphQL operations in JavaScript |
| operation | _Object_ | The plain GraphQL parser result for this operation |
| variables | _Object_ | A map of all used variables for this specific operation |
#### Example
The following example implements a subset of the built-in _Fetch API_ snippet.
The output will look similar to the demo above.
```javascript
const fetchSnippet = {
language: 'JavaScript',
prismLanguage: 'javascript',
name: 'Fetch API',
options: [
{
id: 'server',
label: 'server-side usage',
initial: false,
},
],
generate: ({serverUrl, operations, options}) => {
// we only render the first operation here
const {query} = operations[0];
const serverImport = options.server
? 'import { fetch } from "node-fetch"'
: '';
return `
${serverImport}
const res = await fetch("${serverUrl}", {
method: 'POST',
body: JSON.stringify({ query: \`${query}\` }),
})
const { errors, data } = await res.json()
// Do something with the response
console.log(data, errors)
`;
},
};
```
#### Extending the built-in snippets
If we want to use both custom and all the built-in snippets, we can import them from npm.
```javascript
import snippets from 'graphiql-code-exporter/lib/snippets'
const customSnippet = /* custom snippet */
const extendedSnippets = [
...snippets,
customSnippet
]
```
This is also useful if you want to filter or modify single snippets.
## License
graphiql-code-exporter is licensed under the [MIT License](http://opensource.org/licenses/MIT).
Documentation is licensed under [Creative Common License](http://creativecommons.org/licenses/by/4.0/).
Created with ♥ by [@rofrischmann](http://rofrischmann.de) and all the great contributors.