From 82848c9614933f8dcb97822e4723121fe340365e Mon Sep 17 00:00:00 2001 From: Ward Peeters Date: Tue, 21 May 2019 07:10:19 +0200 Subject: [PATCH] refactor(gatsby-cli): rework cli to use ink (#13089) Replaces our augmented yurnalist reporter with ink. Everything still works the same as before so no changes were made to the reporter api. --- packages/gatsby-cli/package.json | 8 +- packages/gatsby-cli/src/reporter/index.js | 5 +- .../src/reporter/reporters/index.js | 8 + .../reporters/ink/components/activity.js | 23 +++ .../reporters/ink/components/messages.js | 48 +++++ .../src/reporter/reporters/ink/index.js | 9 + .../src/reporter/reporters/ink/reporter.js | 144 +++++++++++++++ packages/gatsby/package.json | 2 + .../__snapshots__/file-parser.js.snap | 30 +++- .../gatsby/src/query/__tests__/file-parser.js | 15 +- yarn.lock | 168 ++++++++++++++++-- 11 files changed, 425 insertions(+), 35 deletions(-) create mode 100644 packages/gatsby-cli/src/reporter/reporters/index.js create mode 100644 packages/gatsby-cli/src/reporter/reporters/ink/components/activity.js create mode 100644 packages/gatsby-cli/src/reporter/reporters/ink/components/messages.js create mode 100644 packages/gatsby-cli/src/reporter/reporters/ink/index.js create mode 100644 packages/gatsby-cli/src/reporter/reporters/ink/reporter.js diff --git a/packages/gatsby-cli/package.json b/packages/gatsby-cli/package.json index 8c0c13c8bcb0f..a51295f50ed15 100644 --- a/packages/gatsby-cli/package.json +++ b/packages/gatsby-cli/package.json @@ -26,20 +26,26 @@ "fs-extra": "^4.0.1", "gatsby-telemetry": "^1.0.9", "hosted-git-info": "^2.6.0", + "ink": "^2.0.5", + "ink-spinner": "^3.0.1", "is-valid-path": "^0.1.1", "lodash": "^4.17.10", "meant": "^1.0.1", "node-fetch": "2.3.0", + "object.entries": "^1.1.0", "opentracing": "^0.14.3", "pretty-error": "^2.1.1", "prompts": "^2.0.4", + "react": "^16.8.4", "resolve-cwd": "^2.0.0", + "semver": "^6.0.0", "source-map": "^0.5.7", "stack-trace": "^0.0.10", + "strip-ansi": "^5.2.0", "update-notifier": "^2.3.0", "uuid": "3.3.2", "yargs": "^12.0.5", - "yurnalist": "^1.0.2" + "yurnalist": "^1.0.5" }, "devDependencies": { "@babel/cli": "^7.0.0", diff --git a/packages/gatsby-cli/src/reporter/index.js b/packages/gatsby-cli/src/reporter/index.js index acde72839db5d..d0d4c4e71bd6b 100644 --- a/packages/gatsby-cli/src/reporter/index.js +++ b/packages/gatsby-cli/src/reporter/index.js @@ -5,7 +5,7 @@ const chalk = require(`chalk`) const { trackError } = require(`gatsby-telemetry`) const tracer = require(`opentracing`).globalTracer() const { getErrorFormatter } = require(`./errors`) -const reporterInstance = require(`./reporters/yurnalist`) +const reporterInstance = require(`./reporters`) const errorFormatter = getErrorFormatter() @@ -61,6 +61,7 @@ const reporter: Reporter = { error = message message = error.message } + reporterInstance.error(message) if (error) this.log(errorFormatter.render(error)) }, @@ -71,11 +72,13 @@ const reporter: Reporter = { uptime(prefix) { this.verbose(`${prefix}: ${(process.uptime() * 1000).toFixed(3)}ms`) }, + success: reporterInstance.success, verbose: reporterInstance.verbose, info: reporterInstance.info, warn: reporterInstance.warn, log: reporterInstance.log, + /** * Time an activity. * @param {string} name - Name of activity. diff --git a/packages/gatsby-cli/src/reporter/reporters/index.js b/packages/gatsby-cli/src/reporter/reporters/index.js new file mode 100644 index 0000000000000..3b897a86d7ed7 --- /dev/null +++ b/packages/gatsby-cli/src/reporter/reporters/index.js @@ -0,0 +1,8 @@ +const semver = require(`semver`) +const { isCI } = require(`ci-info`) + +if (semver.satisfies(process.version, `>=8`) && !isCI) { + module.exports = require(`./ink`).default +} else { + module.exports = require(`./yurnalist`) +} diff --git a/packages/gatsby-cli/src/reporter/reporters/ink/components/activity.js b/packages/gatsby-cli/src/reporter/reporters/ink/components/activity.js new file mode 100644 index 0000000000000..1dcb28fae507b --- /dev/null +++ b/packages/gatsby-cli/src/reporter/reporters/ink/components/activity.js @@ -0,0 +1,23 @@ +import React from "react" +import convertHrtime from "convert-hrtime" +import { Box } from "ink" +import Spinner from "ink-spinner" + +export const calcElapsedTime = startTime => { + const elapsed = process.hrtime(startTime) + + return convertHrtime(elapsed)[`seconds`].toFixed(3) +} + +export default function Activity({ name, status }) { + let statusText = name + if (status) { + statusText += ` — ${status}` + } + + return ( + + {statusText} + + ) +} diff --git a/packages/gatsby-cli/src/reporter/reporters/ink/components/messages.js b/packages/gatsby-cli/src/reporter/reporters/ink/components/messages.js new file mode 100644 index 0000000000000..95043f04a951d --- /dev/null +++ b/packages/gatsby-cli/src/reporter/reporters/ink/components/messages.js @@ -0,0 +1,48 @@ +import React from "react" +import { Color } from "ink" +import stripAnsi from "strip-ansi" + +const ColorSwitcher = ({ hideColors, children, ...props }) => { + if (hideColors) { + return <>{stripAnsi(children)} + } + + return {children} +} + +const createLabel = (text, color) => (...props) => ( + {text} +) + +const getLabel = type => { + switch (type) { + case `success`: + return createLabel(`success`, `green`) + case `error`: + return createLabel(`error`, `red`) + case `warn`: + return createLabel(`warn`, `yellow`) + case `verbose`: + return createLabel(`verbose`, `gray`) + case `info`: + return createLabel(`info`, `blue`) + default: + return createLabel(`debug ${type}`, `blue`) + } +} + +export const Message = ({ type, hideColors, children }) => { + if (!type) { + return <>{children} + } + + const TextLabel = getLabel(type) + + return ( + <> + + {` `} + {children} + + ) +} diff --git a/packages/gatsby-cli/src/reporter/reporters/ink/index.js b/packages/gatsby-cli/src/reporter/reporters/ink/index.js new file mode 100644 index 0000000000000..2e77f393c122e --- /dev/null +++ b/packages/gatsby-cli/src/reporter/reporters/ink/index.js @@ -0,0 +1,9 @@ +import React from "react" +import { render } from "ink" +import GatsbyReporter from "./reporter" + +// render the react component and expose it so it can be changed from the outside world +const inkReporter = React.createRef() +render() + +export default /** @type {GatsbyReporter} */ (inkReporter.current) diff --git a/packages/gatsby-cli/src/reporter/reporters/ink/reporter.js b/packages/gatsby-cli/src/reporter/reporters/ink/reporter.js new file mode 100644 index 0000000000000..f5e220638e742 --- /dev/null +++ b/packages/gatsby-cli/src/reporter/reporters/ink/reporter.js @@ -0,0 +1,144 @@ +import React from "react" +import { Static, Box } from "ink" +import { isCI } from "ci-info" +import chalk from "chalk" +import Activity, { calcElapsedTime } from "./components/activity" +import { Message } from "./components/messages" + +const showProgress = process.stdout.isTTY && !isCI + +const generateActivityFinishedText = (name, activity) => { + let successText = `${name} - ${calcElapsedTime(activity.startTime)} s` + if (activity.status) { + successText += ` — ${activity.status}` + } + + return successText +} + +export default class GatsbyReporter extends React.Component { + verbose = process.env.gatsby_log_level === `verbose` + state = { + verbose: false, + messages: [], + activities: {}, + } + + format = chalk + + createActivity = name => { + return { + start: () => { + this.setState(state => { + return { + activities: { + ...state.activities, + [name]: { + status: ``, + startTime: process.hrtime(), + }, + }, + } + }) + }, + setStatus: status => { + this.setState(state => { + const activity = state.activities[name] + + return { + activities: { + ...state.activities, + [name]: { + ...activity, + status: status, + }, + }, + } + }) + }, + end: () => { + const activity = this.state.activities[name] + + this.success(generateActivityFinishedText(name, activity)) + + this.setState(state => { + const activities = { ...state.activities } + delete activities[name] + + return { + activities, + } + }) + }, + } + } + + setColors(useColors = false) { + this.setState({ + disableColors: !useColors, + }) + } + + setVerbose(isVerbose = true) { + this.verbose = isVerbose + } + + _addMessage(type, str) { + // threat null/undefind as an empty character, it seems like ink can't handle empty str + if (!str) { + str = `\u2800` + } + + this.setState(state => { + return { + messages: [ + ...state.messages, + { + text: str, + type, + }, + ], + } + }) + } + + log = this._addMessage.bind(this, null) + info = this._addMessage.bind(this, `info`) + success = this._addMessage.bind(this, `success`) + warn = this._addMessage.bind(this, `warn`) + error = this._addMessage.bind(this, `error`) + verbose = str => { + if (!this.verbose) { + return + } + + this._addMessage(`verbose`, str) + } + + render() { + return ( + + + + {this.state.messages.map((msg, index) => ( + + + {msg.text} + + + ))} + + + {showProgress && + Object.keys(this.state.activities).map(activityName => ( + + ))} + + + ) + } +} diff --git a/packages/gatsby/package.json b/packages/gatsby/package.json index 38a0d44e097ab..f8a364244591e 100644 --- a/packages/gatsby/package.json +++ b/packages/gatsby/package.json @@ -141,6 +141,8 @@ "@babel/runtime": "^7.0.0", "babel-preset-gatsby-package": "^0.1.4", "cross-env": "^5.1.4", + "react": "^16.4.2", + "react-dom": "^16.4.2", "rimraf": "^2.6.1" }, "engines": { diff --git a/packages/gatsby/src/query/__tests__/__snapshots__/file-parser.js.snap b/packages/gatsby/src/query/__tests__/__snapshots__/file-parser.js.snap index 47ed7db715083..04f1a6480fb71 100644 --- a/packages/gatsby/src/query/__tests__/__snapshots__/file-parser.js.snap +++ b/packages/gatsby/src/query/__tests__/__snapshots__/file-parser.js.snap @@ -976,18 +976,36 @@ Map { `; exports[`File parser extracts query AST correctly from files 2`] = ` -Array [ - "warning +[MockFunction] { + "calls": Array [ + Array [ + " We were unable to find the declaration of variable \\"strangeQueryName\\", which you passed as the \\"query\\" prop into the declaration in \\"query-not-defined.js\\". Perhaps the variable name has a typo? -Also note that we are currently unable to use queries defined in files other than the file where the is defined. If you're attempting to import the query, please move it into \\"query-not-defined.js\\". If being able to import queries from another file is an important capability for you, we invite your help fixing it.", - "warning +Also note that we are currently unable to use queries defined in files other than the file where the is defined. If you're attempting to import the query, please move it into \\"query-not-defined.js\\". If being able to import queries from another file is an important capability for you, we invite your help fixing it. +", + ], + Array [ + " We were unable to find the declaration of variable \\"strangeQueryName\\", which you passed as the \\"query\\" prop into the declaration in \\"query-imported.js\\". Perhaps the variable name has a typo? -Also note that we are currently unable to use queries defined in files other than the file where the is defined. If you're attempting to import the query, please move it into \\"query-imported.js\\". If being able to import queries from another file is an important capability for you, we invite your help fixing it.", -] +Also note that we are currently unable to use queries defined in files other than the file where the is defined. If you're attempting to import the query, please move it into \\"query-imported.js\\". If being able to import queries from another file is an important capability for you, we invite your help fixing it. +", + ], + ], + "results": Array [ + Object { + "type": "return", + "value": undefined, + }, + Object { + "type": "return", + "value": undefined, + }, + ], +} `; diff --git a/packages/gatsby/src/query/__tests__/file-parser.js b/packages/gatsby/src/query/__tests__/file-parser.js index cf9369538a849..baf89da99640e 100644 --- a/packages/gatsby/src/query/__tests__/file-parser.js +++ b/packages/gatsby/src/query/__tests__/file-parser.js @@ -1,12 +1,13 @@ jest.mock(`fs-extra`, () => { - const fs = jest.requireActual(`fs`) + const fs = jest.requireActual(`fs-extra`) return { ...fs, readFile: jest.fn(), } }) jest.mock(`../../utils/api-runner-node`, () => () => []) - +jest.mock(`gatsby-cli/lib/reporter/index`) +const reporter = require(`gatsby-cli/lib/reporter`) const fs = require(`fs-extra`) const FileParser = require(`../file-parser`).default @@ -153,16 +154,8 @@ export default () => ( }) it(`extracts query AST correctly from files`, async () => { - const spyStderr = jest.spyOn(process.stderr, `write`) const results = await parser.parseFiles(Object.keys(MOCK_FILE_INFO)) expect(results).toMatchSnapshot() - expect( - spyStderr.mock.calls - .filter(c => c[0].includes(`warning`)) - // Remove console colors + trim whitespace - // eslint-disable-next-line - .map(c => c[0].replace(/\x1B[[(?);]{0,2}(;?\d)*./g, ``).trim()) - ).toMatchSnapshot() - spyStderr.mockRestore() + expect(reporter.warn).toMatchSnapshot() }) }) diff --git a/yarn.lock b/yarn.lock index d5d0bb2218295..93061f944c4a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2810,6 +2810,14 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/react@^16.8.6": + version "16.8.8" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.8.tgz#4b60a469fd2469f7aa6eaa0f8cfbc51f6d76e662" + integrity sha512-xwEvyet96u7WnB96kqY0yY7qxx/pEpU51QeACkKFtrgjjXITQn0oO1iwPEraXVgh10ZFPix7gs1R4OJXF7P5sg== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -3420,6 +3428,11 @@ ansi-escapes@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-html@0.0.7, ansi-html@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -3913,6 +3926,11 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +auto-bind@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-2.0.0.tgz#9a55a461b521f58daf955169203bed1a07a970a9" + integrity sha512-rvRBv0/O7iriUMqSzTDhAfyAD1vVnElAEruo5rMSFeYLA0iKDEzLPSJiwMnL86+IPpTlhfOIAzjoKZ9TaySYdA== + autolinker@~0.15.0: version "0.15.3" resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.15.3.tgz#342417d8f2f3461b14cf09088d5edf8791dc9832" @@ -5426,9 +5444,9 @@ builtin-modules@^1.0.0: integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= builtin-modules@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.0.0.tgz#1e587d44b006620d90286cc7a9238bbc6129cab1" - integrity sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" + integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== builtin-status-codes@^3.0.0: version "3.0.0" @@ -6007,6 +6025,11 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-spinners@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== + cli-table3@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -11381,6 +11404,34 @@ init-package-json@^1.10.3: validate-npm-package-license "^3.0.1" validate-npm-package-name "^3.0.0" +ink-spinner@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ink-spinner/-/ink-spinner-3.0.1.tgz#7b4b206d2b18538701fd92593f9acabbfe308dce" + integrity sha512-AVR4Z/NXDQ7dT5ltWcCzFS9Dd4T8eaO//E2UO8VYNiJcZpPCSJ11o5A0UVPcMlZxGbGD6ikUFDR3ZgPUQk5haQ== + dependencies: + cli-spinners "^1.0.0" + prop-types "^15.5.10" + +ink@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ink/-/ink-2.0.5.tgz#a7fcd79372f57bef0e436d087cbef9e545ee1051" + integrity sha512-uqJBW4ro8SfMnwEVSfH0hAMGA2T8bhrOb9TUcdhvHval9edVESUcSQBfQ0wTXOENnavQXzAXWB1CznufHYBxiQ== + dependencies: + "@types/react" "^16.8.6" + arrify "^1.0.1" + auto-bind "^2.0.0" + chalk "^2.4.1" + cli-cursor "^2.1.0" + lodash.throttle "^4.1.1" + log-update "^3.0.0" + prop-types "^15.6.2" + react-reconciler "^0.20.0" + scheduler "^0.13.2" + slice-ansi "^1.0.0" + string-length "^2.0.0" + widest-line "^2.0.0" + yoga-layout-prebuilt "^1.9.3" + inline-style-prefixer@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-4.0.2.tgz#d390957d26f281255fe101da863158ac6eb60911" @@ -13977,6 +14028,11 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "~3.0.0" +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + lodash.toarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" @@ -14025,6 +14081,15 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" +log-update@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-3.1.0.tgz#fa22abbbcb30f505906758bbbd0f292b71bc2ad9" + integrity sha512-7ttbZj4w165ZemmS9YngKbBh4/UEiW1gS+SPpfQQHIMYcPMybTDM6UDlmQLrjJ8+j23On173OFB+pXKfPRJP3A== + dependencies: + ansi-escapes "^3.2.0" + cli-cursor "^2.1.0" + wrap-ansi "^5.0.0" + logalot@^2.0.0, logalot@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552" @@ -15020,9 +15085,9 @@ node-dir@^0.1.10: minimatch "^3.0.2" node-emoji@^1.6.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.8.1.tgz#6eec6bfb07421e2148c75c6bba72421f8530a826" - integrity sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg== + version "1.10.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" + integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== dependencies: lodash.toarray "^4.4.0" @@ -15538,6 +15603,16 @@ object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" +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== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -17109,7 +17184,16 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2: +prop-types@^15.5.10, prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +prop-types@^15.6.0, prop-types@^15.6.1: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== @@ -17420,7 +17504,7 @@ react-docgen@^4.1.0: node-dir "^0.1.10" recast "^0.17.3" -react-dom@^16.8.4, react-dom@^16.8.6: +react-dom@^16.4.2, react-dom@^16.8.4, react-dom@^16.8.6: version "16.8.6" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f" integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA== @@ -17455,11 +17539,26 @@ react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== +react-is@^16.8.1: + version "16.8.4" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.4.tgz#90f336a68c3a29a096a3d648ab80e87ec61482a2" + integrity sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA== + react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-reconciler@^0.20.0: + version "0.20.2" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.20.2.tgz#f72fe0329d579371f253719080e7d090262330a9" + integrity sha512-D0Vf/XQkhrZTHTqU5xnjruiXaTcKlPzjENJ7qOqC8d48+qZHb3hBa8n/tmRN7LeeKREBuUUQgFuOsKH55VXioQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.4" + react-testing-library@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/react-testing-library/-/react-testing-library-5.2.1.tgz#31f163e900457e5c0dcff7669ae06b502f8a9a7a" @@ -17472,7 +17571,7 @@ react-typography@^0.16.18: resolved "https://registry.yarnpkg.com/react-typography/-/react-typography-0.16.18.tgz#89341b63d615f1dfcf5e471797df5acce5bde1f3" integrity sha512-BFkw59H2mkYRLLtHOT2UZve/9/RticAvL7o7rheOo/+tlwQyfF61wF2XzGRcA3IWASg+DbXnNViyywHBFlNj6A== -react@^16.8.4, react@^16.8.6: +react@^16.4.2, react@^16.8.4, react@^16.8.6: version "16.8.6" resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw== @@ -18514,14 +18613,14 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.0, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" -rimraf@^2.5.2: +rimraf@^2.5.0, rimraf@^2.5.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -18739,7 +18838,15 @@ saxes@^3.1.5: dependencies: xmlchars "^1.3.1" -scheduler@^0.13.6: +scheduler@^0.13.2: + version "0.13.4" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.4.tgz#8fef05e7a3580c76c0364d2df5e550e4c9140298" + integrity sha512-cvSOlRPxOHs5dAhP9yiS/6IDmVAVxmk33f0CtTJRkmUWcb1Us+t7b1wqdzoC0REw2muC9V5f1L/w5R5uKGaepA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +scheduler@^0.13.4, scheduler@^0.13.6: version "0.13.6" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== @@ -19146,6 +19253,13 @@ slice-ansi@2.0.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" + slide@^1.1.5, slide@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -19857,6 +19971,13 @@ strip-ansi@^5.0.0: ansi-regex "^4.0.0" strip-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.1.0.tgz#55aaa54e33b4c0649a7338a43437b1887d153ec4" + integrity sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -22131,6 +22252,15 @@ wrap-ansi@^3.0.1: string-width "^2.1.1" strip-ansi "^4.0.0" +wrap-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.0.0.tgz#c3838a85fbac6a647558ca97024d41d7631721dc" + integrity sha512-3ThemJUfTTju0SKG2gjGExzGRHxT5l/KEM5sff3TQReaVWe/bFTiF1GEr8DKr/j0LxGt8qPzx0yhd2RLyqgy2Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -22554,10 +22684,15 @@ yeast@0.1.2: resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= -yurnalist@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/yurnalist/-/yurnalist-1.0.2.tgz#4607378548bf50cf70b80bea9b1a9041eb865cc0" - integrity sha512-Xuj2K6KS8pOlpl0H2VwpPFAFAJlVutGG2dONbYJuk2mUqpBfasz4lWBNPYDxriaSIrzVyvUHfoFBBizEtdNxXg== +yoga-layout-prebuilt@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.9.3.tgz#11e3be29096afe3c284e5d963cc2d628148c1372" + integrity sha512-9SNQpwuEh2NucU83i2KMZnONVudZ86YNcFk9tq74YaqrQfgJWO3yB9uzH1tAg8iqh5c9F5j0wuyJ2z72wcum2w== + +yurnalist@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/yurnalist/-/yurnalist-1.0.5.tgz#98534ddc1330e1316684981f53cba879ffc07a28" + integrity sha512-EuLjqX3Q15iVM0UtZa5Ju536uRmklKd2kKhdE5D5fIh8RZmh+pJ8c6wj2oGo0TA+T/Ii2o79cIHCTMfciW8jlA== dependencies: babel-runtime "^6.26.0" chalk "^2.1.0" @@ -22576,6 +22711,7 @@ yurnalist@^1.0.2: read "^1.0.7" rimraf "^2.5.0" semver "^5.1.0" + strip-ansi "^5.0.0" strip-bom "^3.0.0" zen-observable-ts@^0.8.6, zen-observable-ts@^0.8.9: