diff --git a/benchmarks/create-pages/.gitignore b/benchmarks/create-pages/.gitignore new file mode 100644 index 0000000000000..da3d72140c77d --- /dev/null +++ b/benchmarks/create-pages/.gitignore @@ -0,0 +1,62 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +.cache/ +public +yarn-error.log diff --git a/benchmarks/create-pages/LICENSE b/benchmarks/create-pages/LICENSE new file mode 100644 index 0000000000000..996428e740d30 --- /dev/null +++ b/benchmarks/create-pages/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 gatsbyjs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/benchmarks/create-pages/README.md b/benchmarks/create-pages/README.md new file mode 100644 index 0000000000000..6bcb9451f22d7 --- /dev/null +++ b/benchmarks/create-pages/README.md @@ -0,0 +1,5 @@ +# createPages benchmark + +Stress tests creating lots of tiny pages. + +Defaults to building a site with 5k pages. Set the `NUM_PAGES` environment variable to change that e.g. `NUM_PAGES=25000 gatsby build` diff --git a/benchmarks/create-pages/gatsby-node.js b/benchmarks/create-pages/gatsby-node.js new file mode 100644 index 0000000000000..48fae63f86027 --- /dev/null +++ b/benchmarks/create-pages/gatsby-node.js @@ -0,0 +1,18 @@ +let NUM_PAGES = 5000 + +if (process.env.NUM_PAGES) { + NUM_PAGES = process.env.NUM_PAGES +} + +exports.createPages = ({ actions: { createPage } }) => { + var step + for (step = 0; step < NUM_PAGES; step++) { + createPage({ + path: `/path/${step}/`, + component: require.resolve(`./src/templates/blank.js`), + context: { + id: step, + }, + }) + } +} diff --git a/benchmarks/create-pages/package.json b/benchmarks/create-pages/package.json new file mode 100644 index 0000000000000..05abd1709e6c1 --- /dev/null +++ b/benchmarks/create-pages/package.json @@ -0,0 +1,15 @@ +{ + "name": "gatsby-starter-hello-world", + "description": "Gatsby hello world starter", + "license": "MIT", + "scripts": { + "develop": "gatsby develop", + "build": "gatsby build", + "serve": "gatsby serve" + }, + "dependencies": { + "gatsby": "next", + "react": "^16.3.2", + "react-dom": "^16.3.2" + } +} diff --git a/benchmarks/create-pages/src/pages/index.js b/benchmarks/create-pages/src/pages/index.js new file mode 100644 index 0000000000000..92b25c10168f8 --- /dev/null +++ b/benchmarks/create-pages/src/pages/index.js @@ -0,0 +1,3 @@ +import React from "react" + +export default () =>
Hello world!
diff --git a/benchmarks/create-pages/src/templates/blank.js b/benchmarks/create-pages/src/templates/blank.js new file mode 100644 index 0000000000000..c146c8ce8392b --- /dev/null +++ b/benchmarks/create-pages/src/templates/blank.js @@ -0,0 +1,3 @@ +import React from "react" + +export default () =>
Yo!
diff --git a/benchmarks/markdown/.gitignore b/benchmarks/markdown/.gitignore new file mode 100644 index 0000000000000..da3d72140c77d --- /dev/null +++ b/benchmarks/markdown/.gitignore @@ -0,0 +1,62 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +.cache/ +public +yarn-error.log diff --git a/benchmarks/markdown/LICENSE b/benchmarks/markdown/LICENSE new file mode 100644 index 0000000000000..996428e740d30 --- /dev/null +++ b/benchmarks/markdown/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 gatsbyjs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/benchmarks/markdown/README.md b/benchmarks/markdown/README.md new file mode 100644 index 0000000000000..2f01368d2d624 --- /dev/null +++ b/benchmarks/markdown/README.md @@ -0,0 +1,5 @@ +# Markdown benchmark + +Stress tests creating lots of pages rendered from Markdown. + +Defaults to building a site with 5k markdown pages. Set the `NUM_PAGES` environment variable to change that e.g. `NUM_PAGES=25000 gatsby build` diff --git a/benchmarks/markdown/gatsby-config.js b/benchmarks/markdown/gatsby-config.js new file mode 100644 index 0000000000000..c39d69b15059c --- /dev/null +++ b/benchmarks/markdown/gatsby-config.js @@ -0,0 +1,3 @@ +module.exports = { + plugins: [`gatsby-transformer-remark`], +}; diff --git a/benchmarks/markdown/gatsby-node.js b/benchmarks/markdown/gatsby-node.js new file mode 100644 index 0000000000000..ec0da9e20652a --- /dev/null +++ b/benchmarks/markdown/gatsby-node.js @@ -0,0 +1,36 @@ +let NUM_PAGES = 5000 + +if (process.env.NUM_PAGES) { + NUM_PAGES = process.env.NUM_PAGES +} + +exports.sourceNodes = ({ actions: { createNode } }) => { + // Create markdown nodes + let step + for (step = 0; step < NUM_PAGES; step++) { + createNode({ + id: step.toString(), + parent: null, + children: [], + internal: { + type: `FakeMarkdown`, + mediaType: `text/markdown`, + content: `---\ntitle: "hi"\n---\nWhat up folks? This is _lit_\n\n##Page #${step}`, + contentDigest: step.toString(), + }, + }) + } +} + +exports.createPages = ({ actions: { createPage } }) => { + let step + for (step = 0; step < NUM_PAGES; step++) { + createPage({ + path: `/path/${step}/`, + component: require.resolve(`./src/templates/blank.js`), + context: { + id: step, + }, + }) + } +} diff --git a/benchmarks/markdown/package.json b/benchmarks/markdown/package.json new file mode 100644 index 0000000000000..5d64c8ccbd708 --- /dev/null +++ b/benchmarks/markdown/package.json @@ -0,0 +1,16 @@ +{ + "name": "gatsby-starter-hello-world", + "description": "Gatsby hello world starter", + "license": "MIT", + "scripts": { + "develop": "gatsby develop", + "build": "gatsby build", + "serve": "gatsby serve" + }, + "dependencies": { + "gatsby": "next", + "gatsby-transformer-remark": "^2.1.1-beta.2", + "react": "^16.3.2", + "react-dom": "^16.3.2" + } +} diff --git a/benchmarks/markdown/src/pages/index.js b/benchmarks/markdown/src/pages/index.js new file mode 100644 index 0000000000000..92b25c10168f8 --- /dev/null +++ b/benchmarks/markdown/src/pages/index.js @@ -0,0 +1,3 @@ +import React from "react" + +export default () =>
Hello world!
diff --git a/benchmarks/markdown/src/templates/blank.js b/benchmarks/markdown/src/templates/blank.js new file mode 100644 index 0000000000000..66205fb85a64e --- /dev/null +++ b/benchmarks/markdown/src/templates/blank.js @@ -0,0 +1,25 @@ +import React from "react" +import { graphql } from "gatsby" + +export default ({ data }) => { + const markdown = data.fakeMarkdown.childMarkdownRemark + return ( +
+

{markdown.frontmatter.title}

+
+
+ ) +} + +export const query = graphql` + query testing($id: String!) { + fakeMarkdown(id: { eq: $id }) { + childMarkdownRemark { + frontmatter { + title + } + html + } + } + } +` diff --git a/packages/gatsby-cli/package.json b/packages/gatsby-cli/package.json index c9ba4a9bb8fa8..9ba38020e6ac9 100644 --- a/packages/gatsby-cli/package.json +++ b/packages/gatsby-cli/package.json @@ -18,6 +18,7 @@ "core-js": "^2.5.0", "envinfo": "^5.8.1", "execa": "^0.8.0", + "fs-exists-cached": "^1.0.0", "fs-extra": "^4.0.1", "hosted-git-info": "^2.6.0", "lodash": "^4.17.4", diff --git a/packages/gatsby-cli/src/create-cli.js b/packages/gatsby-cli/src/create-cli.js index b00f613eb0e21..385222f6cba09 100644 --- a/packages/gatsby-cli/src/create-cli.js +++ b/packages/gatsby-cli/src/create-cli.js @@ -2,8 +2,8 @@ const path = require(`path`) const resolveCwd = require(`resolve-cwd`) const yargs = require(`yargs`) const report = require(`./reporter`) -const fs = require(`fs`) const envinfo = require(`envinfo`) +const existsSync = require(`fs-exists-cached`).sync const DEFAULT_BROWSERS = [`>0.25%`, `not dead`] @@ -19,7 +19,7 @@ function buildLocalCommands(cli, isLocalSite) { const directory = path.resolve(`.`) let siteInfo = { directory, browserslist: DEFAULT_BROWSERS } - const useYarn = fs.existsSync(path.join(directory, `yarn.lock`)) + const useYarn = existsSync(path.join(directory, `yarn.lock`)) if (isLocalSite) { const json = require(path.join(directory, `package.json`)) siteInfo.sitePackageJson = json diff --git a/packages/gatsby-cli/src/init-starter.js b/packages/gatsby-cli/src/init-starter.js index 27f88642d463a..285d736b71dc6 100644 --- a/packages/gatsby-cli/src/init-starter.js +++ b/packages/gatsby-cli/src/init-starter.js @@ -6,6 +6,7 @@ const fs = require(`fs-extra`) const sysPath = require(`path`) const report = require(`./reporter`) const url = require(`url`) +const existsSync = require(`fs-exists-cached`).sync const spawn = (cmd: string) => { const [file, ...args] = cmd.split(/\s+/) @@ -49,7 +50,7 @@ const copy = async (starterPath: string, rootPath: string) => { // 493 = parseInt('755', 8) await fs.mkdirp(rootPath, { mode: 493 }) - if (!fs.existsSync(starterPath)) { + if (!existsSync(starterPath)) { throw new Error(`starter ${starterPath} doesn't exist`) } @@ -117,7 +118,7 @@ module.exports = async (starter: string, options: InitOptions = {}) => { return } - if (fs.existsSync(sysPath.join(rootPath, `package.json`))) { + if (existsSync(sysPath.join(rootPath, `package.json`))) { report.panic(`Directory ${rootPath} is already an npm project`) return } diff --git a/packages/gatsby-cli/src/reporter/index.js b/packages/gatsby-cli/src/reporter/index.js index 3560c0a1754a7..b3628f6496a46 100644 --- a/packages/gatsby-cli/src/reporter/index.js +++ b/packages/gatsby-cli/src/reporter/index.js @@ -75,6 +75,7 @@ module.exports = Object.assign(reporter, { activityTimer(name) { const spinner = reporter.activity() const start = process.hrtime() + let status const elapsedTime = () => { var elapsed = process.hrtime(start) @@ -85,8 +86,15 @@ module.exports = Object.assign(reporter, { start: () => { spinner.tick(name) }, + setStatus: s => { + status = s + spinner.tick(`${name} — ${status}`) + }, end: () => { - reporter.success(`${name} — ${elapsedTime()}`) + const str = status + ? `${name} — ${elapsedTime()} — ${status}` + : `${name} — ${elapsedTime()}` + reporter.success(str) spinner.end() }, } diff --git a/packages/gatsby-plugin-netlify/src/gatsby-node.js b/packages/gatsby-plugin-netlify/src/gatsby-node.js index 492ea5f3d33d1..afe7787de7c35 100644 --- a/packages/gatsby-plugin-netlify/src/gatsby-node.js +++ b/packages/gatsby-plugin-netlify/src/gatsby-node.js @@ -34,7 +34,7 @@ exports.onPostBuild = async ({ store, pathPrefix }, userPluginOptions) => { let rewrites = [] if (pluginOptions.generateMatchPathRewrites) { const { pages } = store.getState() - rewrites = pages + rewrites = Array.from(pages.values()) .filter(page => page.matchPath && page.matchPath !== page.path) .map(page => { return { diff --git a/packages/gatsby-plugin-page-creator/package.json b/packages/gatsby-plugin-page-creator/package.json index 16479d957f4e8..c83fb054466c3 100644 --- a/packages/gatsby-plugin-page-creator/package.json +++ b/packages/gatsby-plugin-page-creator/package.json @@ -21,6 +21,7 @@ "@babel/runtime": "7.0.0-beta.51", "bluebird": "^3.5.0", "chokidar": "^1.7.0", + "fs-exists-cached": "^1.0.0", "glob": "^7.1.1", "lodash": "^4.17.4", "parse-filepath": "^1.0.1", diff --git a/packages/gatsby-plugin-page-creator/src/gatsby-node.js b/packages/gatsby-plugin-page-creator/src/gatsby-node.js index 17355c721bf13..0b84b88f3fb08 100644 --- a/packages/gatsby-plugin-page-creator/src/gatsby-node.js +++ b/packages/gatsby-plugin-page-creator/src/gatsby-node.js @@ -3,7 +3,7 @@ const Promise = require(`bluebird`) const _ = require(`lodash`) const chokidar = require(`chokidar`) const systemPath = require(`path`) -const fs = require(`fs`) +const existsSync = require(`fs-exists-cached`).sync const glob = Promise.promisify(globCB) @@ -35,7 +35,7 @@ exports.createPagesStatefully = async ( } // Validate that the path exists. - if (pathCheck && !fs.existsSync(pagesPath)) { + if (pathCheck && !existsSync(pagesPath)) { reporter.panic( ` The path passed to gatsby-plugin-page-creator does not exist on your file system: diff --git a/packages/gatsby-plugin-sharp/package.json b/packages/gatsby-plugin-sharp/package.json index 32e794c007544..ef692e026a68a 100644 --- a/packages/gatsby-plugin-sharp/package.json +++ b/packages/gatsby-plugin-sharp/package.json @@ -10,6 +10,7 @@ "@babel/runtime": "7.0.0-beta.51", "async": "^2.1.2", "bluebird": "^3.5.0", + "fs-exists-cached": "^1.0.0", "imagemin": "^5.2.2", "imagemin-pngquant": "^5.1.0", "imagemin-webp": "^4.0.0", diff --git a/packages/gatsby-plugin-sharp/src/index.js b/packages/gatsby-plugin-sharp/src/index.js index 89ed756da4228..f545ecf04923c 100644 --- a/packages/gatsby-plugin-sharp/src/index.js +++ b/packages/gatsby-plugin-sharp/src/index.js @@ -10,6 +10,7 @@ const imageminPngquant = require(`imagemin-pngquant`) const imageminWebp = require(`imagemin-webp`) const queue = require(`async/queue`) const path = require(`path`) +const existsSync = require(`fs-exists-cached`).sync const imageSizeCache = new Map() const getImageSize = file => { @@ -245,7 +246,7 @@ const queueJob = (job, reporter) => { } // Check if the output file already exists so we don't redo work. - if (fs.existsSync(job.outputPath)) { + if (existsSync(job.outputPath)) { return } diff --git a/packages/gatsby/cache-dir/static-entry.js b/packages/gatsby/cache-dir/static-entry.js index b677047053c28..6e9ce14f2ea00 100644 --- a/packages/gatsby/cache-dir/static-entry.js +++ b/packages/gatsby/cache-dir/static-entry.js @@ -9,6 +9,10 @@ const apiRunner = require(`./api-runner-ssr`) const syncRequires = require(`./sync-requires`) const { dataPaths, pages } = require(`./data.json`) +// Speed up looking up pages. +const pagesObjectMap = new Map() +pages.forEach(p => pagesObjectMap.set(p.path, p)) + const stats = JSON.parse( fs.readFileSync(`${process.cwd()}/public/webpack.stats.json`, `utf-8`) ) @@ -48,7 +52,7 @@ function urlJoin(...parts) { }, ``) } -const getPage = path => pages.find(page => page.path === path) +const getPage = path => pagesObjectMap.get(path) const createElement = React.createElement diff --git a/packages/gatsby/package.json b/packages/gatsby/package.json index 5b3e9933daadf..8f0ee8cabba96 100644 --- a/packages/gatsby/package.json +++ b/packages/gatsby/package.json @@ -70,6 +70,7 @@ "graphql-relay": "^0.5.5", "graphql-skip-limit": "^2.0.0-beta.2", "graphql-type-json": "^0.2.1", + "hash-mod": "^0.0.5", "history": "^4.6.2", "invariant": "^2.2.4", "is-relative": "^1.0.0", @@ -117,6 +118,7 @@ "socket.io": "^2.0.3", "string-similarity": "^1.2.0", "style-loader": "^0.19.1", + "treeify": "^1.1.0", "type-of": "^2.0.1", "uglifyjs-webpack-plugin": "^1.2.4", "url-loader": "^1.0.1", diff --git a/packages/gatsby/src/bootstrap/get-config-file.js b/packages/gatsby/src/bootstrap/get-config-file.js index 358431b04b4b0..14c87d56950a5 100644 --- a/packages/gatsby/src/bootstrap/get-config-file.js +++ b/packages/gatsby/src/bootstrap/get-config-file.js @@ -5,6 +5,7 @@ const testRequireError = require(`../utils/test-require-error`).default const report = require(`gatsby-cli/lib/reporter`) const chalk = require(`chalk`) const path = require(`path`) +const existsSync = require(`fs-exists-cached`).sync function isNearMatch( fileName: string, @@ -45,7 +46,7 @@ module.exports = async function getConfigFile( ) console.log(``) process.exit(1) - } else if (fs.existsSync(path.join(rootDir, `src`, configName))) { + } else if (existsSync(path.join(rootDir, `src`, configName))) { console.log(``) report.error( `Your ${configName} file is in the wrong place. You've placed it in the src/ directory. It must instead be at the root of your site next to your package.json file.` diff --git a/packages/gatsby/src/bootstrap/index.js b/packages/gatsby/src/bootstrap/index.js index 7290251e904cd..7a9700b0dfd5f 100644 --- a/packages/gatsby/src/bootstrap/index.js +++ b/packages/gatsby/src/bootstrap/index.js @@ -7,6 +7,7 @@ const md5File = require(`md5-file/promise`) const crypto = require(`crypto`) const del = require(`del`) const path = require(`path`) +const convertHrtime = require(`convert-hrtime`) const apiRunnerNode = require(`../utils/api-runner-node`) const { graphql } = require(`graphql`) @@ -27,6 +28,7 @@ const { const { runInitialQueries, } = require(`../internal-plugins/query-runner/page-query-runner`) +const queryQueue = require(`../internal-plugins/query-runner/query-queue`) const { writePages } = require(`../internal-plugins/query-runner/pages-writer`) const { writeRedirects, @@ -159,8 +161,13 @@ module.exports = async (args: BootstrapArgs) => { // directory. initCache() - // Ensure the public/static directory is created. - await fs.ensureDirSync(`${program.directory}/public/static/d`) + // Ensure the public/static directory and data subdirectories are created. + await fs.ensureDir(`${program.directory}/public/static`) + await Promise.all( + _.range(0, 999).map(i => + fs.ensureDir(`${program.directory}/public/static/d/${i}`) + ) + ) // Copy our site files to the root of the site. activity = report.activityTimer(`copy gatsby files`) @@ -169,7 +176,9 @@ module.exports = async (args: BootstrapArgs) => { const siteDir = `${program.directory}/.cache` const tryRequire = `${__dirname}/../utils/test-require-error.js` try { - await fs.copy(srcDir, siteDir, { clobber: true }) + await fs.copy(srcDir, siteDir, { + clobber: true, + }) await fs.copy(tryRequire, `${siteDir}/test-require-error.js`, { clobber: true, }) @@ -339,7 +348,16 @@ module.exports = async (args: BootstrapArgs) => { // Run queries activity = report.activityTimer(`run graphql queries`) activity.start() - await runInitialQueries() + const startQueries = process.hrtime() + queryQueue.on(`task_finish`, () => { + const stats = queryQueue.getStats() + activity.setStatus( + `${stats.total}/${stats.peak} ${( + stats.total / convertHrtime(process.hrtime(startQueries)).seconds + ).toFixed(2)} queries/second` + ) + }) + await runInitialQueries(activity) activity.end() // Write out files. @@ -370,7 +388,9 @@ module.exports = async (args: BootstrapArgs) => { activity.start() apiRunnerNode(`onPostBootstrap`).then(() => { activity.end() - resolve({ graphqlRunner }) + resolve({ + graphqlRunner, + }) }) } }, 100) @@ -386,7 +406,9 @@ module.exports = async (args: BootstrapArgs) => { report.info(`bootstrap finished - ${process.uptime()} s`) report.log(``) emitter.emit(`BOOTSTRAP_FINISHED`) - return { graphqlRunner } + return { + graphqlRunner, + } } else { return new Promise(resolve => { // Wait until all side effect jobs are finished. diff --git a/packages/gatsby/src/bootstrap/load-plugins/load.js b/packages/gatsby/src/bootstrap/load-plugins/load.js index aa412a0bbf632..a707bbaca4384 100644 --- a/packages/gatsby/src/bootstrap/load-plugins/load.js +++ b/packages/gatsby/src/bootstrap/load-plugins/load.js @@ -5,6 +5,7 @@ const path = require(`path`) const crypto = require(`crypto`) const glob = require(`glob`) const { store } = require(`../../redux`) +const existsSync = require(`fs-exists-cached`).sync function createFileContentHash(root, globPattern) { const hash = crypto.createHash(`md5`) @@ -34,12 +35,12 @@ function createFileContentHash(root, globPattern) { */ function resolvePlugin(pluginName) { // Only find plugins when we're not given an absolute path - if (!fs.existsSync(pluginName)) { + if (!existsSync(pluginName)) { // Find the plugin in the local plugins folder const resolvedPath = slash(path.resolve(`./plugins/${pluginName}`)) - if (fs.existsSync(resolvedPath)) { - if (fs.existsSync(`${resolvedPath}/package.json`)) { + if (existsSync(resolvedPath)) { + if (existsSync(`${resolvedPath}/package.json`)) { const packageJSON = JSON.parse( fs.readFileSync(`${resolvedPath}/package.json`, `utf-8`) ) diff --git a/packages/gatsby/src/commands/build-html.js b/packages/gatsby/src/commands/build-html.js index a7af8fee9a0f1..d78c38d1da89f 100644 --- a/packages/gatsby/src/commands/build-html.js +++ b/packages/gatsby/src/commands/build-html.js @@ -8,12 +8,12 @@ const { store } = require(`../redux`) const { createErrorFromString } = require(`gatsby-cli/lib/reporter/errors`) const renderHTML = require(`../utils/html-renderer`) -module.exports = async (program: any) => { +module.exports = async (program: any, activity: any) => { const { directory } = program debug(`generating static HTML`) // Reduce pages objects to an array of paths. - const pages = store.getState().pages.map(page => page.path) + const pages = Array.from(store.getState().pages.values(), page => page.path) // Static site generation. const compilerConfig = await webpackConfig( @@ -41,7 +41,7 @@ module.exports = async (program: any) => { ) } - return renderHTML(require(outputFile), pages) + return renderHTML(require(outputFile), pages, activity) .then(() => { // Remove the temp JS bundle file built for the static-site-generator-plugin try { diff --git a/packages/gatsby/src/commands/build.js b/packages/gatsby/src/commands/build.js index 1cb8e86f8d310..b7eeea7a6de5a 100644 --- a/packages/gatsby/src/commands/build.js +++ b/packages/gatsby/src/commands/build.js @@ -41,7 +41,7 @@ module.exports = async function build(program: BuildArgs) { activity = report.activityTimer(`Building static HTML for pages`) activity.start() - await buildHTML(program).catch(err => { + await buildHTML(program, activity).catch(err => { reportFailure( report.stripIndent` Building static HTML for pages failed diff --git a/packages/gatsby/src/internal-plugins/internal-data-bridge/gatsby-node.js b/packages/gatsby/src/internal-plugins/internal-data-bridge/gatsby-node.js index 408f03e850f8e..2ffb5d30f9896 100644 --- a/packages/gatsby/src/internal-plugins/internal-data-bridge/gatsby-node.js +++ b/packages/gatsby/src/internal-plugins/internal-data-bridge/gatsby-node.js @@ -40,6 +40,8 @@ function transformPackageJson(json) { return json } +const createPageId = path => `SitePage ${path}` + exports.sourceNodes = ({ actions, store }) => { const { createNode } = actions const state = store.getState() @@ -137,8 +139,6 @@ exports.sourceNodes = ({ actions, store }) => { }) } -const createPageId = path => `SitePage ${path}` - exports.onCreatePage = ({ page, actions }) => { const { createNode } = actions // eslint-disable-next-line diff --git a/packages/gatsby/src/internal-plugins/load-babel-config/gatsby-node.js b/packages/gatsby/src/internal-plugins/load-babel-config/gatsby-node.js index 77490e1553e5a..b1f395342f232 100644 --- a/packages/gatsby/src/internal-plugins/load-babel-config/gatsby-node.js +++ b/packages/gatsby/src/internal-plugins/load-babel-config/gatsby-node.js @@ -5,6 +5,7 @@ const path = require(`path`) const json5 = require(`json5`) const report = require(`gatsby-cli/lib/reporter`) const { actionifyBabelrc, addDefaultPluginsPresets } = require(`./utils`) +const existsSync = require(`fs-exists-cached`).sync const testRequireError = require(`../../utils/test-require-error`).default @@ -15,7 +16,7 @@ const testRequireError = require(`../../utils/test-require-error`).default */ function findBabelrc(directory) { const babelrcPath = path.join(directory, `.babelrc`) - if (fs.existsSync(babelrcPath)) { + if (existsSync(babelrcPath)) { try { const babelrc = fs.readFileSync(babelrcPath, `utf-8`) return json5.parse(babelrc) diff --git a/packages/gatsby/src/internal-plugins/query-runner/gatsby-node.js b/packages/gatsby/src/internal-plugins/query-runner/gatsby-node.js index 257a2226f8ec4..91c246e4963a1 100644 --- a/packages/gatsby/src/internal-plugins/query-runner/gatsby-node.js +++ b/packages/gatsby/src/internal-plugins/query-runner/gatsby-node.js @@ -3,12 +3,18 @@ const { watchComponent } = require(`./query-watcher`) let components = {} exports.onCreatePage = ({ page, store }) => { - const component = store.getState().components.get(page.componentPath) + // In development, watch the component to detect query changes. + if (process.env.NODE_ENV !== `production`) { + const component = store.getState().components.get(page.componentPath) - if (components[component.componentPath]) { - return - } + if (!component) { + process.exit() + } + + if (components[component.componentPath]) { + return + } - // Watch the component to detect query changes. - watchComponent(component.componentPath) + watchComponent(component.componentPath) + } } diff --git a/packages/gatsby/src/internal-plugins/query-runner/page-query-runner.js b/packages/gatsby/src/internal-plugins/query-runner/page-query-runner.js index 363bf0a8031ab..ec8648a75ab3f 100644 --- a/packages/gatsby/src/internal-plugins/query-runner/page-query-runner.js +++ b/packages/gatsby/src/internal-plugins/query-runner/page-query-runner.js @@ -92,7 +92,7 @@ const findIdsWithoutDataDependencies = () => { // paths. const notTrackedIds = _.difference( [ - ...state.pages.map(p => p.path), + ...Array.from(state.pages.values(), p => p.path), ...[...state.staticQueryComponents.values()].map(c => c.jsonName), ], [...allTrackedIds, ...seenIdsWithoutDataDependencies] @@ -126,10 +126,10 @@ const runQueriesForPathnames = pathnames => { queue.push(queryJob) }) - const pages = [...state.pages] + const pages = state.pages let didNotQueueItems = true pageQueries.forEach(id => { - const page = pages.find(pl => pl.path === id) + const page = pages.get(id) if (page) { didNotQueueItems = false queue.push( diff --git a/packages/gatsby/src/internal-plugins/query-runner/pages-writer.js b/packages/gatsby/src/internal-plugins/query-runner/pages-writer.js index 2fac1fd8212bf..6f42f78ab2914 100644 --- a/packages/gatsby/src/internal-plugins/query-runner/pages-writer.js +++ b/packages/gatsby/src/internal-plugins/query-runner/pages-writer.js @@ -12,30 +12,31 @@ let lastHash = null const writePages = async () => { bootstrapFinished = true let { program, jsonDataPaths, pages } = store.getState() + pages = [...pages.values()] const pagesComponentDependencies = {} // Write out pages.json - const pagesData = _.sortBy( - pages.reduce((mem, { path, matchPath, componentChunkName, jsonName }) => { - const pageComponentsChunkNames = { - componentChunkName, - } - - if (program._[0] === `develop`) { - pagesComponentDependencies[path] = pageComponentsChunkNames - } - - return [ - ...mem, - { - ...pageComponentsChunkNames, - jsonName, - path, - matchPath, - }, - ] - }, []), + let pagesData = [] + pages.forEach(({ path, matchPath, componentChunkName, jsonName }) => { + const pageComponentsChunkNames = { + componentChunkName, + } + + if (program._[0] === `develop`) { + pagesComponentDependencies[path] = pageComponentsChunkNames + } + + pagesData.push({ + ...pageComponentsChunkNames, + jsonName, + path, + matchPath, + }) + }) + + pagesData = _.sortBy( + pagesData, // Sort pages with matchPath to end so explicit routes // will match before general. p => (p.matchPath ? 1 : 0) @@ -112,7 +113,7 @@ const preferDefault = m => m && m.default || m .then(() => fs.move(tmp, destination, { overwrite: true })) } - return await Promise.all([ + const result = await Promise.all([ writeAndMove(`pages.json`, JSON.stringify(pagesData, null, 4)), writeAndMove(`sync-requires.js`, syncRequires), writeAndMove(`async-requires.js`, asyncRequires), @@ -124,6 +125,8 @@ const preferDefault = m => m && m.default || m }) ), ]) + + return result } exports.writePages = writePages diff --git a/packages/gatsby/src/internal-plugins/query-runner/query-queue.js b/packages/gatsby/src/internal-plugins/query-runner/query-queue.js index 056b9ba8b33eb..c7bcdbd441a6e 100644 --- a/packages/gatsby/src/internal-plugins/query-runner/query-queue.js +++ b/packages/gatsby/src/internal-plugins/query-runner/query-queue.js @@ -7,52 +7,59 @@ const websocketManager = require(`../../utils/websocket-manager`) const processing = new Set() const waiting = new Map() -const queue = new Queue( - (plObj, callback) => { - const state = store.getState() - processing.add(plObj.id) - - return queryRunner(plObj, state.components[plObj.component]) - .catch(e => console.log(`Error running queryRunner`, e)) - .then( - result => { - processing.delete(plObj.id) - if (waiting.has(plObj.id)) { - queue.push(waiting.get(plObj.id)) - waiting.delete(plObj.id) - } - return callback(null, result) - }, - error => callback(error) - ) +const queueOptions = { + concurrent: 4, + // Merge duplicate jobs. + merge: (oldTask, newTask, cb) => { + cb(null, newTask) }, - { - concurrent: 4, - // Merge duplicate jobs. - merge: (oldTask, newTask, cb) => { - cb(null, newTask) - }, - priority: (job, cb) => { - const activePaths = Array.from(websocketManager.activePaths.values()) - if (job.path && activePaths.includes(job.path)) { - cb(null, 10) - } else { - cb(null, 1) - } - }, - // Filter out new query jobs if that query is already running. When the - // query finshes, it checks the waiting map and pushes another job to - // make sure all the user changes are captured. - filter: (job, cb) => { - if (processing.has(job.id)) { - waiting.set(job.id, job) - cb(`already running`) - } else { - cb(null, job) - } - }, - } -) + priority: (job, cb) => { + const activePaths = Array.from(websocketManager.activePaths.values()) + if (job.path && activePaths.includes(job.path)) { + cb(null, 10) + } else { + cb(null, 1) + } + }, + // Filter out new query jobs if that query is already running. When the + // query finshes, it checks the waiting map and pushes another job to + // make sure all the user changes are captured. + filter: (job, cb) => { + if (processing.has(job.id)) { + waiting.set(job.id, job) + cb(`already running`) + } else { + cb(null, job) + } + }, +} + +// During builds we don't need all the filtering, etc. so we +// remove them to speed up queries +if (process.env.gatsby_executing_command === `build`) { + delete queueOptions.filter + delete queueOptions.priority + delete queueOptions.merge +} + +const queue = new Queue((plObj, callback) => { + const state = store.getState() + processing.add(plObj.id) + + return queryRunner(plObj, state.components[plObj.component]) + .catch(e => console.log(`Error running queryRunner`, e)) + .then( + result => { + processing.delete(plObj.id) + if (waiting.has(plObj.id)) { + queue.push(waiting.get(plObj.id)) + waiting.delete(plObj.id) + } + return callback(null, result) + }, + error => callback(error) + ) +}, queueOptions) queue.on(`drain`, () => { emitter.emit(`QUERY_QUEUE_DRAINED`) diff --git a/packages/gatsby/src/internal-plugins/query-runner/query-runner.js b/packages/gatsby/src/internal-plugins/query-runner/query-runner.js index 942170f0cd591..7f0d2a68a69e6 100644 --- a/packages/gatsby/src/internal-plugins/query-runner/query-runner.js +++ b/packages/gatsby/src/internal-plugins/query-runner/query-runner.js @@ -9,6 +9,7 @@ const path = require(`path`) const { store } = require(`../../redux`) const { generatePathChunkName } = require(`../../utils/js-chunk-names`) const { formatErrorDetails } = require(`./utils`) +const mod = require(`hash-mod`)(999) const resultHashes = {} @@ -66,8 +67,22 @@ ${formatErrorDetails(errorDetails)}`) } // Add the page context onto the results. - if (queryJob?.isPage) { - result[`pageContext`] = queryJob.context + if (queryJob && queryJob.isPage) { + result[`pageContext`] = Object.assign({}, queryJob.context) + } + + // Delete internal data from pageContext + if (result.pageContext) { + delete result.pageContext.jsonName + delete result.pageContext.path + delete result.pageContext.internalComponentName + delete result.pageContext.component + delete result.pageContext.componentChunkName + delete result.pageContext.updatedAt + delete result.pageContext.pluginCreator___NODE + delete result.pageContext.pluginCreatorId + delete result.pageContext.componentPath + delete result.pageContext.context } const resultJSON = JSON.stringify(result) @@ -81,7 +96,7 @@ ${formatErrorDetails(errorDetails)}`) .replace(/[^a-zA-Z0-9-_]/g, ``) let dataPath - if (queryJob?.isPage) { + if (queryJob.isPage) { dataPath = `${generatePathChunkName(queryJob.jsonName)}-${resultHash}` } else { dataPath = queryJob.hash @@ -105,6 +120,13 @@ ${formatErrorDetails(errorDetails)}`) if (resultHashes[queryJob.id] !== resultHash) { resultHashes[queryJob.id] = resultHash + let modInt = `` + // We leave StaticQuery results at public/static/d + // as the babel plugin has that path hard-coded + // for importing static query results. + if (queryJob.isPage) { + modInt = mod(dataPath).toString() + } // Always write file to public/static/d/ folder. const resultPath = path.join( @@ -112,15 +134,21 @@ ${formatErrorDetails(errorDetails)}`) `public`, `static`, `d`, + modInt, `${dataPath}.json` ) + if (queryJob.isPage) { + dataPath = `${modInt}/${dataPath}` + } + await fs.writeFile(resultPath, resultJSON) store.dispatch({ type: `SET_JSON_DATA_PATH`, payload: { - [queryJob.jsonName]: dataPath, + key: queryJob.jsonName, + value: dataPath, }, }) diff --git a/packages/gatsby/src/internal-plugins/query-runner/query-watcher.js b/packages/gatsby/src/internal-plugins/query-runner/query-watcher.js index 920ad5cdc44c9..e2b218025e9c4 100644 --- a/packages/gatsby/src/internal-plugins/query-runner/query-watcher.js +++ b/packages/gatsby/src/internal-plugins/query-runner/query-watcher.js @@ -173,7 +173,9 @@ const queueQueriesForPageComponent = componentPath => { const getPagesForComponent = componentPath => { const state = store.getState() - return [...state.pages].filter(p => p.componentPath === componentPath) + return [...state.pages.values()].filter( + p => p.componentPath === componentPath + ) } const filesToWatch = new Set() diff --git a/packages/gatsby/src/joi-schemas/joi.js b/packages/gatsby/src/joi-schemas/joi.js index 2eef9c03d3bd1..664dd4122a22e 100644 --- a/packages/gatsby/src/joi-schemas/joi.js +++ b/packages/gatsby/src/joi-schemas/joi.js @@ -28,16 +28,8 @@ export const pageSchema = Joi.object() export const nodeSchema = Joi.object() .keys({ id: Joi.string().required(), - children: Joi.array() - .items(Joi.string(), Joi.object().forbidden()) - .required(), - parent: Joi.string() - .allow(null) - .required() - .error( - () => - `"parent" must be the "id" of another node or if there is no parent (common), "null"` - ), + children: Joi.array().items(Joi.string(), Joi.object().forbidden()), + parent: Joi.string().allow(null), fields: Joi.object(), internal: Joi.object() .keys({ @@ -49,6 +41,8 @@ export const nodeSchema = Joi.object() content: Joi.string().allow(``), description: Joi.string(), }) - .unknown({ allow: false }), // Don't allow non-standard fields + .unknown({ + allow: false, + }), // Don't allow non-standard fields }) .unknown() diff --git a/packages/gatsby/src/redux/__tests__/__snapshots__/nodes.js.snap b/packages/gatsby/src/redux/__tests__/__snapshots__/nodes.js.snap index 9b98163e97175..ce3a35ecdd3a7 100644 --- a/packages/gatsby/src/redux/__tests__/__snapshots__/nodes.js.snap +++ b/packages/gatsby/src/redux/__tests__/__snapshots__/nodes.js.snap @@ -1,8 +1,8 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Create and update nodes allows adding fields to nodes 1`] = ` -Object { - "hi": Object { +Map { + "hi" => Object { "children": Array [], "fields": Object { "joy": "soul's delight", @@ -44,8 +44,8 @@ Object { `; exports[`Create and update nodes allows creating nodes 2`] = ` -Object { - "hi": Object { +Map { + "hi" => Object { "children": Array [], "id": "hi", "internal": Object { diff --git a/packages/gatsby/src/redux/__tests__/__snapshots__/pages.js.snap b/packages/gatsby/src/redux/__tests__/__snapshots__/pages.js.snap index 66540d525e5b0..015923e6d65c9 100644 --- a/packages/gatsby/src/redux/__tests__/__snapshots__/pages.js.snap +++ b/packages/gatsby/src/redux/__tests__/__snapshots__/pages.js.snap @@ -46,8 +46,8 @@ The following fields are used by the page object and should be avoided. `; exports[`Add pages allows you to add multiple pages 1`] = ` -Array [ - Object { +Map { + "/hi/" => Object { "component": "/whatever/index.js", "componentChunkName": "component---whatever-index-js", "context": Object {}, @@ -59,7 +59,7 @@ Array [ "pluginCreator___NODE": "test", "updatedAt": 1482363367071, }, - Object { + "/hi/pizza/" => Object { "component": "/whatever/index.js", "componentChunkName": "component---whatever-index-js", "context": Object {}, @@ -71,7 +71,7 @@ Array [ "pluginCreator___NODE": "test", "updatedAt": 1482363367071, }, -] +} `; exports[`Add pages allows you to add pages 1`] = ` @@ -98,8 +98,8 @@ Object { `; exports[`Add pages allows you to add pages 2`] = ` -Array [ - Object { +Map { + "/hi/" => Object { "component": "/whatever/index.js", "componentChunkName": "component---whatever-index-js", "context": Object {}, @@ -111,7 +111,7 @@ Array [ "pluginCreator___NODE": "test", "updatedAt": 1482363367071, }, -] +} `; exports[`Add pages allows you to add pages with context 1`] = ` @@ -140,8 +140,8 @@ Object { `; exports[`Add pages allows you to add pages with context 2`] = ` -Array [ - Object { +Map { + "/hi/" => Object { "component": "/whatever/index.js", "componentChunkName": "component---whatever-index-js", "context": Object { @@ -155,7 +155,7 @@ Array [ "pluginCreator___NODE": "test", "updatedAt": 1482363367071, }, -] +} `; exports[`Add pages allows you to add pages with matchPath 1`] = ` @@ -182,8 +182,8 @@ Object { `; exports[`Add pages allows you to add pages with matchPath 2`] = ` -Array [ - Object { +Map { + "/hi/" => Object { "component": "/whatever/index.js", "componentChunkName": "component---whatever-index-js", "context": Object {}, @@ -195,14 +195,14 @@ Array [ "pluginCreator___NODE": "test", "updatedAt": 1482363367071, }, -] +} `; -exports[`Add pages allows you to delete paths 1`] = `Array []`; +exports[`Add pages allows you to delete paths 1`] = `Map {}`; exports[`Add pages allows you to update existing pages (based on path) 1`] = ` -Array [ - Object { +Map { + "/hi/" => Object { "component": "/whatever2/index.js", "componentChunkName": "component---whatever-2-index-js", "context": Object {}, @@ -214,5 +214,5 @@ Array [ "pluginCreator___NODE": "test", "updatedAt": 1482363367071, }, -] +} `; diff --git a/packages/gatsby/src/redux/__tests__/nodes.js b/packages/gatsby/src/redux/__tests__/nodes.js index 8b78ef141d2d1..3ce2ac9efbd74 100644 --- a/packages/gatsby/src/redux/__tests__/nodes.js +++ b/packages/gatsby/src/redux/__tests__/nodes.js @@ -78,9 +78,9 @@ describe(`Create and update nodes`, () => { ) let state = nodeReducer(undefined, action) state = nodeReducer(state, updateAction) - expect(state[`hi`].pickle).toEqual(false) - expect(state[`hi`].deep.array[0]).toEqual(1) - expect(state[`hi`].deep2.boom).toEqual(`foo`) + expect(state.get(`hi`).pickle).toEqual(false) + expect(state.get(`hi`).deep.array[0]).toEqual(1) + expect(state.get(`hi`).deep2.boom).toEqual(`foo`) }) it(`deletes previously transformed children nodes when the parent node is updated`, () => { @@ -121,8 +121,8 @@ describe(`Create and update nodes`, () => { store.dispatch( actions.createParentChildLink( { - parent: store.getState().nodes[`hi`], - child: store.getState().nodes[`hi-1`], + parent: store.getState().nodes.get(`hi`), + child: store.getState().nodes.get(`hi-1`), }, { name: `tests`, @@ -150,8 +150,8 @@ describe(`Create and update nodes`, () => { store.dispatch( actions.createParentChildLink( { - parent: store.getState().nodes[`hi-1`], - child: store.getState().nodes[`hi-1-1`], + parent: store.getState().nodes.get(`hi-1`), + child: store.getState().nodes.get(`hi-1-1`), }, { name: `tests`, @@ -175,7 +175,7 @@ describe(`Create and update nodes`, () => { } ) ) - expect(Object.keys(store.getState().nodes).length).toEqual(1) + expect(store.getState().nodes.size).toEqual(1) }) it(`deletes previously transformed children nodes when the parent node is deleted`, () => { @@ -230,7 +230,7 @@ describe(`Create and update nodes`, () => { store.dispatch( actions.createParentChildLink( { - parent: store.getState().nodes[`hi`], + parent: store.getState().nodes.get(`hi`), child: getNode(`hi-1`), }, { @@ -276,7 +276,7 @@ describe(`Create and update nodes`, () => { } ) ) - expect(Object.keys(store.getState().nodes).length).toEqual(1) + expect(store.getState().nodes.size).toEqual(1) }) it(`deletes previously transformed children nodes when parent nodes are deleted`, () => { @@ -351,11 +351,14 @@ describe(`Create and update nodes`, () => { ) ) store.dispatch( - actions.deleteNodes([`hi`], { - name: `tests`, - }) + actions.deleteNode( + { node: getNode(`hi`) }, + { + name: `tests`, + } + ) ) - expect(Object.keys(store.getState().nodes).length).toEqual(0) + expect(store.getState().nodes.size).toEqual(0) }) it(`allows deleting nodes`, () => { @@ -463,7 +466,7 @@ describe(`Create and update nodes`, () => { const addFieldAction = actions.createNodeField( { - node: state[`hi`], + node: state.get(`hi`), name: `joy`, value: `soul's delight`, }, @@ -495,7 +498,7 @@ describe(`Create and update nodes`, () => { const addFieldAction = actions.createNodeField( { - node: state[`hi`], + node: state.get(`hi`), name: `joy`, value: `soul's delight`, }, @@ -508,7 +511,7 @@ describe(`Create and update nodes`, () => { function callActionCreator() { actions.createNodeField( { - node: state[`hi`], + node: state.get(`hi`), name: `joy`, value: `soul's delight`, }, @@ -587,6 +590,6 @@ describe(`Create and update nodes`, () => { actions.deleteNode(undefined, { name: `tests`, }) - expect(Object.keys(store.getState().nodes).length).toEqual(0) + expect(store.getState().nodes.size).toEqual(0) }) }) diff --git a/packages/gatsby/src/redux/__tests__/pages.js b/packages/gatsby/src/redux/__tests__/pages.js index b19bd1c0be9c1..e73319b48b9a4 100644 --- a/packages/gatsby/src/redux/__tests__/pages.js +++ b/packages/gatsby/src/redux/__tests__/pages.js @@ -96,7 +96,7 @@ describe(`Add pages`, () => { { id: `test`, name: `test` } ) const state = reducer(undefined, action) - expect(state[0].path).toEqual(`/hi/`) + expect(Array.from(state.values())[0].path).toEqual(`/hi/`) }) it(`allows you to add pages with context`, () => { @@ -150,7 +150,7 @@ describe(`Add pages`, () => { let state = reducer(undefined, action) state = reducer(state, action2) expect(state).toMatchSnapshot() - expect(state.length).toEqual(2) + expect(state.size).toEqual(2) }) it(`allows you to update existing pages (based on path)`, () => { @@ -175,7 +175,7 @@ describe(`Add pages`, () => { let state = reducer(undefined, action) state = reducer(state, action2) expect(state).toMatchSnapshot() - expect(state.length).toEqual(1) + expect(state.size).toEqual(1) }) it(`allows you to delete paths`, () => { @@ -192,6 +192,6 @@ describe(`Add pages`, () => { let state = reducer(undefined, action) state = reducer(state, action2) expect(state).toMatchSnapshot() - expect(state.length).toEqual(0) + expect(state.size).toEqual(0) }) }) diff --git a/packages/gatsby/src/redux/actions.js b/packages/gatsby/src/redux/actions.js index 4dffed34c5064..ecb891468d543 100644 --- a/packages/gatsby/src/redux/actions.js +++ b/packages/gatsby/src/redux/actions.js @@ -11,6 +11,7 @@ const kebabHash = require(`kebab-hash`) const { hasNodeChanged, getNode } = require(`./index`) const { trackInlineObjectsInRootNode } = require(`../schema/node-tracking`) const { store } = require(`./index`) +const fileExistsSync = require(`fs-exists-cached`).sync import * as joiSchemas from "../joi-schemas/joi" import { generateComponentChunkName } from "../utils/js-chunk-names" @@ -95,6 +96,7 @@ const hasWarnedForPageComponent = new Set() * }, * }) */ +const fileOkCache = {} actions.createPage = (page: PageInput, plugin?: Plugin, traceId?: string) => { let noPageOrComponent = false let name = `The plugin "${plugin.name}"` @@ -174,7 +176,7 @@ ${reservedFields.map(f => ` * "${f}"`).join(`\n`)} // Don't check if the component exists during tests as we use a lot of fake // component paths. if (process.env.NODE_ENV !== `test`) { - if (!fs.existsSync(page.component)) { + if (!fileExistsSync(page.component)) { const message = `${name} created a page with a component that doesn't exist` console.log(``) console.log(chalk.bold.red(message)) @@ -234,17 +236,15 @@ ${reservedFields.map(f => ` * "${f}"`).join(`\n`)} internalPage.path = `/${internalPage.path}` } - const result = Joi.validate(internalPage, joiSchemas.pageSchema) - if (result.error) { - console.log(chalk.blue.bgYellow(`The upserted page didn't pass validation`)) - console.log(chalk.bold.red(result.error)) - console.log(internalPage) - return null - } - // Validate that the page component imports React and exports something // (hopefully a component). - if (!internalPage.component.includes(`/.cache/`)) { + // + // Only run validation once during builds. + if ( + !internalPage.component.includes(`/.cache/`) && + (process.env.NODE_ENV === `production` && + !fileOkCache[internalPage.component]) + ) { const fileName = internalPage.component const fileContent = fs.readFileSync(fileName, `utf-8`) let notEmpty = true @@ -288,6 +288,8 @@ ${reservedFields.map(f => ` * "${f}"`).join(`\n`)} // TODO actually do die during builds. // process.exit(1) } + + fileOkCache[internalPage.component] = true } return { @@ -464,12 +466,22 @@ actions.createNode = (node: any, plugin?: Plugin, traceId?: string) => { node.internal = {} } + // Ensure the new node has a children array. + if (!node.array && !_.isArray(node.children)) { + node.children = [] + } + + // Ensure the new node has a parent field + if (!node.parent) { + node.parent = null + } + // Tell user not to set the owner name themself. if (node.internal.owner) { console.log(JSON.stringify(node, null, 4)) console.log( chalk.bold.red( - `The node internal.owner field is set automatically by Gatsby and not by plugin` + `The node internal.owner field is set automatically by Gatsby and not by plugins` ) ) process.exit(1) @@ -570,7 +582,9 @@ actions.createNode = (node: any, plugin?: Plugin, traceId?: string) => { if (oldNode) { const descendantNodes = findChildrenRecursively(oldNode.children) if (descendantNodes.length > 0) { - deleteAction = actions.deleteNodes(descendantNodes) + deleteAction = descendantNodes.map(n => + actions.deleteNode({ node: getNode(n) }) + ) } } diff --git a/packages/gatsby/src/redux/index.js b/packages/gatsby/src/redux/index.js index 9fd9b5d6996a0..a8c9105b44ebc 100644 --- a/packages/gatsby/src/redux/index.js +++ b/packages/gatsby/src/redux/index.js @@ -12,7 +12,13 @@ const emitter = mitt() // Reducers const reducers = require(`./reducers`) -const objectToMap = obj => new Map(Object.entries(obj)) +const objectToMap = obj => { + let map = new Map() + Object.keys(obj).forEach(key => { + map.set(key, obj[key]) + }) + return map +} const mapToObject = map => { const obj = {} @@ -25,14 +31,28 @@ const mapToObject = map => { // Read from cache the old node data. let initialState = {} try { - initialState = JSON.parse( - fs.readFileSync(`${process.cwd()}/.cache/redux-state.json`) - ) - initialState.staticQueryComponents = objectToMap( - initialState.staticQueryComponents - ) - initialState.components = objectToMap(initialState.components) + const file = fs.readFileSync(`${process.cwd()}/.cache/redux-state.json`) + // Apparently the file mocking in node-tracking-test.js + // can override the file reading replacing the mocked string with + // an already parsed object. + if (Buffer.isBuffer(file) || typeof file === `string`) { + initialState = JSON.parse(file) + } + if (initialState.staticQueryComponents) { + initialState.staticQueryComponents = objectToMap( + initialState.staticQueryComponents + ) + } + if (initialState.components) { + initialState.components = objectToMap(initialState.components) + } + if (initialState.nodes) { + initialState.nodes = objectToMap(initialState.nodes) + } } catch (e) { + if (process.env.NODE_ENV === `test`) { + console.log(`error loading initialState`, e) + } // ignore errors. } @@ -85,6 +105,7 @@ const saveState = _.debounce(state => { pickedState.staticQueryComponents ) pickedState.components = mapToObject(pickedState.components) + pickedState.nodes = mapToObject(pickedState.nodes) fs.writeFile( `${process.cwd()}/.cache/redux-state.json`, stringify(pickedState, null, 2), @@ -113,10 +134,14 @@ exports.store = store * @returns {Array} */ exports.getNodes = () => { - let nodes = _.values(store.getState().nodes) - return nodes ? nodes : [] + const nodes = store.getState().nodes + if (nodes) { + return Array.from(nodes.values()) + } else { + return [] + } } -const getNode = id => store.getState().nodes[id] +const getNode = id => store.getState().nodes.get(id) /** Get node by id from store. * @@ -133,7 +158,7 @@ exports.getNode = getNode * @returns {boolean} */ exports.hasNodeChanged = (id, digest) => { - const node = store.getState().nodes[id] + const node = store.getState().nodes.get(id) if (!node) { return true } else { diff --git a/packages/gatsby/src/redux/plugin-runner.js b/packages/gatsby/src/redux/plugin-runner.js index bf27187676b60..55f51dd8726c4 100644 --- a/packages/gatsby/src/redux/plugin-runner.js +++ b/packages/gatsby/src/redux/plugin-runner.js @@ -4,7 +4,7 @@ const { store, emitter } = require(`./index`) const apiRunnerNode = require(`../utils/api-runner-node`) emitter.on(`CREATE_NODE`, action => { - const node = store.getState().nodes[action.payload.id] + const node = store.getState().nodes.get(action.payload.id) apiRunnerNode(`onCreateNode`, { node, traceId: action.traceId }) }) diff --git a/packages/gatsby/src/redux/reducers/json-data-paths.js b/packages/gatsby/src/redux/reducers/json-data-paths.js index b69a4b34a2f70..8238a1708757a 100644 --- a/packages/gatsby/src/redux/reducers/json-data-paths.js +++ b/packages/gatsby/src/redux/reducers/json-data-paths.js @@ -5,10 +5,8 @@ module.exports = (state = {}, action) => { // case `DELETE_ALL_JSON_DATA_PATHS`: // return {} case `SET_JSON_DATA_PATH`: - return { - ...state, - ...action.payload, - } + state[action.payload.key] = action.payload.value + return state // case `DELETE_JSON_DATA_PATH`: // return omit(state, action.payload) default: diff --git a/packages/gatsby/src/redux/reducers/nodes.js b/packages/gatsby/src/redux/reducers/nodes.js index e375682ec4211..86f4d1f5f710f 100644 --- a/packages/gatsby/src/redux/reducers/nodes.js +++ b/packages/gatsby/src/redux/reducers/nodes.js @@ -1,34 +1,25 @@ -const _ = require(`lodash`) - -module.exports = (state = {}, action) => { - let newState +module.exports = (state = new Map(), action) => { switch (action.type) { case `DELETE_CACHE`: - return {} + return new Map() case `CREATE_NODE`: { - newState = { - ...state, - [action.payload.id]: action.payload, - } - return newState + state.set(action.payload.id, action.payload) + return state } case `ADD_FIELD_TO_NODE`: case `ADD_CHILD_NODE_TO_PARENT_NODE`: - newState = { - ...state, - [action.payload.id]: action.payload, - } - return newState + state.set(action.payload.id, action.payload) + return state case `DELETE_NODE`: { - newState = _.omit(state, action.payload.id) - return newState + state.delete(action.payload.id) + return state } case `DELETE_NODES`: { - newState = _.omit(state, action.payload) - return newState + action.payload.forEach(id => state.delete(id)) + return state } default: diff --git a/packages/gatsby/src/redux/reducers/pages.js b/packages/gatsby/src/redux/reducers/pages.js index 445056b7b610f..6788e45db4c96 100644 --- a/packages/gatsby/src/redux/reducers/pages.js +++ b/packages/gatsby/src/redux/reducers/pages.js @@ -1,15 +1,9 @@ const normalize = require(`normalize-path`) -const stateToMap = state => { - let stateMap = new Map() - state.forEach(payload => stateMap.set(payload.path, payload)) - return stateMap -} - -module.exports = (state = [], action) => { +module.exports = (state = new Map(), action) => { switch (action.type) { case `DELETE_CACHE`: - return [] + return new Map() case `CREATE_PAGE`: { action.payload.component = normalize(action.payload.component) if (!action.plugin && !action.plugin.name) { @@ -25,14 +19,12 @@ module.exports = (state = [], action) => { action.payload.pluginCreator___NODE = action.plugin.id action.payload.pluginCreatorId = action.plugin.id - let stateMap = stateToMap(state) - stateMap.set(action.payload.path, action.payload) - return Array.from(stateMap.values()) + state.set(action.payload.path, action.payload) + return state } case `DELETE_PAGE`: { - let stateMap = stateToMap(state) - stateMap.delete(action.payload.path) - return Array.from(stateMap.values()) + state.delete(action.payload.path) + return state } default: return state diff --git a/packages/gatsby/src/schema/build-node-types.js b/packages/gatsby/src/schema/build-node-types.js index fcf4335c77fa2..dd433e78b5ae9 100644 --- a/packages/gatsby/src/schema/build-node-types.js +++ b/packages/gatsby/src/schema/build-node-types.js @@ -23,7 +23,11 @@ const { clearTypeExampleValues } = require(`./data-tree-utils`) import type { ProcessedNodeType } from "./infer-graphql-type" -type TypeMap = { [typeName: string]: ProcessedNodeType } +type TypeMap = { + [typeName: string]: ProcessedNodeType, +} + +const nodesCache = new Map() module.exports = async () => { const types = _.groupBy(getNodes(), node => node.internal.type) @@ -85,7 +89,10 @@ module.exports = async () => { // Add dependencies for the path filteredNodes.forEach(n => - createPageDependency({ path, nodeId: n.id }) + createPageDependency({ + path, + nodeId: n.id, + }) ) return filteredNodes }, @@ -103,7 +110,10 @@ module.exports = async () => { if (childNode) { // Add dependencies for the path - createPageDependency({ path, nodeId: childNode.id }) + createPageDependency({ + path, + nodeId: childNode.id, + }) return childNode } return null @@ -172,17 +182,31 @@ module.exports = async () => { args: filterFields, resolve(a, args, context) { const runSift = require(`./run-sift`) - const latestNodes = _.filter( - getNodes(), - n => n.internal.type === typeName - ) + let latestNodes + if ( + process.env.NODE_ENV === `production` && + nodesCache.has(typeName) + ) { + latestNodes = nodesCache.get(typeName) + } else { + latestNodes = _.filter( + getNodes(), + n => n.internal.type === typeName + ) + nodesCache.set(typeName, latestNodes) + } if (!_.isObject(args)) { args = {} } return runSift({ - args: { filter: { ...args } }, + args: { + filter: { + ...args, + }, + }, nodes: latestNodes, path: context.path ? context.path : ``, + typeName: typeName, type: gqlType, }) }, diff --git a/packages/gatsby/src/schema/node-tracking.js b/packages/gatsby/src/schema/node-tracking.js index c4ab1282cdf8c..495e720d44bab 100644 --- a/packages/gatsby/src/schema/node-tracking.js +++ b/packages/gatsby/src/schema/node-tracking.js @@ -29,16 +29,7 @@ const addRootNodeToInlineObject = (data, nodeId) => { * and that Node object. * @param {Node} node Root Node */ -// const nodeDigestTracked = new Set() const trackInlineObjectsInRootNode = node => { - // const id = - // node && node.internal && node.internal.contentDigest - // ? node.internal.contentDigest - // : node.id - // if (nodeDigestTracked.has(id)) { - // return node - // } - _.each(node, (v, k) => { // Ignore the node internal object. if (k === `internal`) { @@ -47,7 +38,6 @@ const trackInlineObjectsInRootNode = node => { addRootNodeToInlineObject(v, node.id) }) - // nodeDigestTracked.add(id) return node } exports.trackInlineObjectsInRootNode = trackInlineObjectsInRootNode diff --git a/packages/gatsby/src/schema/run-sift.js b/packages/gatsby/src/schema/run-sift.js index be8fa5fb47e2f..44cb2757b733d 100644 --- a/packages/gatsby/src/schema/run-sift.js +++ b/packages/gatsby/src/schema/run-sift.js @@ -6,17 +6,31 @@ const { createPageDependency } = require(`../redux/actions/add-page-dependency`) const prepareRegex = require(`./prepare-regex`) const Promise = require(`bluebird`) const { trackInlineObjectsInRootNode } = require(`./node-tracking`) +const { getNode } = require(`../redux`) +const resolvedNodesCache = new Map() const enhancedNodeCache = new Map() +const enhancedNodePromiseCache = new Map() const enhancedNodeCacheId = ({ node, args }) => node && node.internal && node.internal.contentDigest - ? `${node.id}${node.internal.contentDigest}${JSON.stringify(args)}` + ? JSON.stringify({ + nodeid: node.id, + digest: node.internal.contentDigest, + ...args, + }) : null function awaitSiftField(fields, node, k) { const field = fields[k] if (field.resolve) { - return field.resolve(node, {}, {}, { fieldName: k }) + return field.resolve( + node, + {}, + {}, + { + fieldName: k, + } + ) } else if (node[k] !== undefined) { return node[k] } @@ -25,14 +39,15 @@ function awaitSiftField(fields, node, k) { } /* -* Filters a list of nodes using mongodb-like syntax. -* Returns a single unwrapped element if connection = false. -* -*/ + * Filters a list of nodes using mongodb-like syntax. + * Returns a single unwrapped element if connection = false. + * + */ module.exports = ({ args, nodes, type, + typeName, connection = false, path = ``, }: Object) => { @@ -81,7 +96,11 @@ module.exports = ({ // Ignore connection and sorting args. if (_.includes([`skip`, `limit`, `sort`], k)) return - siftArgs.push(siftifyArgs({ [k]: v })) + siftArgs.push( + siftifyArgs({ + [k]: v, + }) + ) extractFieldsToSift(``, k, {}, fieldsToSift, v) }) } @@ -113,35 +132,92 @@ module.exports = ({ .then(v => [k, v]) ) ).then(resolvedFields => { - const myNode = { ...node } + const myNode = { + ...node, + } resolvedFields.forEach(([k, v]) => (myNode[k] = v)) return myNode }) } - return Promise.all( - nodes.map(node => { - const cacheKey = enhancedNodeCacheId({ node, args: fieldsToSift }) - if (cacheKey && enhancedNodeCache.has(cacheKey)) { - return Promise.resolve(enhancedNodeCache.get(cacheKey)) - } + // If the the query only has a filter for an "id", then we'll just grab + // that ID and return it. + if ( + Object.keys(fieldsToSift).length === 1 && + Object.keys(fieldsToSift)[0] === `id` + ) { + const node = resolveRecursive( + getNode(siftArgs[0].id[`$eq`]), + fieldsToSift, + type.getFields() + ) - return resolveRecursive(node, fieldsToSift, type.getFields()).then( - resolvedNode => { - trackInlineObjectsInRootNode(resolvedNode) - if (cacheKey) { - enhancedNodeCache.set(cacheKey, resolvedNode) - } - return resolvedNode - } - ) + if (node) { + createPageDependency({ + path, + nodeId: node.id, + }) + } + + return node + } + + const nodesPromise = () => { + const nodesCacheKey = JSON.stringify({ + // typeName + count being the same is a pretty good + // indication that the nodes are the same. + typeName, + nodesLength: nodes.length, + ...fieldsToSift, }) - ).then(myNodes => { - myNodes = myNodes.map(trackInlineObjectsInRootNode) + if ( + process.env.NODE_ENV !== `test` && + resolvedNodesCache.has(nodesCacheKey) + ) { + return Promise.resolve(resolvedNodesCache.get(nodesCacheKey)) + } else { + return Promise.all( + nodes.map(node => { + const cacheKey = enhancedNodeCacheId({ + node, + args: fieldsToSift, + }) + if (cacheKey && enhancedNodeCache.has(cacheKey)) { + return Promise.resolve(enhancedNodeCache.get(cacheKey)) + } else if (cacheKey && enhancedNodePromiseCache.has(cacheKey)) { + return enhancedNodePromiseCache.get(cacheKey) + } + + const enhancedNodeGenerationPromise = new Promise(resolve => { + resolveRecursive(node, fieldsToSift, type.getFields()).then( + resolvedNode => { + trackInlineObjectsInRootNode(resolvedNode) + if (cacheKey) { + enhancedNodeCache.set(cacheKey, resolvedNode) + } + resolve(resolvedNode) + } + ) + }) + enhancedNodePromiseCache.set(cacheKey, enhancedNodeGenerationPromise) + return enhancedNodeGenerationPromise + }) + ).then(resolvedNodes => { + resolvedNodesCache.set(nodesCacheKey, resolvedNodes) + return resolvedNodes + }) + } + } + const tempPromise = nodesPromise().then(myNodes => { if (!connection) { const index = _.isEmpty(siftArgs) ? 0 - : sift.indexOf({ $and: siftArgs }, myNodes) + : sift.indexOf( + { + $and: siftArgs, + }, + myNodes + ) // If a node is found, create a dependency between the resulting node and // the path. @@ -159,7 +235,12 @@ module.exports = ({ let result = _.isEmpty(siftArgs) ? myNodes - : sift({ $and: siftArgs }, myNodes) + : sift( + { + $and: siftArgs, + }, + myNodes + ) if (!result || !result.length) return null @@ -184,4 +265,6 @@ module.exports = ({ } return connectionArray }) + + return tempPromise } diff --git a/packages/gatsby/src/utils/api-runner-node.js b/packages/gatsby/src/utils/api-runner-node.js index 4b2ea6cd605b2..c5533f3f119b8 100644 --- a/packages/gatsby/src/utils/api-runner-node.js +++ b/packages/gatsby/src/utils/api-runner-node.js @@ -2,8 +2,6 @@ const Promise = require(`bluebird`) const glob = require(`glob`) const _ = require(`lodash`) -const mapSeries = require(`async/mapSeries`) - const reporter = require(`gatsby-cli/lib/reporter`) const cache = require(`./cache`) const apiList = require(`./api-node-docs`) @@ -106,7 +104,8 @@ const runAPI = (plugin, api, args) => { let filteredPlugins const hasAPIFile = plugin => glob.sync(`${plugin.resolve}/gatsby-node*`)[0] -let apisRunning = [] +let apisRunningById = new Map() +let apisRunningByTraceId = new Map() let waitingForCasacadeToFinish = [] module.exports = async (api, args = {}, pluginSource) => @@ -145,35 +144,47 @@ module.exports = async (api, args = {}, pluginSource) => startTime: new Date().toJSON(), traceId: args.traceId, } + apiRunInstance.id = `${api}|${apiRunInstance.startTime}|${ + apiRunInstance.traceId + }|${JSON.stringify(args)}` if (args.waitForCascadingActions) { waitingForCasacadeToFinish.push(apiRunInstance) } - apisRunning.push(apiRunInstance) + apisRunningById.set(apiRunInstance.id, apiRunInstance) + if (apisRunningByTraceId.has(apiRunInstance.traceId)) { + const currentCount = apisRunningByTraceId.get(apiRunInstance.traceId) + apisRunningByTraceId.set(apiRunInstance.traceId, currentCount + 1) + } else { + apisRunningByTraceId.set(apiRunInstance.traceId, 1) + } let pluginName = null - mapSeries( - noSourcePluginPlugins, - (plugin, callback) => { - if (plugin.name === `default-site-plugin`) { - pluginName = `gatsby-node.js` - } else { - pluginName = `Plugin ${plugin.name}` - } - Promise.resolve(runAPI(plugin, api, args)).asCallback(callback) - }, - (err, results) => { + Promise.mapSeries(noSourcePluginPlugins, plugin => { + if (plugin.name === `default-site-plugin`) { + pluginName = `gatsby-node.js` + } else { + pluginName = `Plugin ${plugin.name}` + } + return Promise.resolve(runAPI(plugin, api, args)) + }) + .catch(err => { if (err) { if (process.env.NODE_ENV === `production`) { return reporter.panic(`${pluginName} returned an error`, err) } return reporter.error(`${pluginName} returned an error`, err) } + return null + }) + .then(results => { // Remove runner instance - apisRunning = apisRunning.filter(runner => runner !== apiRunInstance) + apisRunningById.delete(apiRunInstance.id) + const currentCount = apisRunningByTraceId.get(apiRunInstance.traceId) + apisRunningByTraceId.set(apiRunInstance.traceId, currentCount - 1) - if (apisRunning.length === 0) { + if (apisRunningById.size === 0) { const { emitter } = require(`../redux`) emitter.emit(`API_RUNNING_QUEUE_EMPTY`) } @@ -188,17 +199,20 @@ module.exports = async (api, args = {}, pluginSource) => } // Check if any of our waiters are done. - return (waitingForCasacadeToFinish = waitingForCasacadeToFinish.filter( + waitingForCasacadeToFinish = waitingForCasacadeToFinish.filter( instance => { // If none of its trace IDs are running, it's done. - if (!_.some(apisRunning, a => a.traceId === instance.traceId)) { + const apisByTraceIdCount = apisRunningByTraceId.get( + instance.traceId + ) + if (apisByTraceIdCount === 0) { instance.resolve(instance.results) return false } else { return true } } - )) - } - ) + ) + return + }) }) diff --git a/packages/gatsby/src/utils/cache.js b/packages/gatsby/src/utils/cache.js index b80cb3b88c50b..a807a69cee0f4 100644 --- a/packages/gatsby/src/utils/cache.js +++ b/packages/gatsby/src/utils/cache.js @@ -1,10 +1,20 @@ const Promise = require(`bluebird`) -const low = require(`lowdb`) const fs = require(`fs-extra`) const _ = require(`lodash`) +const objectToMap = obj => new Map(Object.entries(obj)) + +const mapToObject = map => { + const obj = {} + for (let [key, value] of map) { + obj[key] = value + } + return obj +} + let db let directory +let save /** * Initialize cache store. Reuse existing store if available. @@ -16,13 +26,6 @@ exports.initCache = () => { } else { directory = process.cwd() + `/.cache/cache` } - db = low(null, { - format: { - serialize: obj => JSON.stringify(obj), - deserialize: str => JSON.parse(str), - }, - }) - db._.mixin(require(`lodash-id`)) let previousState try { @@ -32,9 +35,9 @@ exports.initCache = () => { } if (previousState) { - db.defaults(previousState).write() + db = objectToMap(previousState) } else { - db.defaults({ keys: [] }).write() + db = new Map() } } @@ -45,21 +48,7 @@ exports.initCache = () => { */ exports.get = key => new Promise((resolve, reject) => { - let pair - try { - pair = db - .get(`keys`) - .getById(key) - .value() - } catch (e) { - // ignore - } - - if (pair) { - resolve(pair.value) - } else { - resolve() - } + resolve(db.get(key)) }) /** @@ -70,18 +59,14 @@ exports.get = key => */ exports.set = (key, value) => new Promise((resolve, reject) => { - db.get(`keys`) - .upsert({ id: key, value }) - .write() + db.set(key, value) save() resolve(`Ok`) }) -let save - if (process.env.NODE_ENV !== `test`) { save = _.debounce(() => { - fs.writeFile(`${directory}/db.json`, JSON.stringify(db.getState())) + fs.writeFile(`${directory}/db.json`, JSON.stringify(mapToObject(db))) }, 250) } else { save = _.noop diff --git a/packages/gatsby/src/utils/html-renderer.js b/packages/gatsby/src/utils/html-renderer.js index bc43d47b39dea..97e09e512856f 100644 --- a/packages/gatsby/src/utils/html-renderer.js +++ b/packages/gatsby/src/utils/html-renderer.js @@ -1,6 +1,7 @@ const Queue = require(`better-queue`) const fs = require(`fs-extra`) const path = require(`path`) +const convertHrtime = require(`convert-hrtime`) // copied from https://github.com/markdalgleish/static-site-generator-webpack-plugin/blob/master/index.js#L161 const generatePathToOutput = outputPath => { @@ -13,8 +14,9 @@ const generatePathToOutput = outputPath => { return path.join(process.cwd(), `public`, outputFileName) } -module.exports = (htmlComponentRenderer, pages) => +module.exports = (htmlComponentRenderer, pages, activity) => new Promise((resolve, reject) => { + const start = process.hrtime() const queue = new Queue( (path, callback) => { try { @@ -36,6 +38,17 @@ module.exports = (htmlComponentRenderer, pages) => queue.push(page) }) + queue.on(`task_finish`, () => { + const stats = queue.getStats() + if (activity) { + activity.setStatus( + `${stats.total}/${pages.length} ${( + stats.total / convertHrtime(process.hrtime(start)).seconds + ).toFixed(2)} pages/second` + ) + } + }) + queue.on(`drain`, () => { resolve() }) diff --git a/packages/gatsby/src/utils/profile.js b/packages/gatsby/src/utils/profile.js new file mode 100644 index 0000000000000..d6033ebbe341e --- /dev/null +++ b/packages/gatsby/src/utils/profile.js @@ -0,0 +1,69 @@ +// const convertHrtime = require(`convert-hrtime`) +// const _ = require(`lodash`) +// const treeify = require(`treeify`) +// const ss = require(`simple-statistics`) + +// let root = { +// ROOT: process.hrtime(), +// } + +// const profile = ({ name, start, parent }) => { +// const span = convertHrtime(process.hrtime(start)) +// let path = parent ? `${parent}.${name}` : name +// let currentValue = _.get(root, path) +// if (_.isObject(currentValue)) { +// path = `${path}.ROOT` +// currentValue = _.get(root, path) +// } +// const newValue = currentValue +// ? currentValue + span.milliseconds +// : span.milliseconds +// if (name === `run-query`) { +// console.log({ +// path, +// span: span.milliseconds, +// newValue, +// }) +// } +// root = _.set(root, path, newValue) +// } + +// global._PROFILE = profile +// module.exports = profile + +// const labelify = (object, rootValue) => +// _.mapKeys(object, (value, key, o) => { +// const currentValue = _.isObject(value) ? value.ROOT : value +// return `${key}: ${currentValue}ms | ${( +// (currentValue / rootValue) * +// 100 +// ).toFixed(2) + `%`}` +// }) + +// const descriptiveStats = (array, label) => { +// if (!array || array.length === 0) return +// console.log(``) +// console.log(label) +// console.log(`count:`, array.length) +// console.log(`min:`, ss.min(array)) +// console.log(`max:`, ss.max(array)) +// console.log(`mean:`, ss.mean(array)) +// console.log(`quantile 25:`, ss.quantile(array, 0.25)) +// console.log(`quantile 75:`, ss.quantile(array, 0.75)) +// } + +// process.on(`exit`, () => { +// root.ROOT = convertHrtime(process.hrtime(root.ROOT)).milliseconds +// root = labelify(root, root.ROOT) +// for (var prop in root) { +// if (_.isObject(root[prop]) && root[prop].ROOT) { +// const rootValue = root[prop].ROOT +// delete root[prop].ROOT +// root[prop] = labelify(root[prop], rootValue) +// } +// } +// console.log(``) +// console.log(`===PROFILE===`) +// console.log(treeify.asTree(root)) +// descriptiveStats(global.promiseMapTimes, `run-sift map nodes`) +// }) diff --git a/packages/gatsby/src/utils/source-nodes.js b/packages/gatsby/src/utils/source-nodes.js index 232776ea020be..40d98190595e7 100644 --- a/packages/gatsby/src/utils/source-nodes.js +++ b/packages/gatsby/src/utils/source-nodes.js @@ -18,7 +18,7 @@ function discoverPluginsWithoutNodes(storeState) { ) // Find out which plugins own already created nodes const nodeOwners = _.uniq( - _.values(storeState.nodes).reduce((acc, node) => { + Array.from(storeState.nodes.values()).reduce((acc, node) => { acc.push(node.internal.owner) return acc }, []) @@ -44,7 +44,7 @@ module.exports = async () => { // Garbage collect stale data nodes const touchedNodes = Object.keys(state.nodesTouched) - const staleNodes = _.values(state.nodes).filter(node => { + const staleNodes = Array.from(state.nodes.values()).filter(node => { // Find the root node. let rootNode = node let whileCount = 0 diff --git a/yarn.lock b/yarn.lock index 5dd922402ef22..3b2d0f9c21db9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,12 +52,18 @@ dependencies: "@babel/highlight" "7.0.0-beta.44" -"@babel/code-frame@7.0.0-beta.51", "@babel/code-frame@^7.0.0-beta.35", "@babel/code-frame@^7.0.0-beta.51": +"@babel/code-frame@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz#bd71d9b192af978df915829d39d4094456439a0c" dependencies: "@babel/highlight" "7.0.0-beta.51" +"@babel/code-frame@^7.0.0-beta.35", "@babel/code-frame@^7.0.0-beta.51": + version "7.0.0-beta.52" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.52.tgz#192483bfa0d1e467c101571c21029ccb74af2801" + dependencies: + "@babel/highlight" "7.0.0-beta.52" + "@babel/core@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0-beta.51.tgz#0e54bd6b638736b2ae593c31a47f0969e2b2b96d" @@ -195,13 +201,20 @@ dependencies: "@babel/types" "7.0.0-beta.51" -"@babel/helper-module-imports@7.0.0-beta.51", "@babel/helper-module-imports@^7.0.0-beta.49": +"@babel/helper-module-imports@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.51.tgz#ce00428045fbb7d5ebc0ea7bf835789f15366ab2" dependencies: "@babel/types" "7.0.0-beta.51" lodash "^4.17.5" +"@babel/helper-module-imports@^7.0.0-beta.49": + version "7.0.0-beta.52" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.52.tgz#70840e83ae891f94702c6c613787c48ee3c965bb" + dependencies: + "@babel/types" "7.0.0-beta.52" + lodash "^4.17.5" + "@babel/helper-module-transforms@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.51.tgz#13af0c8ee41f277743c8fc43d444315db2326f73" @@ -301,6 +314,14 @@ esutils "^2.0.2" js-tokens "^3.0.0" +"@babel/highlight@7.0.0-beta.52": + version "7.0.0-beta.52" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.52.tgz#ef24931432f06155e7bc39cdb8a6b37b4a28b3d0" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + "@babel/node@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.0.0-beta.51.tgz#fe6f4507b5633b822892be854c24c684c6606c18" @@ -837,7 +858,7 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" -"@babel/types@7.0.0-beta.51", "@babel/types@^7.0.0-beta.49": +"@babel/types@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.51.tgz#d802b7b543b5836c778aa691797abf00f3d97ea9" dependencies: @@ -845,6 +866,14 @@ lodash "^4.17.5" to-fast-properties "^2.0.0" +"@babel/types@7.0.0-beta.52", "@babel/types@^7.0.0-beta.49": + version "7.0.0-beta.52" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.52.tgz#a3e5620b1534b253a50abcf2222b520e23b16da2" + dependencies: + esutils "^2.0.2" + lodash "^4.17.5" + to-fast-properties "^2.0.0" + "@contentful/axios@^0.18.0": version "0.18.0" resolved "https://registry.yarnpkg.com/@contentful/axios/-/axios-0.18.0.tgz#576e0e6047411a66971e82d40688a8c795e62f27" @@ -1370,12 +1399,12 @@ resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.3.29.tgz#7f2ad7ec55f914482fc9b1ec4bb1ae6028d46066" "@types/node@*": - version "10.3.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.3.tgz#8798d9e39af2fa604f715ee6a6b19796528e46c3" + version "10.5.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.2.tgz#f19f05314d5421fe37e74153254201a7bf00a707" "@types/node@^7.0.11": - version "7.0.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.66.tgz#3d1dc4d6f52e484e843806ff456379f7e6ad5553" + version "7.0.67" + resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.67.tgz#3aeacf429e24e08e14d7621039d37b7f53542ecf" "@types/opn@^5.1.0": version "5.1.0" @@ -1392,15 +1421,15 @@ "@types/react-router" "*" "@types/react-router@*": - version "4.0.26" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.0.26.tgz#4489c873642baa633014294a6d0a290001ba9860" + version "4.0.28" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.0.28.tgz#b0445fc38613c81e92ca9ec0e08ab36697d51003" dependencies: "@types/history" "*" "@types/react" "*" "@types/react@*": - version "16.3.18" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.3.18.tgz#bf195aed4d77dc86f06e4c9bb760214a3b822b8d" + version "16.4.6" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.6.tgz#5024957c6bcef4f02823accf5974faba2e54fada" dependencies: csstype "^2.2.0" @@ -1408,16 +1437,6 @@ version "0.0.32" resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.32.tgz#0d3cb31022f8427ea58c008af32b80da126ca4e3" -"@webassemblyjs/ast@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.12.tgz#a9acbcb3f25333c4edfa1fdf3186b1ccf64e6664" - dependencies: - "@webassemblyjs/helper-module-context" "1.5.12" - "@webassemblyjs/helper-wasm-bytecode" "1.5.12" - "@webassemblyjs/wast-parser" "1.5.12" - debug "^3.1.0" - mamacro "^0.0.3" - "@webassemblyjs/ast@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" @@ -1428,61 +1447,30 @@ debug "^3.1.0" mamacro "^0.0.3" -"@webassemblyjs/floating-point-hex-parser@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.12.tgz#0f36044ffe9652468ce7ae5a08716a4eeff9cd9c" - "@webassemblyjs/floating-point-hex-parser@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" -"@webassemblyjs/helper-api-error@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.12.tgz#05466833ff2f9d8953a1a327746e1d112ea62aaf" - "@webassemblyjs/helper-api-error@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" -"@webassemblyjs/helper-buffer@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.12.tgz#1f0de5aaabefef89aec314f7f970009cd159c73d" - dependencies: - debug "^3.1.0" - "@webassemblyjs/helper-buffer@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" dependencies: debug "^3.1.0" -"@webassemblyjs/helper-code-frame@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.12.tgz#3cdc1953093760d1c0f0caf745ccd62bdb6627c7" - dependencies: - "@webassemblyjs/wast-printer" "1.5.12" - "@webassemblyjs/helper-code-frame@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" dependencies: "@webassemblyjs/wast-printer" "1.5.13" -"@webassemblyjs/helper-fsm@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.12.tgz#6bc1442b037f8e30f2e57b987cee5c806dd15027" - "@webassemblyjs/helper-fsm@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" -"@webassemblyjs/helper-module-context@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.12.tgz#b5588ca78b33b8a0da75f9ab8c769a3707baa861" - dependencies: - debug "^3.1.0" - mamacro "^0.0.3" - "@webassemblyjs/helper-module-context@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" @@ -1490,24 +1478,10 @@ debug "^3.1.0" mamacro "^0.0.3" -"@webassemblyjs/helper-wasm-bytecode@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.12.tgz#d12a3859db882a448891a866a05d0be63785b616" - "@webassemblyjs/helper-wasm-bytecode@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" -"@webassemblyjs/helper-wasm-section@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.12.tgz#ff9fe1507d368ad437e7969d25e8c1693dac1884" - dependencies: - "@webassemblyjs/ast" "1.5.12" - "@webassemblyjs/helper-buffer" "1.5.12" - "@webassemblyjs/helper-wasm-bytecode" "1.5.12" - "@webassemblyjs/wasm-gen" "1.5.12" - debug "^3.1.0" - "@webassemblyjs/helper-wasm-section@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" @@ -1518,52 +1492,22 @@ "@webassemblyjs/wasm-gen" "1.5.13" debug "^3.1.0" -"@webassemblyjs/ieee754@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.12.tgz#ee9574bc558888f13097ce3e7900dff234ea19a4" - dependencies: - ieee754 "^1.1.11" - "@webassemblyjs/ieee754@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" dependencies: ieee754 "^1.1.11" -"@webassemblyjs/leb128@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.12.tgz#0308eec652765ee567d8a5fa108b4f0b25b458e1" - dependencies: - leb "^0.3.0" - "@webassemblyjs/leb128@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" dependencies: long "4.0.0" -"@webassemblyjs/utf8@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.12.tgz#d5916222ef314bf60d6806ed5ac045989bfd92ce" - "@webassemblyjs/utf8@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" -"@webassemblyjs/wasm-edit@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.12.tgz#821c9358e644a166f2c910e5af1b46ce795a17aa" - dependencies: - "@webassemblyjs/ast" "1.5.12" - "@webassemblyjs/helper-buffer" "1.5.12" - "@webassemblyjs/helper-wasm-bytecode" "1.5.12" - "@webassemblyjs/helper-wasm-section" "1.5.12" - "@webassemblyjs/wasm-gen" "1.5.12" - "@webassemblyjs/wasm-opt" "1.5.12" - "@webassemblyjs/wasm-parser" "1.5.12" - "@webassemblyjs/wast-printer" "1.5.12" - debug "^3.1.0" - "@webassemblyjs/wasm-edit@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" @@ -1578,16 +1522,6 @@ "@webassemblyjs/wast-printer" "1.5.13" debug "^3.1.0" -"@webassemblyjs/wasm-gen@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.12.tgz#0b7ccfdb93dab902cc0251014e2e18bae3139bcb" - dependencies: - "@webassemblyjs/ast" "1.5.12" - "@webassemblyjs/helper-wasm-bytecode" "1.5.12" - "@webassemblyjs/ieee754" "1.5.12" - "@webassemblyjs/leb128" "1.5.12" - "@webassemblyjs/utf8" "1.5.12" - "@webassemblyjs/wasm-gen@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" @@ -1598,16 +1532,6 @@ "@webassemblyjs/leb128" "1.5.13" "@webassemblyjs/utf8" "1.5.13" -"@webassemblyjs/wasm-opt@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.12.tgz#bd758a8bc670f585ff1ae85f84095a9e0229cbc9" - dependencies: - "@webassemblyjs/ast" "1.5.12" - "@webassemblyjs/helper-buffer" "1.5.12" - "@webassemblyjs/wasm-gen" "1.5.12" - "@webassemblyjs/wasm-parser" "1.5.12" - debug "^3.1.0" - "@webassemblyjs/wasm-opt@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" @@ -1618,17 +1542,6 @@ "@webassemblyjs/wasm-parser" "1.5.13" debug "^3.1.0" -"@webassemblyjs/wasm-parser@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.12.tgz#7b10b4388ecf98bd7a22e702aa62ec2f46d0c75e" - dependencies: - "@webassemblyjs/ast" "1.5.12" - "@webassemblyjs/helper-api-error" "1.5.12" - "@webassemblyjs/helper-wasm-bytecode" "1.5.12" - "@webassemblyjs/ieee754" "1.5.12" - "@webassemblyjs/leb128" "1.5.12" - "@webassemblyjs/utf8" "1.5.12" - "@webassemblyjs/wasm-parser@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" @@ -1640,18 +1553,6 @@ "@webassemblyjs/leb128" "1.5.13" "@webassemblyjs/utf8" "1.5.13" -"@webassemblyjs/wast-parser@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.12.tgz#9cf5ae600ecae0640437b5d4de5dd6b6088d0d8b" - dependencies: - "@webassemblyjs/ast" "1.5.12" - "@webassemblyjs/floating-point-hex-parser" "1.5.12" - "@webassemblyjs/helper-api-error" "1.5.12" - "@webassemblyjs/helper-code-frame" "1.5.12" - "@webassemblyjs/helper-fsm" "1.5.12" - long "^3.2.0" - mamacro "^0.0.3" - "@webassemblyjs/wast-parser@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" @@ -1664,14 +1565,6 @@ long "^3.2.0" mamacro "^0.0.3" -"@webassemblyjs/wast-printer@1.5.12": - version "1.5.12" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.12.tgz#563ca4d01b22d21640b2463dc5e3d7f7d9dac520" - dependencies: - "@webassemblyjs/ast" "1.5.12" - "@webassemblyjs/wast-parser" "1.5.12" - long "^3.2.0" - "@webassemblyjs/wast-printer@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" @@ -1801,8 +1694,8 @@ ajv@^5.0.0, ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: json-schema-traverse "^0.3.0" ajv@^6.1.0, ajv@^6.5.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.1.tgz#88ebc1263c7133937d108b80c5572e64e1d9322d" + version "6.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -1810,8 +1703,8 @@ ajv@^6.1.0, ajv@^6.5.0: uri-js "^4.2.1" algoliasearch@^3.25.1: - version "3.28.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-3.28.0.tgz#12b6c8bda397eba805a7ff998ac87f6988411d2d" + version "3.29.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-3.29.0.tgz#d04021a5450be55ce314b928bba4a38723399bd8" dependencies: agentkeepalive "^2.2.0" debug "^2.6.8" @@ -1971,9 +1864,9 @@ argv@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" -aria-query@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" dependencies: ast-types-flow "0.0.7" commander "^2.11.0" @@ -2115,7 +2008,7 @@ assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" -ast-types-flow@0.0.7: +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" @@ -2204,9 +2097,9 @@ axios@^0.18.0: follow-redirects "^1.3.0" is-buffer "^1.1.5" -axobject-query@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" +axobject-query@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.1.tgz#05dfa705ada8ad9db993fa6896f22d395b0b0a07" dependencies: ast-types-flow "0.0.7" @@ -2258,8 +2151,8 @@ babel-eslint@8.2.1: eslint-visitor-keys "^1.0.0" babel-eslint@^8.2.2: - version "8.2.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.3.tgz#1a2e6681cc9bc4473c32899e59915e19cd6733cf" + version "8.2.5" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.5.tgz#dc2331c259d36782aa189da510c43dedd5adc7a3" dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/traverse" "7.0.0-beta.44" @@ -3146,8 +3039,8 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" dependencies: tweetnacl "^0.14.3" @@ -3333,8 +3226,8 @@ boom@2.x.x: hoek "2.x.x" bowser@^1.7.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.3.tgz#6643ae4d783f31683f6d23156976b74183862162" + version "1.9.4" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" boxen@1.3.0, boxen@^1.2.1: version "1.3.0" @@ -3387,8 +3280,8 @@ browser-process-hrtime@^0.1.2: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" browser-resolve@^1.11.2, browser-resolve@^1.7.0: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" dependencies: resolve "1.1.7" @@ -3416,12 +3309,13 @@ browserify-cipher@^1.0.0: evp_bytestokey "^1.0.0" browserify-des@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c" + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" dependencies: cipher-base "^1.0.1" des.js "^1.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" browserify-rsa@^4.0.0: version "4.0.1" @@ -3701,12 +3595,12 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000856" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000856.tgz#fbebb99abe15a5654fc7747ebb5315bdfde3358f" + version "1.0.30000865" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000865.tgz#82ffb64d40f7567620aac02d3a632079689abc6b" caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000844: - version "1.0.30000856" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000856.tgz#ecc16978135a6f219b138991eb62009d25ee8daa" + version "1.0.30000865" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" capture-exit@^1.2.0: version "1.2.0" @@ -3752,8 +3646,8 @@ center-align@^0.1.1: lazy-cache "^1.0.3" cfb@~1.0.2: - version "1.0.7" - resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.0.7.tgz#ccb615eb1bb0a039e7829ab0b2ad4ea564fbaa78" + version "1.0.8" + resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.0.8.tgz#77f213493d697d754fd9c0f5511eab5ad72d02cf" dependencies: commander "^2.14.1" printj "~1.1.2" @@ -3893,8 +3787,8 @@ chokidar@^1.4.2, chokidar@^1.7.0: fsevents "^1.0.0" chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" dependencies: anymatch "^2.0.0" async-each "^1.0.0" @@ -3903,12 +3797,13 @@ chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3: inherits "^2.0.1" is-binary-path "^1.0.0" is-glob "^4.0.0" + lodash.debounce "^4.0.8" normalize-path "^2.1.1" path-is-absolute "^1.0.0" readdirp "^2.0.0" - upath "^1.0.0" + upath "^1.0.5" optionalDependencies: - fsevents "^1.1.2" + fsevents "^1.2.2" chownr@^1.0.1: version "1.0.1" @@ -4219,8 +4114,8 @@ comma-separated-tokens@^1.0.0, comma-separated-tokens@^1.0.1: trim "0.0.1" command-exists@^1.2.2: - version "1.2.6" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.6.tgz#577f8e5feb0cb0f159cd557a51a9be1bdd76e09e" + version "1.2.7" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.7.tgz#16828f0c3ff2b0c58805861ef211b64fc15692a8" command-join@^2.0.0: version "2.0.0" @@ -4230,9 +4125,9 @@ commander@2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" -commander@2.15.x, commander@^2.11.0, commander@^2.14.1, commander@^2.8.1, commander@^2.9.0, commander@~2.15.0: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" +commander@2.16.x, commander@^2.11.0, commander@^2.14.1, commander@^2.8.1, commander@^2.9.0, commander@~2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" commander@~2.13.0: version "2.13.0" @@ -4657,17 +4552,14 @@ cors@^2.7.1: object-assign "^4" vary "^1" -cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892" +cosmiconfig@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" dependencies: is-directory "^0.3.1" - js-yaml "^3.4.3" - minimist "^1.2.0" - object-assign "^4.1.0" - os-homedir "^1.0.1" - parse-json "^2.2.0" - require-from-string "^1.1.0" + js-yaml "^3.9.0" + parse-json "^4.0.0" + require-from-string "^2.0.1" cosmiconfig@^5.0.2: version "5.0.5" @@ -4914,8 +4806,8 @@ csso@~2.3.1: source-map "^0.5.3" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + version "0.3.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" "cssstyle@>= 0.3.1 < 0.4.0": version "0.3.1" @@ -4924,8 +4816,8 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": cssom "0.3.x" csstype@^2.2.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.3.tgz#2504152e6e1cc59b32098b7f5d6a63f16294c1f7" + version "2.5.5" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.5.tgz#4125484a3d42189a863943f23b9e4b80fedfa106" csvtojson@^1.1: version "1.1.12" @@ -4958,7 +4850,7 @@ d@1: dependencies: es5-ext "^0.10.9" -damerau-levenshtein@^1.0.0: +damerau-levenshtein@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" @@ -5726,8 +5618,8 @@ ejs@^2.4.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.47: - version "1.3.48" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900" + version "1.3.52" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" elliptic@^6.0.0: version "6.4.0" @@ -5745,7 +5637,7 @@ elliptic@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" -emoji-regex@^6.1.0: +emoji-regex@^6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" @@ -5806,14 +5698,6 @@ engine.io@~3.2.0: engine.io-parser "~2.1.0" ws "~3.3.1" -enhanced-resolve@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" @@ -5848,8 +5732,8 @@ errno@^0.1.3, errno@~0.1.7: prr "~1.0.1" error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" dependencies: is-arrayish "^0.2.1" @@ -5992,8 +5876,8 @@ eslint-plugin-flow-vars@^0.5.0: resolved "https://registry.yarnpkg.com/eslint-plugin-flow-vars/-/eslint-plugin-flow-vars-0.5.0.tgz#a7fb78fd873c86e0e5839df3b3c90d47bc68c6d2" eslint-plugin-flowtype@^2.46.1: - version "2.49.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.49.3.tgz#ccca6ee5ba2027eb3ed36bc2ec8c9a842feee841" + version "2.50.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.0.tgz#953e262fa9b5d0fa76e178604892cf60dfb916da" dependencies: lodash "^4.17.10" @@ -6005,8 +5889,8 @@ eslint-plugin-graphql@^2.0.0: lodash "^4.11.1" eslint-plugin-import@^2.9.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz#dad31781292d6664b25317fd049d2e2b2f02205d" + version "2.13.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.13.0.tgz#df24f241175e312d91662dc91ca84064caec14ed" dependencies: contains-path "^0.1.0" debug "^2.6.8" @@ -6020,32 +5904,33 @@ eslint-plugin-import@^2.9.0: resolve "^1.6.0" eslint-plugin-jsx-a11y@^6.0.2, eslint-plugin-jsx-a11y@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz#54583d1ae442483162e040e13cc31865465100e5" + version "6.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.0.tgz#569f6f2d29546cab82cedaa077ec829693b0c42d" dependencies: - aria-query "^0.7.0" + aria-query "^3.0.0" array-includes "^3.0.3" - ast-types-flow "0.0.7" - axobject-query "^0.1.0" - damerau-levenshtein "^1.0.0" - emoji-regex "^6.1.0" - jsx-ast-utils "^2.0.0" + ast-types-flow "^0.0.7" + axobject-query "^2.0.1" + damerau-levenshtein "^1.0.4" + emoji-regex "^6.5.1" + has "^1.0.3" + jsx-ast-utils "^2.0.1" eslint-plugin-prettier@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz#33e4e228bdb06142d03c560ce04ec23f6c767dd7" + version "2.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.2.tgz#71998c60aedfa2141f7bfcbf9d1c459bf98b4fad" dependencies: fast-diff "^1.1.1" jest-docblock "^21.0.0" eslint-plugin-react@^7.7.0, eslint-plugin-react@^7.8.2: - version "7.9.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.9.1.tgz#101aadd15e7c7b431ed025303ac7b421a8e3dc15" + version "7.10.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.10.0.tgz#af5c1fef31c4704db02098f9be18202993828b50" dependencies: doctrine "^2.1.0" - has "^1.0.2" + has "^1.0.3" jsx-ast-utils "^2.0.1" - prop-types "^15.6.1" + prop-types "^15.6.2" eslint-scope@^3.7.1, eslint-scope@~3.7.1: version "3.7.1" @@ -6101,7 +5986,7 @@ eslint@^4.0.0, eslint@^4.19.1, eslint@^4.5.0: table "4.0.2" text-table "~0.2.0" -espree@^3.5.4: +espree@^3.5.2, espree@^3.5.4: version "3.5.4" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" dependencies: @@ -6203,10 +6088,10 @@ exec-series@^1.0.0: object-assign "^4.1.0" exec-sh@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + version "0.2.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" dependencies: - merge "^1.1.3" + merge "^1.2.0" execa@^0.10.0: version "0.10.0" @@ -6724,10 +6609,10 @@ flat-cache@^1.2.1, flat-cache@^1.3.0: write "^0.2.1" flat@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.0.0.tgz#3abc7f3b588e64ce77dc42fd59aa35806622fea8" + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" dependencies: - is-buffer "~1.1.5" + is-buffer "~2.0.3" flatten@^1.0.2: version "1.0.2" @@ -6753,8 +6638,8 @@ focus-group@^0.3.1: resolved "https://registry.yarnpkg.com/focus-group/-/focus-group-0.3.1.tgz#e0f32ed86b0dabdd6ffcebdf898ecb32e47fedce" follow-redirects@^1.0.0, follow-redirects@^1.2.5, follow-redirects@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.0.tgz#234f49cf770b7f35b40e790f636ceba0c3a0ab77" + version "1.5.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz#67a8f14f5a1f67f962c2c46469c79eaec0a90291" dependencies: debug "^3.1.0" @@ -6866,6 +6751,10 @@ fs-copy-file-sync@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" +fs-exists-cached@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz#cf25554ca050dc49ae6656b41de42258989dcbce" + fs-extra@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.0.0.tgz#337352bded4a0b714f3eb84de8cea765e9d37600" @@ -6927,7 +6816,7 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@^1.0.0, fsevents@^1.0.14, fsevents@^1.1.2, fsevents@^1.2.3: +fsevents@^1.0.0, fsevents@^1.0.14, fsevents@^1.2.2, fsevents@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" dependencies: @@ -7237,8 +7126,8 @@ globals-docs@^2.4.0: resolved "https://registry.yarnpkg.com/globals-docs/-/globals-docs-2.4.0.tgz#f2c647544eb6161c7c38452808e16e693c2dafbb" globals@^11.0.1, globals@^11.1.0: - version "11.5.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" + version "11.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" globals@^9.18.0: version "9.18.0" @@ -7402,8 +7291,8 @@ got@^7.0.0, got@^7.1.0: url-to-options "^1.0.1" got@^8.0.0, got@^8.0.1: - version "8.3.1" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.1.tgz#093324403d4d955f5a16a7a8d39955d055ae10ed" + version "8.3.2" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" dependencies: "@sindresorhus/is" "^0.7.0" cacheable-request "^2.1.1" @@ -7424,8 +7313,8 @@ got@^8.0.0, got@^8.0.1: url-to-options "^1.0.1" gotrue-js@^0.9.15: - version "0.9.21" - resolved "https://registry.yarnpkg.com/gotrue-js/-/gotrue-js-0.9.21.tgz#38be75c5dfee370d87166e43ab5b2b56717a1484" + version "0.9.22" + resolved "https://registry.yarnpkg.com/gotrue-js/-/gotrue-js-0.9.22.tgz#2f013c59caba5a17b47ad856cd140842190f93c5" dependencies: micro-api-client "^3.2.1" @@ -7715,7 +7604,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1, has@^1.0.2: +has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" dependencies: @@ -7728,12 +7617,16 @@ hash-base@^3.0.0: inherits "^2.0.1" safe-buffer "^5.0.1" +hash-mod@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/hash-mod/-/hash-mod-0.0.5.tgz#daf1e4973a9116643467d54ee7690b43ef802ecc" + hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c" + version "1.1.5" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" dependencies: inherits "^2.0.3" - minimalistic-assert "^1.0.0" + minimalistic-assert "^1.0.1" hast-to-hyperscript@^3.0.0: version "3.1.0" @@ -7748,8 +7641,8 @@ hast-to-hyperscript@^3.0.0: unist-util-is "^2.0.0" hast-util-embedded@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-1.0.0.tgz#49d6114b40933a9d0bd708a3b012378f2cd6e86c" + version "1.0.1" + resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-1.0.1.tgz#2889896b4fd1d485a51cb9ce4f5bd17b47049eba" dependencies: hast-util-is-element "^1.0.0" @@ -7784,12 +7677,12 @@ hast-util-is-body-ok-link@^1.0.0: hast-util-is-element "^1.0.0" hast-util-is-element@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.0.0.tgz#3f7216978b2ae14d98749878782675f33be3ce00" + version "1.0.1" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.0.1.tgz#c76e8aafbdb6e5c83265bf50324e2f2e024eb12a" hast-util-parse-selector@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.1.0.tgz#b55c0f4bb7bb2040c889c325ef87ab29c38102b4" + version "2.1.1" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.1.1.tgz#fc06985272f5d204a25187f002bb916521e74f3a" hast-util-raw@^2.0.2: version "2.0.2" @@ -7852,8 +7745,8 @@ hast-util-to-string@^1.0.0: resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-1.0.1.tgz#b28055cdca012d3c8fd048757c8483d0de0d002c" hast-util-whitespace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.0.tgz#bd096919625d2936e1ff17bc4df7fd727f17ece9" + version "1.0.1" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.1.tgz#d67da2c87637b1ce1d85dd15b270ba057930149a" hastscript@^3.0.0: version "3.1.0" @@ -7920,8 +7813,8 @@ hoek@4.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" hoist-non-react-statics@^2.1.0, hoist-non-react-statics@^2.5.0: - version "2.5.4" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.4.tgz#fc3b1ac05d2ae3abedec84eba846511b0d4fcc4f" + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" home-or-tmp@^2.0.0: version "2.0.0" @@ -7941,8 +7834,8 @@ homedir-polyfill@^1.0.1: parse-passwd "^1.0.0" hosted-git-info@^2.1.4, hosted-git-info@^2.5.0, hosted-git-info@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" hpack.js@^2.1.6: version "2.1.6" @@ -7968,16 +7861,16 @@ html-entities@^1.2.0: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" html-minifier@^3.2.3: - version "3.5.16" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.16.tgz#39f5aabaf78bdfc057fe67334226efd7f3851175" + version "3.5.18" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.18.tgz#fc8b02826cbbafc6de19a103c41c830a91cffe5a" dependencies: camel-case "3.0.x" clean-css "4.1.x" - commander "2.15.x" + commander "2.16.x" he "1.1.x" param-case "2.1.x" relateurl "0.2.x" - uglify-js "3.3.x" + uglify-js "3.4.x" html-void-elements@^1.0.0, html-void-elements@^1.0.1: version "1.0.3" @@ -8133,8 +8026,8 @@ ignore-walk@^3.0.1: minimatch "^3.0.4" ignore@^3.2.7, ignore@^3.3.3, ignore@^3.3.5: - version "3.3.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" image-size@^0.6.1: version "0.6.3" @@ -8180,6 +8073,18 @@ immutable@~3.7.6: version "3.7.6" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + dependencies: + import-from "^2.1.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + dependencies: + resolve-from "^3.0.0" + import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -8414,8 +8319,8 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" is-arrayish@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.1.tgz#c2dfc386abaa0c3e33c48db3fe87059e69065efd" + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" is-binary-path@^1.0.0: version "1.0.1" @@ -8423,10 +8328,14 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.4, is-buffer@^1.1.5, is-buffer@~1.1.1, is-buffer@~1.1.5: +is-buffer@^1.1.4, is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" +is-buffer@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" + is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" @@ -8438,8 +8347,8 @@ is-bzip2@^1.0.0: resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" is-ci@^1.0.10: version "1.1.0" @@ -8648,12 +8557,6 @@ is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" - is-online@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-online/-/is-online-7.0.0.tgz#7e2408c0ae1e7e37ba8d50bdb237260d32bfd96e" @@ -9325,6 +9228,10 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + js-yaml@3.11.0: version "3.11.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" @@ -9332,7 +9239,7 @@ js-yaml@3.11.0: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.10.0, js-yaml@^3.11.0, js-yaml@^3.4.3, js-yaml@^3.5.2, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1: +js-yaml@^3.10.0, js-yaml@^3.11.0, js-yaml@^3.5.2, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: @@ -9487,7 +9394,7 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jsx-ast-utils@^2.0.0, jsx-ast-utils@^2.0.1: +jsx-ast-utils@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" dependencies: @@ -9594,10 +9501,6 @@ lead@^1.0.0: dependencies: flush-write-stream "^1.0.2" -leb@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/leb/-/leb-0.3.0.tgz#32bee9fad168328d6aea8522d833f4180eed1da3" - left-pad@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" @@ -9861,6 +9764,10 @@ lodash.clonedeep@4.5.0, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -10074,10 +9981,10 @@ longest@^1.0.0, longest@^1.0.1: resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" dependencies: - js-tokens "^3.0.0" + js-tokens "^3.0.0 || ^4.0.0" loud-rejection@^1.0.0, loud-rejection@^1.2.0, loud-rejection@^1.6.0: version "1.6.0" @@ -10392,7 +10299,7 @@ merge2@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34" -merge@^1.1.3: +merge@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" @@ -10527,14 +10434,7 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" -mini-css-extract-plugin@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.0.tgz#ff3bf08bee96e618e177c16ca6131bfecef707f9" - dependencies: - loader-utils "^1.1.0" - webpack-sources "^1.1.0" - -mini-css-extract-plugin@^0.4.1: +mini-css-extract-plugin@^0.4.0, mini-css-extract-plugin@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.1.tgz#d2bcf77bb2596b8e4bd9257e43d3f9164c2e86cb" dependencies: @@ -10546,7 +10446,7 @@ mini-svg-data-uri@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.0.1.tgz#d81ffc14b85558860581cc58d9790daaecbe91bf" -minimalistic-assert@^1.0.0: +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -10774,16 +10674,19 @@ nan@^2.10.0, nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" +nanoid@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-1.0.7.tgz#23857a9514ae8efb7374221b923a2b92be3f74f2" + nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" - is-odd "^2.0.0" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" @@ -10801,7 +10704,7 @@ ncom@~1.0.1: dependencies: sc-formatter "~3.0.1" -needle@^2.2.0: +needle@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" dependencies: @@ -10818,8 +10721,8 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" netlify-cms@^1.3.5: - version "1.9.2" - resolved "https://registry.yarnpkg.com/netlify-cms/-/netlify-cms-1.9.2.tgz#ccc40d5747d14ab4562c1e1fda2d3f3cd8db62ab" + version "1.9.3" + resolved "https://registry.yarnpkg.com/netlify-cms/-/netlify-cms-1.9.3.tgz#f65d82b7779983e471fc40307c900ed809dc2819" dependencies: classnames "^2.2.5" create-react-class "^15.6.0" @@ -10920,8 +10823,8 @@ no-case@^2.2.0, no-case@^2.3.2: lower-case "^1.1.1" node-abi@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.4.1.tgz#7628c4d4ec4e9cd3764ceb3652f36b2e7f8d4923" + version "2.4.3" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.4.3.tgz#43666b7b17e57863e572409edbb82115ac7af28b" dependencies: semver "^5.4.1" @@ -11036,16 +10939,16 @@ node-plop@=0.9.0: resolve "^1.2.0" node-pre-gyp@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" - needle "^2.2.0" + needle "^2.2.1" nopt "^4.0.1" npm-packlist "^1.1.6" npmlog "^4.0.2" - rc "^1.1.7" + rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" tar "^4" @@ -11220,8 +11123,8 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" nwsapi@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.3.tgz#3f4010d6c943f34018d3dfb5f2fbc0de90476959" + version "2.0.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.4.tgz#dc79040a5f77b97716dc79565fc7fc3ef7d50570" nyc@^7.0.0: version "7.1.0" @@ -11286,8 +11189,8 @@ object-hash@^1.1.4: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2" object-keys@^1.0.11, object-keys@^1.0.8, object-keys@~1.0.0: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" object-path@^0.11.2: version "0.11.4" @@ -12039,36 +11942,20 @@ postcss-flexbugs-fixes@^3.0.0: dependencies: postcss "^6.0.1" -postcss-load-config@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" - dependencies: - cosmiconfig "^2.1.0" - object-assign "^4.1.0" - postcss-load-options "^1.2.0" - postcss-load-plugins "^2.3.0" - -postcss-load-options@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" - dependencies: - cosmiconfig "^2.1.0" - object-assign "^4.1.0" - -postcss-load-plugins@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" +postcss-load-config@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" dependencies: - cosmiconfig "^2.1.1" - object-assign "^4.1.0" + cosmiconfig "^4.0.0" + import-cwd "^2.0.0" postcss-loader@^2.1.3: - version "2.1.5" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.5.tgz#3c6336ee641c8f95138172533ae461a83595e788" + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.6.tgz#1d7dd7b17c6ba234b9bed5af13e0bea40a42d740" dependencies: loader-utils "^1.1.0" postcss "^6.0.0" - postcss-load-config "^1.2.0" + postcss-load-config "^2.0.0" schema-utils "^0.4.0" postcss-merge-idents@^2.1.5: @@ -12280,8 +12167,8 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 supports-color "^3.2.3" postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.22: - version "6.0.22" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.22.tgz#e23b78314905c3b90cbd61702121e7a78848f2a3" + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" dependencies: chalk "^2.4.1" source-map "^0.6.1" @@ -12353,8 +12240,8 @@ prettier-eslint-cli@4.7.1: yargs "10.0.3" prettier-eslint@^8.5.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.8.1.tgz#38505163274742f2a0b31653c39e40f37ebd07da" + version "8.8.2" + resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.8.2.tgz#fcb29a48ab4524e234680797fe70e9d136ccaf0b" dependencies: babel-runtime "^6.26.0" common-tags "^1.4.0" @@ -12364,14 +12251,15 @@ prettier-eslint@^8.5.0: lodash.merge "^4.6.0" loglevel-colored-level-prefix "^1.0.0" prettier "^1.7.0" - pretty-format "^22.0.3" + pretty-format "^23.0.1" require-relative "^0.8.7" typescript "^2.5.1" - typescript-eslint-parser "^11.0.0" + typescript-eslint-parser "^16.0.0" + vue-eslint-parser "^2.0.2" prettier@^1.12, prettier@^1.7.0: - version "1.13.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.5.tgz#7ae2076998c8edce79d63834e9b7b09fead6bfd0" + version "1.13.7" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281" pretty-bytes@^4.0.2: version "4.0.2" @@ -12384,20 +12272,27 @@ pretty-error@^2.0.2, pretty-error@^2.1.1: renderkid "^2.0.1" utila "~0.4" -pretty-format@^22.0.3, pretty-format@^22.4.0, pretty-format@^22.4.3: +pretty-format@^22.4.0, pretty-format@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f" dependencies: ansi-regex "^3.0.0" ansi-styles "^3.2.0" +pretty-format@^23.0.1: + version "23.2.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.2.0.tgz#3b0aaa63c018a53583373c1cb3a5d96cc5e83017" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + printj@~1.1.0, printj@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" prismjs@^1.13.0, prismjs@^1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.14.0.tgz#bbccfdb8be5d850d26453933cb50122ca0362ae0" + version "1.15.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9" optionalDependencies: clipboard "^2.0.0" @@ -12456,11 +12351,10 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1: - version "15.6.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" +prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" dependencies: - fbjs "^0.8.16" loose-envify "^1.3.1" object-assign "^4.1.1" @@ -12662,7 +12556,7 @@ raw-loader@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" -rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.1.7: +rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" dependencies: @@ -12801,8 +12695,8 @@ react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.2, react-lifecycles resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" react-modal@^3.1.5: - version "3.4.5" - resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.4.5.tgz#75a7eefb8f4c8247278d5ce1c41249d7785d9f69" + version "3.5.1" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.5.1.tgz#33d38527def90ea324848f7d63e53acc4468a451" dependencies: exenv "^1.2.0" prop-types "^15.5.10" @@ -12875,11 +12769,12 @@ react-sortable-hoc@^0.6.8: prop-types "^15.5.7" react-split-pane@^0.1.66: - version "0.1.77" - resolved "https://registry.yarnpkg.com/react-split-pane/-/react-split-pane-0.1.77.tgz#f0c8cd18d076bbac900248dcf6dbcec02d5340db" + version "0.1.81" + resolved "https://registry.yarnpkg.com/react-split-pane/-/react-split-pane-0.1.81.tgz#b1e8b82e0a6edd10f18fd639a5f512db3cbbb4e6" dependencies: inline-style-prefixer "^3.0.6" prop-types "^15.5.10" + react-lifecycles-compat "^3.0.4" react-style-proptype "^3.0.0" react-style-proptype@^3.0.0: @@ -12921,12 +12816,13 @@ react-transition-group@^1.1.3: warning "^3.0.0" react-transition-group@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.3.1.tgz#31d611b33e143a5e0f2d94c348e026a0f3b474b6" + version "2.4.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.4.0.tgz#1d9391fabfd82e016f26fabd1eec329dbd922b5a" dependencies: dom-helpers "^3.3.1" loose-envify "^1.3.1" - prop-types "^15.6.1" + prop-types "^15.6.2" + react-lifecycles-compat "^3.0.4" react-waypoint@^7.1.0: version "7.3.4" @@ -13117,8 +13013,8 @@ readdirp@^2.0.0: set-immediate-shim "^1.0.1" realpath-native@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" + version "1.0.1" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.1.tgz#07f40a0cce8f8261e2e8b7ebebf5c95965d7b633" dependencies: util.promisify "^1.0.0" @@ -13744,9 +13640,9 @@ require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" +require-from-string@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" require-main-filename@^1.0.1: version "1.0.1" @@ -13830,8 +13726,8 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" resolve@^1.1.3, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.0.tgz#a7f2ac27b78480ecc09c83782741d9f26e4f0c3e" + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: path-parse "^1.0.5" @@ -14234,14 +14130,10 @@ semver-truncate@^1.0.0: dependencies: semver "^5.3.0" -"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@5.5.0, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -semver@5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - semver@^4.0.3: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" @@ -14393,12 +14285,12 @@ shallow-equal@^1.0.0: resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.0.0.tgz#508d1838b3de590ab8757b011b25e430900945f7" shallowequal@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.0.2.tgz#1561dbdefb8c01408100319085764da3fcf83f8f" + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" sharp@^0.20.2: - version "0.20.3" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.20.3.tgz#315cbd44c36a0c403433a5d7b50bcbdf81b0ede0" + version "0.20.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.20.5.tgz#fc19d9639b1c792fa68a21624c75069923e79edd" dependencies: color "^3.0.0" detect-libc "^1.0.3" @@ -14435,8 +14327,10 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" shortid@^2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.8.tgz#033b117d6a2e975804f6f0969dbe7d3d0b355131" + version "2.2.11" + resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.11.tgz#a77896f086b0dae7fce1237e29232d2aeef5738e" + dependencies: + nanoid "^1.0.7" sift@^5.1.0: version "5.1.0" @@ -14484,8 +14378,8 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" slate-base64-serializer@^0.2.8: - version "0.2.34" - resolved "https://registry.yarnpkg.com/slate-base64-serializer/-/slate-base64-serializer-0.2.34.tgz#8a310672bf2f1b00dd469bc5e5247c20bb1ecd40" + version "0.2.39" + resolved "https://registry.yarnpkg.com/slate-base64-serializer/-/slate-base64-serializer-0.2.39.tgz#8ea625cdeae3309a926546fd5b845099ba50fade" dependencies: isomorphic-base64 "^1.0.2" @@ -14508,8 +14402,8 @@ slate-plain-serializer@^0.4.0, slate-plain-serializer@^0.4.6: slate-dev-logger "^0.1.36" slate-prop-types@^0.4.6: - version "0.4.32" - resolved "https://registry.yarnpkg.com/slate-prop-types/-/slate-prop-types-0.4.32.tgz#3d39a6db4b61a416ea54af6512f5ffa5542095d2" + version "0.4.37" + resolved "https://registry.yarnpkg.com/slate-prop-types/-/slate-prop-types-0.4.37.tgz#ac7706dd64fd166066cd8313c4d3942df64ad7f0" dependencies: slate-dev-logger "^0.1.39" @@ -15373,8 +15267,8 @@ tapable@^1.0.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" tar-fs@^1.13.0: - version "1.16.2" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.2.tgz#17e5239747e399f7e77344f5f53365f04af53577" + version "1.16.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" dependencies: chownr "^1.0.1" mkdirp "^0.5.1" @@ -15677,8 +15571,8 @@ toposort@^1.0.0: resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" tough-cookie@>=2.3.3, tough-cookie@^2.3.3: - version "2.4.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.2.tgz#aa9133154518b494efab98a58247bfc38818c00c" + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" dependencies: psl "^1.1.24" punycode "^1.4.1" @@ -15695,6 +15589,10 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + trim-lines@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.1.tgz#da738ff58fa74817588455e30b11b85289f2a396" @@ -15748,11 +15646,7 @@ tsickle@^0.27.2: source-map "^0.6.0" source-map-support "^0.5.0" -tslib@^1.6.0, tslib@^1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.2.tgz#8be0cc9a1f6dc7727c38deb16c2ebd1a2892988e" - -tslib@^1.7.1: +tslib@^1.6.0, tslib@^1.7.1, tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -15799,12 +15693,12 @@ typedarray@^0.0.6, typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typescript-eslint-parser@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-11.0.0.tgz#37dba6a0130dd307504aa4b4b21b0d3dc7d4e9f2" +typescript-eslint-parser@^16.0.0: + version "16.0.1" + resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-16.0.1.tgz#b40681c7043b222b9772748b700a000b241c031b" dependencies: lodash.unescape "4.0.1" - semver "5.4.1" + semver "5.5.0" typescript@^1.8.9: version "1.8.10" @@ -15829,11 +15723,11 @@ uglify-es@^3.3.4: commander "~2.13.0" source-map "~0.6.1" -uglify-js@3.3.x: - version "3.3.28" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.28.tgz#0efb9a13850e11303361c1051f64d2ec68d9be06" +uglify-js@3.4.x: + version "3.4.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.4.tgz#92e79532a3aeffd4b6c65755bdba8d5bad98d607" dependencies: - commander "~2.15.0" + commander "~2.16.0" source-map "~0.6.1" uglify-js@^2.6: @@ -15850,8 +15744,8 @@ uglify-to-browserify@~1.0.0: resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" uglifyjs-webpack-plugin@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz#2ef8387c8f1a903ec5e44fa36f9f3cbdcea67641" + version "1.2.7" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" @@ -16061,8 +15955,8 @@ unist-util-visit@^1.0.0, unist-util-visit@^1.1.0, unist-util-visit@^1.1.1, unist unist-util-is "^2.1.1" universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -16083,7 +15977,7 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -upath@^1.0.0: +upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" @@ -16250,11 +16144,7 @@ uuid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - -uuid@^3.2.1: +uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" @@ -16451,8 +16341,8 @@ vinyl@^1.0.0: replace-ext "0.0.1" vinyl@^2.0.0, vinyl@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" + version "2.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" dependencies: clone "^2.1.1" clone-buffer "^1.0.0" @@ -16467,6 +16357,17 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +vue-eslint-parser@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1" + dependencies: + debug "^3.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.2" + esquery "^1.0.0" + lodash "^4.17.4" + vue-template-compiler@^2.5.16: version "2.5.16" resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.16.tgz#93b48570e56c720cdf3f051cc15287c26fbd04cb" @@ -16637,37 +16538,7 @@ webpack-stats-plugin@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/webpack-stats-plugin/-/webpack-stats-plugin-0.1.5.tgz#29e5f12ebfd53158d31d656a113ac1f7b86179d9" -webpack@^4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.12.0.tgz#14758e035ae69747f68dd0edf3c5a572a82bdee9" - dependencies: - "@webassemblyjs/ast" "1.5.12" - "@webassemblyjs/helper-module-context" "1.5.12" - "@webassemblyjs/wasm-edit" "1.5.12" - "@webassemblyjs/wasm-opt" "1.5.12" - "@webassemblyjs/wasm-parser" "1.5.12" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" - enhanced-resolve "^4.0.0" - eslint-scope "^3.7.1" - json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.4" - tapable "^1.0.0" - uglifyjs-webpack-plugin "^1.2.4" - watchpack "^1.5.0" - webpack-sources "^1.0.1" - -webpack@^4.14.0: +webpack@^4.12.0, webpack@^4.14.0: version "4.15.1" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.15.1.tgz#dc716779a3b88827c369f18c71a6137fa7e582fd" dependencies: @@ -16959,8 +16830,8 @@ xmlhttprequest-ssl@~1.5.4: resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" xstate@^3.1.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/xstate/-/xstate-3.3.2.tgz#4be8003fef861c5e4dd4ceb1037d9cdd39635316" + version "3.3.3" + resolved "https://registry.yarnpkg.com/xstate/-/xstate-3.3.3.tgz#64177cd4473d4c2424b3df7d2434d835404b09a9" "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" @@ -17030,7 +16901,7 @@ yargs@10.0.3: y18n "^3.2.1" yargs-parser "^8.0.0" -yargs@11.0.0, yargs@^11.0.0: +yargs@11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b" dependencies: @@ -17064,7 +16935,7 @@ yargs@^10.0.3: y18n "^3.2.1" yargs-parser "^8.1.0" -yargs@^11.1.0: +yargs@^11.0.0, yargs@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" dependencies: @@ -17146,8 +17017,8 @@ yargs@~3.10.0: window-size "0.1.0" yauzl@^2.2.1, yauzl@^2.4.2: - version "2.9.2" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.2.tgz#4fb1bc7ae1fc2f57037b54af6acc8fe1031c5b77" + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0"