From c4037e0214e8b49885415d8be84b09c7ee68f15e Mon Sep 17 00:00:00 2001 From: Kaelig Deloumeau-Prigent Date: Fri, 13 Sep 2019 07:51:37 -0700 Subject: [PATCH] [Tooling] `yarn splash` (beta) (#2113) * First iteration of the observer CLI * Load .ts files too * Add graph script * Enable compilation of .ts files * Remove tinycolor2 dependency * Make filter more portable across environments * Add scoping to getGitStagedFiles * Try to use functions from treebuilder.ts * Add types * Fix filter * Formatting * Remove absolute part of the path * Plug data from git status and improve listing * Rename script to yarn splash, add watcher mode * Align summary text to the right * Change filtering * Add temporary workaround to the skipIndexFile function * Move treebuilder.ts to scripts/splash * Remove skipIndexFile * Add docs * Add changelog item * Add mention that the watcher is still alpha * Remove unused type dependency * Add missing space * Add missing space * Verifies the index file is in a component folder * Account for .ts files * Show utils.tsx files again * Handle loading status properly * Stop filtering index.ts files out * Integrate with storybook * Make component grid layout responsive * Delete watch mode * Update useEffects flow * enum * Revert "enum" This reverts commit 7eeba2aecc8c9feaa21033fc7c30432cccdcd89a. * Revert "Update useEffects flow" This reverts commit 7dd8e0a9dc03dcf188083b7fc78e92b3ed1f3c78. --- .storybook/webpack.config.js | 12 ++ UNRELEASED.md | 2 + package.json | 13 +- scripts/splash/.eslintrc | 6 + scripts/splash/README.md | 20 ++ scripts/splash/index.tsx | 200 ++++++++++++++++++ scripts/splash/treebuilder.ts | 152 +++++++++++++ .../TopBar/components/UserMenu/UserMenu.tsx | 2 +- yarn.lock | 175 +++++++++++---- 9 files changed, 539 insertions(+), 43 deletions(-) create mode 100644 scripts/splash/.eslintrc create mode 100644 scripts/splash/README.md create mode 100644 scripts/splash/index.tsx create mode 100644 scripts/splash/treebuilder.ts diff --git a/.storybook/webpack.config.js b/.storybook/webpack.config.js index 6937638ac91..71a6d7c6805 100644 --- a/.storybook/webpack.config.js +++ b/.storybook/webpack.config.js @@ -3,6 +3,7 @@ // For more information refer the docs: https://storybook.js.org/configurations/custom-webpack-config const path = require('path'); +const spawn = require('child_process').spawn; const postcssShopify = require('postcss-shopify'); @@ -111,6 +112,17 @@ module.exports = ({config, mode}) => { }, ]; + config.plugins.push({ + apply: (compiler) => { + compiler.hooks.afterEmit.tap('AfterEmitPlugin', (compilation) => { + const spawnedProcess = spawn('yarn splash', { + shell: true, + stdio: 'inherit', + }); + }); + }, + }); + config.module.rules = [config.module.rules[0], ...extraRules]; if (isProduction) { diff --git a/UNRELEASED.md b/UNRELEASED.md index 01506d7381b..d094e7420ac 100644 --- a/UNRELEASED.md +++ b/UNRELEASED.md @@ -28,6 +28,8 @@ Use [the changelog guidelines](https://git.io/polaris-changelog-guidelines) to f ### Development workflow +- Added [`yarn splash` (beta)](/scripts/splash/), a command-line interface to observe the splash zone of a change across the component library ([#2113](https://github.com/Shopify/polaris-react/pull/2113)) + ### Dependency upgrades ### Code quality diff --git a/package.json b/package.json index bc76ae49e5b..a2723e0fc91 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,8 @@ "readme-update-version": "node ./scripts/readme-update-version", "version": "yarn run readme-update-version", "storybook": "start-storybook -p 6006 --quiet", - "storybook:build": "yarn run copy-polaris-tokens && build-storybook -o build/storybook/static" + "storybook:build": "yarn run copy-polaris-tokens && build-storybook -o build/storybook/static", + "splash": "babel-node --extensions '.tsx','.ts' ./scripts/splash/index.tsx" }, "stylelint": { "extends": [ @@ -89,6 +90,7 @@ ], "devDependencies": { "@babel/core": "^7.4.3", + "@babel/node": "^7.6.1", "@percy/storybook": "^3.0.2", "@shopify/jest-dom-mocks": "^2.1.1", "@shopify/react-testing": "^1.7.3", @@ -104,7 +106,7 @@ "@types/enzyme": "^3.10.3", "@types/enzyme-adapter-react-16": "^1.0.5", "@types/lodash": "^4.14.108", - "@types/node": "^11.13.8", + "@types/node": "^12.7.4", "archiver": "^3.0.0", "babel-core": "7.0.0-bridge.0", "babel-loader": "^8.0.5", @@ -118,9 +120,10 @@ "enzyme": "^3.10.0", "enzyme-adapter-react-16": "^1.14.0", "fs-extra": "^7.0.1", - "glob": "^7.1.3", + "glob": "^7.1.4", "gray-matter": "^4.0.2", "in-publish": "^2.0.0", + "ink": "^2.3.0", "isomorphic-fetch": "^2.2.1", "js-yaml": "^3.13.1", "marked": "^0.6.2", @@ -153,8 +156,7 @@ "shx": "^0.3.2", "storybook-chroma": "^2.1.1", "svgo": "^1.2.2", - "typescript": "~3.5.1", - "yargs": "^13.2.2" + "typescript": "~3.5.1" }, "peerDependencies": { "react": "^16.8.6", @@ -189,6 +191,7 @@ "@types/react-transition-group": "^2.0.7", "hoist-non-react-statics": "^3.3.0", "lodash": "^4.17.4", + "node-cmd": "^3.0.0", "tslib": "^1.9.3" } } diff --git a/scripts/splash/.eslintrc b/scripts/splash/.eslintrc new file mode 100644 index 00000000000..935cfee4dc6 --- /dev/null +++ b/scripts/splash/.eslintrc @@ -0,0 +1,6 @@ +{ + "rules": { + "jsx-a11y/accessible-emoji": "off", + "shopify/jsx-no-hardcoded-content": "off" + } +} diff --git a/scripts/splash/README.md b/scripts/splash/README.md new file mode 100644 index 00000000000..e283d7d6e8b --- /dev/null +++ b/scripts/splash/README.md @@ -0,0 +1,20 @@ +# `yarn splash` (beta) + +`yarn splash` is a command-line interface to observe the splash zone of a change across the component library. + +It answers the question: + +> When I modify a component, what parts of the system did that also touch (also known as the change’s “splash zone”)? + +## How to use `yarn splash` + +1. Edit files in `src/`, such as components 🧩 and style sheets 🎨 +2. Run `yarn splash` to see the splash zone of your changes in the working directory + +💡 Tip: command + click a file path to open it in your text editor + +## Feedback and bug reports + +Found an issue or want to share feedback? + +Reach out on Slack in [#polaris-tooling](https://shopify.slack.com/messages/CCNUS0FML). diff --git a/scripts/splash/index.tsx b/scripts/splash/index.tsx new file mode 100644 index 00000000000..a60f38b5a8d --- /dev/null +++ b/scripts/splash/index.tsx @@ -0,0 +1,200 @@ +import path from 'path'; +import React, {useState, useEffect} from 'react'; +import {Box, Text, Color, render} from 'ink'; +import sortBy from 'lodash/sortBy'; +import {getGitStagedFiles, getDependencies} from './treebuilder'; + +const excludedFileNames = (fileName) => + !fileName.includes('test') && !fileName.includes('types'); + +const getEmojiForExtension = (extension) => { + switch (extension) { + case '.tsx': + case '.ts': + return '🧩'; + case '.scss': + return '🎨'; + default: + return '❔'; + } +}; + +const formatDependencies = (dependencies) => + dependencies + .filter(({fileName}) => excludedFileNames(fileName)) + .map((dependency) => ({ + pathname: `${path.dirname(dependency.fileName)}/`, + filename: path.basename(dependency.fileName), + dependencies: sortBy( + dependency.dependencies.filter(excludedFileNames).map((dependency) => ({ + pathname: `${path.dirname(dependency)}/`, + filename: path.basename(dependency), + componentName: path + .dirname(dependency) + .replace('src/components/', '') + .split('/')[0], + })), + ['pathname', 'filename'], + ), + })); + +const Component = ({pathname, filename, dependencies}) => ( + + + {getEmojiForExtension(path.extname(filename))} + + + {pathname} + {filename} + + + + + Component name + Files potentially affected (total: {dependencies.length}) + + {dependencies.map(({pathname, filename, componentName}) => ( + 80 ? 'row' : 'column'} + > + + {'<'} + {componentName} + {' />'} + + + {pathname} + {filename} + + + ))} + +); + +const Components = ({components, status}) => ( + + {status === 'loading' && ( + + ⏳{' '}Please wait during compilation… Beep boop beep 🤖 + + )} + + {status === 'loaded' && + components.map(({pathname, filename, dependencies}) => ( + + ))} + +); + +const Summary = ({ + componentsModified, + dependencies, + status, +}: { + componentsModified: number; + dependencies: number; + status: string; +}) => ( + + + + Files modified: + + + {componentsModified} + + + + + Files potentially affected: + + + {status === 'loading' ? '⏳' : dependencies} + + + +); + +const App = () => { + const [stagedFiles, setStagedFiles] = useState([]); + const [data, setData] = useState([]); + const [dataStatus, setDataStatus] = useState('loading'); + + useEffect(() => { + const getStagedFiles = async () => { + const staged = (await getGitStagedFiles('src/')) as string[]; + setStagedFiles(staged); + + if (staged.length === 0) { + setDataStatus('loaded'); + } + }; + getStagedFiles(); + }, []); + + useEffect(() => { + if (stagedFiles.length > 0) { + const dependencies = getDependencies( + 'src/**/*.tsx', + '*.test.tsx', + stagedFiles, + ); + setData(formatDependencies(dependencies)); + setDataStatus('loaded'); + } + }, [setData, stagedFiles]); + + return ( + + + + 💦 + + yarn splash: Observe the splash zone of a change + across the entire library + + + + + [ + pathname, + pathname + filename, + ]), + ...data.reduce( + (val, curr) => + val.concat( + curr.dependencies.map(({pathname}) => [ + pathname, + curr.pathname + curr.filename, + ]), + ), + [], + ), + ]).size + } + /> + + + 💡 + + Tip: command + click a file path to open it in your text editor + + + + + ); +}; + +render(); diff --git a/scripts/splash/treebuilder.ts b/scripts/splash/treebuilder.ts new file mode 100644 index 00000000000..b2c87a3147e --- /dev/null +++ b/scripts/splash/treebuilder.ts @@ -0,0 +1,152 @@ +import path from 'path'; +import * as ts from 'typescript'; +import glob from 'glob'; +import cmd from 'node-cmd'; + +type Node = { + fileName: string; + dependsOn: Node[]; + dependedOnBy: Node[]; +}; + +type GraphType = { + [name: string]: Node; +}; + +const graph: GraphType = {}; + +function compile(fileNames: string[], options: ts.CompilerOptions): void { + const program = ts.createProgram(fileNames, options); + + fileNames.map((fileName) => { + if (!graph[path.resolve(fileName)]) { + const ast: any = program.getSourceFile(fileName); + recurse({ + fileName: path.resolve(ast.originalFileName), + dependsOn: [], + dependedOnBy: [], + }); + } + }); + + function recurse(node: Node) { + const ast: any = program.getSourceFile(node.fileName); + + if (ast && ast.resolvedModules) { + const dependencies = Array.from(ast.resolvedModules.entries()) + .map(([key, module]: any) => { + if (!module) { + return recurse({ + fileName: path.resolve( + ast.originalFileName.replace(/(.*\/)(.*)/, `$1${key}`), + ), + dependsOn: [], + dependedOnBy: [node], + }); + } + + if (module.isExternalLibraryImport) { + return undefined; + } + + const moduleFileName = module.resolvedFileName; + + let newNode; + if (graph[path.resolve(moduleFileName)]) { + newNode = graph[path.resolve(moduleFileName)]; + newNode.dependedOnBy.push(node); + } else { + newNode = recurse({ + fileName: moduleFileName, + dependsOn: [], + dependedOnBy: [node], + }); + } + return newNode; + }) + .filter((node) => node); + + node.dependsOn = dependencies; + } + + graph[path.resolve(node.fileName)] = node; + return node; + } +} + +function findDependencies(fileName) { + const dependencies = {}; + recurse(graph[path.resolve(fileName)], 0); + + function recurse(node, depth) { + if (node && node.dependedOnBy) { + node.dependedOnBy.forEach((dependency) => { + dependencies[dependency.fileName] = 1; + recurse(dependency, depth + 1); + }); + } + } + + return Object.keys(dependencies) + .filter( + (dependency) => !/(components\/)(\w*\/)?(index.ts)/.test(dependency), + ) + .map((dependency) => dependency.split('polaris-react/')[1]); +} + +export function getGitStagedFiles(scope = '') { + return new Promise((resolve, reject) => { + cmd.get('git status --porcelain', (err, data, stderr) => { + if (err) { + reject(err); + return; + } + + resolve( + data + .split('\n') + .filter( + (datum) => + ['M', 'A'].includes(datum[0]) || ['M', 'A'].includes(datum[1]), + ) + .map((datum) => datum.slice(3)) + .filter((filepath) => filepath.startsWith(scope)), + ); + }); + }); +} + +export function getDependencies( + codebaseGlob: string, + ignoreGlob: string, + fileGlobs: string[], +) { + const codebase = glob.sync(codebaseGlob, { + ignore: ignoreGlob, + }); + + compile(codebase, { + noEmitOnError: true, + noImplicitAny: true, + target: ts.ScriptTarget.ES5, + module: ts.ModuleKind.CommonJS, + }); + + const dependencies = fileGlobs + .map((fileGlob) => glob.sync(fileGlob)) + .reduce((accumulator, current) => [...accumulator, ...current], []) + .map(findDependencies); + + return fileGlobs.map((fileGlob, index) => ({ + fileName: fileGlob, + dependencies: dependencies[index], + })); +} + +// console.log( +// getDependencies('src/**/*.tsx', 'src/**/*.test.tsx', [ +// 'src/components/Button/Button.tsx', +// 'src/components/Avatar/Avatar.tsx', +// ]), +// ); +// debugger; diff --git a/src/components/TopBar/components/UserMenu/UserMenu.tsx b/src/components/TopBar/components/UserMenu/UserMenu.tsx index 3dc9b602221..6f26d85abda 100644 --- a/src/components/TopBar/components/UserMenu/UserMenu.tsx +++ b/src/components/TopBar/components/UserMenu/UserMenu.tsx @@ -13,7 +13,7 @@ export interface UserMenuProps { message?: MenuProps['message']; /** A string detailing the merchant’s full name to be displayed in the user menu */ name: string; - /** A string allowing further details on the merchant’s name displayed in the user menu */ + /** A string allowing further detail on the merchant’s name displayed in the user menu */ detail?: string; /** The merchant’s initials, rendered in place of an avatar image when not provided */ initials: AvatarProps['initials']; diff --git a/yarn.lock b/yarn.lock index 48dbe9b7f66..c40ca77ba7f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -284,6 +284,18 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@babel/node@^7.6.1": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.6.1.tgz#84f8f4f1d86647d99537a681f32e65e70bb59f19" + integrity sha512-q2sJw+7aES/5wwjccECJfOuIgM1XIbZcn7b63JZM6VpaZwvOq913jL+tXRIn41Eg/Hr+BeIGWnvnjLTuT579pA== + dependencies: + "@babel/polyfill" "^7.6.0" + "@babel/register" "^7.6.0" + commander "^2.8.1" + lodash "^4.17.13" + node-environment-flags "^1.0.5" + v8flags "^3.1.1" + "@babel/parser@^7.0.0", "@babel/parser@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" @@ -802,6 +814,14 @@ core-js "^2.6.5" regenerator-runtime "^0.13.2" +"@babel/polyfill@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.6.0.tgz#6d89203f8b6cd323e8d946e47774ea35dc0619cc" + integrity sha512-q5BZJI0n/B10VaQQvln1IlDK3BTBJFbADx7tv+oXDPIDZuTo37H5Adb9jhlXm/fEN4Y7/64qD9mnrJJG7rmaTw== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.2" + "@babel/preset-env@7.4.3": version "7.4.3" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.3.tgz#e71e16e123dc0fbf65a52cbcbcefd072fbd02880" @@ -937,6 +957,17 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-typescript" "^7.3.2" +"@babel/register@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.6.0.tgz#76b6f466714680f4becafd45beeb2a7b87431abf" + integrity sha512-78BomdN8el+x/nkup9KwtjJXuptW5oXMFmP11WoM2VJBjxrKv4grC3qjpLL8RGGUYUGsm57xnjYFM2uom+jWUQ== + dependencies: + find-cache-dir "^2.0.0" + lodash "^4.17.13" + mkdirp "^0.5.1" + pirates "^4.0.0" + source-map-support "^0.5.9" + "@babel/runtime@7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" @@ -2343,11 +2374,16 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/node@*", "@types/node@^11.13.5", "@types/node@^11.13.8": +"@types/node@*", "@types/node@^11.13.5": version "11.13.8" resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.8.tgz#e5d71173c95533be9842b2c798978f095f912aab" integrity sha512-szA3x/3miL90ZJxUCzx9haNbK5/zmPieGraZEe4WI+3srN0eGLiT22NXeMHmyhNEopn+IrxqMc7wdVwvPl8meg== +"@types/node@^12.7.4": + version "12.7.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.4.tgz#64db61e0359eb5a8d99b55e05c729f130a678b04" + integrity sha512-W0+n1Y+gK/8G2P/piTkBBN38Qc5Q1ZSO6B5H3QmPCUewaiXOo2GCAWZ4ElZCcNhjJuBSUSLGFUJnmlCn5+nxOQ== + "@types/prop-types@*": version "15.5.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.5.tgz#17038dd322c2325f5da650a94d5f9974943625e3" @@ -2382,6 +2418,14 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/react@^16.8.12", "@types/react@^16.8.6": + version "16.9.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.2.tgz#6d1765431a1ad1877979013906731aae373de268" + integrity sha512-jYP2LWwlh+FTqGd9v7ynUKZzjj98T8x7Yclz479QdRhHfuW9yQ+0jjnD31eXSXutmBpppj5PYNLYLRfnZJvcfg== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@types/resolve@0.0.8": version "0.0.8" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" @@ -3414,6 +3458,13 @@ 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.1.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-2.1.0.tgz#254e12d53063d7cab90446ce021accfb3faa1464" + integrity sha512-qZuFvkes1eh9lB2mg8/HG18C+5GIO51r+RrCSst/lh+i5B1CtVlkhTE488M805Nr3dKl0sM/pIFKSKUIlg3zUg== + dependencies: + "@types/react" "^16.8.12" + autoprefixer@9.3.1: version "9.3.1" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.3.1.tgz#71b622174de2b783d5fd99f9ad617b7a3c78443e" @@ -4954,6 +5005,14 @@ cli-table3@0.5.1: optionalDependencies: colors "^1.1.2" +cli-truncate@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-1.1.0.tgz#2b2dfd83c53cfd3572b87fc4d430a808afb04086" + integrity sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA== + dependencies: + slice-ansi "^1.0.0" + string-width "^2.0.0" + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -5160,7 +5219,7 @@ commander@^2.18.0, commander@~2.19.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== -commander@^2.19.0, commander@^2.9.0, commander@~2.20.0: +commander@^2.19.0, commander@^2.8.1, commander@^2.9.0, commander@~2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== @@ -8143,11 +8202,6 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - get-port@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.0.0.tgz#373c85960138ee20027c070e3cb08019fea29816" @@ -9432,6 +9486,30 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" integrity sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4= +ink@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/ink/-/ink-2.3.0.tgz#222136be17bb72fc742e19090483e7e0e7dc3690" + integrity sha512-931rgXHAS3hM++8ygWPOBeHOFwTzHh3pDAVZtiBVOUH6tVvJijym43ODUy22ySo2NwYUFeR/Zj3xuWzBEKMiHw== + dependencies: + "@types/react" "^16.8.6" + arrify "^1.0.1" + auto-bind "^2.0.0" + chalk "^2.4.1" + cli-cursor "^2.1.0" + cli-truncate "^1.1.0" + is-ci "^2.0.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" + signal-exit "^3.0.2" + slice-ansi "^1.0.0" + string-length "^2.0.0" + widest-line "^2.0.0" + wrap-ansi "^5.0.0" + yoga-layout-prebuilt "^1.9.3" + inquirer@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" @@ -11270,6 +11348,11 @@ lodash@^4.0.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, l resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.13.tgz#0bdc3a6adc873d2f4e0c4bac285df91b64fc7b93" integrity sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA== +lodash@^4.17.13: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + log-symbols@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -11277,6 +11360,15 @@ log-symbols@^2.0.0: dependencies: chalk "^2.0.1" +log-update@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-3.3.0.tgz#3b0501815123f66cb33f300e3dac2a2b6ad3fdf5" + integrity sha512-YSKm5n+YjZoGZT5lfmOqasVH1fIH9xQA9A81Y48nZ99PxAP62vdCCtua+Gcu6oTn0nqtZd/LwRV+Vflo53ZDWA== + 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" @@ -12076,6 +12168,11 @@ node-ask@^1.0.1: resolved "https://registry.yarnpkg.com/node-ask/-/node-ask-1.0.1.tgz#caaa1076cc58e0364267a0903e3eadfac158396b" integrity sha1-yqoQdsxY4DZCZ6CQPj6t+sFYOWs= +node-cmd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/node-cmd/-/node-cmd-3.0.0.tgz#38fff70a4aaa4f659d203eb57862737018e24f6f" + integrity sha1-OP/3CkqqT2WdID61eGJzcBjiT28= + node-dir@^0.1.10: version "0.1.17" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" @@ -12083,6 +12180,14 @@ node-dir@^0.1.10: dependencies: minimatch "^3.0.2" +node-environment-flags@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + node-fetch@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" @@ -12740,7 +12845,7 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-locale@^3.0.0, os-locale@^3.1.0: +os-locale@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== @@ -13251,7 +13356,7 @@ pino@4.10.2: quick-format-unescaped "^1.1.1" split2 "^2.2.0" -pirates@^4.0.1: +pirates@^4.0.0, pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== @@ -14540,7 +14645,7 @@ react-popper@^1.3.3: typed-styles "^0.0.7" warning "^4.0.2" -react-reconciler@^0.20.2: +react-reconciler@^0.20.0, react-reconciler@^0.20.2: version "0.20.4" resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.20.4.tgz#3da6a95841592f849cb4edd3d38676c86fd920b2" integrity sha512-kxERc4H32zV2lXMg/iMiwQHOtyqf15qojvkcZ5Ja2CPkjVohHw9k70pdDBwrnQhLVetUJBSYyqU3yqrlVTOajA== @@ -15518,7 +15623,7 @@ sax@^1.2.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.13.6: +scheduler@^0.13.2, 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== @@ -15938,7 +16043,7 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slice-ansi@1.0.0: +slice-ansi@1.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== @@ -17718,6 +17823,13 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +v8flags@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" + integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== + dependencies: + homedir-polyfill "^1.0.1" + vali-date@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" @@ -18249,6 +18361,15 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrap-fn@^0.1.0: version "0.1.5" resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" @@ -18374,14 +18495,6 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" - integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" @@ -18476,23 +18589,6 @@ yargs@^12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" -yargs@^13.2.2: - version "13.2.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" - integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== - dependencies: - cliui "^4.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.0.0" - yargs@^7.0.0, yargs@^7.0.2: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" @@ -18535,6 +18631,11 @@ yauzl@^2.4.2: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" +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== + zip-stream@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-2.0.1.tgz#48a062488afe91dda42f823700fae589753ccd34"