From 61df46e5250c6cdea24e051837ab34132fc8fa6c Mon Sep 17 00:00:00 2001 From: wangyi <724003548@qq.com> Date: Tue, 26 Nov 2019 16:26:38 +0800 Subject: [PATCH] feat: add test --- .circleci/config.yml | 50 +- __mocks__/fileMock.js | 1 + __mocks__/styleMock.js | 1 + babel.config.js | 7 + jest.config.js | 28 + package.json | 21 +- .../lib/node/__tests__/commands/cli.spec.js | 51 ++ .../commands/fixtures/demo/README.MD | 3 + .../__tests__/prepare/fixtures/demo/README.MD | 3 + .../node/__tests__/prepare/prepare.spec.js | 16 + .../__snapshots__/page-render.spec.js.snap | 29 + .../__tests__/ssr/fixtures/demo/README.MD | 3 + .../node/__tests__/ssr/page-render.spec.js | 31 + .../core/lib/node/commands/spa/index.js | 36 +- .../core/lib/node/commands/ssr/getConfig.js | 70 ++ .../core/lib/node/commands/ssr/index.js | 139 +--- .../core/lib/node/pageRender/index.js | 59 +- .../core/lib/node/prepare/resolveOptions.js | 2 +- packages/@rcpress/core/package.json | 1 + packages/@rcpress/test-util/index.js | 14 + packages/@rcpress/test-util/package.json | 8 + .../__snapshots__/search-box.Spec.js.snap | 3 + .../components/__test__/search-box.Spec.js | 10 + .../@rcpress/theme-default/layout/header.tsx | 2 +- packages/@rcpress/util/src/index.js | 7 +- .../@rcpress/webpack/src/createBaseConfig.js | 11 +- .../docs/docs/.rcpress/public/screenshot.rar | Bin 0 -> 30625 bytes packages/docs/package.json | 2 +- setupTest.js | 10 + test/create-warn-matcher.js | 244 ++++++ yarn.lock | 727 +++++++++++++++++- 31 files changed, 1410 insertions(+), 179 deletions(-) create mode 100644 __mocks__/fileMock.js create mode 100644 __mocks__/styleMock.js create mode 100644 babel.config.js create mode 100644 jest.config.js create mode 100644 packages/@rcpress/core/lib/node/__tests__/commands/cli.spec.js create mode 100644 packages/@rcpress/core/lib/node/__tests__/commands/fixtures/demo/README.MD create mode 100644 packages/@rcpress/core/lib/node/__tests__/prepare/fixtures/demo/README.MD create mode 100644 packages/@rcpress/core/lib/node/__tests__/prepare/prepare.spec.js create mode 100644 packages/@rcpress/core/lib/node/__tests__/ssr/__snapshots__/page-render.spec.js.snap create mode 100644 packages/@rcpress/core/lib/node/__tests__/ssr/fixtures/demo/README.MD create mode 100644 packages/@rcpress/core/lib/node/__tests__/ssr/page-render.spec.js create mode 100644 packages/@rcpress/core/lib/node/commands/ssr/getConfig.js create mode 100644 packages/@rcpress/test-util/index.js create mode 100644 packages/@rcpress/test-util/package.json create mode 100644 packages/@rcpress/theme-default/components/__test__/__snapshots__/search-box.Spec.js.snap create mode 100644 packages/@rcpress/theme-default/components/__test__/search-box.Spec.js create mode 100644 packages/docs/docs/.rcpress/public/screenshot.rar create mode 100644 setupTest.js create mode 100644 test/create-warn-matcher.js diff --git a/.circleci/config.yml b/.circleci/config.yml index f83b114..34e3f62 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,25 +13,63 @@ defaults: &defaults - image: circleci/node:10.15.2 jobs: - build-docs: + # install dependencies + install-dependencies: <<: *defaults + steps: + - checkout + + - restore_cache: + keys: + - v1-deps-{{ checksum "yarn.lock" }} + - v1-deps - docker: - # specify the version you desire here - - image: circleci/node:10.15.2 + - run: + name: 'Install dependencies' + command: yarn bs + - save_cache: + key: v1-deps-{{ checksum "yarn.lock" }} + paths: + - ~/.cache/yarn + + - persist_to_workspace: + root: ~/project/rcpress + paths: + - node_modules + - packages/*/node_modules + - packages/@rcpress/*/node_modules + + # test + run-tests: + <<: *defaults + steps: + - checkout + - attach_workspace: + at: ~/project/rcpress + - run: + name: 'Run tests' + command: yarn test + + # build docs and upload to server + build-docs: + <<: *defaults steps: - checkout - - run: yarn && yarn bs - run: yarn generate-with-prefix - run: ssh -o "StrictHostKeyChecking no" root@$DOCKER_IP "~/rcpress/before-dep.sh" - run: scp -o "StrictHostKeyChecking no" -r packages/docs/docs/.rcpress/dist/* root@$DOCKER_IP:~/rcpress/tmp - run: ssh -o "StrictHostKeyChecking no" root@$DOCKER_IP "~/rcpress/after-dep.sh" + workflows: version: 2 - build-and-deploy: + build: jobs: + - install-dependencies + - run-tests: + requires: install-dependencies - build-docs: + requires: install-dependencies filters: branches: only: diff --git a/__mocks__/fileMock.js b/__mocks__/fileMock.js new file mode 100644 index 0000000..f053ebf --- /dev/null +++ b/__mocks__/fileMock.js @@ -0,0 +1 @@ +module.exports = {}; diff --git a/__mocks__/styleMock.js b/__mocks__/styleMock.js new file mode 100644 index 0000000..f053ebf --- /dev/null +++ b/__mocks__/styleMock.js @@ -0,0 +1 @@ +module.exports = {}; diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..6952076 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,7 @@ +module.exports = { + env: { + test: { + presets: ['@babel/preset-env', '@babel/preset-react'] + } + } +}; diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..e6bde7c --- /dev/null +++ b/jest.config.js @@ -0,0 +1,28 @@ +module.exports = { + rootDir: './', + coverageReporters: ['lcov'], + collectCoverageFrom: ['**/*.{js,ts,tsx}', '!**/*/node_modules/**', '!**/docs/**', '!**/test/**'], + moduleNameMapper: { + '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': + '/__mocks__/fileMock.js', + '.*\\.(css|less|scss)$': 'identity-obj-proxy' + }, + testRegex: '(/__test__/.*|(\\.|/)(test|spec))\\.(ts|js)?$', + transform: { + '^.+\\.jsx?$': 'babel7-jest', + '^.+\\.tsx?$': 'ts-jest' + }, + snapshotSerializers: ['enzyme-to-json/serializer'], + setupFiles: ['/node_modules/regenerator-runtime/runtime'], + setupFilesAfterEnv: ['/setupTest.js'], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + globals: { + 'ts-jest': { + isolatedModules: true, + tsConfig: { + target: 'es6' + }, + babelConfig: true + } + } +}; diff --git a/package.json b/package.json index 3938600..0763944 100644 --- a/package.json +++ b/package.json @@ -2,28 +2,35 @@ "private": true, "workspaces": [ "packages/@rcpress/*", - "packages/docs", - "packages/test" + "packages/docs" ], "scripts": { "bs": "lerna bootstrap", - "serve": "yarn workspace docs serve", - "generate": "yarn workspace docs generate", - "generate-with-prefix": "cross-env base=/rcpress yarn generate", "cl": "conventional-changelog -p angular -i CHANGELOG.md -s", "clean": "lerna clean && rm -rf node_modules", - "pub": "lerna publish --conventional-commits", + "dev": "yarn workspace docs dev", + "generate": "yarn workspace docs generate", + "generate-with-prefix": "cross-env base=/rcpress yarn generate", "pre-pub": "lerna publish --conventional-commits --canary", - "dev": "yarn workspace docs dev" + "pub": "lerna publish --conventional-commits", + "serve": "yarn workspace docs serve", + "test": "jest --config jest.config.js --collectCoverage", + "test-u": "jest -u --collectCoverage" }, "devDependencies": { + "babel7-jest": "^1.0.1", "conventional-changelog-cli": "2.0.23", "cross-env": "5.2.0", + "enzyme": "^3.8.0", + "enzyme-adapter-react-16": "^1.7.1", + "enzyme-to-json": "^3.3.5", "husky": "^3.0.0", "jest": "^24.8.0", + "jest-serializer-enzyme": "^1.0.0", "lerna": "^3.11.1", "npm-run-all": "^4.1.5", "prettier": "^1.18.2", + "react-test-renderer": "^16.6.1", "ts-jest": "^24.0.2", "typescript": "3.5.3" } diff --git a/packages/@rcpress/core/lib/node/__tests__/commands/cli.spec.js b/packages/@rcpress/core/lib/node/__tests__/commands/cli.spec.js new file mode 100644 index 0000000..f0b538b --- /dev/null +++ b/packages/@rcpress/core/lib/node/__tests__/commands/cli.spec.js @@ -0,0 +1,51 @@ +const path = require('path'); +const fs = require('fs-extra'); +const { getSourceDirs } = require('@rcpress/test-util'); +const spa = require('../../commands/spa'); +const ssr = require('../../commands/ssr'); + +describe('Commands', () => { + test('dev', async () => { + await Promise.all( + getSourceDirs(__dirname).map(async ({ name, docsPath, docsTempPath }) => { + await fs.ensureDir(docsTempPath); + expect(() => { + spa(docsPath); + }).not.toThrow(); + }) + ); + }); + + test('dev-prod', async () => { + await Promise.all( + getSourceDirs(__dirname).map(async ({ name, docsPath, docsTempPath }) => { + await fs.ensureDir(docsTempPath); + expect(() => { + spa(docsPath, {}, true); + }).not.toThrow(); + }) + ); + }); + + test('ssr', async () => { + await Promise.all( + getSourceDirs(__dirname).map(async ({ name, docsPath, docsTempPath }) => { + await fs.ensureDir(docsTempPath); + expect(() => { + ssr(docsPath); + }).not.toThrow(); + }) + ); + }); + + test('ssr-prod', async () => { + await Promise.all( + getSourceDirs(__dirname).map(async ({ name, docsPath, docsTempPath }) => { + await fs.ensureDir(docsTempPath); + expect(() => { + ssr(docsPath, {}, true); + }).not.toThrow(); + }) + ); + }); +}); diff --git a/packages/@rcpress/core/lib/node/__tests__/commands/fixtures/demo/README.MD b/packages/@rcpress/core/lib/node/__tests__/commands/fixtures/demo/README.MD new file mode 100644 index 0000000..b0d0bcc --- /dev/null +++ b/packages/@rcpress/core/lib/node/__tests__/commands/fixtures/demo/README.MD @@ -0,0 +1,3 @@ +# hello world! + +hello world diff --git a/packages/@rcpress/core/lib/node/__tests__/prepare/fixtures/demo/README.MD b/packages/@rcpress/core/lib/node/__tests__/prepare/fixtures/demo/README.MD new file mode 100644 index 0000000..b0d0bcc --- /dev/null +++ b/packages/@rcpress/core/lib/node/__tests__/prepare/fixtures/demo/README.MD @@ -0,0 +1,3 @@ +# hello world! + +hello world diff --git a/packages/@rcpress/core/lib/node/__tests__/prepare/prepare.spec.js b/packages/@rcpress/core/lib/node/__tests__/prepare/prepare.spec.js new file mode 100644 index 0000000..2c2f9ab --- /dev/null +++ b/packages/@rcpress/core/lib/node/__tests__/prepare/prepare.spec.js @@ -0,0 +1,16 @@ +const path = require('path'); +const fs = require('fs-extra'); +const prepare = require('../../prepare/index'); +const { getSourceDirs } = require('@rcpress/test-util'); + +describe('App', () => { + test('should not throw error', async () => { + await Promise.all( + getSourceDirs(__dirname).map(async ({ name, docsPath, docsTempPath }) => { + await fs.ensureDir(docsTempPath); + const option = await prepare(docsPath); + expect(option.sourceDir).toBe(docsPath); + }) + ); + }); +}); diff --git a/packages/@rcpress/core/lib/node/__tests__/ssr/__snapshots__/page-render.spec.js.snap b/packages/@rcpress/core/lib/node/__tests__/ssr/__snapshots__/page-render.spec.js.snap new file mode 100644 index 0000000..9fb7bd6 --- /dev/null +++ b/packages/@rcpress/core/lib/node/__tests__/ssr/__snapshots__/page-render.spec.js.snap @@ -0,0 +1,29 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ssr pagerender 1`] = ` +" + + + + + + + {{{ title }}} + {{{ meta }}} + {{{ helmet-links }}} + + + + {{{ links }}} + {{{ style }}} + + +
Last Updated 2020-03-14 21:55:00

