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==