From ff9d8a8c6c8830747cbe72796449494b5f152568 Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Tue, 2 Jul 2019 16:38:48 -0700 Subject: [PATCH] fix: replace terminal component --- .eslintrc.js | 7 +- package.json | 4 +- src/app.jsx | 125 +++++++++----------- src/index.html | 15 ++- src/index.js | 5 +- src/replicator.js | 14 +-- yarn.lock | 296 ++++++++++++++++++++++++++++++---------------- 7 files changed, 280 insertions(+), 186 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index c1e1590..af04b13 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -6,14 +6,15 @@ module.exports = { ecmaVersion: 8, }, rules: { - 'react/sort-comp': 0, + 'arrow-parens': ['error', 'as-needed'], 'import/extensions': 0, 'import/no-extraneous-dependencies': 0, 'import/no-unresolved': [2, {ignore: ['electron']}], + 'import/prefer-default-export': 0, 'linebreak-style': ['error', 'unix'], + 'no-console': 0, 'object-curly-spacing': ['error', 'never'], - 'import/prefer-default-export': 0, 'react/prefer-stateless-function': 0, - 'arrow-parens': ['error', 'as-needed'], + 'react/sort-comp': 0, }, }; diff --git a/package.json b/package.json index d931f7b..b0686b4 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,8 @@ "@material-ui/icons": "^4.2.1", "@material-ui/lab": "^4.0.0-alpha.18", "@solana/web3.js": "^0.16.10", + "autoscroll-react": "^3.2.0", + "console-feed": "^2.8.8", "electron-compile": "^6.4.4", "electron-devtools-installer": "^2.1.0", "electron-log": "^3.0.6", @@ -40,10 +42,10 @@ "node-fetch": "^2.6.0", "npm-run-all": "^4.1.5", "promisify-child-process": "^3.1.0", + "prop-types": "^15.7.2", "react": "^16.8.6", "react-dom": "^16.8.6", "react-hot-loader": "^4.12.0", - "react-terminal-component": "^1.4.1", "update-electron-app": "solana-labs/update-electron-app#nagUser" }, "devDependencies": { diff --git a/src/app.jsx b/src/app.jsx index 3c6811f..0e49ea6 100644 --- a/src/app.jsx +++ b/src/app.jsx @@ -13,21 +13,19 @@ import TextField from '@material-ui/core/TextField'; import Typography from '@material-ui/core/Typography'; import log from 'electron-log'; import {Connection, PublicKey} from '@solana/web3.js'; -import {EmulatorState, OutputFactory, Outputs} from 'javascript-terminal'; -import {ReactThemes, ReactTerminal} from 'react-terminal-component'; import {withStyles} from '@material-ui/core/styles'; import Store from 'electron-store'; import IconButton from '@material-ui/core/IconButton'; import SaveIcon from '@material-ui/icons/Save'; +import autoscroll from 'autoscroll-react'; +import {Hook, Console, Decode} from 'console-feed'; import {url} from './url'; import {Replicator} from './replicator'; const styles = theme => ({ root: { - display: 'flex', - flexDirection: 'column', - minHeight: '100vh', + height: '100%', }, main: { marginTop: theme.spacing(2), @@ -64,6 +62,28 @@ function isValidPublicKey(publicKey) { ); } +class LogConsole extends React.Component { + render() { + return ( +
+
+ +
+
+ ); + } +} +LogConsole.propTypes = { + logs: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types +}; + +// eslint-disable-next-line react/no-multi-comp class App extends React.Component { constructor(props) { super(props); @@ -75,6 +95,7 @@ class App extends React.Component { transactionCount: 0, totalMined: this.store.get('totalMined', 0), newMined: 0, + logs: [], totalSupply: 0, enabled: this.store.get('enabled', true), unsavedDepositPublicKey: this.depositPublicKey, @@ -82,21 +103,29 @@ class App extends React.Component { unsavedDepositPublicKeySavePrompt: false, depositPublicKeyBalance: ' ', }; + } + + componentDidMount() { + Hook(console, newLog => { + const logs = [...this.state.logs, Decode(newLog)]; + const max = 1024; + if (logs.length > max) { + logs.splice(0, logs.length - max); + } + this.setState({logs}); + }); this.connection = new Connection(url); - log.info('connection:', url); this.clearTerminal(); - this.addTerminalText(`Cluster entrypoint: ${url}...`); + log.info(`Cluster entrypoint: ${url}...`); - this.replicator = new Replicator(this.connection, this); + this.replicator = new Replicator(this.connection); if (this.state.enabled) { this.replicator.start(); } else { - this.addTerminalText('Mining disabled'); + console.warn('Mining disabled'); } - } - componentDidMount() { this.updateClusterStats(); this.id = setInterval(() => this.updateClusterStats(), 10000); } @@ -105,57 +134,12 @@ class App extends React.Component { clearInterval(this.id); } - trimTerminalOutput() { - const count = this.terminalOutputs.count(); - if (count > this.terminalHeight) { - this.terminalOutputs = this.terminalOutputs.splice( - 0, - count - this.terminalHeight, - ); - } - this.setState({}); - } - - addTerminalCommand(command) { - log.info('term$ ', command); - this.terminalOutputs = Outputs.addRecord( - this.terminalOutputs, - OutputFactory.makeHeaderOutput('', command), - ); - this.trimTerminalOutput(); - } - - addTerminalText(text) { - text.split('\n').forEach(line => { - log.info('term> ', line); - this.terminalOutputs = Outputs.addRecord( - this.terminalOutputs, - OutputFactory.makeTextOutput(line), - ); - }); - this.trimTerminalOutput(); - } - - addTerminalError(errorMessage) { - errorMessage.split('\n').forEach(line => { - log.info('TERM> ', line); - this.terminalOutputs = Outputs.addRecord( - this.terminalOutputs, - OutputFactory.makeErrorOutput({source: 'error', type: line}), - ); - }); - this.trimTerminalOutput(); - } - clearTerminal() { - this.terminalOutputs = Outputs.create( - new Array(this.terminalHeight).fill(OutputFactory.makeTextOutput(' ')), - ); - this.trimTerminalOutput(); + this.setState({logs: []}); } clusterRestart() { - this.addTerminalText(`Cluster restart detected at ${new Date()}`); + console.warn(`Cluster restart detected at ${new Date()}`); this.replicator.clusterRestart(); this.setState({ transactionCount: 0, @@ -168,7 +152,7 @@ class App extends React.Component { const transactionCount = await this.connection.getTransactionCount(); if (transactionCount < this.state.transactionCount / 2) { - this.addTerminalText( + console.warn( `Transaction count decreased from ${this.state.transactionCount} to ${transactionCount}`, ); this.clusterRestart(); @@ -212,8 +196,7 @@ class App extends React.Component { depositPublicKeyBalance, }); } catch (err) { - log.error('updateClusterStats failed', err); - this.addTerminalError(`updateClusterStats failed: ${err.message}`); + console.warn('updateClusterStats failed', err); } } @@ -222,6 +205,7 @@ class App extends React.Component { this.store.set('enabled', enabled); this.setState({enabled}); if (enabled) { + this.clearTerminal(); this.replicator.start(); } else { this.replicator.stop(); @@ -277,15 +261,15 @@ class App extends React.Component { render() { const {classes} = this.props; + const AutoscrollLogConsole = autoscroll(LogConsole, { + isScrolledDownThreshold: 0, + }); + // eslint-disable-next-line no-restricted-properties const totalSupplySOL = (this.state.totalSupply / Math.pow(2, 34)).toFixed( 2, ); - const emulatorState = EmulatorState.createEmpty().setOutputs( - this.terminalOutputs, - ); - return (
@@ -370,7 +354,7 @@ class App extends React.Component { -
+
@@ -400,16 +384,13 @@ class App extends React.Component { value={100} className={classes.progressBar} /> - -
+ +
); } } + App.propTypes = { classes: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types }; diff --git a/src/index.html b/src/index.html index 4b811e0..383111d 100644 --- a/src/index.html +++ b/src/index.html @@ -2,8 +2,21 @@ + - +
diff --git a/src/index.js b/src/index.js index 6f2d5b7..fd3c9c6 100644 --- a/src/index.js +++ b/src/index.js @@ -24,8 +24,11 @@ app.on('ready', async () => { const devModeExtra = isDevMode ? 200 : 0; mainWindow = new BrowserWindow({ width: 1000 + devModeExtra, - height: 820, + height: 830, resizable: isDevMode, + webPreferences: { + nodeIntegration: true, + }, }); mainWindow.loadURL(`file://${__dirname}/index.html`); diff --git a/src/replicator.js b/src/replicator.js index 07c7660..07c0195 100644 --- a/src/replicator.js +++ b/src/replicator.js @@ -10,12 +10,11 @@ import {solanaInstallInit} from './solana-install-init'; const airdropAmount = 100000; export class Replicator { - constructor(connection, terminalOutput) { + constructor(connection) { const userDataPath = electron.remote.app.getPath('userData'); Object.assign(this, { connection, - terminalOutput, running: false, mainPromise: Promise.resolve(), cmdCancel: () => undefined, @@ -49,7 +48,7 @@ export class Replicator { return; } this.running = false; - this.terminalOutput.addTerminalText('^C'); + console.warn('^C'); this.cmdCancel(); await this.mainPromise; } @@ -107,16 +106,17 @@ export class Replicator { * @private */ async cmd(command, args) { - this.terminalOutput.addTerminalCommand(`${command} ${args.join(' ')}`); + console.log(`$ ${command} ${args.join(' ')}`); + log.info(`$ ${command} ${args.join(' ')}`); const env = Object.assign({}, {RUST_LOG: 'solana=info'}, process.env); const child = spawn(command, args, {env}); log.info(`pid ${child.pid}`); child.stdout.on('data', data => - this.terminalOutput.addTerminalText(data.toString()), + console.log(data.toString().replace(/\n+$/, '')), ); child.stderr.on('data', data => - this.terminalOutput.addTerminalText(data.toString()), + console.log(data.toString().replace(/\n+$/, '')), ); return Promise.race([ child, @@ -200,7 +200,7 @@ export class Replicator { this.replicatorLedgerDir, ]); } catch (err) { - this.terminalOutput.addTerminalError(err.message); + console.error(err.message); } if (!this.running) { diff --git a/yarn.lock b/yarn.lock index db5a580..fe0b368 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,13 +34,6 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== - dependencies: - "@babel/types" "^7.0.0" - "@babel/helper-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" @@ -85,7 +78,7 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== -"@babel/runtime@^7.1.2", "@babel/runtime@^7.1.5", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.5": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.1.5", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12" integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ== @@ -264,27 +257,64 @@ babel-runtime "6.26.0" execa "0.9.0" +"@emotion/babel-utils@^0.6.4": + version "0.6.10" + resolved "https://registry.yarnpkg.com/@emotion/babel-utils/-/babel-utils-0.6.10.tgz#83dbf3dfa933fae9fc566e54fbb45f14674c6ccc" + integrity sha512-/fnkM/LTEp3jKe++T0KyTszVGWNKPNOUJfjNKLO17BzQ6QPxgbg3whayom1Qr2oLFH3V92tDymU+dT5q676uow== + dependencies: + "@emotion/hash" "^0.6.6" + "@emotion/memoize" "^0.6.6" + "@emotion/serialize" "^0.9.1" + convert-source-map "^1.5.1" + find-root "^1.1.0" + source-map "^0.7.2" + +"@emotion/hash@^0.6.2", "@emotion/hash@^0.6.6": + version "0.6.6" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.6.6.tgz#62266c5f0eac6941fece302abad69f2ee7e25e44" + integrity sha512-ojhgxzUHZ7am3D2jHkMzPpsBAiB005GF5YU4ea+8DNPybMk01JJUM9V9YRlF/GE95tcOm8DxQvWA2jq19bGalQ== + "@emotion/hash@^0.7.1": version "0.7.1" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.1.tgz#9833722341379fb7d67f06a4b00ab3c37913da53" integrity sha512-OYpa/Sg+2GDX+jibUfpZVn1YqSVRpYmTLF2eyAfrFTIJSbwyIrc+YscayoykvaOME/wV4BV0Sa0yqdMrgse6mA== -"@emotion/is-prop-valid@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.1.tgz#6fb3ae2d24f07c8cd090f233e45771d9cd826d48" - integrity sha512-Wtaek/KGUP+HusWIa8DqtOR6U/Tl+QIdVkfJQHV3IT6ZImnJwklP5UVVPKZvkfljeFk3Q45CAPJ5N10gJ5XoLA== +"@emotion/is-prop-valid@^0.6.1": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.6.8.tgz#68ad02831da41213a2089d2cab4e8ac8b30cbd85" + integrity sha512-IMSL7ekYhmFlILXcouA6ket3vV7u9BqStlXzbKOF9HBtpUPMMlHU+bBxrLOa2NvleVwNIxeq/zL8LafLbeUXcA== dependencies: - "@emotion/memoize" "0.7.1" + "@emotion/memoize" "^0.6.6" -"@emotion/memoize@0.7.1": +"@emotion/memoize@^0.6.1", "@emotion/memoize@^0.6.6": + version "0.6.6" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.6.6.tgz#004b98298d04c7ca3b4f50ca2035d4f60d2eed1b" + integrity sha512-h4t4jFjtm1YV7UirAFuSuFGyLa+NNxjdkq6DpFLANNQY5rHueFZHVY+8Cu1HYVP6DrheB0kv4m5xPjo7eKT7yQ== + +"@emotion/serialize@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.9.1.tgz#a494982a6920730dba6303eb018220a2b629c145" + integrity sha512-zTuAFtyPvCctHBEL8KZ5lJuwBanGSutFEncqLn/m9T1a6a93smBStK+bZzcNPgj4QS8Rkw9VTwJGhRIUVO8zsQ== + dependencies: + "@emotion/hash" "^0.6.6" + "@emotion/memoize" "^0.6.6" + "@emotion/unitless" "^0.6.7" + "@emotion/utils" "^0.8.2" + +"@emotion/stylis@^0.7.0": version "0.7.1" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.1.tgz#e93c13942592cf5ef01aa8297444dc192beee52f" - integrity sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg== + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.7.1.tgz#50f63225e712d99e2b2b39c19c70fff023793ca5" + integrity sha512-/SLmSIkN13M//53TtNxgxo57mcJk/UJIDFRKwOiLIBEyBHEcipgR6hNMQ/59Sl4VjCJ0Z/3zeAZyvnSLPG/1HQ== -"@emotion/unitless@^0.7.0": - version "0.7.3" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.3.tgz#6310a047f12d21a1036fb031317219892440416f" - integrity sha512-4zAPlpDEh2VwXswwr/t8xGNDGg8RQiPxtxZ3qQEXyQsBV39ptTdESCjuBvGze1nLMVrxmTIKmnO/nAV8Tqjjzg== +"@emotion/unitless@^0.6.2", "@emotion/unitless@^0.6.7": + version "0.6.7" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.6.7.tgz#53e9f1892f725b194d5e6a1684a7b394df592397" + integrity sha512-Arj1hncvEVqQ2p7Ega08uHLr1JuRYBuO5cIvcA+WWEQ5+VmkOE3ZXzl04NbQxeQpWX78G7u6MqxKuNX3wvYZxg== + +"@emotion/utils@^0.8.2": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.8.2.tgz#576ff7fb1230185b619a75d258cbc98f0867a8dc" + integrity sha512-rLu3wcBWH4P5q1CGoSSH/i9hrXs7SlbRLkoq9IGuoPYNGQvDJ3pt/wmOM+XgYjIDRMVIdkUWt0RsfzF50JfnCw== "@marionebl/sander@^0.6.0": version "0.6.1" @@ -1237,6 +1267,11 @@ autoprefixer@^6.3.1: postcss "^5.2.16" postcss-value-parser "^3.2.3" +autoscroll-react@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/autoscroll-react/-/autoscroll-react-3.2.0.tgz#eec26a4f3ef57173a724c356af02f3df5ab03342" + integrity sha512-HOiwy9GGTSk9WZwEPd+FwNLLZ17o5wkjAtAb+RtQUr/2J1PT2KRG+OI6LoGtfY5EwWvQKAbSsjkgLvLhItscSg== + aws-sdk@^2.9.0: version "2.475.0" resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.475.0.tgz#69f0f9c97e591fad98a31a4b40dd15bde000cf1e" @@ -1524,15 +1559,32 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -"babel-plugin-styled-components@>= 1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.10.1.tgz#cc89ac5a13476ce675e13fbe53a826f9bb0ca4cd" - integrity sha512-F6R2TnPGNN6iuXCs0xQ+EsrunwNoWI55J5I8Pkd/+fzzbv1I4gFgTaZepMOVpLobYWU2XaLIm+73L0zD3CnOdQ== +babel-plugin-emotion@^9.2.11: + version "9.2.11" + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-9.2.11.tgz#319c005a9ee1d15bb447f59fe504c35fd5807728" + integrity sha512-dgCImifnOPPSeXod2znAmgc64NhaaOjGEHROR/M+lmStb3841yK1sgaDYAYMnlvWNz8GnpwIPN0VmNpbWYZ+VQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-module-imports" "^7.0.0" + "@emotion/babel-utils" "^0.6.4" + "@emotion/hash" "^0.6.2" + "@emotion/memoize" "^0.6.1" + "@emotion/stylis" "^0.7.0" + babel-plugin-macros "^2.0.0" babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" + convert-source-map "^1.5.0" + find-root "^1.1.0" + mkdirp "^0.5.1" + source-map "^0.5.7" + touch "^2.0.1" + +babel-plugin-macros@^2.0.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" + integrity sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ== + dependencies: + "@babel/runtime" "^7.4.2" + cosmiconfig "^5.2.0" + resolve "^1.10.0" babel-plugin-syntax-async-functions@^6.1.4, babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" @@ -2476,11 +2528,6 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" - integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= - caniuse-api@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" @@ -3045,6 +3092,17 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +console-feed@^2.8.8: + version "2.8.8" + resolved "https://registry.yarnpkg.com/console-feed/-/console-feed-2.8.8.tgz#c02054e8b1ae4c4562d4d7539aee83a426c9b1bb" + integrity sha512-tqONbPYrolH9Gn8yMc+7sBZG9F9FkNJM68ziG5dInznBOHbHNua+Mq0S70EgvkhEpE9AifvV9d7EX2Jm5yDw2w== + dependencies: + emotion "^9.1.1" + emotion-theming "^9.0.0" + linkifyjs "^2.1.6" + react-emotion "^9.1.1" + react-inspector "^2.2.2" + console-polyfill@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/console-polyfill/-/console-polyfill-0.1.2.tgz#96cfed51caf78189f699572e6f18271dc37c0e30" @@ -3201,6 +3259,26 @@ crc32-stream@~0.3.1: buffer-crc32 "~0.2.1" readable-stream "~1.0.24" +create-emotion-styled@^9.2.8: + version "9.2.8" + resolved "https://registry.yarnpkg.com/create-emotion-styled/-/create-emotion-styled-9.2.8.tgz#c0050e768ba439609bec108600467adf2de67cc3" + integrity sha512-2LrNM5MREWzI5hZK+LyiBHglwE18WE3AEbBQgpHQ1+zmyLSm/dJsUZBeFAwuIMb+TjNZP0KsMZlV776ufOtFdg== + dependencies: + "@emotion/is-prop-valid" "^0.6.1" + +create-emotion@^9.2.12: + version "9.2.12" + resolved "https://registry.yarnpkg.com/create-emotion/-/create-emotion-9.2.12.tgz#0fc8e7f92c4f8bb924b0fef6781f66b1d07cb26f" + integrity sha512-P57uOF9NL2y98Xrbl2OuiDQUZ30GVmASsv5fbsjF4Hlraip2kyAvMm+2PoYUvFFw03Fhgtxk3RqZSm2/qHL9hA== + dependencies: + "@emotion/hash" "^0.6.2" + "@emotion/memoize" "^0.6.1" + "@emotion/stylis" "^0.7.0" + "@emotion/unitless" "^0.6.2" + csstype "^2.5.2" + stylis "^3.5.0" + stylis-rule-sheet "^0.0.10" + create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" @@ -3278,11 +3356,6 @@ cson@^3.0.2: requirefresh "^2.0.0" safefs "^4.0.0" -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= - css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" @@ -3313,15 +3386,6 @@ css-stringify@1.0.5: resolved "https://registry.yarnpkg.com/css-stringify/-/css-stringify-1.0.5.tgz#b0d042946db2953bb9d292900a6cb5f6d0122031" integrity sha1-sNBClG2ylTu50pKQCmy19tASIDE= -css-to-react-native@^2.2.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.3.1.tgz#cf0f61e0514846e2d4dc188b0886e29d8bef64a2" - integrity sha512-yO+oEx1Lf+hDKasqQRVrAvzMCz825Huh1VMlEEDlRWyAhFb/FWb6I0KpEF1PkyKQ7NEdcx9d5M2ZEWgJAsgPvQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^3.3.0" - css-vendor@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.5.tgz#949c58fd5307e79a9417daa0939506f0e5d0a187" @@ -4245,6 +4309,21 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +emotion-theming@^9.0.0: + version "9.2.9" + resolved "https://registry.yarnpkg.com/emotion-theming/-/emotion-theming-9.2.9.tgz#2bfd77fdd47d3f5e60d59d97dd4cea4622657220" + integrity sha512-Ncyr1WocmDDrTbuYAzklIUC5iKiGtHy3e5ymoFXcka6SuvZl/EDMawegk4wVp72Agrcm1xemab3QOHfnOkpoMA== + dependencies: + hoist-non-react-statics "^2.3.1" + +emotion@^9.1.1: + version "9.2.12" + resolved "https://registry.yarnpkg.com/emotion/-/emotion-9.2.12.tgz#53925aaa005614e65c6e43db8243c843574d1ea9" + integrity sha512-hcx7jppaI8VoXxIWEhxpDW7I+B4kq9RNzQLmsrF6LY8BGKqe2N+gFAQr0EfuFucFlPs2A9HM4+xNj4NeqEWIOQ== + dependencies: + babel-plugin-emotion "^9.2.11" + create-emotion "^9.2.12" + encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" @@ -4888,6 +4967,11 @@ find-npm-prefix@^1.0.2: resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf" integrity sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA== +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -5746,6 +5830,11 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= +hoist-non-react-statics@^2.3.1: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== + hoist-non-react-statics@^3.2.1, hoist-non-react-statics@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" @@ -6209,6 +6298,14 @@ is-directory@^0.3.1: resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= +is-dom@^1.0.9: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a" + integrity sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ== + dependencies: + is-object "^1.0.1" + is-window "^1.0.2" + is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -6346,6 +6443,11 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -6470,10 +6572,10 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-what@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.2.3.tgz#50f76f1bd8e56967e15765d1d34302513701997b" - integrity sha512-c4syLgFnjXTH5qd82Fp/qtUIeM0wA69xbI0KH1QpurMIvDaZFrS8UtAa4U52Dc2qSznaMxHit0gErMp6A/Qk1w== +is-window@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d" + integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0= is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" @@ -6615,6 +6717,11 @@ jmespath@0.15.0: resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= +jquery@^3.3.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" + integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== + js-base64@^2.1.9: version "2.5.1" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" @@ -7138,6 +7245,15 @@ libnpx@^10.2.0: y18n "^4.0.0" yargs "^11.0.0" +linkifyjs@^2.1.6: + version "2.1.8" + resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-2.1.8.tgz#2bee2272674dc196cce3740b8436c43df2162f9c" + integrity sha512-j3QpiEr4UYzN5foKhrr9Sr06VI9vSlI4HisDWt+7Mq+TWDwpJ6H/LLpogYsXcyUIJLVhGblXXdUnblHsVNMPpg== + optionalDependencies: + jquery "^3.3.1" + react "^16.4.2" + react-dom "^16.4.2" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -7596,11 +7712,6 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" -memoize-one@^5.0.0: - version "5.0.4" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.0.4.tgz#005928aced5c43d890a4dfab18ca908b0ec92cbc" - integrity sha512-P0z5IeAH6qHHGkJIXWw0xC2HNEgkx/9uWWBQw64FJj3/ol14VYdfVGWWr0fXfjhhv3TKVIqUq65os6O4GUNksA== - memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -7652,13 +7763,6 @@ meow@^4.0.0: redent "^2.0.0" trim-newlines "^2.0.0" -merge-anything@^2.2.4: - version "2.2.5" - resolved "https://registry.yarnpkg.com/merge-anything/-/merge-anything-2.2.5.tgz#37ef13f36359ee64f09c657d2cef45f7e29493f9" - integrity sha512-WgZGR7EQ1D8pyh57uKBbkPhUCJZLGdMzbDaxL4MDTJSGsvtpGdm8myr6DDtgJwT46xiFBlHqxbveDRpFBWlKWQ== - dependencies: - is-what "^3.2.3" - merge2@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" @@ -9443,7 +9547,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.5.4, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +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" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -9610,7 +9714,7 @@ rcedit@^1.0.0: resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-1.1.2.tgz#7a28edf981953f75b5f3e5d4cbc1f9ffa0abbc78" integrity sha512-z2ypB4gbINhI6wVe0JJMmdpmOpmNc4g90sE6/6JSuch5kYnjfz9CxvVPqqhShgR6GIkmtW3W2UlfiXhWljA0Fw== -react-dom@^16.8.6: +react-dom@^16.4.2, 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== @@ -9620,6 +9724,14 @@ react-dom@^16.8.6: prop-types "^15.6.2" scheduler "^0.13.6" +react-emotion@^9.1.1: + version "9.2.12" + resolved "https://registry.yarnpkg.com/react-emotion/-/react-emotion-9.2.12.tgz#74d1494f89e22d0b9442e92a33ca052461955c83" + integrity sha512-qt7XbxnEKX5sZ73rERJ92JMbEOoyOwG3BuCRFRkXrsJhEe+rFBRTljRw7yOLHZUCQC4GBObZhjXIduQ8S0ZpYw== + dependencies: + babel-plugin-emotion "^9.2.11" + create-emotion-styled "^9.2.8" + react-event-listener@^0.6.6: version "0.6.6" resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a" @@ -9644,7 +9756,16 @@ react-hot-loader@^4.12.0: shallowequal "^1.0.2" source-map "^0.7.3" -react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1: +react-inspector@^2.2.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-2.3.1.tgz#f0eb7f520669b545b441af9d38ec6d706e5f649c" + integrity sha512-tUUK7t3KWgZEIUktOYko5Ic/oYwvjEvQUFAGC1UeMeDaQ5za2yZFtItJa2RTwBJB//NxPr000WQK6sEbqC6y0Q== + dependencies: + babel-runtime "^6.26.0" + is-dom "^1.0.9" + prop-types "^15.6.1" + +react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1: version "16.8.6" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== @@ -9654,16 +9775,6 @@ react-lifecycles-compat@^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-terminal-component@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/react-terminal-component/-/react-terminal-component-1.4.1.tgz#0d15383389db67667a94195c8855afe66a151f8d" - integrity sha512-cPgW+A9UfYo4c4ff6KsE09Pb84ftPuEhZvmh/DDVgY6qMovYr5nNSh1ZPr/RDCZxak9Fsw2QCBct6ytuEJCZjA== - dependencies: - javascript-terminal "^1.0.3" - prop-types "^15.7.2" - styled-components "^4.3.2" - styled-theming "^2.2.0" - react-transition-group@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.1.1.tgz#16efe9ac8c68306f6bef59c7da5a96b4dfd9fb32" @@ -9674,7 +9785,7 @@ react-transition-group@^4.0.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react@^16.8.6: +react@^16.4.2, 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== @@ -10699,7 +10810,7 @@ source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: +source-map@^0.7.2, source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== @@ -11014,30 +11125,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -styled-components@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-4.3.2.tgz#4ca81918c812d3006f60ac5fdec7d6b64a9509cc" - integrity sha512-NppHzIFavZ3TsIU3R1omtddJ0Bv1+j50AKh3ZWyXHuFvJq1I8qkQ5mZ7uQgD89Y8zJNx2qRo6RqAH1BmoVafHw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@emotion/is-prop-valid" "^0.8.1" - "@emotion/unitless" "^0.7.0" - babel-plugin-styled-components ">= 1" - css-to-react-native "^2.2.2" - memoize-one "^5.0.0" - merge-anything "^2.2.4" - prop-types "^15.5.4" - react-is "^16.6.0" - stylis "^3.5.0" - stylis-rule-sheet "^0.0.10" - supports-color "^5.5.0" - -styled-theming@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/styled-theming/-/styled-theming-2.2.0.tgz#3084e43d40eaab4bc11ebafd3de04e3622fee37e" - integrity sha1-MITkPUDqq0vBHrr9PeBONiL+434= - stylis-rule-sheet@^0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" @@ -11101,7 +11188,7 @@ supports-color@^3.1.0, supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^5.0.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.0.0, supports-color@^5.2.0, supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -11377,6 +11464,13 @@ touch@0.0.3: dependencies: nopt "~1.0.10" +touch@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/touch/-/touch-2.0.2.tgz#ca0b2a3ae3211246a61b16ba9e6cbf1596287164" + integrity sha512-qjNtvsFXTRq7IuMLweVgFxmEuQ6gLbRs2jQxL80TtZ31dEKWYIxRXquij6w6VimyDek5hD3PytljHmEtAs2u0A== + dependencies: + nopt "~1.0.10" + tough-cookie@^2.2.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"