hello world!#

hello world

+ + {{{ scripts }}} + + +" +`; diff --git a/packages/@rcpress/core/lib/node/__tests__/ssr/fixtures/demo/README.MD b/packages/@rcpress/core/lib/node/__tests__/ssr/fixtures/demo/README.MD new file mode 100644 index 0000000..b0d0bcc --- /dev/null +++ b/packages/@rcpress/core/lib/node/__tests__/ssr/fixtures/demo/README.MD @@ -0,0 +1,3 @@ +# hello world! + +hello world diff --git a/packages/@rcpress/core/lib/node/__tests__/ssr/page-render.spec.js b/packages/@rcpress/core/lib/node/__tests__/ssr/page-render.spec.js new file mode 100644 index 0000000..628f20f --- /dev/null +++ b/packages/@rcpress/core/lib/node/__tests__/ssr/page-render.spec.js @@ -0,0 +1,31 @@ +const prepare = require('../../prepare/index'); +const fs = require('fs-extra'); +const { getSourceDirs } = require('@rcpress/test-util'); +const getConfig = require('../../commands/ssr/getConfig'); +const { Helmet } = require('react-helmet'); +jest.setTimeout(200000); +// Helmet.canUseDOM = false; +describe('ssr', () => { + beforeEach(() => { + Helmet.canUseDOM = false; + }); + + afterEach(() => { + Helmet.canUseDOM = true; + }); + test('pagerender', async () => { + const { getPageRender } = require('../../commands/ssr'); + await Promise.all( + getSourceDirs(__dirname).map(async ({ name, docsPath, docsTempPath }) => { + await fs.ensureDir(docsTempPath); + const [ssrConfig, spaConfig, options] = await getConfig(docsPath, {}, true); + const pagerender = await getPageRender(ssrConfig, spaConfig, options); + const html = await pagerender.renderPage( + options.siteData.pages[0], + true /* only render html*/ + ); + expect(html).toMatchSnapshot(); + }) + ); + }); +}); diff --git a/packages/@rcpress/core/lib/node/commands/spa/index.js b/packages/@rcpress/core/lib/node/commands/spa/index.js index 00f6c39..fdde4b5 100644 --- a/packages/@rcpress/core/lib/node/commands/spa/index.js +++ b/packages/@rcpress/core/lib/node/commands/spa/index.js @@ -1,25 +1,25 @@ -module.exports = async function dev(sourceDir, cliOptions = {}, isProd) { - if (isProd) { - process.env.NODE_ENV = 'production'; - } +const fs = require('fs-extra'); +const path = require('path'); +const chalk = require('chalk'); +const webpack = require('webpack'); - const fs = require('fs-extra'); - const path = require('path'); - const chalk = require('chalk'); +const { + WebpackLogPlugin, + createSPAConfig, + markdownLoader: { frontMatterEmitter } +} = require('@rcpress/webpack'); - const fileWatcher = require('../../fileWatcher'); - const createServer = require('../../server'); - const prepare = require('../../prepare'); - const buildSW = require('../../sw'); +const fileWatcher = require('../../fileWatcher'); +const createServer = require('../../server'); +const prepare = require('../../prepare'); +const buildSW = require('../../sw'); - const { - WebpackLogPlugin, - createSPAConfig, - markdownLoader: { frontMatterEmitter } - } = require('@rcpress/webpack'); - const { applyUserWebpackConfig, logger, resolveHostandPort } = require('@rcpress/util'); +const { applyUserWebpackConfig, logger, resolveHostandPort } = require('@rcpress/util'); - const webpack = require('webpack'); +module.exports = async function dev(sourceDir, cliOptions = {}, isProd) { + if (isProd) { + process.env.NODE_ENV = 'production'; + } logger.wait('\nExtracting site metadata...'); diff --git a/packages/@rcpress/core/lib/node/commands/ssr/getConfig.js b/packages/@rcpress/core/lib/node/commands/ssr/getConfig.js new file mode 100644 index 0000000..077fdec --- /dev/null +++ b/packages/@rcpress/core/lib/node/commands/ssr/getConfig.js @@ -0,0 +1,70 @@ +const chalk = require('chalk'); +const fileWatcher = require('../../fileWatcher'); + +const prepare = require('../../prepare'); +const { + WebpackLogPlugin, + createSSRConfig, + createSPAConfig, + markdownLoader: { frontMatterEmitter } +} = require('@rcpress/webpack'); + +const { applyUserWebpackConfig, logger, resolveHostandPort } = require('@rcpress/util'); + +module.exports = async function dev(sourceDir, cliOptions = {}, isProd) { + if (isProd) { + process.env.NODE_ENV = 'production'; + } + + logger.wait('\nExtracting site metadata...'); + const options = await prepare(sourceDir); + if (cliOptions.outDir) { + options.outDir = cliOptions.outDir; + } + + // resolve webpack config + let spaConfig = createSPAConfig(options, cliOptions, isProd, true /* isServer */); + let ssrConfig = createSSRConfig(options, cliOptions, isProd); + + let compilerDoneReporterOpts = { + isProd + }; + if (!isProd) { + const resolvedOpts = await resolveHostandPort( + cliOptions.port || options.siteConfig.port, + cliOptions.host || options.siteConfig.host + ); + + compilerDoneReporterOpts = { + ...compilerDoneReporterOpts, + ...resolvedOpts, + publicPath: options.siteData.base + }; + } + + spaConfig.plugin('rcpress-log').use(WebpackLogPlugin, [compilerDoneReporterOpts]); + + spaConfig = spaConfig.toConfig(); + ssrConfig = ssrConfig.toConfig(); + + if (!isProd) { + // setup watchers to update options and dynamically generated files + const update = () => { + prepare(sourceDir).catch(err => { + console.error(logger.error(chalk.red(err.stack), false)); + }); + }; + + new fileWatcher(update, sourceDir).watch(); + // also listen for frontMatter changes from markdown files + frontMatterEmitter.on('update', update); + } + + const userConfig = options.siteConfig.configureWebpack; + if (userConfig) { + ssrConfig = applyUserWebpackConfig(userConfig, ssrConfig, true /* isServer */, isProd); + spaConfig = applyUserWebpackConfig(userConfig, spaConfig, false /* isServer */, isProd); + } + + return [ssrConfig, spaConfig, options]; +}; diff --git a/packages/@rcpress/core/lib/node/commands/ssr/index.js b/packages/@rcpress/core/lib/node/commands/ssr/index.js index 4412cc8..d25eafd 100644 --- a/packages/@rcpress/core/lib/node/commands/ssr/index.js +++ b/packages/@rcpress/core/lib/node/commands/ssr/index.js @@ -1,75 +1,10 @@ -module.exports = async function dev(sourceDir, cliOptions = {}, isProd) { - if (isProd) { - process.env.NODE_ENV = 'production'; - } - - const fs = require('fs-extra'); - const path = require('path'); - const chalk = require('chalk'); - const createServer = require('../../server'); - const fileWatcher = require('../../fileWatcher'); +var getConfig = require('./getConfig'); +const webpack = require('webpack'); +const fs = require('fs-extra'); +const path = require('path'); - const prepare = require('../../prepare'); - const { - WebpackLogPlugin, - createSSRConfig, - createSPAConfig, - markdownLoader: { frontMatterEmitter } - } = require('@rcpress/webpack'); - - const { applyUserWebpackConfig, logger, resolveHostandPort } = require('@rcpress/util'); - const PageRender = require('../../pageRender'); - const buildSW = require('../../sw'); - - logger.wait('\nExtracting site metadata...'); - const options = await prepare(sourceDir); - if (cliOptions.outDir) { - options.outDir = cliOptions.outDir; - } - - // resolve webpack config - let spaConfig = createSPAConfig(options, cliOptions, isProd, true /* isServer */); - let ssrConfig = createSSRConfig(options, cliOptions, isProd); - - let compilerDoneReporterOpts = { - isProd - }; - if (!isProd) { - const resolvedOpts = await resolveHostandPort( - cliOptions.port || options.siteConfig.port, - cliOptions.host || options.siteConfig.host - ); - - compilerDoneReporterOpts = { - ...compilerDoneReporterOpts, - ...resolvedOpts, - publicPath: options.siteData.base - }; - } - - spaConfig.plugin('rcpress-log').use(WebpackLogPlugin, [compilerDoneReporterOpts]); - - spaConfig = spaConfig.toConfig(); - ssrConfig = ssrConfig.toConfig(); - - if (!isProd) { - // setup watchers to update options and dynamically generated files - const update = () => { - prepare(sourceDir).catch(err => { - console.error(logger.error(chalk.red(err.stack), false)); - }); - }; - - new fileWatcher(update, sourceDir).watch(); - // also listen for frontMatter changes from markdown files - frontMatterEmitter.on('update', update); - } - - const userConfig = options.siteConfig.configureWebpack; - if (userConfig) { - ssrConfig = applyUserWebpackConfig(userConfig, ssrConfig, true /* isServer */, isProd); - spaConfig = applyUserWebpackConfig(userConfig, spaConfig, true /* isServer */, isProd); - } +module.exports = async function ssr(sourceDir, cliOptions = {}, isProd) { + const [ssrConfig, spaConfig, options] = await getConfig(sourceDir, cliOptions, isProd); if (!isProd) { await createServer( @@ -81,39 +16,47 @@ module.exports = async function dev(sourceDir, cliOptions = {}, isProd) { false /* use webpack-dev-server*/ ); } else { - const { outDir } = options; - if (path.resolve() === outDir) { - return console.error( - logger.error( - chalk.red('Unexpected option: outDir cannot be set to the current working directory.\n'), - false - ) - ); + const buildSW = require('../../sw'); + const renderer = await module.exports.getPageRender(ssrConfig, spaConfig, options); + await renderer.renderPages(options.siteData.pages); + + // generate service worker config. + if (options.siteData.serviceWorker) { + buildSW(options.outDir); } - await fs.remove(outDir); + } +}; + +module.exports.getPageRender = async function getPageRender(ssrConfig, spaConfig, options) { + const { outDir } = options; + const PageRender = require('../../pageRender'); + if (path.resolve() === outDir) { + return console.error( + logger.error( + chalk.red('Unexpected option: outDir cannot be set to the current working directory.\n'), + false + ) + ); + } + await fs.remove(outDir); - const webpack = require('webpack'); + return await new Promise((resolve, reject) => { webpack([ssrConfig, spaConfig], async (err, stat) => { if (err) { - throw error; + reject(error); } const stats = stat.stats; - const renderer = new PageRender(stats[0].toJson(), { - clientManifest: stats[1].toJson(), - template: fs.readFileSync( - path.resolve(__dirname, '../../templates/index.ssr.html'), - 'utf-8' - ), - outDir - }); - - await renderer.renderPages(options.siteData.pages); - - // generate service worker config. - if (options.siteData.serviceWorker) { - buildSW(options.outDir); - } + resolve( + new PageRender(stats[0].toJson(), { + clientManifest: stats[1].toJson(), + template: fs.readFileSync( + path.resolve(__dirname, '../../templates/index.ssr.html'), + 'utf-8' + ), + outDir + }) + ); }); - } + }); }; diff --git a/packages/@rcpress/core/lib/node/pageRender/index.js b/packages/@rcpress/core/lib/node/pageRender/index.js index 5d8d33c..c8b847e 100644 --- a/packages/@rcpress/core/lib/node/pageRender/index.js +++ b/packages/@rcpress/core/lib/node/pageRender/index.js @@ -7,14 +7,19 @@ const readline = require('readline'); const { logger } = require('@rcpress/util'); const path = require('path'); +// options: { +// clientManifest, +// template, +// outDir +// } class Render { - constructor(bundle, options, clientMfs = fs) { - this.bundle = bundle; + constructor(serverBundle, options, clientMfs = fs) { + this.bundle = serverBundle; this.options = options; this.clientMfs = clientMfs; } - renderToString(context) { + renderToString(context, pureHtml) { return new Promise((resolve, reject) => { try { const { pageMeta = '' } = context; @@ -45,19 +50,20 @@ class Render { }; webExtractor.getCssString().then(cssString => { - const res = template - .replace('{{{ html() }}}', html) + let res = template.replace('{{{ html() }}}', html); + if (!pureHtml) { + res = res + .replace('{{{ links }}}', removeCSSL(webExtractor.getLinkTags())) + .replace('{{{ scripts }}}', webExtractor.getScriptTags()) + .replace('{{{ style }}}', ``) - .replace('{{{ links }}}', removeCSSL(webExtractor.getLinkTags())) - .replace('{{{ scripts }}}', webExtractor.getScriptTags()) - .replace('{{{ style }}}', ``) + .replace('{{{ title }}}', helmet.title.toString()) + .replace('{{{ meta }}}', helmet.meta.toString() + '\n' + pageMeta) + .replace('{{{ htmlAttr }}}', helmet.htmlAttributes.toString()) + .replace('{{{ helmet-links }}}', helmet.link.toString()) - .replace('{{{ title }}}', helmet.title.toString()) - .replace('{{{ meta }}}', helmet.meta.toString() + '\n' + pageMeta) - .replace('{{{ htmlAttr }}}', helmet.htmlAttributes.toString()) - .replace('{{{ helmet-links }}}', helmet.link.toString()) - - .replace('"{{ RC_CONTEXT }}"', JSON.stringify(context)); + .replace('"{{ RC_CONTEXT }}"', JSON.stringify(context)); + } resolve(res); }); @@ -67,11 +73,22 @@ class Render { }); } + async writeToFile(page, outDir, html) { + const pagePath = page.path; + const filename = decodeURIComponent( + pagePath.replace(/\/$/, '/index').replace(/^\//, '') + '.html' + ); + const filePath = path.resolve(outDir, filename); + await fs.ensureDir(path.dirname(filePath)); + await fs.writeFile(filePath, html); + } + async renderPages(pages) { const outDir = this.options.outDir; for (const page of pages) { - await this.renderPage(page, outDir); + const html = await this.renderPage(page, outDir); + await this.writeToFile(page, outDir, html); } // DONE. @@ -81,7 +98,7 @@ class Render { ); } - async renderPage(page, outDir) { + async renderPage(page, pureHtml) { const pagePath = page.path; readline.clearLine(process.stdout, 0); readline.cursorTo(process.stdout, 0); @@ -99,17 +116,13 @@ class Render { let html; try { - html = await this.renderToString(context); + html = await this.renderToString(context, pureHtml); } catch (e) { console.error(logger.error(chalk.red(`Error rendering ${pagePath}:`), false)); throw e; } - const filename = decodeURIComponent( - pagePath.replace(/\/$/, '/index').replace(/^\//, '') + '.html' - ); - const filePath = path.resolve(outDir, filename); - await fs.ensureDir(path.dirname(filePath)); - await fs.writeFile(filePath, html); + + return html; } } diff --git a/packages/@rcpress/core/lib/node/prepare/resolveOptions.js b/packages/@rcpress/core/lib/node/prepare/resolveOptions.js index 3d58cbc..6f5cdc0 100644 --- a/packages/@rcpress/core/lib/node/prepare/resolveOptions.js +++ b/packages/@rcpress/core/lib/node/prepare/resolveOptions.js @@ -187,7 +187,7 @@ module.exports = async function resolveOptions(sourceDir) { }; // make tmp path - const tempPath = path.resolve(__dirname, '../../../.temp'); + const tempPath = path.resolve(sourceDir, '.rcpress/.temp'); fs.ensureDirSync(tempPath); // console.log('layoutPath:', themeLayoutPath); diff --git a/packages/@rcpress/core/package.json b/packages/@rcpress/core/package.json index c5fbf07..d70abed 100644 --- a/packages/@rcpress/core/package.json +++ b/packages/@rcpress/core/package.json @@ -23,6 +23,7 @@ "@loadable/babel-plugin": "^5.10.0", "@loadable/server": "^5.10.2", "@rcpress/markdown": "^0.1.1", + "@rcpress/test-util": "^0.0.0", "@rcpress/util": "^0.1.1", "@rcpress/webpack": "^0.1.13", "@types/classnames": "^2.2.7", diff --git a/packages/@rcpress/test-util/index.js b/packages/@rcpress/test-util/index.js new file mode 100644 index 0000000..4549a6b --- /dev/null +++ b/packages/@rcpress/test-util/index.js @@ -0,0 +1,14 @@ +const path = require('path'); +const fs = require('fs-extra'); + +const getSourceDirs = currentDir => { + const docsBaseDir = path.resolve(currentDir, 'fixtures'); + const docsModeNames = fs.readdirSync(docsBaseDir); + return docsModeNames.map(name => { + const docsPath = path.resolve(docsBaseDir, name); + const docsTempPath = path.resolve(docsPath, '.rcpress/.temp'); + return { name, docsPath, docsTempPath }; + }); +}; + +module.exports.getSourceDirs = getSourceDirs; diff --git a/packages/@rcpress/test-util/package.json b/packages/@rcpress/test-util/package.json new file mode 100644 index 0000000..58888ad --- /dev/null +++ b/packages/@rcpress/test-util/package.json @@ -0,0 +1,8 @@ +{ + "name": "@rcpress/test-util", + "main": "index.js", + "version": "0.0.0", + "dependencies": { + "@rcpress/util": "^0.1.1" + } +} diff --git a/packages/@rcpress/theme-default/components/__test__/__snapshots__/search-box.Spec.js.snap b/packages/@rcpress/theme-default/components/__test__/__snapshots__/search-box.Spec.js.snap new file mode 100644 index 0000000..f194f7d --- /dev/null +++ b/packages/@rcpress/theme-default/components/__test__/__snapshots__/search-box.Spec.js.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`SearchBox SearchBox 1`] = `"
"`; diff --git a/packages/@rcpress/theme-default/components/__test__/search-box.Spec.js b/packages/@rcpress/theme-default/components/__test__/search-box.Spec.js new file mode 100644 index 0000000..72a2dad --- /dev/null +++ b/packages/@rcpress/theme-default/components/__test__/search-box.Spec.js @@ -0,0 +1,10 @@ +import { mount } from 'enzyme'; +import React from 'react'; +import SearchBox from '../search-box'; + +describe('SearchBox', () => { + test('SearchBox', () => { + let SearchBoxInstance = mount(); + expect(SearchBoxInstance.render().html()).toMatchSnapshot(); + }); +}); diff --git a/packages/@rcpress/theme-default/layout/header.tsx b/packages/@rcpress/theme-default/layout/header.tsx index 40269a2..32b31c3 100644 --- a/packages/@rcpress/theme-default/layout/header.tsx +++ b/packages/@rcpress/theme-default/layout/header.tsx @@ -2,7 +2,7 @@ import React, { useRef, useEffect, useReducer } from 'react'; import Link from '../components/MyLink'; import * as utils from '../components/utils'; -import { Row, Col, Icon, Input, Menu, Button, Popover, Dropdown, Affix, Badge } from 'antd'; +import { Row, Col, Icon, Menu, Button, Popover, Dropdown, Affix, Badge } from 'antd'; import { useSiteContext } from '@rcpress/core'; import SearchBox from '../components/search-box'; import SubMenu from 'antd/lib/menu/SubMenu'; diff --git a/packages/@rcpress/util/src/index.js b/packages/@rcpress/util/src/index.js index ef88fab..4cc9161 100644 --- a/packages/@rcpress/util/src/index.js +++ b/packages/@rcpress/util/src/index.js @@ -1,4 +1,7 @@ const { deeplyParseHeaders } = require('./parseHeaders'); +const matter = require('gray-matter'); +const toml = require('toml'); +const merge = require('webpack-merge'); exports.normalizeHeadTag = function(tag) { if (typeof tag === 'string') { @@ -14,7 +17,6 @@ exports.normalizeHeadTag = function(tag) { }; exports.applyUserWebpackConfig = function(userConfig, config, isServer) { - const merge = require('webpack-merge'); if (typeof userConfig === 'object') { return merge(config, userConfig); } @@ -41,9 +43,6 @@ exports.inferTitle = function(frontMatter, headers) { }; exports.parseFrontmatter = function(content) { - const matter = require('gray-matter'); - const toml = require('toml'); - return matter(content, { excerpt_separator: '', engines: { diff --git a/packages/@rcpress/webpack/src/createBaseConfig.js b/packages/@rcpress/webpack/src/createBaseConfig.js index fd72c0c..a855e67 100644 --- a/packages/@rcpress/webpack/src/createBaseConfig.js +++ b/packages/@rcpress/webpack/src/createBaseConfig.js @@ -15,7 +15,8 @@ module.exports = function createBaseConfig( isAlgoliaSearch, markdown, cache, - globalComponentPath + globalComponentPath, + tempPath }, { debug } = {}, isServer, @@ -23,7 +24,7 @@ module.exports = function createBaseConfig( ) { const Config = require('webpack-chain'); const CSSExtractPlugin = require('mini-css-extract-plugin'); - const cacheDirectory = '@rcpress/core/.temp'; + const isProd = process.env.NODE_ENV === 'production'; const inlineLimit = 10000; const modulePaths = getModulePaths(); @@ -48,7 +49,7 @@ module.exports = function createBaseConfig( .set('@themeNotFound', themeNotFoundPath) .set('@globalComp', globalComponentPath) .set('@source', sourceDir) - .set('@temp', cacheDirectory) + .set('@temp', tempPath) .set('react-dom', '@hot-loader/react-dom') .set('@default-theme', '@rcpress/theme-default') .set( @@ -66,7 +67,7 @@ module.exports = function createBaseConfig( if (cache === false) { logger.tip('Clean cache...\n'); - fs.emptyDirSync(cacheDirectory); + fs.emptyDirSync(tempPath); } const cacheIdentifier = JSON.stringify({ @@ -82,7 +83,7 @@ module.exports = function createBaseConfig( const resolve = p => require.resolve(p); const babelOption = { - cacheDirectory, + cacheDirectory: tempPath, cacheIdentifier, presets: [ [resolve('@babel/preset-typescript')], diff --git a/packages/docs/docs/.rcpress/public/screenshot.rar b/packages/docs/docs/.rcpress/public/screenshot.rar new file mode 100644 index 0000000000000000000000000000000000000000..172d294bee9422c7cc0a1e4b7ce15344e3374201 GIT binary patch literal 30625 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

