diff --git a/e2e-tests/development-runtime/cypress/integration/functionality/graphql-endpoint.js b/e2e-tests/development-runtime/cypress/integration/functionality/graphql-endpoint.js
index 4de5f2ca96c2c..ede60970d927f 100644
--- a/e2e-tests/development-runtime/cypress/integration/functionality/graphql-endpoint.js
+++ b/e2e-tests/development-runtime/cypress/integration/functionality/graphql-endpoint.js
@@ -1,10 +1,36 @@
const endpoints = [`/___graphql`, `/_graphql`, `/___graphiql`]
+const testQueryString = `?query=${encodeURIComponent(`{
+ site {
+ siteMetadata {
+ title
+ }
+ }
+}`)}`
+
describe(`The GraphQL endpoint`, () => {
endpoints.forEach(endpoint => {
it(`Should appear on ${endpoint}`, () => {
cy.visit(endpoint)
cy.title().should(`eq`, `GraphiQL`)
})
+
+ it(`Should execute queries from query string on ${endpoint}`, () => {
+ // prefill query from query string
+ cy.visit(endpoint + testQueryString)
+ cy.get(`.execute-button`).click()
+ cy.get(`.result-window .CodeMirror-code`).contains(
+ `Gatsby Default Starter`
+ )
+ })
+
+ it(`Should execute queries created with explorer on ${endpoint}`, () => {
+ // hack to show (almost) empty editor instead of
+ cy.visit(endpoint + `?query=%20`)
+ cy.get(`[data-field-name="site"]`).click()
+ cy.get(`[data-field-name="port"]`).click()
+ cy.get(`.execute-button`).click()
+ cy.get(`.result-window .CodeMirror-code`).contains(`8000`)
+ })
})
})
diff --git a/packages/gatsby-graphiql-explorer/.gitignore b/packages/gatsby-graphiql-explorer/.gitignore
new file mode 100644
index 0000000000000..60fa326678537
--- /dev/null
+++ b/packages/gatsby-graphiql-explorer/.gitignore
@@ -0,0 +1,3 @@
+/*.js
+/*.html
+yarn.lock
diff --git a/packages/gatsby-graphiql-explorer/.npmignore b/packages/gatsby-graphiql-explorer/.npmignore
new file mode 100644
index 0000000000000..d0e77c8f69da4
--- /dev/null
+++ b/packages/gatsby-graphiql-explorer/.npmignore
@@ -0,0 +1,34 @@
+# Logs
+logs
+*.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directory
+# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
+node_modules
+*.un~
+yarn.lock
+src
+flow-typed
+coverage
+decls
+examples
\ No newline at end of file
diff --git a/packages/gatsby-graphiql-explorer/README.md b/packages/gatsby-graphiql-explorer/README.md
new file mode 100644
index 0000000000000..fae0ad4bd8cb7
--- /dev/null
+++ b/packages/gatsby-graphiql-explorer/README.md
@@ -0,0 +1,16 @@
+# gatsby-graphiql-explorer
+
+A package to extend the default [GraphiQL][graphiql] IDE with useful features for Gatsby users.
+
+_Note:_ accessible at http://localhost:8000/___graphql after running `gatsby develop`
+
+![Gatsby GraphiQL Explorer](./assets/gatsby-graphiql-explorer.png)
+
+## Features
+
+- Offline support - for when you need to work on your excellent Gatsby app on a plane, train, or elsewhere off the grid
+- [GraphiQL Explorer][graphiql-explorer] - an interactive explorer plugin to visually create and interact with the GraphQL schema
+- _All_ the expected features you know and love from [GraphiQL][graphiql]
+
+[graphiql]: https://github.com/graphql/graphiql
+[graphiql-explorer]: https://github.com/OneGraph/graphiql-explorer
diff --git a/packages/gatsby-graphiql-explorer/assets/gatsby-graphiql-explorer.png b/packages/gatsby-graphiql-explorer/assets/gatsby-graphiql-explorer.png
new file mode 100644
index 0000000000000..e4bf20233fcca
Binary files /dev/null and b/packages/gatsby-graphiql-explorer/assets/gatsby-graphiql-explorer.png differ
diff --git a/packages/gatsby-graphiql-explorer/package.json b/packages/gatsby-graphiql-explorer/package.json
new file mode 100644
index 0000000000000..baec8baf6981e
--- /dev/null
+++ b/packages/gatsby-graphiql-explorer/package.json
@@ -0,0 +1,53 @@
+{
+ "name": "gatsby-graphiql-explorer",
+ "version": "0.0.1",
+ "description": "GraphiQL IDE with custom features for Gatsby users",
+ "main": "index.js",
+ "scripts": {
+ "build:app": "webpack --config ./src/app/webpack.config.js",
+ "build:babel": "babel src/index.js --out-dir . --ignore **/__tests__",
+ "build": "npm-run-all --parallel build:app build:babel",
+ "prepare": "cross-env NODE_ENV=production npm run build",
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "watch:app": "npm run build:app -- --watch",
+ "watch:babel": "npm run build:babel -- --watch",
+ "watch": "npm-run-all --parallel watch:app watch:babel"
+ },
+ "keywords": [
+ "gatsby"
+ ],
+ "author": "",
+ "bugs": {
+ "url": "https://github.com/gatsbyjs/gatsby/issues"
+ },
+ "homepage": "https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-graphiql-explorer#readme",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/gatsbyjs/gatsby.git"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.0.0",
+ "graphiql": "^0.13.0",
+ "graphiql-explorer": "^0.3.7",
+ "react": "^16.8.6",
+ "react-dom": "^16.8.6",
+ "whatwg-fetch": "^3.0.0"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.0.0",
+ "@babel/core": "^7.0.0",
+ "@babel/plugin-proposal-class-properties": "^7.0.0",
+ "@babel/plugin-transform-runtime": "^7.0.0",
+ "@babel/preset-env": "^7.4.1",
+ "@babel/preset-react": "^7.0.0",
+ "babel-loader": "^8.0.0",
+ "babel-preset-gatsby-package": "^0.1.4",
+ "cross-env": "^5.0.5",
+ "css-loader": "^1.0.0",
+ "html-webpack-plugin": "^3.2.0",
+ "npm-run-all": "4.1.5",
+ "style-loader": "^0.21.0",
+ "webpack-cli": "^3.3.2"
+ }
+}
diff --git a/packages/gatsby-graphiql-explorer/src/app/app.css b/packages/gatsby-graphiql-explorer/src/app/app.css
new file mode 100644
index 0000000000000..a72ee264fbf16
--- /dev/null
+++ b/packages/gatsby-graphiql-explorer/src/app/app.css
@@ -0,0 +1,19 @@
+body {
+ margin: 0;
+ padding: 0;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
+ "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
+ sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+code {
+ font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
+ monospace;
+}
+
+.graphiql-container {
+ height: 100vh;
+ width: 100vw;
+}
diff --git a/packages/gatsby-graphiql-explorer/src/app/app.js b/packages/gatsby-graphiql-explorer/src/app/app.js
new file mode 100644
index 0000000000000..1ebc27f62f38a
--- /dev/null
+++ b/packages/gatsby-graphiql-explorer/src/app/app.js
@@ -0,0 +1,247 @@
+import React from "react"
+import ReactDOM from "react-dom"
+
+import GraphiQL from "graphiql"
+import GraphiQLExplorer from "graphiql-explorer"
+import { getIntrospectionQuery, buildClientSchema } from "graphql"
+
+import "whatwg-fetch"
+
+import "graphiql/graphiql.css"
+import "./app.css"
+
+const parameters = {}
+window.location.search
+ .substr(1)
+ .split(`&`)
+ .forEach(function(entry) {
+ var eq = entry.indexOf(`=`)
+ if (eq >= 0) {
+ parameters[decodeURIComponent(entry.slice(0, eq))] = decodeURIComponent(
+ entry.slice(eq + 1)
+ )
+ }
+ })
+// Produce a Location query string from a parameter object.
+function locationQuery(params) {
+ return (
+ `?` +
+ Object.keys(params)
+ .filter(function(key) {
+ return Boolean(params[key])
+ })
+ .map(function(key) {
+ return encodeURIComponent(key) + `=` + encodeURIComponent(params[key])
+ })
+ .join(`&`)
+ )
+}
+
+// Derive a fetch URL from the current URL, sans the GraphQL parameters.
+const graphqlParamNames = {
+ query: true,
+ variables: true,
+ operationName: true,
+}
+const otherParams = {}
+for (var k in parameters) {
+ if (parameters.hasOwnProperty(k) && graphqlParamNames[k] !== true) {
+ otherParams[k] = parameters[k]
+ }
+}
+const fetchURL = locationQuery(otherParams)
+
+function graphQLFetcher(graphQLParams) {
+ return fetch(fetchURL, {
+ method: `post`,
+ headers: {
+ Accept: `application/json`,
+ "Content-Type": `application/json`,
+ },
+ body: JSON.stringify(graphQLParams),
+ credentials: `include`,
+ }).then(function(response) {
+ return response.json()
+ })
+}
+
+// When the query and variables string is edited, update the URL bar so
+// that it can be easily shared.
+function onEditVariables(newVariables) {
+ parameters.variables = newVariables
+ updateURL()
+}
+function onEditOperationName(newOperationName) {
+ parameters.operationName = newOperationName
+ updateURL()
+}
+function updateURL() {
+ history.replaceState(null, null, locationQuery(parameters))
+}
+
+// We control query, so we need to recreate initial query text that show up
+// on visiting graphiql - in order it will be
+// - query from query string (if set)
+// - query stored in localStorage (which graphiql set when closing window)
+// - default empty query
+const DEFAULT_QUERY =
+ parameters.query ||
+ (window.localStorage && window.localStorage.getItem(`graphiql:query`)) ||
+ null
+
+const QUERY_EXAMPLE_SITEMETADATA_TITLE = `# {
+# site {
+# siteMetadata {
+# title
+# }
+# }
+# }`
+
+const QUERY_EXAMPLE_FALLBACK = `# {
+# allSitePage {
+# nodes {
+# path
+# }
+# }
+# }`
+
+function generateDefaultFallbackQuery(queryExample) {
+ return `# Welcome to GraphiQL
+#
+# GraphiQL is an in-browser tool for writing, validating, and
+# testing GraphQL queries.
+#
+# Type queries into this side of the screen, and you will see intelligent
+# typeaheads aware of the current GraphQL type schema and live syntax and
+# validation errors highlighted within the text.
+#
+# GraphQL queries typically start with a "{" character. Lines that starts
+# with a # are ignored.
+#
+# An example GraphQL query might look like:
+#
+${queryExample}
+#
+# Keyboard shortcuts:
+#
+# Prettify Query: Shift-Ctrl-P (or press the prettify button above)
+#
+# Merge Query: Shift-Ctrl-M (or press the merge button above)
+#
+# Run Query: Ctrl-Enter (or press the play button above)
+#
+# Auto Complete: Ctrl-Space (or just start typing)
+#
+`
+}
+
+const storedExplorerPaneState = window.localStorage
+ ? window.localStorage.getItem(`graphiql:graphiqlExplorerOpen`) !== `false`
+ : true
+
+class App extends React.Component {
+ state = {
+ schema: null,
+ query: DEFAULT_QUERY,
+ explorerIsOpen: storedExplorerPaneState,
+ }
+
+ componentDidMount() {
+ graphQLFetcher({
+ query: getIntrospectionQuery(),
+ }).then(result => {
+ const newState = { schema: buildClientSchema(result.data) }
+
+ if (this.state.query === null) {
+ try {
+ const siteMetadataType = result.data.__schema.types.find(
+ type => type.name === `SiteSiteMetadata` && type.kind === `OBJECT`
+ )
+ if (siteMetadataType) {
+ const titleField = siteMetadataType.fields.find(
+ field =>
+ field.name === `title` &&
+ field.type &&
+ field.type.kind === `SCALAR` &&
+ field.type.name === `String`
+ )
+
+ if (titleField) {
+ newState.query = generateDefaultFallbackQuery(
+ QUERY_EXAMPLE_SITEMETADATA_TITLE
+ )
+ }
+ }
+ // eslint-disable-next-line no-empty
+ } catch {}
+ if (!newState.query) {
+ newState.query = generateDefaultFallbackQuery(QUERY_EXAMPLE_FALLBACK)
+ }
+ }
+
+ this.setState(newState)
+ })
+ }
+
+ _handleEditQuery = query => {
+ parameters.query = query
+ updateURL()
+ this.setState({ query })
+ }
+
+ _handleToggleExplorer = () => {
+ const newExplorerIsOpen = !this.state.explorerIsOpen
+ if (window.localStorage) {
+ window.localStorage.setItem(
+ `graphiql:graphiqlExplorerOpen`,
+ newExplorerIsOpen
+ )
+ }
+ this.setState({ explorerIsOpen: newExplorerIsOpen })
+ }
+
+ render() {
+ const { query, schema } = this.state
+
+ return (
+
+
+ (this._graphiql = ref)}
+ fetcher={graphQLFetcher}
+ schema={schema}
+ query={query}
+ onEditQuery={this._handleEditQuery}
+ onEditVariables={onEditVariables}
+ onEditOperationName={onEditOperationName}
+ >
+
+ this._graphiql.handlePrettifyQuery()}
+ label="Prettify"
+ title="Prettify Query (Shift-Ctrl-P)"
+ />
+ this._graphiql.handleToggleHistory()}
+ label="History"
+ title="Show History"
+ />
+
+
+
+
+ )
+ }
+}
+
+ReactDOM.render(, document.getElementById(`root`))
diff --git a/packages/gatsby-graphiql-explorer/src/app/index.ejs b/packages/gatsby-graphiql-explorer/src/app/index.ejs
new file mode 100644
index 0000000000000..a6455349fbd0d
--- /dev/null
+++ b/packages/gatsby-graphiql-explorer/src/app/index.ejs
@@ -0,0 +1,17 @@
+
+
+
+
+ GraphiQL
+
+
+
+
+
+ Loading...
+
+
+
diff --git a/packages/gatsby-graphiql-explorer/src/app/webpack.config.js b/packages/gatsby-graphiql-explorer/src/app/webpack.config.js
new file mode 100644
index 0000000000000..941f7560d2568
--- /dev/null
+++ b/packages/gatsby-graphiql-explorer/src/app/webpack.config.js
@@ -0,0 +1,72 @@
+const path = require(`path`)
+const HtmlWebpackPlugin = require(`html-webpack-plugin`)
+const webpack = require(`webpack`)
+
+const mode = `production`
+module.exports = {
+ entry: path.join(__dirname, `app.js`),
+ mode,
+ output: {
+ path: path.join(__dirname, `..`, `..`),
+ filename: `./app.js`,
+ },
+ devtool: false,
+ module: {
+ rules: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ use: {
+ loader: `babel-loader`,
+ options: {
+ presets: [
+ [
+ `@babel/preset-env`,
+ {
+ corejs: 2,
+ loose: true,
+ modules: `commonjs`,
+ useBuiltIns: `usage`,
+ targets: [`>0.25%`, `not dead`],
+ },
+ ],
+ [
+ `@babel/preset-react`,
+ {
+ useBuiltIns: true,
+ pragma: `React.createElement`,
+ development: false,
+ },
+ ],
+ ],
+ plugins: [
+ [
+ `@babel/plugin-proposal-class-properties`,
+ {
+ loose: true,
+ },
+ ],
+ ],
+ },
+ },
+ },
+ {
+ test: /\.css$/,
+ use: [{ loader: `style-loader` }, { loader: `css-loader` }],
+ },
+ ],
+ },
+ plugins: [
+ new HtmlWebpackPlugin({
+ template: path.resolve(__dirname, `index.ejs`),
+ filename: `index.html`,
+ inject: false,
+ }),
+ new webpack.DefinePlugin({
+ "process.env.NODE_ENV": JSON.stringify(mode),
+ }),
+ ],
+ stats: {
+ warnings: false,
+ },
+}
diff --git a/packages/gatsby-graphiql-explorer/src/index.js b/packages/gatsby-graphiql-explorer/src/index.js
new file mode 100644
index 0000000000000..8efd4243195b1
--- /dev/null
+++ b/packages/gatsby-graphiql-explorer/src/index.js
@@ -0,0 +1,13 @@
+const path = require(`path`)
+
+module.exports = (expressApp, { graphqlEndpoint }) => {
+ const bundleUrlHandler = path.posix.join(graphqlEndpoint, `app.js`)
+ expressApp.get(bundleUrlHandler, (req, res) => {
+ res.set(`Cache-Control`, `public, max-age=31557600`)
+ res.sendFile(path.join(__dirname, `app.js`))
+ })
+
+ expressApp.get(graphqlEndpoint, (req, res) => {
+ res.sendFile(path.join(__dirname, `index.html`))
+ })
+}
diff --git a/packages/gatsby/package.json b/packages/gatsby/package.json
index a77dac4dc868b..3aae49e0fa555 100644
--- a/packages/gatsby/package.json
+++ b/packages/gatsby/package.json
@@ -67,6 +67,7 @@
"fs-exists-cached": "1.0.0",
"fs-extra": "^5.0.0",
"gatsby-cli": "^2.6.2",
+ "gatsby-graphiql-explorer": "0.0.1",
"gatsby-link": "^2.1.1",
"gatsby-plugin-page-creator": "^2.0.13",
"gatsby-react-router-scroll": "^2.0.7",
diff --git a/packages/gatsby/src/commands/develop.js b/packages/gatsby/src/commands/develop.js
index 910ff74218d64..a80dc1ed59f04 100644
--- a/packages/gatsby/src/commands/develop.js
+++ b/packages/gatsby/src/commands/develop.js
@@ -9,6 +9,7 @@ const express = require(`express`)
const graphqlHTTP = require(`express-graphql`)
const graphqlPlayground = require(`graphql-playground-middleware-express`)
.default
+const graphiqlExplorer = require(`gatsby-graphiql-explorer`)
const { formatError } = require(`graphql`)
const got = require(`got`)
const rl = require(`readline`)
@@ -136,6 +137,10 @@ async function startServer(program) {
}),
() => {}
)
+ } else {
+ graphiqlExplorer(app, {
+ graphqlEndpoint,
+ })
}
app.use(
@@ -144,8 +149,7 @@ async function startServer(program) {
const schema = store.getState().schema
return {
schema,
- graphiql:
- process.env.GATSBY_GRAPHQL_IDE === `playground` ? false : true,
+ graphiql: false,
context: withResolverContext({}, schema),
formatError(err) {
return {
diff --git a/yarn.lock b/yarn.lock
index 632e8999087ac..2e975bac1e244 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6191,6 +6191,19 @@ code-point-at@^1.0.0:
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+codemirror-graphql@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/codemirror-graphql/-/codemirror-graphql-0.7.1.tgz#64b995643d511b9aa8f85eeeb2feac7aeb4b94d4"
+ integrity sha512-HtHXMJAn6iGJYpijkzi3IlqWIdGrB6V0RqJ607yffJTCKk/OgaNtdLOb8hZJyEtHfkw7PZDaKybMAVCi6ScWSQ==
+ dependencies:
+ graphql-language-service-interface "^1.3.2"
+ graphql-language-service-parser "^1.2.2"
+
+codemirror@^5.26.0:
+ version "5.47.0"
+ resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.47.0.tgz#c13a521ae5660d3acc655af252f4955065293789"
+ integrity sha512-kV49Fr+NGFHFc/Imsx6g180hSlkGhuHxTSDDmDHOuyln0MQYFLixDY4+bFkBVeCEiepYfDimAF/e++9jPJk4QA==
+
codepage@~1.14.0:
version "1.14.0"
resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99"
@@ -10424,6 +10437,20 @@ graceful-fs@^4.1.15, graceful-fs@^4.1.9:
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
+graphiql-explorer@^0.3.7:
+ version "0.3.7"
+ resolved "https://registry.yarnpkg.com/graphiql-explorer/-/graphiql-explorer-0.3.7.tgz#92f1c0860d6371754373cb5107db8672dc3ee381"
+ integrity sha512-i24+xTe012/OAMFH/r9YL5QarSr/YqkP0Si0NspCnXKmJv7HzHueFUTRpFRPF1Ka9dLqiszrmOg/5stU4gCQnA==
+
+graphiql@^0.13.0:
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/graphiql/-/graphiql-0.13.0.tgz#8fcbfd25f73d84806ba6d3e8c96eac0a5bec8ab7"
+ integrity sha512-m2RBtSY1CQLz4XqCftQC0V9ZcbUXEx2Uwvuok3L/TJtsN5HOHUmPxGhOAZs7mESaAsg7Z8Tgy04BmYirDyfWug==
+ dependencies:
+ codemirror "^5.26.0"
+ codemirror-graphql "^0.7.1"
+ markdown-it "^8.4.0"
+
graphql-compose@^6.3.2:
version "6.3.2"
resolved "https://registry.yarnpkg.com/graphql-compose/-/graphql-compose-6.3.2.tgz#0eff6e0f086c934af950db88b90a6667f879c59b"
@@ -10432,6 +10459,17 @@ graphql-compose@^6.3.2:
graphql-type-json "^0.2.4"
object-path "^0.11.4"
+graphql-config@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-2.0.1.tgz#d34a9bdf1d7360af7b01db9b20260a342ddc7390"
+ integrity sha512-eb4FzlODifHE/Q+91QptAmkGw39wL5ToinJ2556UUsGt2drPc4tzifL+HSnHSaxiIbH8EUhc/Fa6+neinF04qA==
+ dependencies:
+ graphql-import "^0.4.4"
+ graphql-request "^1.5.0"
+ js-yaml "^3.10.0"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+
graphql-config@^2.0.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-2.2.0.tgz#fe1529eb5b77d0bf5cb32b8bbda2f5e7db622d97"
@@ -10443,6 +10481,13 @@ graphql-config@^2.0.1:
lodash "^4.17.4"
minimatch "^3.0.4"
+graphql-import@^0.4.4:
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/graphql-import/-/graphql-import-0.4.5.tgz#e2f18c28d335733f46df8e0733d8deb1c6e2a645"
+ integrity sha512-G/+I08Qp6/QGTb9qapknCm3yPHV0ZL7wbaalWFpxsfR8ZhZoTBe//LsbsCKlbALQpcMegchpJhpTSKiJjhaVqQ==
+ dependencies:
+ lodash "^4.17.4"
+
graphql-import@^0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/graphql-import/-/graphql-import-0.7.1.tgz#4add8d91a5f752d764b0a4a7a461fcd93136f223"
@@ -10451,6 +10496,39 @@ graphql-import@^0.7.1:
lodash "^4.17.4"
resolve-from "^4.0.0"
+graphql-language-service-interface@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/graphql-language-service-interface/-/graphql-language-service-interface-1.3.2.tgz#4bd5d49e23766c3d2ab65d110f26f10e321cc000"
+ integrity sha512-sOxFV5sBSnYtKIFHtlmAHHVdhok7CRbvCPLcuHvL4Q1RSgKRsPpeHUDKU+yCbmlonOKn/RWEKaYWrUY0Sgv70A==
+ dependencies:
+ graphql-config "2.0.1"
+ graphql-language-service-parser "^1.2.2"
+ graphql-language-service-types "^1.2.2"
+ graphql-language-service-utils "^1.2.2"
+
+graphql-language-service-parser@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/graphql-language-service-parser/-/graphql-language-service-parser-1.2.2.tgz#010c8a5fdfae4726c8e15714137eee822753d3ea"
+ integrity sha512-38zMqJibNKeQe3GheyJtBENoXMp+qc29smiiRQtHLZcwnQfsYtu6reJZKxxwzU7XOVh3SedNH15Gf3LjWJVkiQ==
+ dependencies:
+ graphql-config "2.0.1"
+ graphql-language-service-types "^1.2.2"
+
+graphql-language-service-types@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/graphql-language-service-types/-/graphql-language-service-types-1.2.2.tgz#078e0abc7936a593968c946a039502af136a9743"
+ integrity sha512-WEAYYCP4jSzbz/Mw0Klc7HHMgtUHLgtaPMV6zyMMmvefCg/yBUkv7wREXKmqF1k1u9+f5ZX3dki0BMaXiwmJug==
+ dependencies:
+ graphql-config "2.0.1"
+
+graphql-language-service-utils@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/graphql-language-service-utils/-/graphql-language-service-utils-1.2.2.tgz#d31d4b4288085bd31d1bb8efc35790d69e496cae"
+ integrity sha512-98hzn1Dg3sSAiB+TuvNwWAoBrzuHs8NylkTK26TFyBjozM5wBZttp+T08OvOt+9hCFYRa43yRPrWcrs78KH9Hw==
+ dependencies:
+ graphql-config "2.0.1"
+ graphql-language-service-types "^1.2.2"
+
graphql-playground-html@1.6.11:
version "1.6.11"
resolved "https://registry.yarnpkg.com/graphql-playground-html/-/graphql-playground-html-1.6.11.tgz#a4e40b3d43527270722cacf7a96811c7806eb22a"
@@ -11492,6 +11570,11 @@ interpret@^1.0.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=
+interpret@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
+ integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
+
into-stream@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
@@ -13573,6 +13656,13 @@ lines-and-columns@^1.1.6:
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+linkify-it@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.1.0.tgz#c4caf38a6cd7ac2212ef3c7d2bde30a91561f9db"
+ integrity sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==
+ dependencies:
+ uc.micro "^1.0.1"
+
lint-staged@^8.0.4:
version "8.0.4"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.0.4.tgz#d3c909fcf7897152cdce2d6e42500cd9b5b41a0d"
@@ -14292,6 +14382,17 @@ markdown-escapes@^1.0.0:
resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.2.tgz#e639cbde7b99c841c0bacc8a07982873b46d2122"
integrity sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==
+markdown-it@^8.4.0:
+ version "8.4.2"
+ resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54"
+ integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==
+ dependencies:
+ argparse "^1.0.7"
+ entities "~1.1.1"
+ linkify-it "^2.0.0"
+ mdurl "^1.0.1"
+ uc.micro "^1.0.5"
+
markdown-link@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/markdown-link/-/markdown-link-0.1.1.tgz#32c5c65199a6457316322d1e4229d13407c8c7cf"
@@ -20897,6 +20998,11 @@ ua-parser-js@^0.7.18:
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed"
integrity sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==
+uc.micro@^1.0.1, uc.micro@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
+ integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
+
uglify-es@^3.3.4:
version "3.3.9"
resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
@@ -21468,6 +21574,11 @@ v8-compile-cache@^1.1.0:
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz#8d32e4f16974654657e676e0e467a348e89b0dc4"
integrity sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==
+v8-compile-cache@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe"
+ integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==
+
v8flags@^2.0.10:
version "2.1.1"
resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
@@ -21812,6 +21923,23 @@ webpack-assets-manifest@^3.0.2:
tapable "^1.0.0"
webpack-sources "^1.0.0"
+webpack-cli@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.2.tgz#aed2437b0db0a7faa2ad28484e166a5360014a91"
+ integrity sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==
+ dependencies:
+ chalk "^2.4.1"
+ cross-spawn "^6.0.5"
+ enhanced-resolve "^4.1.0"
+ findup-sync "^2.0.0"
+ global-modules "^1.0.0"
+ import-local "^2.0.0"
+ interpret "^1.1.0"
+ loader-utils "^1.1.0"
+ supports-color "^5.5.0"
+ v8-compile-cache "^2.0.2"
+ yargs "^12.0.5"
+
webpack-dev-middleware@3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890"
@@ -22008,7 +22136,7 @@ whatwg-fetch@2.0.4:
resolved "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==
-whatwg-fetch@>=0.10.0:
+whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==