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 0000000..172d294 Binary files /dev/null and b/packages/docs/docs/.rcpress/public/screenshot.rar differ 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"