Lu(o<)4R7yl@%7Y~{pq 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 KrU(uR0rEd-8(gUX literal 0 HcmV?d00001 diff --git a/packages/docs/package.json b/packages/docs/package.json index 9b372e3..fb5d842 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -6,9 +6,9 @@ "license": "MIT", "author": "", "scripts": { + "build": "rcpress build", "dev": "rcpress dev", "generate": "rcpress generate", - "build": "rcpress build", "serve": "rcpress serve" }, "devDependencies": { diff --git a/setupTest.js b/setupTest.js new file mode 100644 index 0000000..669cd66 --- /dev/null +++ b/setupTest.js @@ -0,0 +1,10 @@ +const Enzyme = require('enzyme'); +const Adapter = require('enzyme-adapter-react-16'); +const createMatcherFor = require('./test/create-warn-matcher'); + +Enzyme.configure({ adapter: new Adapter() }); + +expect.extend({ + toWarnDev: createMatcherFor('warn'), + toErrorDev: createMatcherFor('error') +}); diff --git a/test/create-warn-matcher.js b/test/create-warn-matcher.js new file mode 100644 index 0000000..729596e --- /dev/null +++ b/test/create-warn-matcher.js @@ -0,0 +1,244 @@ +// https://github.com/facebook/react/blob/master/scripts/jest/matchers/toWarnDev.js +const util = require('util'); + +function normalizeCodeLocInfo(str) { + return str && str.replace(/at .+?:\d+/g, 'at **'); +} + +const createMatcherFor = (consoleMethod) => + function matcher(callback, expectedMessages, options = {}) { + // Warn about incorrect usage of matcher. + if (typeof expectedMessages === 'string') { + expectedMessages = [expectedMessages]; + } else if (!Array.isArray(expectedMessages)) { + throw Error( + `toWarnDev() requires a parameter of type string or an array of strings ` + + `but was given ${typeof expectedMessages}.` + ); + } + if ( + options != null && + (typeof options !== 'object' || Array.isArray(options)) + ) { + throw new Error( + 'toWarnDev() second argument, when present, should be an object. ' + + 'Did you forget to wrap the messages into an array?' + ); + } + if (arguments.length > 3) { + // `matcher` comes from Jest, so it's more than 2 in practice + throw new Error( + 'toWarnDev() received more than two arguments. ' + + 'Did you forget to wrap the messages into an array?' + ); + } + + const withoutStack = options.withoutStack; + const warningsWithoutComponentStack = []; + const warningsWithComponentStack = []; + const unexpectedWarnings = []; + + let lastWarningWithMismatchingFormat = null; + let lastWarningWithExtraComponentStack = null; + + // Catch errors thrown by the callback, + // But only rethrow them if all test expectations have been satisfied. + // Otherwise an Error in the callback can mask a failed expectation, + // and result in a test that passes when it shouldn't. + let caughtError; + + const isLikelyAComponentStack = (message) => + typeof message === 'string' && message.includes('\n in '); + + const consoleSpy = (format, ...args) => { + // Ignore uncaught errors reported by jsdom + // and React addendums because they're too noisy. + if (consoleMethod === 'error' && shouldIgnoreConsoleError(format, args)) { + return; + } + + const message = util.format(format, ...args); + const normalizedMessage = normalizeCodeLocInfo(message); + + // Remember if the number of %s interpolations + // doesn't match the number of arguments. + // We'll fail the test if it happens. + let argIndex = 0; + format.replace(/%s/g, () => argIndex++); + if (argIndex !== args.length) { + lastWarningWithMismatchingFormat = { + format, + args, + expectedArgCount: argIndex + }; + } + + // Protect against accidentally passing a component stack + // to warning() which already injects the component stack. + if ( + args.length >= 2 && + isLikelyAComponentStack(args[args.length - 1]) && + isLikelyAComponentStack(args[args.length - 2]) + ) { + lastWarningWithExtraComponentStack = { + format + }; + } + + for (let index = 0; index < expectedMessages.length; index++) { + const expectedMessage = expectedMessages[index]; + if ( + normalizedMessage === expectedMessage || + normalizedMessage.includes(expectedMessage) + ) { + if (isLikelyAComponentStack(normalizedMessage)) { + warningsWithComponentStack.push(normalizedMessage); + } else { + warningsWithoutComponentStack.push(normalizedMessage); + } + expectedMessages.splice(index, 1); + return; + } + } + + let errorMessage; + if (expectedMessages.length === 0) { + errorMessage = + 'Unexpected warning recorded: ' + + this.utils.printReceived(normalizedMessage); + } else if (expectedMessages.length === 1) { + errorMessage = + 'Unexpected warning recorded: ' + + jestDiff(expectedMessages[0], normalizedMessage); + } else { + errorMessage = + 'Unexpected warning recorded: ' + + jestDiff(expectedMessages, [normalizedMessage]); + } + + // Record the call stack for unexpected warnings. + // We don't throw an Error here though, + // Because it might be suppressed by ReactFiberScheduler. + unexpectedWarnings.push(new Error(errorMessage)); + }; + + // TODO Decide whether we need to support nested toWarn* expectations. + // If we don't need it, add a check here to see if this is already our spy, + // And throw an error. + const originalMethod = console[consoleMethod]; + + // Avoid using Jest's built-in spy since it can't be removed. + console[consoleMethod] = consoleSpy; + + try { + callback(); + } catch (error) { + caughtError = error; + } finally { + // Restore the unspied method so that unexpected errors fail tests. + console[consoleMethod] = originalMethod; + + // Any unexpected Errors thrown by the callback should fail the test. + // This should take precedence since unexpected errors could block warnings. + if (caughtError) { + throw caughtError; + } + + // Any unexpected warnings should be treated as a failure. + if (unexpectedWarnings.length > 0) { + return { + message: () => unexpectedWarnings[0].stack, + pass: false + }; + } + + // Any remaining messages indicate a failed expectations. + if (expectedMessages.length > 0) { + return { + message: () => + `Expected warning was not recorded:\n ${this.utils.printReceived( + expectedMessages[0] + )}`, + pass: false + }; + } + + if (typeof withoutStack === 'number') { + // We're expecting a particular number of warnings without stacks. + if (withoutStack !== warningsWithoutComponentStack.length) { + return { + message: () => + `Expected ${withoutStack} warnings without a component stack but received ${ + warningsWithoutComponentStack.length + }:\n` + + warningsWithoutComponentStack.map((warning) => + this.utils.printReceived(warning) + ), + pass: false + }; + } + } else if (withoutStack === true) { + // We're expecting that all warnings won't have the stack. + // If some warnings have it, it's an error. + if (warningsWithComponentStack.length > 0) { + return { + message: () => + `Received warning unexpectedly includes a component stack:\n ${this.utils.printReceived( + warningsWithComponentStack[0] + )}\nIf this warning intentionally includes the component stack, remove ` + + `{withoutStack: true} from the toWarnDev() call. If you have a mix of ` + + `warnings with and without stack in one toWarnDev() call, pass ` + + `{withoutStack: N} where N is the number of warnings without stacks.`, + pass: false + }; + } + } else if (withoutStack === false || withoutStack === undefined) { + // We're expecting that all warnings *do* have the stack (default). + // If some warnings don't have it, it's an error. + if (warningsWithoutComponentStack.length > 0) { + return { + message: () => + `Received warning unexpectedly does not include a component stack:\n ${this.utils.printReceived( + warningsWithoutComponentStack[0] + )}\nIf this warning intentionally omits the component stack, add ` + + `{withoutStack: true} to the toWarnDev() call.`, + pass: false + }; + } + } else { + throw Error( + `The second argument for toWarnDev(), when specified, must be an object. It may have a ` + + `property called "withoutStack" whose value may be undefined, boolean, or a number. ` + + `Instead received ${typeof withoutStack}.` + ); + } + + if (lastWarningWithMismatchingFormat !== null) { + return { + message: () => + `Received ${ + lastWarningWithMismatchingFormat.args.length + } arguments for a message with ${ + lastWarningWithMismatchingFormat.expectedArgCount + } placeholders:\n ${this.utils.printReceived( + lastWarningWithMismatchingFormat.format + )}`, + pass: false + }; + } + + if (lastWarningWithExtraComponentStack !== null) { + return { + message: () => + `Received more than one component stack for a warning:\n ${this.utils.printReceived( + lastWarningWithExtraComponentStack.format + )}\nDid you accidentally pass a stack to warning() as the last argument? ` + + `Don't forget warning() already injects the component stack automatically.`, + pass: false + }; + } + + return { pass: true }; + } + }; +module.exports = createMatcherFor; diff --git a/yarn.lock b/yarn.lock index 398d0c4..cd1d251 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2272,6 +2272,22 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" +airbnb-prop-types@^2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz#5287820043af1eb469f5b0af0d6f70da6c52aaef" + integrity sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA== + dependencies: + array.prototype.find "^2.1.0" + function.prototype.name "^1.1.1" + has "^1.0.3" + is-regex "^1.0.4" + object-is "^1.0.1" + object.assign "^4.1.0" + object.entries "^1.1.0" + prop-types "^15.7.2" + prop-types-exact "^1.2.0" + react-is "^16.9.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -2451,12 +2467,19 @@ aria-query@^3.0.0: ast-types-flow "0.0.7" commander "^2.11.0" +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.1.0: +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -2476,6 +2499,11 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= +array-filter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" + integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -2521,11 +2549,33 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.find@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.0.tgz#630f2eaf70a39e608ac3573e45cf8ccd0ede9ad7" + integrity sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.13.0" + +array.prototype.flat@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.2.tgz#8f3c71d245ba349b6b64b4078f76f5576f1fd723" + integrity sha512-VXjh7lAL4KXKF2hY4FnEW9eRW6IhdvFW1sN/JwLbmECbCgACCnBHNyP3lFiYuttr0jxRN9Bsc5+G27dMseSWqQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.15.0" + function-bind "^1.1.1" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -2695,6 +2745,20 @@ babel-extract-comments@^1.0.0: dependencies: babylon "^6.18.0" +babel-generator@^6.18.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + babel-jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" @@ -2718,6 +2782,13 @@ babel-loader@^8.0.6: mkdirp "^0.5.1" pify "^4.0.1" +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + babel-plugin-apply-mdx-type-prop@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.5.1.tgz#d6c10f756a428a3724047662503257c74878c721" @@ -2740,6 +2811,16 @@ babel-plugin-extract-import-names@^1.5.1: dependencies: "@babel/helper-plugin-utils" "7.0.0" +babel-plugin-istanbul@^4.1.5: + version "4.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" + integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ== + dependencies: + babel-plugin-syntax-object-rest-spread "^6.13.0" + find-up "^2.1.0" + istanbul-lib-instrument "^1.10.1" + test-exclude "^4.2.1" + babel-plugin-istanbul@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" @@ -2750,6 +2831,11 @@ babel-plugin-istanbul@^5.1.0: istanbul-lib-instrument "^3.3.0" test-exclude "^5.2.3" +babel-plugin-jest-hoist@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz#2cef637259bd4b628a6cace039de5fcd14dbb006" + integrity sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ== + babel-plugin-jest-hoist@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" @@ -2757,7 +2843,7 @@ babel-plugin-jest-hoist@^24.9.0: dependencies: "@types/babel__traverse" "^7.0.6" -babel-plugin-syntax-object-rest-spread@^6.8.0: +babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= @@ -2770,6 +2856,14 @@ babel-plugin-transform-object-rest-spread@^6.26.0: babel-plugin-syntax-object-rest-spread "^6.8.0" babel-runtime "^6.26.0" +babel-preset-jest@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz#ff9d2bce08abd98e8a36d9a8a5189b9173b85638" + integrity sha512-hm9cBnr2h3J7yXoTtAVV0zg+3vg0Q/gT2GYuzlreTU0EPkJRtlNgKJJ3tBKEn0+VjAi3JykV6xCJkuUYttEEfA== + dependencies: + babel-plugin-jest-hoist "^21.2.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + babel-preset-jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" @@ -2778,7 +2872,7 @@ babel-preset-jest@^24.9.0: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" babel-plugin-jest-hoist "^24.9.0" -babel-runtime@6.x, babel-runtime@^6.23.0, babel-runtime@^6.26.0: +babel-runtime@6.x, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -2786,6 +2880,50 @@ babel-runtime@6.x, babel-runtime@^6.23.0, babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" +babel-template@^6.16.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.18.0, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.18.0, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babel7-jest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel7-jest/-/babel7-jest-1.0.1.tgz#dbe9bfcd87736d0fda26943ae72775c059d70875" + integrity sha512-qlQEZ/InEsNRG8iwTmbxyAOgbZNU7Bewy6e03NCR5ohJqJ5wBDMGbwwSg4zzHEuNRYcVizKgmdlYOFIWsNCOTA== + dependencies: + babel-plugin-istanbul "^4.1.5" + babel-preset-jest "^21.2.0" + babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -2914,6 +3052,15 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -3345,6 +3492,18 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +cheerio@^1.0.0-rc.2: + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" + integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.1" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" + chokidar@^2.0.2, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -4136,7 +4295,7 @@ css-loader@^0.28.11: postcss-value-parser "^3.3.0" source-list-map "^2.0.0" -css-select@^1.1.0: +css-select@^1.1.0, css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= @@ -4473,6 +4632,13 @@ detab@2.0.2, detab@^2.0.0: dependencies: repeat-string "^1.5.4" +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" @@ -4522,6 +4688,11 @@ dir-glob@^2.0.0, dir-glob@^2.2.2: dependencies: path-type "^3.0.0" +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -4601,6 +4772,14 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-serializer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + dom-walk@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" @@ -4611,7 +4790,7 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@1, domelementtype@^1.3.1: +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== @@ -4792,7 +4971,7 @@ enquire.js@^2.1.6: resolved "https://registry.yarnpkg.com/enquire.js/-/enquire.js-2.1.6.tgz#3e8780c9b8b835084c3f60e166dbc3c2a3c89814" integrity sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ= -entities@^1.1.1: +entities@^1.1.1, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -4812,6 +4991,88 @@ envinfo@7.1.0: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.1.0.tgz#c64f80bbf5faaafc962eef76c0d871c6c672eec0" integrity sha512-38LJhrmyQafVInoYlaEDxomIfjtK+HUtp1JsInWdKtpxk0MlTU60fqYHg0LrKgxxJuq6H89ddw4IkxfQejZ77g== +enzyme-adapter-react-16@^1.7.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.1.tgz#8ad55332be7091dc53a25d7d38b3485fc2ba50d5" + integrity sha512-yMPxrP3vjJP+4wL/qqfkT6JAIctcwKF+zXO6utlGPgUJT2l4tzrdjMDWGd/Pp1BjHBcljhN24OzNEGRteibJhA== + dependencies: + enzyme-adapter-utils "^1.12.1" + enzyme-shallow-equal "^1.0.0" + has "^1.0.3" + object.assign "^4.1.0" + object.values "^1.1.0" + prop-types "^15.7.2" + react-is "^16.10.2" + react-test-renderer "^16.0.0-0" + semver "^5.7.0" + +enzyme-adapter-utils@^1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.1.tgz#e828e0d038e2b1efa4b9619ce896226f85c9dd88" + integrity sha512-KWiHzSjZaLEoDCOxY8Z1RAbUResbqKN5bZvenPbfKtWorJFVETUw754ebkuCQ3JKm0adx1kF8JaiR+PHPiP47g== + dependencies: + airbnb-prop-types "^2.15.0" + function.prototype.name "^1.1.1" + object.assign "^4.1.0" + object.fromentries "^2.0.1" + prop-types "^15.7.2" + semver "^5.7.0" + +enzyme-shallow-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.0.tgz#d8e4603495e6ea279038eef05a4bf4887b55dc69" + integrity sha512-VUf+q5o1EIv2ZaloNQQtWCJM9gpeux6vudGVH6vLmfPXFLRuxl5+Aq3U260wof9nn0b0i+P5OEUXm1vnxkRpXQ== + dependencies: + has "^1.0.3" + object-is "^1.0.1" + +enzyme-to-json@^1.4.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-1.6.0.tgz#9d9bba706e8b500c673b7a4fa9ff7ce57b8b9254" + integrity sha512-izMrbriQySEiWDUR0NeAyzCiRBncgDjfX5bt3xobkyUinEA79q8UuBNUfWFyjX2ahhP2G8k1GN4kG9NAUF405g== + dependencies: + lodash.filter "^4.6.0" + lodash.isnil "^4.0.0" + lodash.isplainobject "^4.0.6" + lodash.omitby "^4.6.0" + lodash.range "^3.2.0" + object-values "^1.0.0" + object.entries "^1.0.4" + +enzyme-to-json@^3.3.5: + version "3.4.3" + resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-3.4.3.tgz#ed4386f48768ed29e2d1a2910893542c34e7e0af" + integrity sha512-jqNEZlHqLdz7OTpXSzzghArSS3vigj67IU/fWkPyl1c0TCj9P5s6Ze0kRkYZWNEoCqCR79xlQbigYlMx5erh8A== + dependencies: + lodash "^4.17.15" + +enzyme@^3.8.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.10.0.tgz#7218e347c4a7746e133f8e964aada4a3523452f6" + integrity sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg== + dependencies: + array.prototype.flat "^1.2.1" + cheerio "^1.0.0-rc.2" + function.prototype.name "^1.1.0" + has "^1.0.3" + html-element-map "^1.0.0" + is-boolean-object "^1.0.0" + is-callable "^1.1.4" + is-number-object "^1.0.3" + is-regex "^1.0.4" + is-string "^1.0.4" + is-subset "^0.1.1" + lodash.escape "^4.0.1" + lodash.isequal "^4.5.0" + object-inspect "^1.6.0" + object-is "^1.0.1" + object.assign "^4.1.0" + object.entries "^1.0.4" + object.values "^1.0.4" + raf "^3.4.0" + rst-selector-parser "^2.2.3" + string.prototype.trim "^1.1.2" + err-code@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" @@ -4847,6 +5108,22 @@ es-abstract@^1.12.0, es-abstract@^1.15.0, es-abstract@^1.4.3, es-abstract@^1.5.1 string.prototype.trimleft "^2.1.0" string.prototype.trimright "^2.1.0" +es-abstract@^1.13.0: + version "1.16.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.2.tgz#4e874331645e9925edef141e74fc4bd144669d34" + integrity sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-inspect "^1.7.0" + object-keys "^1.1.1" + string.prototype.trimleft "^2.1.0" + string.prototype.trimright "^2.1.0" + es-to-primitive@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" @@ -4856,6 +5133,15 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -5209,6 +5495,13 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -5222,6 +5515,13 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + expect@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" @@ -5299,6 +5599,13 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -5430,6 +5737,22 @@ file-loader@^1.1.11: loader-utils "^1.0.2" schema-utils "^0.4.5" +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -5542,11 +5865,18 @@ follow-redirects@^1.0.0: dependencies: debug "^3.0.0" -for-in@^1.0.2: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -5672,11 +6002,26 @@ function-bind@^1.0.2, function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.0, function.prototype.name@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.1.tgz#6d252350803085abc2ad423d4fe3be2f9cbda392" + integrity sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + functions-have-names "^1.1.1" + is-callable "^1.1.4" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +functions-have-names@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.0.tgz#83da7583e4ea0c9ac5ff530f73394b033e0bf77d" + integrity sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ== + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -5830,6 +6175,21 @@ github-slugger@^1.2.1: dependencies: emoji-regex ">=6.0.0 <=6.1.1" +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -5891,6 +6251,11 @@ globals@^11.1.0, globals@^11.7.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -6028,6 +6393,11 @@ has-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -6257,6 +6627,13 @@ html-comment-regex@^1.1.0: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== +html-element-map@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.2.0.tgz#dfbb09efe882806af63d990cf6db37993f099f22" + integrity sha512-0uXq8HsuG1v2TmQ8QkIhzbrqeskE4kn52Q18QJ9iAA/SnHoEKXWiUxHQtclRsCFWEUD2So34X+0+pZZu862nnw== + dependencies: + array-filter "^1.0.0" + html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -6292,7 +6669,7 @@ html-void-elements@^1.0.0, html-void-elements@^1.0.1: resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.4.tgz#95e8bb5ecd6b88766569c2645f2b5f1591db9ba5" integrity sha512-yMk3naGPLrfvUV9TdDbuYXngh/TpHbA6TrOw3HL9kS8yhwx7i309BReNg7CbAJXGE+UMJ6je5OqJ7lC63o6YuQ== -htmlparser2@^3.10.0, htmlparser2@^3.3.0: +htmlparser2@^3.10.0, htmlparser2@^3.3.0, htmlparser2@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -6758,6 +7135,11 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" +is-boolean-object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" + integrity sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M= + is-buffer@^1.1.4, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -6827,6 +7209,18 @@ is-directory@^0.3.1: resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -6839,6 +7233,11 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -6868,6 +7267,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -6894,6 +7300,18 @@ is-lower-case@^1.1.0: dependencies: lower-case "^1.1.0" +is-number-object@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" + integrity sha1-8mWrian0RQNO9q/xWo8AsA9VF5k= + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -6901,6 +7319,11 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + is-obj@^1.0.0, is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -6949,6 +7372,16 @@ is-plain-object@^3.0.0: dependencies: isobject "^4.0.0" +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -6978,6 +7411,16 @@ is-stream@^1.0.1, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-string@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" + integrity sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ= + +is-subset@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= + is-supported-regexp-flag@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" @@ -7093,11 +7536,29 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== + istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== +istanbul-lib-instrument@^1.10.1: + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" + integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.1" + semver "^5.3.0" + istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" @@ -7414,6 +7875,13 @@ jest-runtime@^24.9.0: strip-bom "^3.0.0" yargs "^13.3.0" +jest-serializer-enzyme@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jest-serializer-enzyme/-/jest-serializer-enzyme-1.0.0.tgz#f8b5090d1ae4d105bbaebf04d33be5df2988f059" + integrity sha1-+LUJDRrk0QW7rr8E0zvl3ymI8Fk= + dependencies: + enzyme-to-json "^1.4.4" + jest-serializer@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" @@ -7590,6 +8058,11 @@ jsdom@^11.5.1: ws "^5.2.0" xml-name-validator "^3.0.0" +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -7938,6 +8411,21 @@ lodash.debounce@^4.0.0, lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg= + +lodash.filter@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= + +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -7953,11 +8441,26 @@ lodash.isarray@^3.0.0: resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= +lodash.isnil@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/lodash.isnil/-/lodash.isnil-4.0.0.tgz#49e28cd559013458c814c5479d3c663a21bfaa6c" + integrity sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + lodash.iteratee@^4.5.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.iteratee/-/lodash.iteratee-4.7.0.tgz#be4177db289a8ccc3c0990f1db26b5b22fc1554c" @@ -7977,6 +8480,16 @@ lodash.memoize@4.x, lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.omitby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.omitby/-/lodash.omitby-4.6.0.tgz#5c15ff4754ad555016b53c041311e8f079204791" + integrity sha1-XBX/R1StVVAWtTwEExHo8HkgR5E= + +lodash.range@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.range/-/lodash.range-3.2.0.tgz#f461e588f66683f7eadeade513e38a69a565a15d" + integrity sha1-9GHliPZmg/fq3q3lE+OKaaVloV0= + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -8017,7 +8530,7 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.14.14, lodash@^4.16.5, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: +lodash@^4.14.14, lodash@^4.15.0, lodash@^4.16.5, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -8189,6 +8702,11 @@ math-expression-evaluator@^1.2.14: resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw= +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + mathml-tag-names@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc" @@ -8370,6 +8888,25 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -8578,6 +9115,11 @@ moment@2.x, moment@^2.24.0: resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== +moo@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" + integrity sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -8679,6 +9221,17 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +nearley@^2.7.10: + version "2.19.0" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.0.tgz#37717781d0fd0f2bfc95e233ebd75678ca4bda46" + integrity sha512-2v52FTw7RPqieZr3Gth1luAXZR7Je6q3KaDHY5bjl/paDUdMu35fZ8ICNgiYJRr3tf3NMvIQQR1r27AvEr9CRA== + dependencies: + commander "^2.19.0" + moo "^0.4.3" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + semver "^5.4.1" + needle@^2.2.1: version "2.4.0" resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" @@ -8859,7 +9412,7 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -9044,6 +9597,11 @@ object-inspect@^1.6.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" @@ -9054,6 +9612,11 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/object-values/-/object-values-1.0.0.tgz#72af839630119e5b98c3b02bb8c27e3237158105" + integrity sha1-cq+DljARnluYw7AruMJ+MjcVgQU= + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -9071,7 +9634,7 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.entries@^1.1.0: +object.entries@^1.0.4, object.entries@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== @@ -9081,7 +9644,7 @@ object.entries@^1.1.0: function-bind "^1.1.1" has "^1.0.3" -object.fromentries@^2.0.0: +object.fromentries@^2.0.0, object.fromentries@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.1.tgz#050f077855c7af8ae6649f45c80b16ee2d31e704" integrity sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA== @@ -9099,6 +9662,14 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.2" es-abstract "^1.5.1" +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -9106,7 +9677,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0: +object.values@^1.0.4, object.values@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== @@ -9414,6 +9985,16 @@ parse-github-repo-url@^1.3.0: resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -9467,6 +10048,13 @@ parse5@4.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== + dependencies: + "@types/node" "*" + parse5@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" @@ -10094,6 +10682,11 @@ prepend-http@^1.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + prettier@^1.14.0, prettier@^1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" @@ -10194,6 +10787,15 @@ promzard@^0.3.0: dependencies: read "1" +prop-types-exact@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" + integrity sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA== + dependencies: + has "^1.0.3" + object.assign "^4.1.0" + reflect.ownkeys "^0.2.0" + prop-types@15.x, 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.5.9, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -10352,6 +10954,28 @@ raf@^3.4.0, raf@^3.4.1: dependencies: performance-now "^2.1.0" +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= + +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -10892,6 +11516,11 @@ react-hot-loader@^4.12.14: shallowequal "^1.1.0" source-map "^0.7.3" +react-is@^16.10.2, react-is@^16.8.6, react-is@^16.9.0: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== + react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: version "16.10.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.10.2.tgz#984120fd4d16800e9a738208ab1fba422d23b5ab" @@ -10969,6 +11598,16 @@ react-slick@~0.25.2: lodash.debounce "^4.0.8" resize-observer-polyfill "^1.5.0" +react-test-renderer@^16.0.0-0, react-test-renderer@^16.6.1: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.12.0.tgz#11417ffda579306d4e841a794d32140f3da1b43f" + integrity sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w== + dependencies: + object-assign "^4.1.1" + prop-types "^15.6.2" + react-is "^16.8.6" + scheduler "^0.18.0" + react@^16.9.0: version "16.10.2" resolved "https://registry.yarnpkg.com/react/-/react-16.10.2.tgz#a5ede5cdd5c536f745173c8da47bda64797a4cf0" @@ -11182,6 +11821,11 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^1.0.0" +reflect.ownkeys@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" + integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= + regenerate-unicode-properties@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" @@ -11211,6 +11855,13 @@ regenerator-transform@^0.14.0: dependencies: private "^0.1.6" +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -11525,7 +12176,7 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.4, repeat-string@^1.6.1: +repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -11706,6 +12357,14 @@ rmc-feedback@^2.0.0: babel-runtime "6.x" classnames "^2.2.5" +rst-selector-parser@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" + integrity sha1-gbIw6i/MYGbInjRy3nlChdmwPZE= + dependencies: + lodash.flattendeep "^4.4.0" + nearley "^2.7.10" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -11798,6 +12457,14 @@ scheduler@^0.16.2: loose-envify "^1.1.0" object-assign "^4.1.1" +scheduler@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" + integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^0.4.5: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" @@ -12187,7 +12854,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -12429,6 +13096,15 @@ string.prototype.padend@^3.0.0: es-abstract "^1.4.3" function-bind "^1.0.2" +string.prototype.trim@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz#75a729b10cfc1be439543dae442129459ce61e3d" + integrity sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.13.0" + function-bind "^1.1.1" + string.prototype.trimleft@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" @@ -12844,6 +13520,17 @@ terser@^4.1.2: source-map "~0.6.1" source-map-support "~0.5.12" +test-exclude@^4.2.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" + integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + test-exclude@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" @@ -12968,6 +13655,11 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -13068,6 +13760,11 @@ trim-off-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + trim-trailing-lines@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz#d2f1e153161152e9f02fabc670fb40bec2ea2e3a"