From cd95b5a8dcce00c65a9a6a2925673e817eb3dc57 Mon Sep 17 00:00:00 2001 From: Jude Nelson Date: Mon, 11 Feb 2019 11:45:22 -0500 Subject: [PATCH 01/76] connectToGaiaHub() takes an optional third argument for an association token --- app/js/account/utils/blockstack-inc.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/js/account/utils/blockstack-inc.js b/app/js/account/utils/blockstack-inc.js index 17f32963a..756c8ff95 100644 --- a/app/js/account/utils/blockstack-inc.js +++ b/app/js/account/utils/blockstack-inc.js @@ -11,6 +11,7 @@ export function redirectToConnectToGaiaHub() { window.top.location.href = `http://${host}:${port}/account/storage#gaiahub` } -const connectToGaiaHub = (hubUrl: string, key: string) => bsConnectToGaiaHub(hubUrl, key) +const connectToGaiaHub = (hubUrl: string, key: string, associationToken?: string) => + bsConnectToGaiaHub(hubUrl, key, associationToken) export { connectToGaiaHub, GaiaHubConfig, uploadToGaiaHub } From 966dab71a107aa11e31970b274bd6a158f4d55d0 Mon Sep 17 00:00:00 2001 From: Jude Nelson Date: Mon, 11 Feb 2019 11:46:21 -0500 Subject: [PATCH 02/76] if we get an auth request version greater than 1.3.0, pass along both an association token and the user's designated nameLookupUrl from the api settings in the auth response. --- app/js/auth/index.js | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/app/js/auth/index.js b/app/js/auth/index.js index 5df4272e0..933b568b3 100644 --- a/app/js/auth/index.js +++ b/app/js/auth/index.js @@ -15,7 +15,8 @@ import { redirectUserToApp, getAppBucketUrl, isLaterVersion, - updateQueryStringParameter + updateQueryStringParameter, + getPublicKeyFromPrivate } from 'blockstack' import { AppsNode } from '@utils/account-utils' import { @@ -27,7 +28,11 @@ import { HDNode } from 'bitcoinjs-lib' import log4js from 'log4js' import { uploadProfile } from '../account/utils' import { signProfileForUpload } from '@utils' -import { validateScopes, appRequestSupportsDirectHub } from './utils' +import { + validateScopes, + appRequestSupportsDirectHub, + makeGaiaAssociationToken +} from './utils' import { selectApi, selectCoreHost, @@ -53,6 +58,7 @@ import { } from '@common/store/selectors/account' import { formatAppManifest } from '@common' import Modal from 'react-modal' +import url from 'url' const views = [Initial, LegacyGaia] @@ -267,6 +273,7 @@ class AuthPage extends React.Component { const gaiaUrlBase = nextProps.api.gaiaHubConfig.url_prefix if (!profileUrlPromise) { + // use default Gaia hub if we can't tell from the profile where the profile Gaia hub is profileUrlPromise = fetchProfileLocations( gaiaUrlBase, identityAddress, @@ -392,6 +399,8 @@ class AuthPage extends React.Component { let transitPublicKey = undefined let hubUrl = undefined + let blockstackAPIUrl = undefined + let associationToken = undefined let requestVersion = '0' if (this.state.decodedToken.payload.hasOwnProperty('version')) { @@ -407,6 +416,13 @@ class AuthPage extends React.Component { if (appRequestSupportsDirectHub(this.state.decodedToken.payload)) { hubUrl = this.props.api.gaiaHubUrl } + if (isLaterVersion(requestVersion, '1.3.0')) { + let compressedAppPublicKey = getPublicKeyFromPrivate(appPrivateKey.slice(0,64)) + let parsedCoreUrl = url.parse(this.props.api.nameLookupUrl) + + blockstackAPIUrl = `${parsedCoreUrl.protocol}//${parsedCoreUrl.host}` + associationToken = makeGaiaAssociationToken(privateKey, compressedAppPublicKey) + } const authResponse = makeAuthResponse( privateKey, @@ -417,7 +433,9 @@ class AuthPage extends React.Component { appPrivateKey, undefined, transitPublicKey, - hubUrl + hubUrl, + blockstackAPIUrl, + associationToken ) this.props.clearSessionToken(appDomain) @@ -425,6 +443,7 @@ class AuthPage extends React.Component { logger.info( `login(): id index ${this.state.currentIdentityIndex} is logging in` ) + this.setState({ responseSent: true }) redirectUserToApp(this.state.authRequest, authResponse) } From 4e3cf55ca7f23192327c08de4da15a4539fcf5e2 Mon Sep 17 00:00:00 2001 From: Jude Nelson Date: Mon, 11 Feb 2019 11:47:10 -0500 Subject: [PATCH 03/76] add code to generate an association token. This really belongs in blockstack.js; we'll remove it here once that gets merged over there. --- app/js/auth/utils.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/app/js/auth/utils.js b/app/js/auth/utils.js index 43ff6b71f..6d5ec9fd5 100644 --- a/app/js/auth/utils.js +++ b/app/js/auth/utils.js @@ -5,6 +5,17 @@ import { isLaterVersion } from 'blockstack' const logger = log4js.getLogger(__filename) +import { + getPublicKeyFromPrivate +} from 'blockstack' + +import { + randomBytes +} from 'crypto' + +import { + TokenSigner +} from 'jsontokens' const VALID_SCOPES = { store_write: true, @@ -48,3 +59,18 @@ export function validateScopes(scopes: Array): boolean { } return valid } + +export function makeGaiaAssociationToken(secretKeyHex: string, childPublicKeyHex: string) { + const LIFETIME_SECONDS = 91 * 24 * 3600 + const signerKeyHex = secretKeyHex.slice(0, 64) + const compressedPublicKeyHex = getPublicKeyFromPrivate(signerKeyHex) + const salt = randomBytes(16).toString('hex') + const payload = { childToAssociate: childPublicKeyHex, + iss: compressedPublicKeyHex, + exp: LIFETIME_SECONDS + (new Date()/1000), + iat: Date.now()/1000, + salt } + + const token = new TokenSigner('ES256K', signerKeyHex).sign(payload) + return token +} From a49a035324fb2ee5892b4b1cecd4045f3d0addd7 Mon Sep 17 00:00:00 2001 From: Jude Nelson Date: Mon, 11 Feb 2019 12:31:44 -0500 Subject: [PATCH 04/76] move makeGaiaAssociationToken to index to try and fix circleci --- app/js/auth/index.js | 21 ++++++++++++++++++--- app/js/auth/utils.js | 27 --------------------------- 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/app/js/auth/index.js b/app/js/auth/index.js index 933b568b3..4e90611df 100644 --- a/app/js/auth/index.js +++ b/app/js/auth/index.js @@ -4,9 +4,10 @@ import { ShellParent, AppHomeWrapper } from '@blockstack/ui' import { Initial, LegacyGaia } from './views' import { bindActionCreators } from 'redux' import { connect } from 'react-redux' +import { randomBytes } from 'crypto' import { AuthActions } from './store/auth' import { IdentityActions } from '../profiles/store/identity' -import { decodeToken } from 'jsontokens' +import { decodeToken, TokenSigner } from 'jsontokens' import { parseZoneFile } from 'zone-file' import queryString from 'query-string' import { @@ -30,8 +31,7 @@ import { uploadProfile } from '../account/utils' import { signProfileForUpload } from '@utils' import { validateScopes, - appRequestSupportsDirectHub, - makeGaiaAssociationToken + appRequestSupportsDirectHub } from './utils' import { selectApi, @@ -92,6 +92,21 @@ function mapDispatchToProps(dispatch) { return bindActionCreators(actions, dispatch) } +function makeGaiaAssociationToken(secretKeyHex: string, childPublicKeyHex: string) { + const LIFETIME_SECONDS = 365 * 24 * 3600 + const signerKeyHex = secretKeyHex.slice(0, 64) + const compressedPublicKeyHex = getPublicKeyFromPrivate(signerKeyHex) + const salt = randomBytes(16).toString('hex') + const payload = { childToAssociate: childPublicKeyHex, + iss: compressedPublicKeyHex, + exp: LIFETIME_SECONDS + (new Date()/1000), + iat: Date.now()/1000, + salt } + + const token = new TokenSigner('ES256K', signerKeyHex).sign(payload) + return token +} + class AuthPage extends React.Component { static contextTypes = { router: PropTypes.object diff --git a/app/js/auth/utils.js b/app/js/auth/utils.js index 6d5ec9fd5..14f99b30b 100644 --- a/app/js/auth/utils.js +++ b/app/js/auth/utils.js @@ -5,18 +5,6 @@ import { isLaterVersion } from 'blockstack' const logger = log4js.getLogger(__filename) -import { - getPublicKeyFromPrivate -} from 'blockstack' - -import { - randomBytes -} from 'crypto' - -import { - TokenSigner -} from 'jsontokens' - const VALID_SCOPES = { store_write: true, email: true, @@ -59,18 +47,3 @@ export function validateScopes(scopes: Array): boolean { } return valid } - -export function makeGaiaAssociationToken(secretKeyHex: string, childPublicKeyHex: string) { - const LIFETIME_SECONDS = 91 * 24 * 3600 - const signerKeyHex = secretKeyHex.slice(0, 64) - const compressedPublicKeyHex = getPublicKeyFromPrivate(signerKeyHex) - const salt = randomBytes(16).toString('hex') - const payload = { childToAssociate: childPublicKeyHex, - iss: compressedPublicKeyHex, - exp: LIFETIME_SECONDS + (new Date()/1000), - iat: Date.now()/1000, - salt } - - const token = new TokenSigner('ES256K', signerKeyHex).sign(payload) - return token -} From ddc697023e177b07b3393d8e96cfde001a59ee37 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Wed, 13 Feb 2019 10:57:58 -0600 Subject: [PATCH 05/76] update react, react-dom --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5f5dd5061..6b8c8383f 100644 --- a/package.json +++ b/package.json @@ -32,11 +32,11 @@ "prop-types": "^15.6.0", "qrcode.react": "^0.8.0", "query-string": "^4.2.3", - "react": "^16.7.0", + "react": "^16.8.1", "react-addons-css-transition-group": "^15.6.2", "react-contextmenu": "^2.8.0", "react-copy-to-clipboard": "^5.0.1", - "react-dom": "^16.7.0", + "react-dom": "^16.8.1", "react-fns": "^1.4.0", "react-loadable": "^5.5.0", "react-modal": "^3.1.12", From 53499f97aa8337f8a99f2ba45076872979e5a1ef Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Wed, 13 Feb 2019 11:47:00 -0600 Subject: [PATCH 06/76] refactor Navbar --- app/js/components/Navbar.js | 302 +++++++++++++++--------------------- package.json | 47 +++--- 2 files changed, 146 insertions(+), 203 deletions(-) diff --git a/app/js/components/Navbar.js b/app/js/components/Navbar.js index d82d225bc..1be96fae4 100644 --- a/app/js/components/Navbar.js +++ b/app/js/components/Navbar.js @@ -1,184 +1,126 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import { Link } from 'react-router' - -/* eslint-disable global-require */ -export const ICONS = { - homeNav: require('@images/icon-nav-home.svg'), - homeNavActive: require('@images/icon-nav-home-hover.svg'), - walletNav: require('@images/icon-nav-wallet.svg'), - walletNavActive: require('@images/icon-nav-wallet-hover.svg'), - avatarNav: require('@images/icon-nav-profile.svg'), - avatarNavActive: require('@images/icon-nav-profile-hover.svg'), - settingsNav: require('@images/icon-nav-settings.svg'), - settingsNavActive: require('@images/icon-nav-settings-hover.svg') -} -/* eslint-enable global-require */ - -class Navbar extends Component { - static propTypes = { - activeTab: PropTypes.string - } - - constructor(props) { - super(props) - this.onHomeNavMouseOver = this.onHomeNavMouseOver.bind(this) - this.onHomeNavMouseOut = this.onHomeNavMouseOut.bind(this) - this.onWalletNavMouseOver = this.onWalletNavMouseOver.bind(this) - this.onWalletNavMouseOut = this.onWalletNavMouseOut.bind(this) - this.onAvatarNavMouseOver = this.onAvatarNavMouseOver.bind(this) - this.onAvatarNavMouseOut = this.onAvatarNavMouseOut.bind(this) - this.onSettingsNavMouseOver = this.onSettingsNavMouseOver.bind(this) - this.onSettingsNavMouseOut = this.onSettingsNavMouseOut.bind(this) - - this.state = { - homeTabHover: false, - walletTabHover: false, - avatarTabHover: false, - settingsTabHover: false +import React from 'react' +import HomeIcon from 'mdi-react/AppsIcon' +import IDsIcon from 'mdi-react/AccountCircleIcon' +import WalletIcon from 'mdi-react/WalletIcon' +import SettingsIcon from 'mdi-react/SettingsIcon' +import { Hover, Focus } from 'react-powerplug' +import { Box, Flex, Type } from 'blockstack-ui' +import { Link, withRouter } from 'react-router' + +const sections = [ + [ + { + label: 'Home', + icon: HomeIcon, + path: '/', + active: '/' } - } - - onHomeNavMouseOver() { - this.setState({ homeTabHover: true }) - } - - onHomeNavMouseOut() { - this.setState({ homeTabHover: false }) - } - - onWalletNavMouseOver() { - this.setState({ walletTabHover: true }) - } - - onWalletNavMouseOut() { - this.setState({ walletTabHover: false }) - } - - onAvatarNavMouseOver() { - this.setState({ avatarTabHover: true }) - } - - onAvatarNavMouseOut() { - this.setState({ avatarTabHover: false }) - } - - onSettingsNavMouseOver() { - this.setState({ settingsTabHover: true }) - } - - onSettingsNavMouseOut() { - this.setState({ settingsTabHover: false }) - } - - settingsNavIconImage() { - if (this.props.activeTab === 'settings' || this.state.settingsTabHover) { - return ICONS.settingsNavActive - } else { - return ICONS.settingsNav - } - } - - homeNavIconImage() { - if (this.props.activeTab === 'home' || this.state.homeTabHover) { - return ICONS.homeNavActive - } else { - return ICONS.homeNav - } - } - - walletNavIconImage() { - if (this.props.activeTab === 'wallet' || this.state.walletTabHover) { - return ICONS.walletNavActive - } else { - return ICONS.walletNav - } - } - - avatarNavIconImage() { - if (this.props.activeTab === 'avatar' || this.state.avatarTabHover) { - return ICONS.avatarNavActive - } else { - return ICONS.avatarNav + ], + [ + { + label: 'Identity', + icon: IDsIcon, + path: '/profiles', + active: 'profiles' + }, + { + label: 'Wallet', + icon: WalletIcon, + path: '/wallet/receive', + active: 'wallet' + }, + { + label: 'Settings', + icon: SettingsIcon, + path: '/account', + active: 'account' } - } - - render() { - const homeActive = - this.props.activeTab === 'home' || this.state.homeTabHover - const avatarActive = - this.props.activeTab === 'avatar' || this.state.avatarTabHover - const walletActive = - this.props.activeTab === 'wallet' || this.state.walletTabHover - const settingsActive = - this.props.activeTab === 'settings' || this.state.settingsTabHover - - return ( -
- -
- ) - } -} + ] +] + +const Wrapper = ({ ...rest }) => ( + +) + +const Icon = ({ component: Component, ...rest }) => ( + + + +) + +const Label = ({ children, ...rest }) => ( + + {children} + +) + +const NavItem = ({ label, icon, path, active, ...rest }) => ( + + + {({ focused, bind: focusBind }) => ( + + {({ hovered, bind }) => ( + + + + + )} + + )} + + +) + +const Navbar = withRouter(({ location }) => ( + + + {sections.map((section, i) => ( + + {section.map(({ label, icon, path, active }) => ( + + ))} + + ))} + + +)) export default Navbar diff --git a/package.json b/package.json index 6b8c8383f..9b46b767c 100644 --- a/package.json +++ b/package.json @@ -7,17 +7,18 @@ "bigi": "^1.4.2", "bip39": "^2.2.0", "bitcoinjs-lib": "^3.2.0", - "blockstack": "^18.2.1", + "blockstack": "^18.3.0", + "blockstack-ui": "^0.0.71", "body-parser": "^1.16.1", "bootstrap": "^4.0.0-beta", "browser-stdout": "^1.3.0", "chroma-js": "^1.3.7", - "clean-tag": "^2.0.0", - "core-js": "^2.5.7", + "clean-tag": "^2.0.3", + "core-js": "^2.6.4", "cors-anywhere": "^0.4.1", "currency-formatter": "^1.2.1", "ecurve": "^1.0.4", - "enzyme-adapter-react-16": "^1.2.0", + "enzyme-adapter-react-16": "^1.9.1", "formik": "^1.4.2", "hash-handler": "^1.5.1", "inert-polyfill": "^0.2.5", @@ -26,10 +27,10 @@ "jsontokens": "^0.7.8", "lodash": "^4.17.10", "log4js": "^3.0.4", - "mdi-react": "^3.3.0", - "memoize-one": "^3.1.1", - "polished": "^1.9.2", - "prop-types": "^15.6.0", + "mdi-react": "^5.2.0", + "memoize-one": "^5.0.0", + "polished": "^2.3.3", + "prop-types": "^15.7.1", "qrcode.react": "^0.8.0", "query-string": "^4.2.3", "react": "^16.8.1", @@ -42,7 +43,7 @@ "react-modal": "^3.1.12", "react-powerplug": "^1.0.0-rc.1", "react-qr-reader": "^2.1.2", - "react-qr-svg": "^2.0.1", + "react-qr-svg": "^2.2.1", "react-redux": "^4.4.8", "react-router": "^3.0.0", "react-spring": "^5.1.2", @@ -59,7 +60,7 @@ "round-to": "^2.0.0", "styled-components": "^4.1.3", "styled-system": "^3.2.1", - "system-components": "^3.0.1", + "system-components": "^3.0.3", "triplesec": "^3.0.25", "yup": "^0.24.1", "zone-file": "^0.2.2" @@ -78,7 +79,7 @@ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", "@babel/plugin-proposal-numeric-separator": "^7.0.0", "@babel/plugin-proposal-optional-chaining": "^7.0.0", - "@babel/plugin-proposal-pipeline-operator": "^7.3.0", + "@babel/plugin-proposal-pipeline-operator": "^7.3.2", "@babel/plugin-proposal-throw-expressions": "^7.0.0", "@babel/plugin-syntax-dynamic-import": "^7.0.0", "@babel/plugin-syntax-import-meta": "^7.0.0", @@ -93,7 +94,7 @@ "babel-loader": "^8.0.5", "babel-plugin-dynamic-import-node": "^2.1.0", "babel-plugin-lodash": "^3.3.2", - "babel-plugin-module-resolver": "^3.1.3", + "babel-plugin-module-resolver": "^3.2.0", "babel-plugin-rewire": "^1.2.0", "babel-plugin-styled-components": "^1.10.0", "chai": "^3.5.0", @@ -102,12 +103,12 @@ "cross-env": "^5.2.0", "css-loader": "^0.28.11", "enzyme": "^3.3.0", - "eslint": "^5.12.1", + "eslint": "^5.13.0", "eslint-config-airbnb": "^9.0.1", "eslint-config-prettier": "^2.9.0", - "eslint-import-resolver-babel-module": "^5.0.0-beta.1", + "eslint-import-resolver-babel-module": "^5.0.1", "eslint-plugin-flowtype": "^2.39.1", - "eslint-plugin-import": "^2.15.0", + "eslint-plugin-import": "^2.16.0", "eslint-plugin-jsx-a11y": "^1.2.2", "eslint-plugin-react": "^5.1.1", "express": "^4.13.4", @@ -125,21 +126,21 @@ "mock-require": "^3.0.2", "nock": "^9.0.13", "node-libs-browser": "^1.0.0", - "nyc": "^13.0.1", - "prettier": "^1.16.1", - "react-hot-loader": "^4.3.3", + "nyc": "^13.2.0", + "prettier": "^1.16.4", + "react-hot-loader": "^4.6.5", "redux-mock-store": "^1.2.3", "require-hacker": "^3.0.1", - "serve": "^10.0.1", + "serve": "^10.1.2", "shx": "^0.3.2", "sinon": "^1.17.7", "sinon-as-promised": "^4.0.0", "style-loader": "^0.23.0", - "terser-webpack-plugin": "^1.2.1", + "terser-webpack-plugin": "^1.2.2", "url-loader": "^1.0.1", - "webpack": "^4.29.0", - "webpack-bundle-analyzer": "^3.0.2", - "webpack-cli": "^3.2.1", + "webpack": "^4.29.3", + "webpack-bundle-analyzer": "^3.0.4", + "webpack-cli": "^3.2.3", "webpack-dev-server": "^3.1.14", "webpack-stylish": "^0.1.8", "webpackbar": "^3.1.5", From 04399aa3d9c0e566fcd249627f654d5332404cc9 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Wed, 13 Feb 2019 11:51:17 -0600 Subject: [PATCH 07/76] zindex --- app/js/components/Navbar.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/js/components/Navbar.js b/app/js/components/Navbar.js index 1be96fae4..8c998b734 100644 --- a/app/js/components/Navbar.js +++ b/app/js/components/Navbar.js @@ -100,6 +100,7 @@ const Navbar = withRouter(({ location }) => ( position="fixed" top={0} width={1} + zIndex={999} > {sections.map((section, i) => ( From 9b871f7b7b379d4cae5a3e6f33f37b4595f7cc14 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Wed, 13 Feb 2019 12:17:30 -0600 Subject: [PATCH 08/76] fix aspect ratio of avatars, fixes #1624 --- app/js/components/ui/containers/user.js | 30 +++++++++++++++---------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/app/js/components/ui/containers/user.js b/app/js/components/ui/containers/user.js index bfb6aef23..a1a4d4b5b 100644 --- a/app/js/components/ui/containers/user.js +++ b/app/js/components/ui/containers/user.js @@ -5,7 +5,7 @@ import { User } from '@blockstack/ui/components/user' import CheckIcon from 'mdi-react/CheckIcon' import ChevronRightIcon from 'mdi-react/ChevronRightIcon' import Image from '@components/Image' -import { Flex } from '@components/ui/components/primitives' +import { Flex } from 'blockstack-ui' const UserAvatar = ({ id, @@ -13,7 +13,7 @@ const UserAvatar = ({ size = 46, camera, textSize = 14, - avatarUrl = '', + avatarUrl, ...rest }) => ( {avatarUrl ? ( - ) : ( @@ -67,7 +67,12 @@ const UserButton = ({ username, id, hideID, avatarUrl, ...rest }) => ( cd maxWidth="calc(100% - 102px) !important" > - + {username.includes('.') ? ( <> @@ -85,8 +90,9 @@ const UserButton = ({ username, id, hideID, avatarUrl, ...rest }) => ( {username} )} - {id && - !hideID && {id}} + {id && !hideID && ( + {id} + )} Date: Wed, 13 Feb 2019 14:02:01 -0500 Subject: [PATCH 09/76] de-lint --- app/js/auth/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/js/auth/index.js b/app/js/auth/index.js index 4e90611df..3c55d37ec 100644 --- a/app/js/auth/index.js +++ b/app/js/auth/index.js @@ -432,8 +432,8 @@ class AuthPage extends React.Component { hubUrl = this.props.api.gaiaHubUrl } if (isLaterVersion(requestVersion, '1.3.0')) { - let compressedAppPublicKey = getPublicKeyFromPrivate(appPrivateKey.slice(0,64)) - let parsedCoreUrl = url.parse(this.props.api.nameLookupUrl) + const compressedAppPublicKey = getPublicKeyFromPrivate(appPrivateKey.slice(0,64)) + const parsedCoreUrl = url.parse(this.props.api.nameLookupUrl) blockstackAPIUrl = `${parsedCoreUrl.protocol}//${parsedCoreUrl.host}` associationToken = makeGaiaAssociationToken(privateKey, compressedAppPublicKey) From 00520f9b8851394c1543424ddf5da9d79c1aeb7a Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Wed, 13 Feb 2019 16:00:22 -0600 Subject: [PATCH 10/76] clear-auth is now sign-out, redirect on devices, resolves #1799 --- app/js/clear-auth/index.js | 80 ---------------------------- app/js/routes.js | 55 +++++++++++-------- app/js/sign-out/index.js | 51 ++++++++++++++++++ app/js/sign-out/views/initial.js | 90 ++++++++++++++++++++++++++++++++ 4 files changed, 173 insertions(+), 103 deletions(-) delete mode 100644 app/js/clear-auth/index.js create mode 100644 app/js/sign-out/index.js create mode 100644 app/js/sign-out/views/initial.js diff --git a/app/js/clear-auth/index.js b/app/js/clear-auth/index.js deleted file mode 100644 index a957da064..000000000 --- a/app/js/clear-auth/index.js +++ /dev/null @@ -1,80 +0,0 @@ -import React, { PureComponent } from 'react' -import { withRouter } from 'react-router' -import App from '../App' - -class ClearAuthPage extends PureComponent { - state = { - countdown: 5, - hasAttemptedConfirm: false - } - - componentDidMount() { - this.decrementCountdown() - } - - decrementCountdown() { - setTimeout(() => { - const { countdown } = this.state - this.setState({ countdown: countdown - 1 }) - if (countdown > 1) { - this.decrementCountdown() - } - }, 1000) - } - - clearData = () => { - if (this.state.hasAttemptedConfirm) { - localStorage.clear() - window.location = `${this.props.location.query.redirect_uri}://?authCleared=1` - } - else { - this.setState({ hasAttemptedConfirm: true }) - } - } - - cancel = () => { - window.location = `${this.props.location.query.redirect_uri}://?authCleared=0` - } - - render() { - const { countdown, hasAttemptedConfirm } = this.state - - return ( - -
-

Sign Out

-

- Warning: This will reset your account on this device. - You’ll be able to restore your account, or create a new one afterwards. -
-
- If you plan to restore your account, make sure you have - recorded your backup information. You will either need your - 12 word secret recovery key, or your magic recovery code and password - to do so. -

-
- -
-
- -
-
-
- ) - } -} - -export default withRouter(ClearAuthPage) diff --git a/app/js/routes.js b/app/js/routes.js index 991ac29ad..b2783bd7c 100644 --- a/app/js/routes.js +++ b/app/js/routes.js @@ -2,25 +2,33 @@ import React from 'react' import { browserHistory, IndexRoute, Route, Router } from 'react-router' import Loadable from 'react-loadable' import App from './App' -import ClearAuthPage from './clear-auth' +import SignOutPage from './sign-out' import ConnectStoragePage from './connect-storage' import { connectedRouterRedirect } from 'redux-auth-wrapper/history3/redirect' const LOADABLE_DELAY = 300 -const Loading = (props) => { +const Loading = props => { if (props.error) { - return
Error!
+ return ( +
+ Error! +
+ ) } else if (props.pastDelay) { - return (
Loading...
) + return ( +
+ Loading... +
+ ) } return null } @@ -220,20 +228,20 @@ const NotFoundPage = Loadable({ delay: LOADABLE_DELAY }) - const accountCreated = connectedRouterRedirect({ redirectPath: state => - !state.account.encryptedBackupPhrase ? - // Not signed in - '/sign-up' : - // Storage failed to connect - '/connect-storage', - authenticatedSelector: (state, props) => !!props.location.query.echo || + !state.account.encryptedBackupPhrase + ? // Not signed in + '/sign-up' + : // Storage failed to connect + '/connect-storage', + authenticatedSelector: (state, props) => + !!props.location.query.echo || // No echo param (for protocol check) // No keyphrase (!!state.account.encryptedBackupPhrase && - // Storage failed to connect - !!state.settings.api.storageConnected), + // Storage failed to connect + !!state.settings.api.storageConnected), wrapperDisplayName: 'AccountCreated' }) @@ -283,7 +291,7 @@ export default ( - { /** + {/** * TODO: move /update back up ^^, had to move it out of the 'app' nested route * because when we wipe data, it wants to redirect to /sign-up */} @@ -292,7 +300,8 @@ export default ( - + + ) diff --git a/app/js/sign-out/index.js b/app/js/sign-out/index.js new file mode 100644 index 000000000..48d942acc --- /dev/null +++ b/app/js/sign-out/index.js @@ -0,0 +1,51 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { withRouter } from 'react-router' +import Initial from './views/initial' +import { AppHomeWrapper, ShellParent } from '@blockstack/ui' +import App from '../App' + +const VIEWS = { + INITIAL: 0 +} + +const views = [Initial] + +const SignOut = ({ location }) => { + const view = 0 + + const viewProps = [ + { + show: VIEWS.INITIAL, + props: { + backLabel: 'Cancel' + } + } + ] + + const currentViewProps = viewProps.find(v => v.show === view) || {} + + const componentProps = { + view, + backView: () => null, + location, + ...currentViewProps.props + } + return ( + + + + + ) +} + +SignOut.propTypes = { + location: PropTypes.object, + router: PropTypes.object +} + +export default withRouter(SignOut) diff --git a/app/js/sign-out/views/initial.js b/app/js/sign-out/views/initial.js new file mode 100644 index 000000000..9991dceb2 --- /dev/null +++ b/app/js/sign-out/views/initial.js @@ -0,0 +1,90 @@ +import React, { useState } from 'react' +import { ShellScreen, Type } from '@blockstack/ui' +import { Box } from 'blockstack-ui' +import PropTypes from 'prop-types' + +const InitialSignOutScreen = ({ location, ...rest }) => { + const [hasAttempted, setAttempted] = useState(false) + const [loading, setLoading] = useState(false) + + const handleResetClick = () => { + if (!hasAttempted) { + setAttempted(true) + } else { + setLoading(true) + localStorage.clear() + window.location = + location.query && location.query.redirect_uri + ? `${location.query.redirect_uri}://?authCleared=1` + : '/sign-up' + } + } + + const handleCancelClick = () => { + window.location = + location.query && location.query.redirect_uri + ? `${location.query.redirect_uri}://?authCleared=0` + : '/sign-up' + } + + const screen = { + title: { + children: 'Sign Out' + }, + content: { + grow: 1, + children: ( + <> + + + Warning: This will erase your account data on + this device. You’ll have to restore your account or create a new + one afterwards. + + + + If you plan to restore your account, make sure you have recorded + your backup information: you will either need your{' '} + 12 word secret recovery key, or your{' '} + magic recovery code and password to do so. + + + ) + }, + actions: { + items: [ + { + label: hasAttempted ? ( + <>Press Again to Confirm + ) : ( + <>Reset my Device + ), + loading, + disabled: loading, + primary: true, + onClick: handleResetClick + }, + { + label: <>Cancel, + primary: false, + onClick: handleCancelClick + } + ] + } + } + + return +} + +InitialSignOutScreen.propTypes = { + location: PropTypes.object, + value: PropTypes.string +} + +export default InitialSignOutScreen From ddbb7061a800e3675cdb611ec085d3c344be0c12 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Tue, 19 Feb 2019 10:15:48 -0600 Subject: [PATCH 11/76] initial fixes and changes to remove blurred apps --- app/js/App.js | 1 + .../components/ui/components/shell/index.js | 2 +- .../ui/containers/AppHomeWrapper.js | 9 +++++- app/js/routes.js | 30 ++++++++++--------- app/js/sign-in/index.js | 5 ++-- app/js/sign-out/index.js | 5 ++-- app/js/sign-up/index.js | 5 ++-- 7 files changed, 32 insertions(+), 25 deletions(-) diff --git a/app/js/App.js b/app/js/App.js index 8257ac2e6..c8f72f38f 100644 --- a/app/js/App.js +++ b/app/js/App.js @@ -20,6 +20,7 @@ import Modal from 'react-modal' import NotificationsSystem from 'reapop' import NotificationsTheme from 'reapop-theme-wybo' import { hot } from 'react-hot-loader' +import { AppHomeWrapper } from '@blockstack/ui' import log4js from 'log4js' diff --git a/app/js/components/ui/components/shell/index.js b/app/js/components/ui/components/shell/index.js index 17f306d35..1e310b183 100644 --- a/app/js/components/ui/components/shell/index.js +++ b/app/js/components/ui/components/shell/index.js @@ -150,7 +150,7 @@ const StyledShell = styled.div` width: 100%; z-index: 9001; background-color: ${({ width }) => - width <= 599 ? 'white' : 'rgba(240, 240, 240, 0.8)'}; + width <= 599 ? 'white' : 'rgba(240, 240, 240, 0.85)'}; ${({ maxHeight }) => maxHeight && css` diff --git a/app/js/components/ui/containers/AppHomeWrapper.js b/app/js/components/ui/containers/AppHomeWrapper.js index 8ff523265..e18ddfa0f 100644 --- a/app/js/components/ui/containers/AppHomeWrapper.js +++ b/app/js/components/ui/containers/AppHomeWrapper.js @@ -1,6 +1,7 @@ import React from 'react' import styled from 'styled-components' import { WindowSize } from 'react-fns' +import { Box } from 'blockstack-ui' import HomePage from '../../../HomeScreenPage' const StyledAppHomeWrapper = styled.div.attrs({ @@ -34,7 +35,13 @@ const AppHomeWrapper = props => ( width > 599 ? (
- + +
) : null diff --git a/app/js/routes.js b/app/js/routes.js index b2783bd7c..951b20346 100644 --- a/app/js/routes.js +++ b/app/js/routes.js @@ -289,19 +289,21 @@ export default ( - - - {/** - * TODO: move /update back up ^^, had to move it out of the 'app' nested route - * because when we wipe data, it wants to redirect to /sign-up - */} - - - - - - - - + + + + {/** + * TODO: move /update back up ^^, had to move it out of the 'app' nested route + * because when we wipe data, it wants to redirect to /sign-up + */} + + + + + + + + + ) diff --git a/app/js/sign-in/index.js b/app/js/sign-in/index.js index edb6fdd73..493f1cf26 100644 --- a/app/js/sign-in/index.js +++ b/app/js/sign-in/index.js @@ -415,15 +415,14 @@ class SignIn extends React.Component { ...currentViewProps.props } return ( - + <> - - + ) } } diff --git a/app/js/sign-out/index.js b/app/js/sign-out/index.js index 48d942acc..4cb0d6f27 100644 --- a/app/js/sign-out/index.js +++ b/app/js/sign-out/index.js @@ -32,14 +32,13 @@ const SignOut = ({ location }) => { ...currentViewProps.props } return ( - + <> - - + ) } diff --git a/app/js/sign-up/index.js b/app/js/sign-up/index.js index 008f020e1..a1b6dce18 100644 --- a/app/js/sign-up/index.js +++ b/app/js/sign-up/index.js @@ -711,7 +711,7 @@ class Onboarding extends React.Component { } return ( - + <> - - + ) } } From 6048e350b8f178aa142af54512726de9676e495d Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Wed, 6 Mar 2019 18:01:49 -0600 Subject: [PATCH 12/76] add back in apps --- .../components/ui/containers/shell-parent.js | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/app/js/components/ui/containers/shell-parent.js b/app/js/components/ui/containers/shell-parent.js index 813e706a2..2845ad3bc 100644 --- a/app/js/components/ui/containers/shell-parent.js +++ b/app/js/components/ui/containers/shell-parent.js @@ -5,6 +5,8 @@ import { Shell } from '@ui/containers/shell' import { Header } from '@ui/containers/headers' import { Transition } from 'react-spring' import { WindowSize } from 'react-fns' +import { AppHomeWrapper } from '@components/ui/containers/AppHomeWrapper' + const ShellContext = React.createContext() /** @@ -87,10 +89,7 @@ class ShellParent extends React.Component { const internalBackLabel = backLabel !== '' ? backLabel : 'Back' const defaultBackLabel = isFirstView ? backLabel : internalBackLabel - const label = - backLabel === '' && isFirstView && app - ? `` - : defaultBackLabel + const label = backLabel === '' && isFirstView && app ? `` : defaultBackLabel const Component = views[view] @@ -132,26 +131,29 @@ class ShellParent extends React.Component { }) return ( - - {windowSize => ( - - - - -
- - {this.renderLoading(this.state.loadingProps)} - - - - - - - )} - + <> + + {windowSize => ( + + + + +
+ + {this.renderLoading(this.state.loadingProps)} + + + + + + + )} + + + ) } } From cf76156637c8e4ae558769f82a434d7ff4b61e4f Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Wed, 6 Mar 2019 18:11:48 -0600 Subject: [PATCH 13/76] linting fixes --- app/js/components/Navbar.js | 18 ++++++++++++ app/js/sign-in/index.js | 55 ++++++++++++++++++------------------- app/js/sign-out/index.js | 3 +- app/js/sign-up/index.js | 45 ++++++++++++++++++++---------- 4 files changed, 75 insertions(+), 46 deletions(-) diff --git a/app/js/components/Navbar.js b/app/js/components/Navbar.js index 8c998b734..2b2a29bb4 100644 --- a/app/js/components/Navbar.js +++ b/app/js/components/Navbar.js @@ -6,6 +6,7 @@ import SettingsIcon from 'mdi-react/SettingsIcon' import { Hover, Focus } from 'react-powerplug' import { Box, Flex, Type } from 'blockstack-ui' import { Link, withRouter } from 'react-router' +import PropTypes from 'prop-types' const sections = [ [ @@ -124,4 +125,21 @@ const Navbar = withRouter(({ location }) => ( )) +Icon.propTypes = { + component: PropTypes.node +} +Label.propTypes = { + children: PropTypes.node +} +NavItem.propTypes = { + label: PropTypes.any, + icon: PropTypes.any, + path: PropTypes.any, + active: PropTypes.any +} + +Navbar.propTypes = { + location: PropTypes.object.isRequired +} + export default Navbar diff --git a/app/js/sign-in/index.js b/app/js/sign-in/index.js index 197e50be8..3842bca40 100644 --- a/app/js/sign-in/index.js +++ b/app/js/sign-in/index.js @@ -11,7 +11,7 @@ import { RegistrationActions } from '../profiles/store/registration' import { trackEventOnce } from '@utils/server-utils' import { Initial, Password, Success, Email } from './views' import log4js from 'log4js' -import { AppHomeWrapper, ShellParent } from '@blockstack/ui' +import { ShellParent } from '@blockstack/ui' import { selectConnectedStorageAtLeastOnce, selectEmail, @@ -34,7 +34,6 @@ import { } from '@common/store/selectors/auth' import { AuthActions } from '../auth/store/auth' import { formatAppManifest } from '@common' -import App from '../App' const CREATE_ACCOUNT_IN_PROCESS = 'createAccount/in_process' @@ -168,34 +167,32 @@ class SignIn extends React.Component { if (this.state.decrypt && !decrypting) { setImmediate(() => { - this.setState( - { decrypting: true }, - async () => { - try { - const decryptedKeyBuffer = await decrypt( - new Buffer(encryptedKey, 'base64'), - this.state.password - ) - const decryptedKey = decryptedKeyBuffer.toString() - this.setState( - { - key: decryptedKey, - decrypting: false, - restoreError: null - }, - () => { - this.updateView(VIEWS.EMAIL) - } - ) - } catch (e) { - logger.debug(e) - this.setState({ + this.setState({ decrypting: true }, async () => { + try { + const decryptedKeyBuffer = await decrypt( + new Buffer(encryptedKey, 'base64'), + this.state.password + ) + const decryptedKey = decryptedKeyBuffer.toString() + this.setState( + { + key: decryptedKey, decrypting: false, - restoreError: 'Incorrect password or invalid recovery code', - key: '' - }) - } - }) + restoreError: null + }, + () => { + this.updateView(VIEWS.EMAIL) + } + ) + } catch (e) { + logger.debug(e) + this.setState({ + decrypting: false, + restoreError: 'Incorrect password or invalid recovery code', + key: '' + }) + } + }) }) } else { this.updateView(VIEWS.EMAIL) diff --git a/app/js/sign-out/index.js b/app/js/sign-out/index.js index 4cb0d6f27..6028bcdd8 100644 --- a/app/js/sign-out/index.js +++ b/app/js/sign-out/index.js @@ -2,8 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' import { withRouter } from 'react-router' import Initial from './views/initial' -import { AppHomeWrapper, ShellParent } from '@blockstack/ui' -import App from '../App' +import { ShellParent } from '@blockstack/ui' const VIEWS = { INITIAL: 0 diff --git a/app/js/sign-up/index.js b/app/js/sign-up/index.js index 8cec6c222..07aef6961 100644 --- a/app/js/sign-up/index.js +++ b/app/js/sign-up/index.js @@ -2,7 +2,6 @@ import React from 'react' import PropTypes from 'prop-types' import { browserHistory, withRouter } from 'react-router' import { decodeToken } from 'jsontokens' -import App from '../App' import { selectConnectedStorageAtLeastOnce, selectEmail, @@ -41,7 +40,7 @@ import { sendRestoreEmail as sendEmail } from '@utils/email-utils' import queryString from 'query-string' import log4js from 'log4js' import { formatAppManifest } from '@common' -import { ShellParent, AppHomeWrapper } from '@blockstack/ui' +import { ShellParent } from '@blockstack/ui' import { Initial, Email, @@ -98,7 +97,8 @@ const VIEW_EVENTS = { // Allow the front-end (for example Selenium tests or dev console) to override the subdomain suffix. const DEFAULT_SUBDOMAIN_SUFFIX = 'id.blockstack' -const getSubdomainSuffix = () => window.SUBDOMAIN_SUFFIX_OVERRIDE || DEFAULT_SUBDOMAIN_SUFFIX +const getSubdomainSuffix = () => + window.SUBDOMAIN_SUFFIX_OVERRIDE || DEFAULT_SUBDOMAIN_SUFFIX const mapStateToProps = state => ({ localIdentities: selectLocalIdentities(state), @@ -188,7 +188,11 @@ class Onboarding extends React.Component { */ submitPassword = async () => { const decodedAuthRequest = this.getDecodedAuthRequest() - if (decodedAuthRequest && (decodedAuthRequest.solicitGaiaHubUrl || decodedAuthRequest.recommendedGaiaHub)) { + if ( + decodedAuthRequest && + (decodedAuthRequest.solicitGaiaHubUrl || + decodedAuthRequest.recommendedGaiaHub) + ) { if (decodedAuthRequest.recommendedGaiaHubUrl) { this.updateView(VIEWS.RECOMMENDED_GAIA_HUB) } else { @@ -230,16 +234,19 @@ class Onboarding extends React.Component { submitRecommendedGaiaHub = async () => { const decodedAuthRequest = this.getDecodedAuthRequest() - this.setState({ - loading: true, - hubURL: decodedAuthRequest.recommendedGaiaHubUrl - }, async () => { - const success = await this.validateGaiaURL() - if (success) { - await this.createAccount() - this.updateView(VIEWS.EMAIL) + this.setState( + { + loading: true, + hubURL: decodedAuthRequest.recommendedGaiaHubUrl + }, + async () => { + const success = await this.validateGaiaURL() + if (success) { + await this.createAccount() + this.updateView(VIEWS.EMAIL) + } } - }) + ) } /** @@ -596,7 +603,14 @@ class Onboarding extends React.Component { render() { const { appManifest } = this.props - const { email, password, username, emailSubmitted, view, decodedAuthRequest } = this.state + const { + email, + password, + username, + emailSubmitted, + view, + decodedAuthRequest + } = this.state const app = formatAppManifest(appManifest) @@ -688,7 +702,8 @@ class Onboarding extends React.Component { { show: VIEWS.RECOMMENDED_GAIA_HUB, props: { - recommendedGaiaHubUrl: decodedAuthRequest && decodedAuthRequest.recommendedGaiaHubUrl, + recommendedGaiaHubUrl: + decodedAuthRequest && decodedAuthRequest.recommendedGaiaHubUrl, updateValue: this.updateValue, next: () => this.submitRecommendedGaiaHub(), customHub: () => this.updateView(VIEWS.CUSTOMHUB), From 797d549d5dd781b08981351e3856acd91bff4d0c Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Wed, 6 Mar 2019 18:12:37 -0600 Subject: [PATCH 14/76] correct proptypes for navitem --- app/js/components/Navbar.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/js/components/Navbar.js b/app/js/components/Navbar.js index 2b2a29bb4..1e517116f 100644 --- a/app/js/components/Navbar.js +++ b/app/js/components/Navbar.js @@ -132,10 +132,10 @@ Label.propTypes = { children: PropTypes.node } NavItem.propTypes = { - label: PropTypes.any, - icon: PropTypes.any, - path: PropTypes.any, - active: PropTypes.any + label: PropTypes.string, + icon: PropTypes.node, + path: PropTypes.string, + active: PropTypes.bool } Navbar.propTypes = { From f262c4ba8d8e94b475f1a8ea396f402edb8cb067 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Wed, 6 Mar 2019 18:23:53 -0600 Subject: [PATCH 15/76] navbar no proptype --- app/js/components/Navbar.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/js/components/Navbar.js b/app/js/components/Navbar.js index 1e517116f..32f200eb9 100644 --- a/app/js/components/Navbar.js +++ b/app/js/components/Navbar.js @@ -138,8 +138,4 @@ NavItem.propTypes = { active: PropTypes.bool } -Navbar.propTypes = { - location: PropTypes.object.isRequired -} - export default Navbar From 26dd35ccea21923b0a6618f7e7517c5a930b316d Mon Sep 17 00:00:00 2001 From: Ken Date: Mon, 18 Mar 2019 11:57:58 -0400 Subject: [PATCH 16/76] Tweak onboarding success page. --- app/js/sign-up/views/_success.js | 51 ++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/app/js/sign-up/views/_success.js b/app/js/sign-up/views/_success.js index 6e8732f92..92cca99bc 100644 --- a/app/js/sign-up/views/_success.js +++ b/app/js/sign-up/views/_success.js @@ -7,6 +7,7 @@ import React from 'react' import { ShellScreen, Type } from '@blockstack/ui' import PropTypes from 'prop-types' import { ProfileScreen } from '@components/ui/containers/profile' +import { Flex } from '@components/ui/components/primitives' const Success = ({ finish, @@ -26,30 +27,50 @@ const Success = ({ : null const props = { + title: { + children: ( + + + ) + }, content: { grow: 1, + form: { + fields: [], + actions: { + items: [ + { + label: ( + <> + Go to {app && app.name ? app.name : 'Blockstack'} + + ), + primary: true, + onClick: () => finish() + } + ] + } + }, children: ( - + Your ID is ready and we sent recovery instructions to your email. You can also view your{' '} goToRecovery()}>Secret Recovery Key. - + ) - }, - actions: { - items: [ - { - label: ( - <> - Go to {app && app.name ? app.name : 'Blockstack'} - - ), - primary: true, - onClick: () => finish() - } - ] } } return From b4a9610f8b6d99595361e625b6ac2cc20f787bdd Mon Sep 17 00:00:00 2001 From: Matthew Little Date: Mon, 18 Mar 2019 15:25:17 -0400 Subject: [PATCH 17/76] Add `blockstack.listFiles()` to e2e test --- test-e2e/auth/sign-in.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test-e2e/auth/sign-in.js b/test-e2e/auth/sign-in.js index 0e9708034..9a7e991cd 100644 --- a/test-e2e/auth/sign-in.js +++ b/test-e2e/auth/sign-in.js @@ -149,6 +149,24 @@ createTestSuites('login-to-hello-blockstack-app', ({driver, browserHostUrl, loop expect(getFileResult).to.equal(gaiaFileData); }); + step('validate blockstack.listFiles(...)', async () => { + const [error, result] = await driver.executeAsyncScript(` + var callback = arguments[arguments.length - 1]; + var files = []; + blockstack.listFiles(function(filename) { + files.push(filename); + return true; + }) + .then(result => callback([null, {files: files, count: result}])) + .catch(error => callback([error.toString(), null])); + `); + if (error) { + throw new Error(error); + } + expect(result.count).to.be.greaterThan(0); + expect(result.files).to.include('/hello.txt'); + }); + step('validate blockstack.getUserAppFileUrl(...)', async () => { const userAppFileUrl = await driver.executePromise( `blockstack.getUserAppFileUrl(arguments[0], arguments[1], arguments[2])`, From e4ab0cbaede0006390807e8e77511505a4fb35a7 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Wed, 20 Mar 2019 10:56:13 -0500 Subject: [PATCH 18/76] modify profile component and success view for button placement, fixes #1817 --- app/js/components/ui/containers/profile.js | 12 ++-- app/js/sign-up/views/_success.js | 64 +++++++--------------- 2 files changed, 28 insertions(+), 48 deletions(-) diff --git a/app/js/components/ui/containers/profile.js b/app/js/components/ui/containers/profile.js index bf46cfb5f..01f0091c0 100644 --- a/app/js/components/ui/containers/profile.js +++ b/app/js/components/ui/containers/profile.js @@ -19,7 +19,8 @@ export const Title = ({ user, ...p }) => ( whiteSpace: 'nowrap', textOverflow: 'ellipsis' }} - width='100%' + m={0} + width="100%" maxWidth={['calc(100% - 60px)', 'calc(100% - 40px)']} > {user.username && user.username.includes('.') @@ -35,11 +36,11 @@ export const Suffix = ({ user, ...p }) => ( ) export const Line = p => ( - + ) -export const ProfileScreen = ({ children, user, ...p }) => { +export const ProfileScreen = ({ children, user, hideLine }) => { const avatarUrl = user && user.profile && user.profile.image && user.profile.image.length ? user.profile.image[0].contentUrl @@ -50,6 +51,7 @@ export const ProfileScreen = ({ children, user, ...p }) => { flexDirection="column" alignItems="center" justifyContent="center" + width={1} style={{ flexGrow: 1 }} @@ -57,11 +59,11 @@ export const ProfileScreen = ({ children, user, ...p }) => { {user && user.username ? ( <> - + <Title user={user} pt={3} /> <Suffix user={user} /> </> ) : null} - <Line /> + {hideLine ? null : <Line />} <Box textAlign="center">{children}</Box> </Flex> ) diff --git a/app/js/sign-up/views/_success.js b/app/js/sign-up/views/_success.js index 92cca99bc..344b6e568 100644 --- a/app/js/sign-up/views/_success.js +++ b/app/js/sign-up/views/_success.js @@ -4,10 +4,10 @@ * This screen welcomes the new user and shows their username / ID */ import React from 'react' -import { ShellScreen, Type } from '@blockstack/ui' +import { ShellScreen, Type, Button } from '@blockstack/ui' import PropTypes from 'prop-types' -import { ProfileScreen } from '@components/ui/containers/profile' -import { Flex } from '@components/ui/components/primitives' +import { ProfileScreen, Line } from '@components/ui/containers/profile' +import { Flex, Box } from '@components/ui/components/primitives' const Success = ({ finish, @@ -27,49 +27,27 @@ const Success = ({ : null const props = { - title: { - children: ( - <ProfileScreen - user={user} - justifyContent="center" - alignItems="center" - style={{ - justifyContent: "center", - alignItems: "center" - }} - > - </ProfileScreen> - ) - }, content: { grow: 1, - form: { - fields: [], - actions: { - items: [ - { - label: ( - <> - Go to {app && app.name ? app.name : 'Blockstack'} - </> - ), - primary: true, - onClick: () => finish() - } - ] - } - }, children: ( - <Flex - justifyContent="center" - alignItems="center" - > - <Type.p> - Your ID is ready and we sent recovery instructions to your email. - You can also view your{' '} - <Type.a onClick={() => goToRecovery()}>Secret Recovery Key</Type.a>. - </Type.p> - </Flex> + <ProfileScreen hideLine user={user}> + <Box pt={3} pb={2}> + <Button primary onClick={finish}> + <>Go to {app && app.name ? app.name : 'Blockstack'}</> + </Button> + </Box> + <Line /> + <Flex justifyContent="center" alignItems="center"> + <Type.p> + Your ID is ready and we sent recovery instructions to your email. + You can also view your{' '} + <Type.a onClick={() => goToRecovery()}> + Secret Recovery Key + </Type.a> + . + </Type.p> + </Flex> + </ProfileScreen> ) } } From 7d60371227f7307feb9e9e85345896267f052edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Friedger=20M=C3=BCffke?= <friedger@gmail.com> Date: Sat, 23 Mar 2019 23:21:15 +0100 Subject: [PATCH 19/76] Create assetlinks.json --- app/public/.well-known/assetlinks.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 app/public/.well-known/assetlinks.json diff --git a/app/public/.well-known/assetlinks.json b/app/public/.well-known/assetlinks.json new file mode 100644 index 000000000..77c18c821 --- /dev/null +++ b/app/public/.well-known/assetlinks.json @@ -0,0 +1,18 @@ +[{ + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "org.blockstack.browser.twa", + "sha256_cert_fingerprints": + ["89:69:55:95:E3:09:B4:E8:E9:52:4E:E5:CA:C7:6C:30:51:0B:87:5D:17:8C:B7:95:4E:2C:BB:7F:20:D6:F7:06"] + } +}, +{ + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "org.blockstack.browser.twa", + "sha256_cert_fingerprints": + ["E6:34:C9:F2:9F:CB:18:1F:E6:C3:7C:40:78:5B:16:EC:13:99:4A:ED:86:E1:01:43:9C:92:7B:E8:A8:C9:12:7F"] + } +}] From 36ba1c0ada180478bf5ddf60d45335665ac638a2 Mon Sep 17 00:00:00 2001 From: Ken <yukanliao@gmail.com> Date: Sun, 24 Mar 2019 21:31:38 -0400 Subject: [PATCH 20/76] Update release checklist. --- maintainers/release-checklist.md | 62 +++++----- native/linux/Blockstack-for-Linux.sh | 174 +++++++++++++++++++++++++++ native/linux/make_deb.sh | 102 ---------------- 3 files changed, 204 insertions(+), 134 deletions(-) create mode 100644 native/linux/Blockstack-for-Linux.sh delete mode 100755 native/linux/make_deb.sh diff --git a/maintainers/release-checklist.md b/maintainers/release-checklist.md index 8f579625c..936e6296e 100644 --- a/maintainers/release-checklist.md +++ b/maintainers/release-checklist.md @@ -1,44 +1,42 @@ # Browser release checklist - -- [ ] `git flow release start 0.27.0` where 0.27.0 is the version of the release (make sure the version prefix `v` is set for git flow) +- [ ] `git flow release start 0.36.0` where 0.36.0 is the version of the release (make sure the version prefix `v` is set for git flow) - [ ] `git flow release publish` (optional, shares release branch) -- [ ] update version in `/package.json` -- [ ] update version and build number in xcode -- [ ] commit version changes + +## Release beta +- [ ] Update version in `/package.json` to `v0.36.0` +- [ ] In xcode, update version to `0.36.0` and increment the build number (Both for the Blockstack and Blockstack Launcher targets) +- [ ] Update the Linux script version in `/native/linux/Blockstack-for-Linux.sh` to `TAG=0.36.0` +- [ ] Commit version changes - [ ] Exit locally running Blockstack & stop any regtest instances & kill any `npm run dev` instances -- [ ] `npm run mac-release` -- [ ] Rename .dmg file to `Blockstack-for-macOS-v0.27.0.dmg` -- [ ] `git flow release finish 0.27.0` +- [ ] `npm run mac:release` +- [ ] Rename .dmg file to `Blockstack-for-macOS-v0.36.0-beta.dmg` +- [ ] Tag the release `git tag -a v0.36.0-beta.1` +- [ ] `git push origin --tags` +- [ ] Draft a new release on github: https://github.com/blockstack/blockstack-browser/releases/new +- [ ] Enter the tag (eg. `v0.36.0-beta.1`) the tag box and as the name of the release. +- [ ] Enter release notes +- [ ] Download Windows build from Appveyor +- [ ] Rename files to format `Blockstack-for-<platform>-v0.36.0-beta<.extension>` +- [ ] Upload macOS, Windows builds and the Linux script to the newly created release on GitHub +- [ ] Create beta forum post for the beta and upload the macOS and Windows builds +- [ ] Announce availability of beta in #pre-releases channel + +## Production release +- [ ] Make sure your `develop` and `master` branchs are up to date +- [ ] `git flow release finish 0.36.0` - [ ] on `develop` branch `git push origin develop` - [ ] `git push origin --tags` - [ ] `git checkout master` -- [ ] Create a branch of master so that we give CircleCI a chance to run tests successfully `git checkout -b master-test` -- [ ] `git push origin master-test` -- [ ] After CircleCI tests on `master-test` pass, `git checkout master` - [ ] `git push origin master` -- [ ] `git branch -d master-test` -- [ ] `git push origin :master-test` - -- [ ] tag blockstack/packaging `cd packaging; git checkout master; git tag v0.27.0` -- [ ] build Linux and Windows installers: `make windows; make linux-launcher` -- [ ] Enter blockstack/packaging `cd packaging; git checkout master` -- [ ] build Linux installer: `BUILD_TAG=v0.14.0 make linux-launcher` -- [ ] Confirm docker images successfully pull: `./dist/linux-launcher/launcher pull` -- [ ] Update `latest` image for browser on quay: `docker tag quay.io/blockstack/blockstack-browser:v0.23.0 quay.io/blockstack/blockstack-browser:latest` -- [ ] Update `latest-browser` on quay: `docker tag quay.io/blockstack/blockstack-core:v0.23.0-browser quay.io/blockstack/blockstack-core:latest-browser` -- [ ] Push docker tags `docker push quay.io/blockstack/blockstack-core:latest-browser` -- [ ] ... `docker push quay.io/blockstack/blockstack-browser:latest` -- [ ] Build Windows installer: https://github.com/kantai/blockstack-windows (Aaron should merge this into blockstack-browser) -- [ ] Sign Windows installer: `osslsigncode -certs "X509/IntermediateCA.crt" -certs "X509/ssl_certificate.crt" -key sign.key -n "Blockstack Browser" -i "https://blockstack.org" -t "http://timestamp.verisign.com/scripts/timstamp.dll" -in BlockstackSetup.msi -out blockstack-browser-signed.msi` - [ ] Draft a new release on github: https://github.com/blockstack/blockstack-browser/releases/new -- [ ] Enter the tag (eg. `v0.27.0`) the tag box and as the name of the release. +- [ ] Enter the tag (eg. `v0.36.0`) the tag box and as the name of the release. - [ ] Enter release notes -- [ ] Rename files to format `Blockstack-for-<platform>-v0.27.0<.extension>` -- [ ] Upload the `.dmg` file generated earlier -- [ ] Upload Linux launcher -- [ ] Upload Windows installer -- [ ] After verifying tests, push new version to update server. -- [ ] Update blockstack.org with direct links to install files https://github.com/blockstack/blockstack.org/blob/master/app/js/config.js +- [ ] Rename files to format `Blockstack-for-<platform>-v0.36.0<.extension>` +- [ ] Upload macOS, Windows builds and the Linux script to the newly created release on GitHub +- [ ] Open the `/public/macappcast.xml` file on https://github.com/blockstack/updates.blockstack.org +- [ ] Add the new version at the bottom with release notes and download link +- [ ] In the `updates.blockstack.org` repo, run `firebase deploy` to push new version to update server +- [ ] Update `blockstack.org/install` download links - [ ] Create a pull request from master into deploy/browser.blockstack.org https://github.com/blockstack/blockstack-browser/compare/deploy/browser.blockstack.org...master?expand=1 - [ ] Test netlify deploy preview of pull request from above and add review to pull request. (Performed by a colleague not running this release) - [ ] When pull request to deploy/browser.blockstack.org is approved, merge pull request diff --git a/native/linux/Blockstack-for-Linux.sh b/native/linux/Blockstack-for-Linux.sh new file mode 100644 index 000000000..9dcbf5248 --- /dev/null +++ b/native/linux/Blockstack-for-Linux.sh @@ -0,0 +1,174 @@ +#!/bin/bash + +# This script provides a simple interface for folks to use the docker install + +TAG=v0.35.4 +if [ "$BLOCKSTACK_TAG" ]; then + TAG="$BLOCKSTACK_TAG" +fi + +browserimage=quay.io/blockstack/blockstack-browser:$TAG + +if [ "$BROWSER_IMAGE" ]; then + browserimage="$BROWSER_IMAGE" +fi + + +# Default to setting blockstack to debug mode +if [ "$BLOCKSTACK_DEBUG" != "0" ]; then + BLOCKSTACK_DEBUG=1 +fi + +# Local Blockstack directory +homedir=$HOME/.blockstack +# Name of Blockstack Browser container +browsercontainer=blockstack-browser +# Local temporary directory +tmpdir=/tmp/.blockstack_tmp +if [ ! -e $tmpdir ]; then + mkdir -p $tmpdir +fi +# set password blank so we know when to prompt +password=0 + +if [ "$WIN_HYPERV" == '1' ]; then + prefix='winpty' +else + prefix='' +fi + +build () { + echo "Building blockstack docker image. This might take a minute..." + docker build -t $browserimage . +} + +start-containers () { + # Check for the blockstack-browser-* containers are running or stopped. + if [ "$(docker ps -q -f name=$browsercontainer)" ]; then + echo "Blockstack browser is already running -- restarting it." + stop + elif [ ! "$(docker ps -q -f name=$browsercontainer)" ]; then + if [ "$(docker ps -aq -f status=exited -f name=$browsercontainer)" ]; then + # cleanup old containers if they are still around + echo "removing old browser containers..." + docker rm $(docker ps -aq -f status=exited -f name=$browsercontainer) + fi + + # If there are no existing blockstack-browser-* containers, run them + docker run -d --name $browsercontainer-static -p 127.0.0.1:8888:8888 $browserimage blockstack-browser + docker run -d --name $browsercontainer-cors -e CORSPROXY_HOST="0.0.0.0" -p 127.0.0.1:1337:1337 $browserimage blockstack-cors-proxy + + if [[ $(uname) == 'Linux' ]]; then + # let's register the protocol handler if it isn't already registered: + create-linux-protocol-handler + xdg-open "http://localhost:8888/#coreAPIPassword=$password" + elif [[ $(uname) == 'Darwin' ]]; then + open "http://localhost:8888/#coreAPIPassword=$password" + elif [[ $(uname) == 'Windows' || $(uname) == 'MINGW64_NT-10.0' ]]; then + start "http://localhost:8888/#coreAPIPassword=$password" + fi + fi +} + +stop () { + bc=$(docker ps -a -f name=$browsercontainer -q) + if [ ! -z "$bc" ]; then + echo "stopping the running blockstack-browser containers" + docker stop $bc + docker rm $bc + fi +} + +commands () { + cat <<-EOF + +blockstack docker launcher commands: + install-protocol-handler -> install a protocol handler for blockstack:// links + remove-protocol-handler -> uninstall the protocol handler for blockstack:// links + pull -> fetch docker containers from quay + start -> start the blockstack browser server + stop -> stop the blockstack browser server + +To get started, use + + $ ./Blockstack-for-Linux.sh pull + $ ./Blockstack-for-Linux.sh install-protocol-handler + $ ./Blockstack-for-Linux.sh start + +This *requires* Docker to run. + +To remove the protocol handler (the only thing 'installed' when you run this launcher): + + $ ./Blockstack-for-Linux.sh remove-protocol-handler + +And this will start the environment for running the Blockstack Browser + +Note: the Docker containers mount your /home/<user>/.blockstack directory + +EOF +} + +pull () { + docker pull ${browserimage} +} + +version () { + echo "Blockstack launcher tagged @ '$TAG'" +} + +delete-linux-protocol-handler () { + HANDLER="blockstack.desktop" + HANDLER_SCRIPT="blockstack-protocol-handler" + rm -f "$HOME/.local/share/applications/$HANDLER_SCRIPT" + rm -f "$HOME/.local/share/applications/$HANDLER" +} + +create-linux-protocol-handler () { + HANDLER="blockstack.desktop" + HANDLER_SCRIPT="blockstack-protocol-handler" + echo "Registering protocol handler" + if [ ! -e "$HOME/.local/share/applications/" ]; then + mkdir -p "$HOME/.local/share/applications/" + fi + cat - > "$HOME/.local/share/applications/$HANDLER_SCRIPT" <<EOF +#!/bin/bash +AUTH=\$(echo "\$1" | sed s#/##g | sed s/blockstack:// | sed 's/ //g') +xdg-open "http://localhost:8888/auth?authRequest=\${AUTH}" +EOF + chmod +x "$HOME/.local/share/applications/$HANDLER_SCRIPT" + + cat - > "$HOME/.local/share/applications/$HANDLER" <<EOF +[Desktop Entry] +Type=Application +Terminal=false +Exec=$HOME/.local/share/applications/$HANDLER_SCRIPT %u +Name=Blockstack-Browser +MimeType=x-scheme-handler/blockstack; +EOF + chmod +x "$HOME/.local/share/applications/$HANDLER" + xdg-mime default "$HANDLER" x-scheme-handler/blockstack +} + +case $1 in + install-protocol-handler) + create-linux-protocol-handler + ;; + remove-protocol-handler) + delete-linux-protocol-handler + ;; + stop) + stop + ;; + start) + start-containers $2 + ;; + pull) + pull + ;; + version) + version + ;; + *) + commands + ;; +esac diff --git a/native/linux/make_deb.sh b/native/linux/make_deb.sh deleted file mode 100755 index c3ea2a372..000000000 --- a/native/linux/make_deb.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash -set -e - -BUILD_DIR="$(mktemp -d)" - -if [ -z "$REPO_DIR" ]; then - REPO_DIR="." -fi - -pushd "${REPO_DIR}" - -VERSION="$(cat package.json | grep '"version":' | awk '{ print $2 }' | sed -e 's/"//g' | sed -e 's/,//')" - -echo "Building version $VERSION" - -mkdir -p "${BUILD_DIR}" - -LIB_PATH=/usr/local/lib/blockstack-browser -HANDLERPATH="${BUILD_DIR}/usr/share/applications" -OUTPATH="${BUILD_DIR}${LIB_PATH}" -BINPATH="${BUILD_DIR}/usr/local/bin" - -DISTPATH="native/linux/dist" - -mkdir -p "${OUTPATH}" -mkdir -p "${BINPATH}" -mkdir -p "${HANDLERPATH}" -mkdir -p "${DISTPATH}" - -DISTFILE="${DISTPATH}/blockstack-browser_${VERSION}_all.deb" - -npm install -NODE_ENV="production ./node_modules/.bin/gulp prod-webapp" - -echo "Building ${DISTFILE}" - -echo "Copying gulped build" -cp -r ./build "${OUTPATH}" -mv "${OUTPATH}/build" "${OUTPATH}/browser" - -cp native/blockstackProxy.js "${OUTPATH}" - -MAKE_CORS=0 - -if [ $MAKE_CORS = "1" ]; then - echo "Install the CORS Proxy" - mkdir -p $OUTPATH/corsproxy/node_modules - npm install corsproxy-https --prefix $OUTPATH/corsproxy - chmod -R 0755 $OUTPATH/corsproxy -fi - -echo "Make run scripts" - -cat - > $BINPATH/blockstack-browser <<EOF -#!/bin/bash -nodejs "$LIB_PATH/blockstackProxy.js" 8888 "$LIB_PATH/browser" -EOF - -cat - > $BINPATH/blockstack-protocol-handler <<EOF -#!/bin/bash -AUTH=\$(echo "\$1" | sed s#/##g | sed s/blockstack:// | sed 's/ //g') -xdg-open "http://localhost:8888/auth?authRequest=\${AUTH}" -EOF - - -if [ $MAKE_CORS = "1" ]; then - cat - > $BINPATH/blockstack-cors-proxy <<EOF -#!/bin/bash -"$LIB_PATH/corsproxy/node_modules/.bin/corsproxy" -EOF - chmod 0555 $BINPATH/blockstack-cors-proxy -fi - -cat - > $HANDLERPATH/blockstack.desktop <<EOF -[Desktop Entry] -Type=Application -Terminal=false -Exec=blockstack-protocol-handler %u -Name=Blockstack-Browser -MimeType=x-scheme-handler/blockstack; -EOF - -chmod 0555 $HANDLERPATH/blockstack.desktop -chmod 0555 $BINPATH/blockstack-browser -chmod 0555 $BINPATH/blockstack-protocol-handler - -ARCH="all" -NAME="blockstack-browser" -LICENSE="MPL-2.0" -DESCRIPTION="The Blockstack Browser" -MAINTAINER="Aaron Blankstein (aaron@blockstack.com)" -VENDOR="Blockstack PBC" -URL="https://github.com/blockstack/blockstack-browser.git" - -fpm --force -s dir -t deb -a "$ARCH" -v "$VERSION" -n "$NAME" \ - -d 'nodejs >= 6.0.0' -C $BUILD_DIR --license "$LICENSE" --vendor "$VENDOR" --maintainer "$MAINTAINER" \ - --url "$URL" --description "$DESCRIPTION" -p "$DISTFILE" $(ls "$BUILD_DIR") - -popd - -echo "SUCCESS: Built browser paths" - From 27e0069ba3f79e293a41c0c550fad5505445c472 Mon Sep 17 00:00:00 2001 From: Ken <yukanliao@gmail.com> Date: Mon, 25 Mar 2019 17:03:39 -0400 Subject: [PATCH 21/76] Update release checklist. --- maintainers/release-checklist.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/maintainers/release-checklist.md b/maintainers/release-checklist.md index 936e6296e..4137085ba 100644 --- a/maintainers/release-checklist.md +++ b/maintainers/release-checklist.md @@ -18,7 +18,7 @@ - [ ] Download Windows build from Appveyor - [ ] Rename files to format `Blockstack-for-<platform>-v0.36.0-beta<.extension>` - [ ] Upload macOS, Windows builds and the Linux script to the newly created release on GitHub -- [ ] Create beta forum post for the beta and upload the macOS and Windows builds +- [ ] Create forum post for the beta and upload the macOS and Windows builds - [ ] Announce availability of beta in #pre-releases channel ## Production release @@ -40,3 +40,4 @@ - [ ] Create a pull request from master into deploy/browser.blockstack.org https://github.com/blockstack/blockstack-browser/compare/deploy/browser.blockstack.org...master?expand=1 - [ ] Test netlify deploy preview of pull request from above and add review to pull request. (Performed by a colleague not running this release) - [ ] When pull request to deploy/browser.blockstack.org is approved, merge pull request +- [ ] Update the beta forum post for production release \ No newline at end of file From 9ede805328437ec28e664f88ee1874003699cc01 Mon Sep 17 00:00:00 2001 From: Ken <yukanliao@gmail.com> Date: Mon, 1 Apr 2019 13:20:39 -0400 Subject: [PATCH 22/76] Update release checklist. --- maintainers/release-checklist.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/maintainers/release-checklist.md b/maintainers/release-checklist.md index 4137085ba..9d2f2a15a 100644 --- a/maintainers/release-checklist.md +++ b/maintainers/release-checklist.md @@ -1,9 +1,9 @@ # Browser release checklist -- [ ] `git flow release start 0.36.0` where 0.36.0 is the version of the release (make sure the version prefix `v` is set for git flow) +- [ ] `git flow release start v0.36.0` where 0.36.0 is the version of the release (make sure the version prefix `v` is set for git flow) - [ ] `git flow release publish` (optional, shares release branch) ## Release beta -- [ ] Update version in `/package.json` to `v0.36.0` +- [ ] Update version in `/package.json` to `0.36.0` - [ ] In xcode, update version to `0.36.0` and increment the build number (Both for the Blockstack and Blockstack Launcher targets) - [ ] Update the Linux script version in `/native/linux/Blockstack-for-Linux.sh` to `TAG=0.36.0` - [ ] Commit version changes @@ -23,7 +23,7 @@ ## Production release - [ ] Make sure your `develop` and `master` branchs are up to date -- [ ] `git flow release finish 0.36.0` +- [ ] `git flow release finish v0.36.0` - [ ] on `develop` branch `git push origin develop` - [ ] `git push origin --tags` - [ ] `git checkout master` From eb10f4d1f8eea69ca3837c83811955daa92e7c2b Mon Sep 17 00:00:00 2001 From: Ken <yukanliao@gmail.com> Date: Mon, 1 Apr 2019 13:28:36 -0400 Subject: [PATCH 23/76] Update release checklist. --- maintainers/release-checklist.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maintainers/release-checklist.md b/maintainers/release-checklist.md index 9d2f2a15a..13b7b563b 100644 --- a/maintainers/release-checklist.md +++ b/maintainers/release-checklist.md @@ -5,7 +5,7 @@ ## Release beta - [ ] Update version in `/package.json` to `0.36.0` - [ ] In xcode, update version to `0.36.0` and increment the build number (Both for the Blockstack and Blockstack Launcher targets) -- [ ] Update the Linux script version in `/native/linux/Blockstack-for-Linux.sh` to `TAG=0.36.0` +- [ ] Update the Linux script version in `/native/linux/Blockstack-for-Linux.sh` to `TAG=v0.36.0` - [ ] Commit version changes - [ ] Exit locally running Blockstack & stop any regtest instances & kill any `npm run dev` instances - [ ] `npm run mac:release` From 47914be6519c77fb456cb3c13ffd83059ce98aa7 Mon Sep 17 00:00:00 2001 From: Ken <yukanliao@gmail.com> Date: Wed, 3 Apr 2019 13:53:16 -0400 Subject: [PATCH 24/76] Release checklist adjustments. --- maintainers/release-checklist.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/maintainers/release-checklist.md b/maintainers/release-checklist.md index 13b7b563b..90bf13167 100644 --- a/maintainers/release-checklist.md +++ b/maintainers/release-checklist.md @@ -11,14 +11,15 @@ - [ ] `npm run mac:release` - [ ] Rename .dmg file to `Blockstack-for-macOS-v0.36.0-beta.dmg` - [ ] Tag the release `git tag -a v0.36.0-beta.1` -- [ ] `git push origin --tags` +- [ ] `git push origin --follow-tags` +- [ ] Push changes to the `next` branch to generate signed Windows build on Appveyor - [ ] Draft a new release on github: https://github.com/blockstack/blockstack-browser/releases/new - [ ] Enter the tag (eg. `v0.36.0-beta.1`) the tag box and as the name of the release. - [ ] Enter release notes - [ ] Download Windows build from Appveyor - [ ] Rename files to format `Blockstack-for-<platform>-v0.36.0-beta<.extension>` - [ ] Upload macOS, Windows builds and the Linux script to the newly created release on GitHub -- [ ] Create forum post for the beta and upload the macOS and Windows builds +- [ ] Create forum post with the `Releases` tag for the beta and upload the macOS and Windows builds - [ ] Announce availability of beta in #pre-releases channel ## Production release From c27257451e16c07a5cef0c72102b8b69d9643943 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Thu, 4 Apr 2019 14:18:51 -0500 Subject: [PATCH 25/76] remove deny button --- app/js/auth/views/initial.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/app/js/auth/views/initial.js b/app/js/auth/views/initial.js index 0ea596881..939bd1be3 100644 --- a/app/js/auth/views/initial.js +++ b/app/js/auth/views/initial.js @@ -6,7 +6,13 @@ const basicInfo = 'read your basic info' const readEmail = 'read your email address' const publishData = 'publish data stored for this app' -const Accounts = ({ list, handleClick, processing, refreshingIdentities, selectedIndex }) => { +const Accounts = ({ + list, + handleClick, + processing, + refreshingIdentities, + selectedIndex +}) => { let loadingMessage = null if (processing) { loadingMessage = 'Signing in...' @@ -121,15 +127,6 @@ const InitialScreen = ({ </Buttons> </> ) - }, - actions: { - items: [ - { - label: 'Deny', - to: '/', - negative: true - } - ] } } return <ShellScreen {...rest} {...props} /> From e6f84358e9a2e4b1cda551e404a61008a99ad8a4 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Thu, 4 Apr 2019 14:19:25 -0500 Subject: [PATCH 26/76] add cancel back link, prettier --- app/js/auth/index.js | 55 +++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/app/js/auth/index.js b/app/js/auth/index.js index 5df4272e0..7502c7a70 100644 --- a/app/js/auth/index.js +++ b/app/js/auth/index.js @@ -171,24 +171,34 @@ class AuthPage extends React.Component { if (redirectURI) { // Get the current localhost authentication url that the app will redirect back to, // and remove the 'echo' param from it. - const authContinuationURI = updateQueryStringParameter(window.location.href, 'echo', '') - redirectURI = updateQueryStringParameter(redirectURI, 'echoReply', this.state.echoRequestId) - redirectURI = updateQueryStringParameter(redirectURI, 'authContinuation', encodeURIComponent(authContinuationURI)) + const authContinuationURI = updateQueryStringParameter( + window.location.href, + 'echo', + '' + ) + redirectURI = updateQueryStringParameter( + redirectURI, + 'echoReply', + this.state.echoRequestId + ) + redirectURI = updateQueryStringParameter( + redirectURI, + 'authContinuation', + encodeURIComponent(authContinuationURI) + ) } else { throw new Error('Invalid redirect echo reply URI') } this.setState({ responseSent: true }) window.location = redirectURI } - - componentWillReceiveProps(nextProps) { + componentWillReceiveProps(nextProps) { if (!this.state.responseSent) { - if (this.state.echoRequestId) { this.redirectUserToEchoReply() return - } + } const storageConnected = this.props.api.storageConnected this.setState({ @@ -251,9 +261,7 @@ class AuthPage extends React.Component { if (identity.zoneFile && identity.zoneFile.length > 0) { const zoneFileJson = parseZoneFile(identity.zoneFile) - const profileUrlFromZonefile = getTokenFileUrlFromZoneFile( - zoneFileJson - ) + const profileUrlFromZonefile = getTokenFileUrlFromZoneFile(zoneFileJson) if ( profileUrlFromZonefile !== null && profileUrlFromZonefile !== undefined @@ -358,10 +366,7 @@ class AuthPage extends React.Component { } getFreshIdentities = async () => { - await this.props.refreshIdentities( - this.props.api, - this.props.addresses - ) + await this.props.refreshIdentities(this.props.api, this.props.addresses) this.setState({ refreshingIdentities: false }) } @@ -541,7 +546,11 @@ class AuthPage extends React.Component { } render() { - const { appManifest, appManifestLoading, appManifestLoadingError } = this.props + const { + appManifest, + appManifestLoading, + appManifestLoadingError + } = this.props if (appManifestLoadingError) { return ( @@ -596,11 +605,18 @@ class AuthPage extends React.Component { ) }, deny: () => console.log('go back to app'), + backLabel: 'Cancel', + backView: () => { + if (document.referrer === '') { + window.close() + } else { + history.back() + } + }, accounts: this.props.localIdentities, processing: this.state.processing, refreshingIdentities: this.state.refreshingIdentities, - selectedIndex: this.state.currentIdentityIndex, - disableBackOnView: 0 + selectedIndex: this.state.currentIdentityIndex } }, { @@ -630,4 +646,7 @@ class AuthPage extends React.Component { } } -export default connect(mapStateToProps, mapDispatchToProps)(AuthPage) +export default connect( + mapStateToProps, + mapDispatchToProps +)(AuthPage) From 5168d74c88c28323525dc4d0111655ca666ef1b8 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Thu, 4 Apr 2019 14:19:57 -0500 Subject: [PATCH 27/76] clean up and refactor name registration actions, add in better messaging --- app/js/profiles/store/registration/actions.js | 269 +++++++++++------- 1 file changed, 174 insertions(+), 95 deletions(-) diff --git a/app/js/profiles/store/registration/actions.js b/app/js/profiles/store/registration/actions.js index e73ed9d9c..c6afb1938 100644 --- a/app/js/profiles/store/registration/actions.js +++ b/app/js/profiles/store/registration/actions.js @@ -1,19 +1,23 @@ import * as types from './types' -import { makeProfileZoneFile, transactions, config, network, safety } from 'blockstack' +import { + makeProfileZoneFile, + transactions, + config, + network, + safety +} from 'blockstack' import { uploadProfile } from '../../../account/utils' import { IdentityActions } from '../identity' import { signProfileForUpload, authorizationHeaderValue } from '@utils' import { DEFAULT_PROFILE } from '@utils/profile-utils' import { isSubdomain, getNameSuffix } from '@utils/name-utils' +import { notify } from 'reapop' import log4js from 'log4js' const logger = log4js.getLogger(__filename) - -function profileUploading() { - return { - type: types.PROFILE_UPLOADING - } +const profileUploading = { + type: types.PROFILE_UPLOADING } function profileUploadError(error) { @@ -55,10 +59,19 @@ function beforeRegister() { } } -function registerSubdomain(api, domainName, identityIndex, ownerAddress, zoneFile) { +async function registerSubdomain( + api, + domainName, + identityIndex, + ownerAddress, + zoneFile +) { let nameSuffix = null + nameSuffix = getNameSuffix(domainName) + logger.debug(`registerName: ${domainName} is a subdomain of ${nameSuffix}`) + const registerUrl = api.subdomains[nameSuffix].registerUrl const registrationRequestBody = JSON.stringify({ @@ -75,24 +88,41 @@ function registerSubdomain(api, domainName, identityIndex, ownerAddress, zoneFil logger.info(`Submitting registration for ${domainName} to ${registerUrl}`) - return fetch(registerUrl, { + const response = await fetch(registerUrl, { method: 'POST', headers: requestHeaders, body: registrationRequestBody }) - .then((response) => { - if (!response.ok) { - logger.error(`Subdomain registrar responded with status code ${response.status}`) - return Promise.reject(new Error('Failed to register username')) - } - return response.text() - }) - .then((responseText) => JSON.parse(responseText)) + + if (!response.ok) { + logger.error( + `Subdomain registrar responded with status code ${response.status}` + ) + + return Promise.reject({ + error: 'Failed to register username', + status: response.status + }) + } + + const responseText = await response.text() + + return JSON.parse(responseText) } -function registerDomain(myNet, tx, domainName, identityIndex, ownerAddress, paymentKey, zoneFile) { +function registerDomain( + myNet, + tx, + domainName, + identityIndex, + ownerAddress, + paymentKey, + zoneFile +) { if (!paymentKey) { - logger.error('registerName: payment key not provided for non-subdomain registration') + logger.error( + 'registerName: payment key not provided for non-subdomain registration' + ) return Promise.reject('Missing payment key') } @@ -102,31 +132,33 @@ function registerDomain(myNet, tx, domainName, identityIndex, ownerAddress, paym let preorderTx = '' let registerTx = '' - return safety.addressCanReceiveName(ownerAddress) - .then((canReceive) => { + return safety + .addressCanReceiveName(ownerAddress) + .then(canReceive => { if (!canReceive) { return Promise.reject(`Address ${ownerAddress} cannot receive names.`) } return safety.isNameValid(domainName) }) - .then((nameValid) => { + .then(nameValid => { if (!nameValid) { return Promise.reject(`Name ${domainName} is not valid`) } return true }) .then(() => tx.makePreorder(domainName, coercedAddress, compressedKey)) - .then((rawtx) => { + .then(rawtx => { preorderTx = rawtx return rawtx }) - .then((rawtx) => { + .then(rawtx => { myNet.modifyUTXOSetFrom(preorderTx) return rawtx }) .then(() => - tx.makeRegister(domainName, coercedAddress, compressedKey, zoneFile)) - .then((rawtx) => { + tx.makeRegister(domainName, coercedAddress, compressedKey, zoneFile) + ) + .then(rawtx => { registerTx = rawtx return rawtx }) @@ -136,84 +168,131 @@ function registerDomain(myNet, tx, domainName, identityIndex, ownerAddress, paym }) .then(() => { logger.debug( - `Sending registration to transaction broadcaster at ${myNet.broadcastServiceUrl}`) + `Sending registration to transaction broadcaster at ${ + myNet.broadcastServiceUrl + }` + ) return myNet.broadcastNameRegistration(preorderTx, registerTx, zoneFile) }) } -function registerName(api, domainName, identity, identityIndex, - ownerAddress, keypair, paymentKey = null) { +const registerName = ( + api, + domainName, + identity, + identityIndex, + ownerAddress, + keypair, + paymentKey = null +) => async dispatch => { logger.info(`registerName: domainName: ${domainName}`) - return dispatch => { - logger.debug(`Signing a new profile for ${domainName}`) - const profile = identity.profile || DEFAULT_PROFILE - const signedProfileTokenData = signProfileForUpload(profile, keypair, api) - - dispatch(profileUploading()) - logger.info(`Uploading ${domainName} profile...`) - return uploadProfile(api, identity, keypair, signedProfileTokenData) - .then((profileUrl) => { - logger.info(`Uploading ${domainName} profiled succeeded.`) - const tokenFileUrl = profileUrl - logger.debug(`tokenFileUrl: ${tokenFileUrl}`) - - logger.info('Making profile zonefile...') - const zoneFile = makeProfileZoneFile(domainName, tokenFileUrl) - - const nameIsSubdomain = isSubdomain(domainName) - - dispatch(registrationSubmitting()) - - if (nameIsSubdomain) { - return registerSubdomain(api, domainName, identityIndex, ownerAddress, zoneFile) - .then((responseJson) => { - if (responseJson.error) { - logger.error(responseJson.error) - dispatch(registrationError(responseJson.error)) - } else { - logger.debug(`Successfully submitted registration for ${domainName}`) - dispatch(registrationSubmitted()) - dispatch(IdentityActions.addUsername(identityIndex, domainName)) - } - }) - .catch((error) => { - logger.error('registerName: error POSTing registration to registrar', error) - dispatch(registrationError(error)) - throw error - }) - } else { - if (api.regTestMode) { - logger.info('Using regtest network') - config.network = network.defaults.LOCAL_REGTEST - // browser regtest environment uses 6270 - config.network.blockstackAPIUrl = 'http://localhost:6270' + logger.debug(`Signing a new profile for ${domainName}`) + + const profile = identity.profile || DEFAULT_PROFILE + const signedProfileTokenData = signProfileForUpload(profile, keypair, api) + dispatch(profileUploading) + logger.info(`Uploading ${domainName} profile...`) + try { + const profileUrl = await uploadProfile( + api, + identity, + keypair, + signedProfileTokenData + ) + logger.info(`Uploading ${domainName} profiled succeeded.`) + const tokenFileUrl = profileUrl + logger.debug(`tokenFileUrl: ${tokenFileUrl}`) + logger.info('Making profile zonefile...') + const zoneFile = makeProfileZoneFile(domainName, tokenFileUrl) + const nameIsSubdomain = isSubdomain(domainName) + dispatch(registrationSubmitting()) + if (nameIsSubdomain) { + try { + const res = await registerSubdomain( + api, + domainName, + identityIndex, + ownerAddress, + zoneFile + ) + + if (res.error) { + logger.error(res.error) + let message = + `Sorry, something went wrong while registering ${domainName}. ` + + 'You can try to register again later from your profile page. Some ' + + 'apps may be unusable until you do.' + if (res.status === 409) { + message = + "Sorry, it looks like we weren't able to process your name registration. Please contact us at support@blockstack.org for help. Some apps may be unusable until you register an ID." + } + dispatch(registrationError(message)) + dispatch( + notify({ + title: 'Username Registration Failed', + message, + status: 'error', + dismissAfter: 6000, + dismissible: true, + closeButton: true, + position: 'b' + }) + ) + } else { + logger.debug(`Successfully submitted registration for ${domainName}`) + dispatch(registrationSubmitted()) + dispatch(IdentityActions.addUsername(identityIndex, domainName)) + } + } catch (e) { + logger.error('registerName: error POSTing registration to registrar', e) + let message = + `Sorry, something went wrong while registering ${domainName}. ` + + 'You can try to register again later from your profile page. Some ' + + 'apps may be unusable until you do.' + if (e.status === 409) { + message = + "Sorry, it looks like we weren't able to process your name registration. Please contact us at support@blockstack.org for help. Some apps may be unusable until you register an ID." } + dispatch(registrationError(message)) + throw new Error(message) + } + } else { + // paid name + if (api.regTestMode) { + logger.info('Using regtest network') + config.network = network.defaults.LOCAL_REGTEST + // browser regtest environment uses 6270 + config.network.blockstackAPIUrl = 'http://localhost:6270' + } + const myNet = config.network - const myNet = config.network - - return registerDomain(myNet, transactions, domainName, identityIndex, - ownerAddress, paymentKey, zoneFile) - .then((response) => { - if (response.status) { - logger.debug(`Successfully submitted registration for ${domainName}`) - dispatch(registrationSubmitted()) - dispatch(IdentityActions.addUsername(identityIndex, domainName)) - } else { - logger.error(response) - dispatch(registrationError(response)) - } - }) - .catch(error => { - logger.error('registerName: error submitting name registration', error) - dispatch(registrationError(error)) - throw new Error('Error submitting name registration') - }) + try { + const response = await registerDomain( + myNet, + transactions, + domainName, + identityIndex, + ownerAddress, + paymentKey, + zoneFile + ) + if (response.status && response.status !== 409) { + logger.debug(`Successfully submitted registration for ${domainName}`) + dispatch(registrationSubmitted()) + dispatch(IdentityActions.addUsername(identityIndex, domainName)) + } else { + logger.error(response) + dispatch(registrationError(response)) + } + } catch (e) { + logger.error('registerName: error uploading profile', e) + dispatch(profileUploadError(e)) + throw e } - }).catch((error) => { - logger.error('registerName: error uploading profile', error) - dispatch(profileUploadError(error)) - throw error - }) + } + } catch (e) { + logger.error('registerName: error', e) + dispatch(registrationError(e)) } } From 79e91d649a91f36d2514821999d85954a454f9d7 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Thu, 4 Apr 2019 14:20:22 -0500 Subject: [PATCH 28/76] add in check to reset error, better boolean fixes for submitted state --- app/js/profiles/store/registration/reducer.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/js/profiles/store/registration/reducer.js b/app/js/profiles/store/registration/reducer.js index d73f8e636..f795b8e13 100644 --- a/app/js/profiles/store/registration/reducer.js +++ b/app/js/profiles/store/registration/reducer.js @@ -1,11 +1,16 @@ import * as types from './types' +import { CHECKING_NAME_AVAILABILITY } from '../availability/types' -const initialState = { - -} +const initialState = {} function RegistrationReducer(state = initialState, action) { switch (action.type) { + // reset error on new name search + case CHECKING_NAME_AVAILABILITY: + return { + ...state, + error: null + } case types.REGISTRATION_BEFORE_SUBMIT: return Object.assign({}, state, { profileUploading: false, @@ -18,6 +23,7 @@ function RegistrationReducer(state = initialState, action) { return Object.assign({}, state, { profileUploading: false, registrationSubmitting: true, + registrationSubmitted: false, error: null, preventRegistration: true }) @@ -33,7 +39,8 @@ function RegistrationReducer(state = initialState, action) { return Object.assign({}, state, { registrationSubmitting: false, error: action.error, - preventRegistration: false + preventRegistration: false, + registrationSubmitted: false }) case types.PROFILE_UPLOADING: return Object.assign({}, state, { From 9eb1c9b20a201b85416e07b160c11c25f3eee488 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Thu, 4 Apr 2019 14:21:04 -0500 Subject: [PATCH 29/76] remove names in buttons, long names would break layout --- app/js/profiles/components/registration/UsernameResultDomain.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/js/profiles/components/registration/UsernameResultDomain.js b/app/js/profiles/components/registration/UsernameResultDomain.js index ad4309d9c..247ec8c0b 100644 --- a/app/js/profiles/components/registration/UsernameResultDomain.js +++ b/app/js/profiles/components/registration/UsernameResultDomain.js @@ -36,7 +36,7 @@ const UsernameResultDomain = (props: Props) => { className="btn btn-primary btn-block" to={`/profiles/i/add-username/${index}/select/${name}`} > - Register <strong>{name}</strong> for {price} bitcoins + Register for {price} bitcoins </Link> ) From 0e0b5ce90b0e72b173b19160244bfaa6a4fb0742 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Thu, 4 Apr 2019 14:21:32 -0500 Subject: [PATCH 30/76] remove names in buttons, long names would break layout --- .../profiles/components/registration/UsernameResultSubdomain.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/js/profiles/components/registration/UsernameResultSubdomain.js b/app/js/profiles/components/registration/UsernameResultSubdomain.js index 50a4ecef4..2e2dd1621 100644 --- a/app/js/profiles/components/registration/UsernameResultSubdomain.js +++ b/app/js/profiles/components/registration/UsernameResultSubdomain.js @@ -19,7 +19,7 @@ const UsernameResultSubdomain = (props: Props) => { className="btn btn-primary btn-block" to={`/profiles/i/add-username/${index}/select/${name}`} > - Get <strong>{name}</strong> for free + Register for free </Link> </div> From 0913d5dbd4f54ac043a5fa96d6294f6f98bd9b32 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Thu, 4 Apr 2019 14:22:09 -0500 Subject: [PATCH 31/76] update components in register name views, general clean up and show error state --- .../registration/RegistrationSelectView.js | 514 +++++++++++------- 1 file changed, 306 insertions(+), 208 deletions(-) diff --git a/app/js/profiles/components/registration/RegistrationSelectView.js b/app/js/profiles/components/registration/RegistrationSelectView.js index 2dee21a8f..d596d9022 100644 --- a/app/js/profiles/components/registration/RegistrationSelectView.js +++ b/app/js/profiles/components/registration/RegistrationSelectView.js @@ -14,6 +14,7 @@ import { QRCode } from 'react-qr-svg' import Alert from '@components/Alert' import InputGroup from '@components/InputGroup' import log4js from 'log4js' +import { Box, Flex } from 'blockstack-ui' const logger = log4js.getLogger(__filename) const CHECK_FOR_PAYMENT_INTERVAL = 10000 @@ -35,10 +36,93 @@ function mapStateToProps(state) { } function mapDispatchToProps(dispatch) { - return bindActionCreators(Object.assign({}, - IdentityActions, AccountActions, RegistrationActions, AvailabilityActions), dispatch) + return bindActionCreators( + Object.assign( + {}, + IdentityActions, + AccountActions, + RegistrationActions, + AvailabilityActions + ), + dispatch + ) } +const RegisterButton = ({ onClick, disabled, ...rest }) => ( + <Box {...rest}> + <Box + is="button" + className="btn btn-primary btn-block" + disabled={disabled} + onClick={onClick} + > + {disabled ? <span>Registering...</span> : <span>Register</span>} + </Box> + </Box> +) + +const CloseButton = ({ ...rest }) => ( + <Box {...rest}> + <Link to={`/profiles`} className="btn btn-primary btn-block"> + <span>Close</span> + </Link> + </Box> +) + +const SubdomainContent = ({ + name, + loading, + identityIndex, + doRegister, + ...rest +}) => ( + <Box textAlign="center" {...rest}> + <Box pb={2}> + <Box lineHeight="1.5" is="h3"> + Are you sure you want to register <strong>{name}</strong>? + </Box> + </Box> + + <Box> + <p> + <strong>{name}</strong> is a free username. + </p> + </Box> + + <Box> + <RegisterButton pb={2} onClick={doRegister} disabled={loading} /> + {!loading ? ( + <Box> + <Link + to={`/profiles/i/add-username/${identityIndex}/search`} + className="btn btn-tertiary btn-block" + > + Back + </Link> + </Box> + ) : null} + </Box> + </Box> +) + +const ErrorState = ({ message, ...rest }) => ( + <Box textAlign="center"> + <Box pb={4}> + <Box m={0} p={0} is="h3"> + Something went wrong! + </Box> + </Box> + {message && ( + <Box fontSize="16px" lineHeight="1.5"> + {message} + </Box> + )} + <Box pt={4}> + <CloseButton /> + </Box> + </Box> +) + class AddUsernameSelectPage extends Component { static propTypes = { routeParams: PropTypes.object.isRequired, @@ -69,13 +153,15 @@ class AddUsernameSelectPage extends Component { props.router.push(`/profiles/i/add-username/${index}/search`) } - const nameHasBeenPreordered = hasNameBeenPreordered(name, props.localIdentities) + const nameHasBeenPreordered = hasNameBeenPreordered( + name, + props.localIdentities + ) if (nameHasBeenPreordered) { logger.error(`constructor: Name ${name} has already been preordered.`) props.router.push('/profiles') } - const nameIsSubdomain = isSubdomain(name) let enoughMoney = false let price = 0 @@ -85,7 +171,7 @@ class AddUsernameSelectPage extends Component { price = roundTo.up(price, 3) const walletBalance = this.props.balances.total - if (nameIsSubdomain || (walletBalance >= price)) { + if (nameIsSubdomain || walletBalance >= price) { enoughMoney = true } @@ -93,7 +179,10 @@ class AddUsernameSelectPage extends Component { if (!enoughMoney) { this.paymentTimer = setInterval(() => { logger.debug('paymentTimer: calling refreshBalances...') - that.props.refreshBalances(that.props.btcBalanceUrl, that.props.addresses) + that.props.refreshBalances( + that.props.btcBalanceUrl, + that.props.addresses + ) }, CHECK_FOR_PAYMENT_INTERVAL) } this.state = { @@ -106,9 +195,6 @@ class AddUsernameSelectPage extends Component { password: '', acceptedWarning: false } - this.onValueChange = this.onValueChange.bind(this) - this.register = this.register.bind(this) - this.updateAlert = this.updateAlert.bind(this) } componentDidMount() { @@ -121,9 +207,12 @@ class AddUsernameSelectPage extends Component { .filter(ident => ident.usernamePending) .reduce((prev, ident) => prev || !isSubdomain(ident.username), false) if (hasPendingReg) { - this.updateAlert('danger', 'You have a pending name registration. ' + - 'Starting a new registration may interfere with that ' + - 'registration’s transactions.') + this.updateAlert( + 'danger', + 'You have a pending name registration. ' + + 'Starting a new registration may interfere with that ' + + 'registration’s transactions.' + ) } } } @@ -133,9 +222,16 @@ class AddUsernameSelectPage extends Component { const name = nextProps.routeParams.name const index = nextProps.routeParams.index - if (this.state.registrationInProgress && registration.registrationSubmitted) { - logger.debug('componentWillReceiveProps: registration submitted! redirecting...') - this.props.router.push(`/profiles/i/add-username/${index}/submitted/${name}`) + if ( + this.state.registrationInProgress && + registration.registrationSubmitted + ) { + logger.debug( + 'componentWillReceiveProps: registration submitted! redirecting...' + ) + this.props.router.push( + `/profiles/i/add-username/${index}/submitted/${name}` + ) } else if (registration.registrationError) { this.setState({ registrationInProgress: false @@ -154,7 +250,7 @@ class AddUsernameSelectPage extends Component { price = roundTo.up(price, 3) const walletBalance = this.props.balances.total - if (nameIsSubdomain || (walletBalance >= price)) { + if (nameIsSubdomain || walletBalance >= price) { enoughMoney = true } @@ -169,248 +265,247 @@ class AddUsernameSelectPage extends Component { }) } - onValueChange(event) { + onValueChange = event => this.setState({ [event.target.name]: event.target.value }) - } - register(event) { + register = async event => { logger.info('register') - if (event) { event.preventDefault() } - this.setState({ registrationInProgress: true }) - const index = this.props.routeParams.index - const name = this.props.routeParams.name - const nameHasBeenPreordered = hasNameBeenPreordered(name, this.props.localIdentities) - const identity = this.props.localIdentities[index] + const { + localIdentities, + routeParams, + identityAddresses, + identityKeypairs, + registerName, + api + } = this.props + + const { index, name } = routeParams + const address = identityAddresses[index] + const identity = localIdentities[index] + const { ownerAddress } = identity + const nameHasBeenPreordered = hasNameBeenPreordered(name, localIdentities) + const keypair = identityKeypairs[index] + const nameTokens = name.split('.') + const nameSuffix = name.split(nameTokens[0]) + const nameIsSubdomain = isSubdomain(name) + if (nameHasBeenPreordered) { logger.error(`register: Name ${name} has already been preordered`) - } else { - logger.debug(`register: Will try to register ${name} for identity ${index}`) + return + } + // has not been preordered - const address = this.props.identityAddresses[index] - const ownerAddress = identity.ownerAddress - if (ownerAddress !== address) { - this.setState({ - registrationInProgress: false - }) - logger.error(`register: ${address} @ ${index} doesn't match owner ${ownerAddress}`) - this.updateAlert('danger', 'There is a problem with your account.') - } + logger.debug(`register: Will try to register ${name} for identity ${index}`) + if (ownerAddress !== address) { + this.setState({ + registrationInProgress: false + }) + logger.error( + `register: ${address} @ ${index} doesn't match owner ${ownerAddress}` + ) + this.updateAlert('danger', 'There is a problem with your account.') + return + } + + logger.debug(`register: ${name} has name suffix ${nameSuffix}`) + logger.debug(`register: is ${name} a subdomain? ${nameIsSubdomain}`) - const keypair = this.props.identityKeypairs[index] - - const nameTokens = name.split('.') - const nameSuffix = name.split(nameTokens[0]) - const nameIsSubdomain = isSubdomain(name) - - logger.debug(`register: ${name} has name suffix ${nameSuffix}`) - logger.debug(`register: is ${name} a subdomain? ${nameIsSubdomain}`) - - if (nameIsSubdomain) { - this.props.registerName(this.props.api, name, identity, - index, address, keypair) - } else { - const password = this.state.password - const encryptedBackupPhrase = this.props.encryptedBackupPhrase - decryptBitcoinPrivateKey(password, encryptedBackupPhrase) - .then((paymentKey) => - this.props.registerName(this.props.api, name, identity, - index, address, keypair, paymentKey) + if (nameIsSubdomain) { + registerName(api, name, identity, index, address, keypair) + } else { + const { password } = this.state + const { encryptedBackupPhrase } = this.props + try { + const paymentKey = await decryptBitcoinPrivateKey( + password, + encryptedBackupPhrase ) - .catch((error) => { - this.setState({ - registrationInProgress: false - }) - this.updateAlert('danger', error.message) + registerName(api, name, identity, index, address, keypair, paymentKey) + } catch (error) { + this.setState({ + registrationInProgress: false }) + this.updateAlert('danger', error.message) } } } - updateAlert(alertStatus, alertMessage) { + updateAlert = (alertStatus, alertMessage) => this.setState({ - alerts: [{ - status: alertStatus, - message: alertMessage - }] + alerts: [ + { + status: alertStatus, + message: alertMessage + } + ] }) - } render() { - const name = this.props.routeParams.name - const availableNames = this.props.availability.names + const { + routeParams, + availability, + balances, + addresses, + registration + } = this.props + + const { + index: identityIndex, + registrationInProgress, + acceptedWarning + } = this.state + + const { name } = routeParams + const { names: availableNames } = availability const nameAvailabilityObject = availableNames[name] const nameIsSubdomain = isSubdomain(name) - const identityIndex = this.state.index - let enoughMoney = false + const { total: walletBalance } = balances + const [walletAddress] = addresses + let price = 0 if (nameAvailabilityObject) { price = nameAvailabilityObject.price } price = roundTo.up(price, 6) + PRICE_BUFFER - const walletBalance = this.props.balances.total - if (nameIsSubdomain || (walletBalance >= price)) { - enoughMoney = true - } - - const walletAddress = this.props.addresses[0] - - const registrationInProgress = this.state.registrationInProgress + const enoughMoney = nameIsSubdomain || walletBalance >= price - const acceptedWarning = this.state.acceptedWarning - - return ( - <div> - {this.state.alerts.map((alert, index) => - ( + return registration.error ? ( + <ErrorState message={registration.error} /> + ) : ( + <Box> + {this.state.alerts.map((alert, index) => ( <Alert key={index} message={alert.message} status={alert.status} /> - ) - )} - {enoughMoney ? - <div> - {nameIsSubdomain ? - <div className="text-center"> - <h3 className="modal-heading"> - Are you sure you want to register <strong>{name}</strong>? - </h3> - <p><strong>{name}</strong> is a free username.</p> + ))} + {enoughMoney ? ( + <Box> + {nameIsSubdomain ? ( + <SubdomainContent + loading={registrationInProgress} + name={name} + identityIndex={identityIndex} + doRegister={e => this.register(e)} + /> + ) : ( <div> - <button - onClick={this.register} - className="btn btn-primary btn-block" - disabled={registrationInProgress} - > - {registrationInProgress ? - <span>Registering...</span> - : - <span>Register</span> - } - </button> - <br /> - {registrationInProgress ? - null - : - <Link - to={`/profiles/i/add-username/${identityIndex}/search`} - className="btn btn-tertiary btn-block" - > - Back - </Link> - } - </div> - </div> - : - <div> - {acceptedWarning ? - <div> - <h3 className="modal-heading"> - Enter your password to register <strong>{name}</strong> - </h3> - <div className="text-center"> - <p>Requesting registration of <strong>{name} </strong> - will spend {price} bitcoins from your wallet. - </p> + {acceptedWarning ? ( + <div> + <h3 className="modal-heading"> + Enter your password to register <strong>{name}</strong> + </h3> + <div className="text-center"> + <p> + Requesting registration of <strong>{name} </strong> + will spend {price} bitcoins from your wallet. + </p> + </div> + <div> + <form onSubmit={this.register}> + <InputGroup + data={this.state} + onChange={this.onValueChange} + name="password" + label="Password" + placeholder="Password" + type="password" + required + /> + <button + type="submit" + onClick={this.register} + className="btn btn-primary btn-block" + disabled={registrationInProgress} + > + {registrationInProgress ? ( + <span>Generating registration transactions...</span> + ) : ( + <span>Request Registration</span> + )} + </button> + </form> + <br /> + {registrationInProgress ? null : ( + <Link + to={`/profiles/i/add-username/${identityIndex}/search`} + className="btn btn-tertiary btn-block" + > + Back + </Link> + )} + </div> </div> + ) : ( <div> - <form onSubmit={this.register}> - <InputGroup - data={this.state} - onChange={this.onValueChange} - name="password" - label="Password" - placeholder="Password" - type="password" - required - /> + <h3 className="modal-heading"> + Name Registration Disclaimer + </h3> + <div className="text-center"> + <p> + You’re about to create a registration request for{' '} + <strong>{name}</strong> + </p> + + <p>Please confirm you understand the following:</p> + <ul + style={{ + marginLeft: '20px', + marginRight: '20px', + textAlign: 'left' + }} + > + <li> + Registrations are a race & there's a small chance + someone else will win. + </li> + <li> + Registration requests have a fee regardless of the + outcome. + </li> + <li> + Fees are destroyed on the network and not sent to any + company. + </li> + </ul> <button - type="submit" - onClick={this.register} className="btn btn-primary btn-block" - disabled={registrationInProgress} + onClick={() => { + this.setState({ acceptedWarning: true }) + }} > - {registrationInProgress ? - <span>Generating registration transactions...</span> - : - <span>Request Registration</span> - } + I understand </button> - </form> - <br /> - {registrationInProgress ? - null - : <Link to={`/profiles/i/add-username/${identityIndex}/search`} className="btn btn-tertiary btn-block" > Back </Link> - } - </div> - </div> - : - <div> - <h3 className="modal-heading"> - Name Registration Disclaimer - </h3> - <div className="text-center"> - <p>You’re about to create a registration - request for <strong>{name}</strong></p> - - <p>Please confirm you understand the following:</p> - <ul - style={{ - marginLeft: '20px', - marginRight: '20px', - textAlign: 'left' - }} - > - <li>Registrations are a race & there's a small chance someone else will win. - </li> - <li>Registration requests have a fee regardless of the outcome.</li> - <li>Fees are destroyed on the network and not sent to any company.</li> - </ul> - <button - className="btn btn-primary btn-block" - onClick={() => { this.setState({ acceptedWarning: true }) }} - > - I understand - </button> - <Link - to={`/profiles/i/add-username/${identityIndex}/search`} - className="btn btn-tertiary btn-block" - > - Back - </Link> + </div> </div> - </div> - } - </div> - } - </div> - : + )} + </div> + )} + </Box> + ) : ( <div style={{ textAlign: 'center' }}> <h3 className="modal-heading">Buy {name}</h3> - <p>Send at least {price} bitcoins to your wallet:<br /> + <p> + Send at least {price} bitcoins to your wallet: + <br /> <strong>{walletAddress}</strong> </p> <div style={{ textAlign: 'center' }}> - {walletAddress ? - <QRCode - style={{ width: 256 }} - value={walletAddress} - /> - : - null - } + {walletAddress ? ( + <QRCode style={{ width: 256 }} value={walletAddress} /> + ) : null} <div> <div className="progress m-t-20 m-b-20"> <div @@ -421,7 +516,7 @@ class AddUsernameSelectPage extends Component { aria-valuemax="100" style={{ width: '100%' }} > - Waiting for payment... + Waiting for payment... </div> </div> <Link @@ -433,10 +528,13 @@ class AddUsernameSelectPage extends Component { </div> </div> </div> - } - </div> + )} + </Box> ) } } -export default connect(mapStateToProps, mapDispatchToProps)(AddUsernameSelectPage) +export default connect( + mapStateToProps, + mapDispatchToProps +)(AddUsernameSelectPage) From 29d7cdeaac629d7319735fbafe20cb1de8f2d5f6 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Fri, 5 Apr 2019 11:25:32 -0500 Subject: [PATCH 32/76] convert action back to fn --- app/js/profiles/store/registration/actions.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/js/profiles/store/registration/actions.js b/app/js/profiles/store/registration/actions.js index c6afb1938..f5795b7f3 100644 --- a/app/js/profiles/store/registration/actions.js +++ b/app/js/profiles/store/registration/actions.js @@ -16,9 +16,9 @@ import log4js from 'log4js' const logger = log4js.getLogger(__filename) -const profileUploading = { +const profileUploading = () => ({ type: types.PROFILE_UPLOADING -} +}) function profileUploadError(error) { return { @@ -190,7 +190,7 @@ const registerName = ( const profile = identity.profile || DEFAULT_PROFILE const signedProfileTokenData = signProfileForUpload(profile, keypair, api) - dispatch(profileUploading) + dispatch(profileUploading()) logger.info(`Uploading ${domainName} profile...`) try { const profileUrl = await uploadProfile( From 6a923731a17d3cfa5ad15b845cdb3506455ba212 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Fri, 5 Apr 2019 11:50:21 -0500 Subject: [PATCH 33/76] attempt to fix reducer tests --- .../store/registration/reducer.test.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/profiles/store/registration/reducer.test.js b/test/profiles/store/registration/reducer.test.js index b034bf1d0..cba1248f0 100644 --- a/test/profiles/store/registration/reducer.test.js +++ b/test/profiles/store/registration/reducer.test.js @@ -1,16 +1,13 @@ import { - RegistrationActions, RegistrationReducer + RegistrationActions, + RegistrationReducer } from '../../../../app/js/profiles/store/registration' -const initialState = { - -} +const initialState = {} describe('Registration Store: RegistrationReducer', () => { it('should return the proper initial state', () => { - assert.deepEqual( - RegistrationReducer(undefined, {}), - initialState) + assert.deepEqual(RegistrationReducer(undefined, {}), initialState) }) describe('Registration Store: RegistrationReducer: successful registration', () => { @@ -32,7 +29,8 @@ describe('Registration Store: RegistrationReducer', () => { preventRegistration: true, error: null, profileUploading: false, - registrationSubmitting: true + registrationSubmitting: true, + registrationSubmitted: false } const action = RegistrationActions.registrationSubmitting() actualState = RegistrationReducer(actualState, action) @@ -98,7 +96,8 @@ describe('Registration Store: RegistrationReducer', () => { preventRegistration: true, error: null, profileUploading: false, - registrationSubmitting: true + registrationSubmitting: true, + registrationSubmitted: false } const action = RegistrationActions.registrationSubmitting() actualState = RegistrationReducer(actualState, action) @@ -110,7 +109,8 @@ describe('Registration Store: RegistrationReducer', () => { preventRegistration: false, error: 'Core error', profileUploading: false, - registrationSubmitting: false + registrationSubmitting: false, + registrationSubmitted: false } const action = RegistrationActions.registrationError('Core error') actualState = RegistrationReducer(actualState, action) From 16349dc8a75f289178a9d237fa595165260c3fda Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Fri, 5 Apr 2019 14:27:17 -0500 Subject: [PATCH 34/76] don't pass objects to error action --- app/js/profiles/store/registration/actions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/js/profiles/store/registration/actions.js b/app/js/profiles/store/registration/actions.js index f5795b7f3..ff8ff94ae 100644 --- a/app/js/profiles/store/registration/actions.js +++ b/app/js/profiles/store/registration/actions.js @@ -286,13 +286,13 @@ const registerName = ( } } catch (e) { logger.error('registerName: error uploading profile', e) - dispatch(profileUploadError(e)) + dispatch(profileUploadError(e.message)) throw e } } } catch (e) { logger.error('registerName: error', e) - dispatch(registrationError(e)) + dispatch(registrationError(e.message)) } } From 7be183e3bc893d88af39a54d91699d2f69d2ca35 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 9 Apr 2019 09:07:18 -0400 Subject: [PATCH 35/76] Update config.yml --- .circleci/config.yml | 99 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7f19197e9..d637a4554 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,33 @@ version: 2 jobs: + my-repo: + docker: + - image: circleci/python:2.7.13 + working_directory: ~/repo + steps: + - run: + name: Repo Check 1 + command: | + if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/tim/tim-repo.git" ]; then + exit 0 + # else + # exit 1 + fi + + forked-repo: + docker: + - image: circleci/python:2.7.13 + working_directory: ~/repo + steps: + - run: + name: Repo Check 2 + command: | + if [ "$CIRCLE_REPOSITORY_URL" != "https://github.com/tim/tim-repo.git" ]; then + exit 0 + # else + # exit 1 + fi + build: docker: - image: circleci/node:10.15.1 @@ -49,11 +77,74 @@ jobs: - run: npm run test-e2e:browserstack - store_artifacts: path: /tmp/test-errors + + test-e2e-login-local: + docker: + - image: circleci/node:10.15.1 + environment: + TEST_E2E_GREP: login-to-hello-blockstack-app + working_directory: ~/repo + steps: + - checkout + - run: npm install + - run: npm run test-e2e:localBuild + - store_artifacts: + path: /tmp/test-errors + test-e2e-account-creation-local: + docker: + - image: circleci/node:10.15.1 + environment: + TEST_E2E_GREP: account-creation + working_directory: ~/repo + steps: + - checkout + - run: npm install + - run: npm run test-e2e:localBuild + - store_artifacts: + path: /tmp/test-errors + test-e2e-account-recovery-local: + docker: + - image: circleci/node:10.15.1 + environment: + TEST_E2E_GREP: account-recovery + working_directory: ~/repo + steps: + - checkout + - run: npm install + - run: npm run test-e2e:localbuild + - store_artifacts: + path: /tmp/test-errors + workflows: version: 2 build_and_test-e2e: jobs: - - build - - test-e2e-login - - test-e2e-account-creation - - test-e2e-account-recovery \ No newline at end of file + - my-repo + - build: + requires: + - my-repo + - test-e2e-login: + requires: + - my-repo + - test-e2e-account-creation: + requires: + - my-repo + - test-e2e-account-recovery: + requires: + - my-repo + + build_and_test-e2e-local: + jobs: + - forked-repo + - build: + requires: + - forked-repo + - test-e2e-login-local: + requires: + - forked-repo + - test-e2e-account-creation-local: + requires: + - forked-repo + - test-e2e-account-recovery-local: + requires: + - forked-repo From fff603d07cfdb9e04ee7016586bc8ffc8686ff29 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 9 Apr 2019 09:25:34 -0400 Subject: [PATCH 36/76] change repo --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d637a4554..f2468a936 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,7 +8,7 @@ jobs: - run: name: Repo Check 1 command: | - if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/tim/tim-repo.git" ]; then + if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then exit 0 # else # exit 1 @@ -22,7 +22,7 @@ jobs: - run: name: Repo Check 2 command: | - if [ "$CIRCLE_REPOSITORY_URL" != "https://github.com/tim/tim-repo.git" ]; then + if [ "$CIRCLE_REPOSITORY_URL" != "https://github.com/blockstack/blockstack-browser.git" ]; then exit 0 # else # exit 1 From a0cf041523a7ad3ca231d0b703401f51e92cc346 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 9 Apr 2019 09:50:07 -0400 Subject: [PATCH 37/76] Update config.yml --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f2468a936..cda26f73a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,8 +10,8 @@ jobs: command: | if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then exit 0 - # else - # exit 1 + else + exit 1 fi forked-repo: @@ -24,8 +24,8 @@ jobs: command: | if [ "$CIRCLE_REPOSITORY_URL" != "https://github.com/blockstack/blockstack-browser.git" ]; then exit 0 - # else - # exit 1 + else + exit 1 fi build: From 06ea93e7a594c6f4ae3510e380c5d3ecfca3929a Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Tue, 9 Apr 2019 09:11:24 -0500 Subject: [PATCH 38/76] remove navbar test --- test/components/Navbar.test.js | 62 ---------------------------------- 1 file changed, 62 deletions(-) delete mode 100644 test/components/Navbar.test.js diff --git a/test/components/Navbar.test.js b/test/components/Navbar.test.js deleted file mode 100644 index 412226e8a..000000000 --- a/test/components/Navbar.test.js +++ /dev/null @@ -1,62 +0,0 @@ -import React from 'react' -import { expect } from 'chai' -import { shallow } from 'enzyme' -import Navbar, { ICONS } from '../../app/js/components/Navbar' - -describe('<Navbar />', () => { - describe('renders the component', () => { - const wrapper = shallow(<Navbar />) - - it('creates four <Link /> tags', () => { - expect(wrapper.find('Link')).to.have.length(4) - }) - }) - - const tabDetails = [ - { - name: 'home', - activeIcon: ICONS.homeNavActive, - regularIcon: ICONS.homeNav - }, - { - name:'settings', - activeIcon: ICONS.settingsNavActive, - regularIcon: ICONS.settingsNav - }, - { - name:'wallet', - activeIcon: ICONS.walletNavActive, - regularIcon: ICONS.walletNav - }, - { - name: 'profile', - prop: 'avatar', - activeIcon: ICONS.avatarNavActive, - regularIcon: ICONS.avatarNav - }] - - tabDetails.forEach((tab) => { - describe( - `renders the component with active ${tab.name} tab`, () => { - const props = { - activeTab: tab.prop || tab.name - } - - const wrapper = shallow(<Navbar {...props} />) - - it(`uses the active ${tab.name} tab icon`, () => { - expect(wrapper.find(`img[src="${tab.activeIcon}"]`) - .exists()).to.equal(true) - }) - - const tabs = tabDetails.filter(temp => temp.name !== tab.name) - - tabs.forEach((innerLoopTab) => { - it(`uses the regular ${innerLoopTab.name} tab icon`, () => { - expect(wrapper.find(`img[src="${innerLoopTab.regularIcon}"]`) - .exists()).to.equal(true) - }) - }) - }) - }) -}) From 4191752609e0c7a7f65c990133c3be9cf6dcd019 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 9 Apr 2019 10:48:05 -0400 Subject: [PATCH 39/76] Update config.yml --- .circleci/config.yml | 149 ++++++++++++------------------------------- 1 file changed, 42 insertions(+), 107 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cda26f73a..3903c0c08 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,33 +1,5 @@ version: 2 jobs: - my-repo: - docker: - - image: circleci/python:2.7.13 - working_directory: ~/repo - steps: - - run: - name: Repo Check 1 - command: | - if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then - exit 0 - else - exit 1 - fi - - forked-repo: - docker: - - image: circleci/python:2.7.13 - working_directory: ~/repo - steps: - - run: - name: Repo Check 2 - command: | - if [ "$CIRCLE_REPOSITORY_URL" != "https://github.com/blockstack/blockstack-browser.git" ]; then - exit 0 - else - exit 1 - fi - build: docker: - image: circleci/node:10.15.1 @@ -41,77 +13,65 @@ jobs: - run: npm run test # build - run: npm run prod-webapp + test-e2e-login: docker: - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: login-to-hello-blockstack-app working_directory: ~/repo steps: - checkout - - run: npm install - - run: npm run test-e2e:browserstack + - run: + name: Repo Check 1 + command: | + if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then + export TEST_E2E_GREP=login-to-hello-blockstack-app + npm install && npm run test-e2e:browserstack + else + export TEST_E2E_GREP=login-to-hello-blockstack-app + npm install && npm run test-e2e:localBuild + exit 1 + fi - store_artifacts: path: /tmp/test-errors + + test-e2e-account-creation: docker: - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: account-creation working_directory: ~/repo steps: - checkout - - run: npm install - - run: npm run test-e2e:browserstack - - store_artifacts: - path: /tmp/test-errors - test-e2e-account-recovery: - docker: - - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: account-recovery - working_directory: ~/repo - steps: - - checkout - - run: npm install - - run: npm run test-e2e:browserstack + - run: + name: Repo Check 2 + command: | + if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then + export TEST_E2E_GREP=account-creation + npm install && npm run test-e2e:browserstack + else + export TEST_E2E_GREP=account-creation + npm install && npm run test-e2e:localBuild + exit 1 + fi - store_artifacts: path: /tmp/test-errors - test-e2e-login-local: - docker: - - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: login-to-hello-blockstack-app - working_directory: ~/repo - steps: - - checkout - - run: npm install - - run: npm run test-e2e:localBuild - - store_artifacts: - path: /tmp/test-errors - test-e2e-account-creation-local: - docker: - - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: account-creation - working_directory: ~/repo - steps: - - checkout - - run: npm install - - run: npm run test-e2e:localBuild - - store_artifacts: - path: /tmp/test-errors - test-e2e-account-recovery-local: + test-e2e-account-recovery: docker: - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: account-recovery - working_directory: ~/repo + working_directory: ~/repo steps: - checkout - - run: npm install - - run: npm run test-e2e:localbuild + - run: + name: Repo Check 3 + command: | + if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then + export TEST_E2E_GREP=account-recovery + npm install && npm run test-e2e:browserstack + else + export TEST_E2E_GREP=account-recovery + npm install && npm run test-e2e:localBuild + exit 1 + fi - store_artifacts: path: /tmp/test-errors @@ -119,32 +79,7 @@ workflows: version: 2 build_and_test-e2e: jobs: - - my-repo - - build: - requires: - - my-repo - - test-e2e-login: - requires: - - my-repo - - test-e2e-account-creation: - requires: - - my-repo - - test-e2e-account-recovery: - requires: - - my-repo - - build_and_test-e2e-local: - jobs: - - forked-repo - - build: - requires: - - forked-repo - - test-e2e-login-local: - requires: - - forked-repo - - test-e2e-account-creation-local: - requires: - - forked-repo - - test-e2e-account-recovery-local: - requires: - - forked-repo + - build + - test-e2e-login + - test-e2e-account-creation + - test-e2e-account-recovery From 643a626190f9fe2cb9e6b3663ac6be59d78554b2 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 9 Apr 2019 11:04:14 -0400 Subject: [PATCH 40/76] Update config.yml --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3903c0c08..1004912bf 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -22,7 +22,7 @@ jobs: - checkout - run: name: Repo Check 1 - command: | + command: - | if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then export TEST_E2E_GREP=login-to-hello-blockstack-app npm install && npm run test-e2e:browserstack @@ -43,7 +43,7 @@ jobs: - checkout - run: name: Repo Check 2 - command: | + command: - | if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then export TEST_E2E_GREP=account-creation npm install && npm run test-e2e:browserstack @@ -63,7 +63,7 @@ jobs: - checkout - run: name: Repo Check 3 - command: | + command: - | if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then export TEST_E2E_GREP=account-recovery npm install && npm run test-e2e:browserstack From 116b1cc66ebe440de1f7acb62744da5cd6f762b1 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 9 Apr 2019 11:05:27 -0400 Subject: [PATCH 41/76] Update config.yml --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1004912bf..3903c0c08 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -22,7 +22,7 @@ jobs: - checkout - run: name: Repo Check 1 - command: - | + command: | if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then export TEST_E2E_GREP=login-to-hello-blockstack-app npm install && npm run test-e2e:browserstack @@ -43,7 +43,7 @@ jobs: - checkout - run: name: Repo Check 2 - command: - | + command: | if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then export TEST_E2E_GREP=account-creation npm install && npm run test-e2e:browserstack @@ -63,7 +63,7 @@ jobs: - checkout - run: name: Repo Check 3 - command: - | + command: | if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then export TEST_E2E_GREP=account-recovery npm install && npm run test-e2e:browserstack From 613a8fd5a4913a07313a8afa7c7a1010ccd8e19a Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 9 Apr 2019 11:08:13 -0400 Subject: [PATCH 42/76] Update config.yml --- .circleci/config.yml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3903c0c08..557a7e5e7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,19 +1,5 @@ version: 2 jobs: - build: - docker: - - image: circleci/node:10.15.1 - working_directory: ~/repo - steps: - - checkout - - run: - name: Install Dependencies - command: npm install - # test - - run: npm run test - # build - - run: npm run prod-webapp - test-e2e-login: docker: - image: circleci/node:10.15.1 @@ -79,7 +65,6 @@ workflows: version: 2 build_and_test-e2e: jobs: - - build - test-e2e-login - test-e2e-account-creation - test-e2e-account-recovery From d58d0d313b69544c4189a448977a8319d6ee69f0 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 9 Apr 2019 11:20:05 -0400 Subject: [PATCH 43/76] Update config.yml --- .circleci/config.yml | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 557a7e5e7..1fccd554a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,20 +1,33 @@ version: 2 jobs: + build: + docker: + - image: circleci/node:10.15.1 + working_directory: ~/repo + steps: + - checkout + - run: + name: Install Dependencies + command: npm install + # test + - run: npm run test + # build + - run: npm run prod-webapp + test-e2e-login: docker: - image: circleci/node:10.15.1 working_directory: ~/repo steps: - checkout + - run: npm install - run: name: Repo Check 1 command: | if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then - export TEST_E2E_GREP=login-to-hello-blockstack-app - npm install && npm run test-e2e:browserstack + TEST_E2E_GREP=login-to-hello-blockstack-app npm run test-e2e:browserstack else - export TEST_E2E_GREP=login-to-hello-blockstack-app - npm install && npm run test-e2e:localBuild + TEST_E2E_GREP=login-to-hello-blockstack-app npm run test-e2e:localBuild exit 1 fi - store_artifacts: @@ -27,15 +40,14 @@ jobs: working_directory: ~/repo steps: - checkout + - run: npm install - run: name: Repo Check 2 command: | if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then - export TEST_E2E_GREP=account-creation - npm install && npm run test-e2e:browserstack + TEST_E2E_GREP=account-creation npm run test-e2e:browserstack else - export TEST_E2E_GREP=account-creation - npm install && npm run test-e2e:localBuild + TEST_E2E_GREP=account-creation npm run test-e2e:localBuild exit 1 fi - store_artifacts: @@ -47,15 +59,14 @@ jobs: working_directory: ~/repo steps: - checkout + - run: npm install - run: name: Repo Check 3 command: | if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then - export TEST_E2E_GREP=account-recovery - npm install && npm run test-e2e:browserstack + TEST_E2E_GREP=account-recovery npm run test-e2e:browserstack else - export TEST_E2E_GREP=account-recovery - npm install && npm run test-e2e:localBuild + TEST_E2E_GREP=account-recovery npm run test-e2e:localBuild exit 1 fi - store_artifacts: @@ -65,6 +76,7 @@ workflows: version: 2 build_and_test-e2e: jobs: + - build - test-e2e-login - test-e2e-account-creation - test-e2e-account-recovery From 2f271fd602833f737ba2ab5d46d513b12f126f2b Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 9 Apr 2019 12:34:46 -0400 Subject: [PATCH 44/76] Update config.yml --- .circleci/config.yml | 69 +++++--------------------------------------- 1 file changed, 7 insertions(+), 62 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1fccd554a..37c86bdbb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,72 +1,20 @@ version: 2 jobs: - build: + build_and_test_e2e: docker: - image: circleci/node:10.15.1 working_directory: ~/repo steps: - checkout - - run: - name: Install Dependencies - command: npm install - # test - - run: npm run test - # build - - run: npm run prod-webapp - - test-e2e-login: - docker: - - image: circleci/node:10.15.1 - working_directory: ~/repo - steps: - - checkout - - run: npm install - run: name: Repo Check 1 command: | if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then - TEST_E2E_GREP=login-to-hello-blockstack-app npm run test-e2e:browserstack - else - TEST_E2E_GREP=login-to-hello-blockstack-app npm run test-e2e:localBuild - exit 1 - fi - - store_artifacts: - path: /tmp/test-errors - - - test-e2e-account-creation: - docker: - - image: circleci/node:10.15.1 - working_directory: ~/repo - steps: - - checkout - - run: npm install - - run: - name: Repo Check 2 - command: | - if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then - TEST_E2E_GREP=account-creation npm run test-e2e:browserstack - else - TEST_E2E_GREP=account-creation npm run test-e2e:localBuild - exit 1 - fi - - store_artifacts: - path: /tmp/test-errors - - test-e2e-account-recovery: - docker: - - image: circleci/node:10.15.1 - working_directory: ~/repo - steps: - - checkout - - run: npm install - - run: - name: Repo Check 3 - command: | - if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then - TEST_E2E_GREP=account-recovery npm run test-e2e:browserstack + export TEST_E2E_GREP=account-creation + npm install && npm run test-e2e:browserstack else - TEST_E2E_GREP=account-recovery npm run test-e2e:localBuild + export TEST_E2E_GREP=account-creation + npm install && npm run test-e2e:localBuild exit 1 fi - store_artifacts: @@ -74,9 +22,6 @@ jobs: workflows: version: 2 - build_and_test-e2e: + build_and_test_e2e_local_or_remote-e2e: jobs: - - build - - test-e2e-login - - test-e2e-account-creation - - test-e2e-account-recovery + - build_and_test_e2e From 2282b7dc60b0b3efd5ebbac7df42b2dcf287c257 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 13:49:48 -0400 Subject: [PATCH 45/76] Update config.yml --- .circleci/config.yml | 111 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 97 insertions(+), 14 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 37c86bdbb..b6109c3db 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,27 +1,110 @@ version: 2 jobs: - build_and_test_e2e: + build: docker: - image: circleci/node:10.15.1 working_directory: ~/repo steps: - checkout - run: - name: Repo Check 1 - command: | - if [ "$CIRCLE_REPOSITORY_URL" == "https://github.com/blockstack/blockstack-browser.git" ]; then - export TEST_E2E_GREP=account-creation - npm install && npm run test-e2e:browserstack - else - export TEST_E2E_GREP=account-creation - npm install && npm run test-e2e:localBuild - exit 1 - fi + name: Install Dependencies + command: npm install + # test + - run: npm run test + # build + - run: npm run prod-webapp + test-e2e-login: + docker: + - image: circleci/node:10.15.1 + environment: + TEST_E2E_GREP: login-to-hello-blockstack-app + working_directory: ~/repo + steps: + - checkout + - run: npm install + - run: npm run test-e2e:browserstack + - store_artifacts: + path: /tmp/test-errors + test-e2e-account-creation: + docker: + - image: circleci/node:10.15.1 + environment: + TEST_E2E_GREP: account-creation + working_directory: ~/repo + steps: + - checkout + - run: npm install + - run: npm run test-e2e:browserstack + - store_artifacts: + path: /tmp/test-errors + test-e2e-account-recovery: + docker: + - image: circleci/node:10.15.1 + environment: + TEST_E2E_GREP: account-recovery + working_directory: ~/repo + steps: + - checkout + - run: npm install + - run: npm run test-e2e:browserstack + - store_artifacts: + path: /tmp/test-errors + test-e2e-login-local: + docker: + - image: circleci/node:10.15.1 + environment: + TEST_E2E_GREP: login-to-hello-blockstack-app + working_directory: ~/repo + steps: + - checkout + - run: npm install + - run: npm run test-e2e:localBuild + - store_artifacts: + path: /tmp/test-errors + test-e2e-account-creation-local: + docker: + - image: circleci/node:10.15.1 + environment: + TEST_E2E_GREP: account-creation + working_directory: ~/repo + steps: + - checkout + - run: npm install + - run: npm run test-e2e:localBuild + - store_artifacts: + path: /tmp/test-errors + test-e2e-account-recovery-local: + docker: + - image: circleci/node:10.15.1 + environment: + TEST_E2E_GREP: account-recovery + working_directory: ~/repo + steps: + - checkout + - run: npm install + - run: npm run test-e2e:localbuild - store_artifacts: path: /tmp/test-errors - workflows: version: 2 - build_and_test_e2e_local_or_remote-e2e: + build_and_test-e2e: + jobs: + - forks_only: + filters: + branches: + # only from forks + only: /^pull\/.*$/ + - build + - test-e2e-login + - test-e2e-account-creation + - test-e2e-account-recovery jobs: - - build_and_test_e2e + - canonical_repo_only: + filters: + branches: + # only from canonical repository + only: /^(?!pull\/).*$/ + - build + - test-e2e-login-local + - test-e2e-account-creation-local + - test-e2e-account-recovery-local From b9b38f8a7f1754c922111f7a9534b1e0b14e35e8 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 15:05:23 -0400 Subject: [PATCH 46/76] Update config.yml --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b6109c3db..be7b322c8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -92,8 +92,8 @@ workflows: - forks_only: filters: branches: - # only from forks - only: /^pull\/.*$/ + # only from canonical repository + only: /^(?!pull\/).*$/ - build - test-e2e-login - test-e2e-account-creation @@ -102,8 +102,8 @@ workflows: - canonical_repo_only: filters: branches: - # only from canonical repository - only: /^(?!pull\/).*$/ + # only from forks + only: /^pull\/.*$/ - build - test-e2e-login-local - test-e2e-account-creation-local From 50ab7f4851a8f37d011d9b69bc6aebdded0d7bd6 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 15:08:13 -0400 Subject: [PATCH 47/76] Update config.yml --- .circleci/config.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index be7b322c8..aac750764 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -89,16 +89,15 @@ workflows: version: 2 build_and_test-e2e: jobs: + - build - forks_only: filters: branches: # only from canonical repository only: /^(?!pull\/).*$/ - - build - test-e2e-login - test-e2e-account-creation - test-e2e-account-recovery - jobs: - canonical_repo_only: filters: branches: From 425081117c8d56ae4025a01dc46d96cdb7c9c0e9 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 16:06:34 -0400 Subject: [PATCH 48/76] Update config.yml --- .circleci/config.yml | 73 ++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index aac750764..0989e121c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,33 @@ version: 2 jobs: + my-repo: + docker: + - image: circleci/python:2.7.13 + working_directory: ~/repo + steps: + - run: + name: Repo Check 1 + command: | + if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com/blockstack/blockstack-browser.git" ]; then + exit 0 + else + echo "this is a forked repo hence failing." + exit 1 + fi + forked-repo: + docker: + - image: circleci/python:2.7.13 + working_directory: ~/repo + steps: + - run: + name: Repo Check 2 + command: | + if [ "$CIRCLE_REPOSITORY_URL" != "git@github.com/blockstack/blockstack-browser.git" ]; then + exit 0 + else + echo "This is not a forked repo, hence the fail." + exit 1 + fi build: docker: - image: circleci/node:10.15.1 @@ -49,6 +77,7 @@ jobs: - run: npm run test-e2e:browserstack - store_artifacts: path: /tmp/test-errors + test-e2e-login-local: docker: - image: circleci/node:10.15.1 @@ -87,23 +116,29 @@ jobs: path: /tmp/test-errors workflows: version: 2 - build_and_test-e2e: + build_and_test-e2e-account: + jobs: + - build: + - requires: + - my-repo + - test-e2e-login: + - requires: + - my-repo + - test-e2e-account-creation: + - requires: + - my-repo + - test-e2e-account-recovery: + - requires: + - my-repo + + build_and_test-e2e-account-local: jobs: - - build - - forks_only: - filters: - branches: - # only from canonical repository - only: /^(?!pull\/).*$/ - - test-e2e-login - - test-e2e-account-creation - - test-e2e-account-recovery - - canonical_repo_only: - filters: - branches: - # only from forks - only: /^pull\/.*$/ - - build - - test-e2e-login-local - - test-e2e-account-creation-local - - test-e2e-account-recovery-local + - test-e2e-login-local: + - requires: + - forked-repo + - test-e2e-account-creation-local: + - requires: + - forked-repo + - test-e2e-account-recovery-local: + - requires: + - forked-repo From 87f04a98d6188206eb35a56ca9e17da563999fc7 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 16:09:22 -0400 Subject: [PATCH 49/76] Update config.yml --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0989e121c..b2118f05a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2 jobs: my-repo: docker: - - image: circleci/python:2.7.13 + - image: circleci/node:10.15.1 working_directory: ~/repo steps: - run: @@ -16,7 +16,7 @@ jobs: fi forked-repo: docker: - - image: circleci/python:2.7.13 + - image: circleci/node:10.15.1 working_directory: ~/repo steps: - run: From 54553572959960b62236db1f1795d7d8246d2447 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 16:14:31 -0400 Subject: [PATCH 50/76] Update config.yml --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index b2118f05a..a69994347 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -133,6 +133,7 @@ workflows: build_and_test-e2e-account-local: jobs: + - build: - test-e2e-login-local: - requires: - forked-repo From 21d8bb636d5e4c012c24e45503d8f962b22ac3ce Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 16:18:47 -0400 Subject: [PATCH 51/76] Update config.yml --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index a69994347..909d793b5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -134,6 +134,8 @@ workflows: build_and_test-e2e-account-local: jobs: - build: + - requires: + - forked-repo - test-e2e-login-local: - requires: - forked-repo From aa35b9ad65176747d5bff827814bf0e76c41f4f2 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 16:21:56 -0400 Subject: [PATCH 52/76] Update config.yml --- .circleci/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 909d793b5..b2118f05a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -133,9 +133,6 @@ workflows: build_and_test-e2e-account-local: jobs: - - build: - - requires: - - forked-repo - test-e2e-login-local: - requires: - forked-repo From 07814780d2e3ea191cfb649fd2f9344a794bcd45 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 18:15:01 -0400 Subject: [PATCH 53/76] Update config.yml --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b2118f05a..07cc4332c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,7 +8,7 @@ jobs: - run: name: Repo Check 1 command: | - if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com/blockstack/blockstack-browser.git" ]; then + if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then exit 0 else echo "this is a forked repo hence failing." @@ -22,7 +22,7 @@ jobs: - run: name: Repo Check 2 command: | - if [ "$CIRCLE_REPOSITORY_URL" != "git@github.com/blockstack/blockstack-browser.git" ]; then + if [ "$CIRCLE_REPOSITORY_URL" != "git@github.com:blockstack/blockstack-browser.git" ]; then exit 0 else echo "This is not a forked repo, hence the fail." From a99e3de76463414dcfce51a44ef2a713b14bade5 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 18:39:00 -0400 Subject: [PATCH 54/76] Update config.yml --- .circleci/config.yml | 135 ++----------------------------------------- 1 file changed, 6 insertions(+), 129 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 07cc4332c..963892162 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,144 +1,21 @@ version: 2 jobs: - my-repo: + build_and_test_e2e: docker: - image: circleci/node:10.15.1 working_directory: ~/repo steps: + - checkout - run: name: Repo Check 1 command: | - if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then - exit 0 - else - echo "this is a forked repo hence failing." - exit 1 - fi - forked-repo: - docker: - - image: circleci/node:10.15.1 - working_directory: ~/repo - steps: - - run: - name: Repo Check 2 - command: | - if [ "$CIRCLE_REPOSITORY_URL" != "git@github.com:blockstack/blockstack-browser.git" ]; then - exit 0 - else - echo "This is not a forked repo, hence the fail." - exit 1 - fi - build: - docker: - - image: circleci/node:10.15.1 - working_directory: ~/repo - steps: - - checkout - - run: - name: Install Dependencies - command: npm install - # test - - run: npm run test - # build - - run: npm run prod-webapp - test-e2e-login: - docker: - - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: login-to-hello-blockstack-app - working_directory: ~/repo - steps: - - checkout - - run: npm install - - run: npm run test-e2e:browserstack - - store_artifacts: - path: /tmp/test-errors - test-e2e-account-creation: - docker: - - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: account-creation - working_directory: ~/repo - steps: - - checkout - - run: npm install - - run: npm run test-e2e:browserstack - - store_artifacts: - path: /tmp/test-errors - test-e2e-account-recovery: - docker: - - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: account-recovery - working_directory: ~/repo - steps: - - checkout - - run: npm install - - run: npm run test-e2e:browserstack + echo $CIRCLE_REPOSITORY_URL + - store_artifacts: path: /tmp/test-errors - test-e2e-login-local: - docker: - - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: login-to-hello-blockstack-app - working_directory: ~/repo - steps: - - checkout - - run: npm install - - run: npm run test-e2e:localBuild - - store_artifacts: - path: /tmp/test-errors - test-e2e-account-creation-local: - docker: - - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: account-creation - working_directory: ~/repo - steps: - - checkout - - run: npm install - - run: npm run test-e2e:localBuild - - store_artifacts: - path: /tmp/test-errors - test-e2e-account-recovery-local: - docker: - - image: circleci/node:10.15.1 - environment: - TEST_E2E_GREP: account-recovery - working_directory: ~/repo - steps: - - checkout - - run: npm install - - run: npm run test-e2e:localbuild - - store_artifacts: - path: /tmp/test-errors workflows: version: 2 - build_and_test-e2e-account: - jobs: - - build: - - requires: - - my-repo - - test-e2e-login: - - requires: - - my-repo - - test-e2e-account-creation: - - requires: - - my-repo - - test-e2e-account-recovery: - - requires: - - my-repo - - build_and_test-e2e-account-local: + build_and_test_e2e_local_or_remote-e2e: jobs: - - test-e2e-login-local: - - requires: - - forked-repo - - test-e2e-account-creation-local: - - requires: - - forked-repo - - test-e2e-account-recovery-local: - - requires: - - forked-repo + - build_and_test_e2e From effdd189b8b9789973800f9d6a9c442914f857ed Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 18:44:06 -0400 Subject: [PATCH 55/76] Update config.yml --- .circleci/config.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 963892162..1dc35c2e5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,3 +1,4 @@ + version: 2 jobs: build_and_test_e2e: @@ -9,8 +10,14 @@ jobs: - run: name: Repo Check 1 command: | - echo $CIRCLE_REPOSITORY_URL - + if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then + export TEST_E2E_GREP=account-creation + npm install && npm run test-e2e:browserstack + else + export TEST_E2E_GREP=account-creation + npm install && npm run test-e2e:localBuild + exit 1 + fi - store_artifacts: path: /tmp/test-errors From ef780fb3242b24d716c392a29fd4d16dd5994afa Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 19:25:23 -0400 Subject: [PATCH 56/76] Update config.yml --- .circleci/config.yml | 45 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1dc35c2e5..a45516f26 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,7 +1,26 @@ version: 2 jobs: - build_and_test_e2e: + test-e2e-login: + docker: + - image: circleci/node:10.15.1 + working_directory: ~/repo + steps: + - checkout + - run: + name: Repo Check 1 + command: | + if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then + export TEST_E2E_GREP=login-to-hello-blockstack-app + npm install && npm run test-e2e:browserstack + else + export TEST_E2E_GREP=login-to-hello-blockstack-app + npm install && npm run test-e2e:localBuild + exit 1 + fi + - store_artifacts: + path: /tmp/test-errors + test-e2e-account-creation: docker: - image: circleci/node:10.15.1 working_directory: ~/repo @@ -20,9 +39,29 @@ jobs: fi - store_artifacts: path: /tmp/test-errors - + test-e2e-account-recovery: + docker: + - image: circleci/node:10.15.1 + working_directory: ~/repo + steps: + - checkout + - run: + name: Repo Check 1 + command: | + if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then + export TEST_E2E_GREP=account-recovery + npm install && npm run test-e2e:browserstack + else + export TEST_E2E_GREP=account-recovery + npm install && npm run test-e2e:localBuild + exit 1 + fi + - store_artifacts: + path: /tmp/test-errors workflows: version: 2 build_and_test_e2e_local_or_remote-e2e: jobs: - - build_and_test_e2e + - test-e2e-login: + - test-e2e-account-creation: + - test-e2e-account-recovery From 7bc97c1dca95aff8b321d93b569674be8471d239 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 19:28:19 -0400 Subject: [PATCH 57/76] Update config.yml --- .circleci/config.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a45516f26..6c82c3da4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,3 @@ - version: 2 jobs: test-e2e-login: @@ -27,7 +26,7 @@ jobs: steps: - checkout - run: - name: Repo Check 1 + name: Repo Check 2 command: | if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then export TEST_E2E_GREP=account-creation @@ -46,7 +45,7 @@ jobs: steps: - checkout - run: - name: Repo Check 1 + name: Repo Check 3 command: | if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then export TEST_E2E_GREP=account-recovery From 3939f0f3e00d4abfadc252257075a682fd7a5f9d Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 19:30:50 -0400 Subject: [PATCH 58/76] Update config.yml --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6c82c3da4..48a751b22 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -61,6 +61,6 @@ workflows: version: 2 build_and_test_e2e_local_or_remote-e2e: jobs: - - test-e2e-login: - - test-e2e-account-creation: + - test-e2e-login + - test-e2e-account-creation - test-e2e-account-recovery From 8d4f8092b597f9d3331e6c9a1d61878cba863532 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 21:01:50 -0400 Subject: [PATCH 59/76] Update config.yml --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 48a751b22..4bab1c57d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2 jobs: test-e2e-login: docker: - - image: circleci/node:10.15.1 + - image: circleci/node:10.15.1-node-browsers working_directory: ~/repo steps: - checkout @@ -21,7 +21,7 @@ jobs: path: /tmp/test-errors test-e2e-account-creation: docker: - - image: circleci/node:10.15.1 + - image: circleci/node:10.15.1-node-browsers working_directory: ~/repo steps: - checkout @@ -40,7 +40,7 @@ jobs: path: /tmp/test-errors test-e2e-account-recovery: docker: - - image: circleci/node:10.15.1 + - image: circleci/node:10.15.1-node-browsers working_directory: ~/repo steps: - checkout From db48df6127cdeaa7b8340586a8279746af625c2c Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 21:05:16 -0400 Subject: [PATCH 60/76] Update config.yml --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4bab1c57d..b2a565349 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2 jobs: test-e2e-login: docker: - - image: circleci/node:10.15.1-node-browsers + - image: circleci/node:10.15.1-browsers working_directory: ~/repo steps: - checkout @@ -21,7 +21,7 @@ jobs: path: /tmp/test-errors test-e2e-account-creation: docker: - - image: circleci/node:10.15.1-node-browsers + - image: circleci/node:10.15.1-browsers working_directory: ~/repo steps: - checkout @@ -40,7 +40,7 @@ jobs: path: /tmp/test-errors test-e2e-account-recovery: docker: - - image: circleci/node:10.15.1-node-browsers + - image: circleci/node:10.15.1-browsers working_directory: ~/repo steps: - checkout From 7a85e79bb6aa5c9bcfe6d06a5c0548dc1611a378 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 21:07:46 -0400 Subject: [PATCH 61/76] Update config.yml --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b2a565349..bf3a28867 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,7 +9,7 @@ jobs: - run: name: Repo Check 1 command: | - if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then + if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:tim/blockstack-browser.git" ]; then export TEST_E2E_GREP=login-to-hello-blockstack-app npm install && npm run test-e2e:browserstack else @@ -28,7 +28,7 @@ jobs: - run: name: Repo Check 2 command: | - if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then + if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:tim/blockstack-browser.git" ]; then export TEST_E2E_GREP=account-creation npm install && npm run test-e2e:browserstack else @@ -47,7 +47,7 @@ jobs: - run: name: Repo Check 3 command: | - if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then + if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:tim/blockstack-browser.git" ]; then export TEST_E2E_GREP=account-recovery npm install && npm run test-e2e:browserstack else From 9b8cda4a61c2348240c1fa53cda754598f0a876c Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 10 Apr 2019 21:22:06 -0400 Subject: [PATCH 62/76] Update config.yml --- .circleci/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bf3a28867..28a02fae7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,7 +15,6 @@ jobs: else export TEST_E2E_GREP=login-to-hello-blockstack-app npm install && npm run test-e2e:localBuild - exit 1 fi - store_artifacts: path: /tmp/test-errors @@ -34,7 +33,6 @@ jobs: else export TEST_E2E_GREP=account-creation npm install && npm run test-e2e:localBuild - exit 1 fi - store_artifacts: path: /tmp/test-errors @@ -53,7 +51,6 @@ jobs: else export TEST_E2E_GREP=account-recovery npm install && npm run test-e2e:localBuild - exit 1 fi - store_artifacts: path: /tmp/test-errors From d93b08f7a9fcb2aea6beaeb65c10e3ef5586cf84 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 16 Apr 2019 11:34:12 -0400 Subject: [PATCH 63/76] final build with correct home repo --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 28a02fae7..8a66e51e4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,7 +9,7 @@ jobs: - run: name: Repo Check 1 command: | - if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:tim/blockstack-browser.git" ]; then + if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then export TEST_E2E_GREP=login-to-hello-blockstack-app npm install && npm run test-e2e:browserstack else @@ -27,7 +27,7 @@ jobs: - run: name: Repo Check 2 command: | - if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:tim/blockstack-browser.git" ]; then + if [ "$CIRCLE_REPOSITORY_URL" == "git@github.com:blockstack/blockstack-browser.git" ]; then export TEST_E2E_GREP=account-creation npm install && npm run test-e2e:browserstack else From 6707b176b2d27b4197b6c02a3b1b68e0f6b03498 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 16 Apr 2019 12:05:08 -0400 Subject: [PATCH 64/76] adding build for unit test --- .circleci/config.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8a66e51e4..7da621b6f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,18 @@ version: 2 jobs: + build: + docker: + - image: circleci/node:10.15.1 + working_directory: ~/repo + steps: + - checkout + - run: + name: Install Dependencies + command: npm install + # test + - run: npm run test + # build + - run: npm run prod-webapp test-e2e-login: docker: - image: circleci/node:10.15.1-browsers @@ -58,6 +71,7 @@ workflows: version: 2 build_and_test_e2e_local_or_remote-e2e: jobs: + - build - test-e2e-login - test-e2e-account-creation - test-e2e-account-recovery From 7cb648f01c7d393e5339698a47ddaca95df960e6 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Fri, 3 May 2019 12:49:11 -0500 Subject: [PATCH 65/76] add displayName for Navbar component --- app/js/components/Navbar.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/js/components/Navbar.js b/app/js/components/Navbar.js index 32f200eb9..88f15b629 100644 --- a/app/js/components/Navbar.js +++ b/app/js/components/Navbar.js @@ -138,4 +138,6 @@ NavItem.propTypes = { active: PropTypes.bool } +Navbar.displayName = 'Navbar' + export default Navbar From 7f8eecc3504c072bc9f3fbc4a7a5c7aa13e648d1 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Fri, 3 May 2019 13:18:43 -0500 Subject: [PATCH 66/76] add unit test for Navbar component --- app/js/components/Navbar.js | 7 +++++-- test/components/Navbar.test.js | 36 ++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 test/components/Navbar.test.js diff --git a/app/js/components/Navbar.js b/app/js/components/Navbar.js index 88f15b629..f3c7e71e8 100644 --- a/app/js/components/Navbar.js +++ b/app/js/components/Navbar.js @@ -8,7 +8,7 @@ import { Box, Flex, Type } from 'blockstack-ui' import { Link, withRouter } from 'react-router' import PropTypes from 'prop-types' -const sections = [ +const navBarData = [ [ { label: 'Home', @@ -104,7 +104,7 @@ const Navbar = withRouter(({ location }) => ( zIndex={999} > <Wrapper> - {sections.map((section, i) => ( + {navBarData.map((section, i) => ( <Flex key={i}> {section.map(({ label, icon, path, active }) => ( <NavItem @@ -139,5 +139,8 @@ NavItem.propTypes = { } Navbar.displayName = 'Navbar' +NavItem.displayName = 'NavItem' export default Navbar + +export { navBarData, NavItem } diff --git a/test/components/Navbar.test.js b/test/components/Navbar.test.js new file mode 100644 index 000000000..5fdb6030c --- /dev/null +++ b/test/components/Navbar.test.js @@ -0,0 +1,36 @@ +import React from 'react' +import { expect } from 'chai' +import { shallow } from 'enzyme' +import Navbar, { + navBarData as sections, + NavItem +} from '../../app/js/components/Navbar' + +describe('<Navbar />', () => { + describe('renders the component', () => { + const wrapper = shallow(<Navbar />) + + it('creates four <NavItem /> components', () => { + expect(wrapper.find(NavItem)).to.have.lengthOf(4) + }) + }) + + sections.forEach(section => { + describe('renders the component with each section', () => { + section.forEach(item => { + describe(`renders the component with active prop ${item.label}`, () => { + const props = { + location: { + pathname: item.path + } + } + const wrapper = shallow(<Navbar {...props} />) + + it(`item is active, ${item.label}`, () => { + expect(wrapper.find('NavItem').prop('active')).to.have.lengthOf(1) + }) + }) + }) + }) + }) +}) From 40800bc4fc493a6d5b89823af0dced100d60a11a Mon Sep 17 00:00:00 2001 From: Ludo Galabru <ludovic@galabru.com> Date: Mon, 6 May 2019 13:43:53 -0400 Subject: [PATCH 67/76] Update blockstack.js dependency (from 18.3.0 to 19.1.0) --- package-lock.json | 127 ++++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 85 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index 01a5f1cc0..55b97f068 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "blockstack-browser", - "version": "0.36.0", + "version": "0.36.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2546,17 +2546,17 @@ "dev": true }, "bindings": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.4.0.tgz", - "integrity": "sha512-7znEVX22Djn+nYjxCWKDne0RRloa9XfYa84yk3s+HkE3LpDYZmhArYr9O9huBoHY3/oXispx5LorIX7Sl2CgSQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "requires": { "file-uri-to-path": "1.0.0" } }, "bip32": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-1.0.2.tgz", - "integrity": "sha512-kedLYj8yvYzND+EfzeoMSlGiN7ImiRBF/MClJSZPkMfcU+OQO7ZpL5L/Yg+TunebBZIHhunstiQF//KLKSF5rg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-1.0.4.tgz", + "integrity": "sha512-8T21eLWylZETolyqCPgia+MNp+kY37zFr7PTFDTPObHeNi9JlfG4qGIh8WzerIJidtwoK+NsWq2I5i66YfHoIw==", "requires": { "bs58check": "^2.1.1", "create-hash": "^1.2.0", @@ -2624,33 +2624,27 @@ } }, "blockstack": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/blockstack/-/blockstack-18.3.0.tgz", - "integrity": "sha512-mOS2l5nPph4XhOxcR6Hlv9mULzwRI3T5stA2qtCc6uXPnVc6aUshtQtj9+fBpbS5sn4c5zr+1gEMEtvW/laVqA==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/blockstack/-/blockstack-19.1.0.tgz", + "integrity": "sha512-ULyPhFLZncIb4Qf+nlBvJ9zH+Ii8xn7DhoXWKBQU959Ur9Xy86cPgKkZ06oFZAGOQjQ2AshMZZ+hnS5TyqAt1g==", "requires": { "ajv": "^4.11.5", - "babel-runtime": "^6.26.0", - "bigi": "^1.4.2", "bip32": "^1.0.2", "bip39": "^2.5.0", - "bitcoinjs-lib": "^4", + "bitcoinjs-lib": "^4.0.3", + "bn.js": "^4.11.8", "cheerio": "^0.22.0", "cross-fetch": "^2.2.2", - "ecurve": "^1.0.6", - "elliptic": "^6.4.0", - "es6-promise": "^4.2.4", - "form-data": "^2.3.2", - "jsontokens": "^0.7.8", - "promise": "^7.1.1", - "query-string": "^4.3.2", - "request": "^2.87.0", - "ripemd160": "^2.0.1", - "schema-inspector": "^1.6.4", - "sprintf-js": "^1.0.3", + "elliptic": "^6.4.1", + "form-data": "^2.3.3", + "jsontokens": "^1.0.0", + "query-string": "^6.3.0", + "request": "^2.88.0", + "ripemd160": "^2.0.2", + "schema-inspector": "^1.6.8", "triplesec": "^3.0.26", - "uuid": "^3.2.1", - "validator": "^7.0.0", - "zone-file": "^0.2.2" + "uuid": "^3.3.2", + "zone-file": "^1.0.0" }, "dependencies": { "ajv": { @@ -2662,13 +2656,23 @@ "json-stable-stringify": "^1.0.1" } }, + "asn1.js": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.0.1.tgz", + "integrity": "sha512-aO8EaEgbgqq77IEw+1jfx5c9zTbzvkfuRBuZsSsPnTHMkmd5AI4J6OtITLZFa381jReeaQL67J0GBTUu0+ZTVw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "bitcoinjs-lib": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-4.0.3.tgz", - "integrity": "sha512-cb5t55MYUpwQi095J+u6eyltgIU7lbhZfC6+annstncDhfH4cyctW5jmU/tac7NonZZFYH7DktWnDxUm9AWWDQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-4.0.5.tgz", + "integrity": "sha512-gYs7K2hiY4Xb96J8AIF+Rx+hqbwjVlp5Zt6L6AnHOdzfe/2tODdmDxsEytnaxVCdhOUg0JnsGpl+KowBpGLxtA==", "requires": { "bech32": "^1.1.2", - "bip32": "^1.0.0", + "bip32": "^1.0.4", "bip66": "^1.1.0", "bitcoin-ops": "^1.4.0", "bs58check": "^2.0.0", @@ -2683,6 +2687,43 @@ "varuint-bitcoin": "^1.0.4", "wif": "^2.0.1" } + }, + "jsontokens": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jsontokens/-/jsontokens-1.0.0.tgz", + "integrity": "sha512-cC5q2qnJfwFQfN/P30Lo/m2v3x2D/JLUxli5tGP2367yRY5ZyEZSFpu+HQEBf2C8xlHL6DjQMYNFPdCFgQTmgA==", + "requires": { + "asn1.js": "^5.0.1", + "base64url": "^3.0.1", + "elliptic": "^6.4.1", + "key-encoder": "^1.1.7", + "validator": "^10.9.0" + } + }, + "query-string": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.5.0.tgz", + "integrity": "sha512-TYC4hDjZSvVxLMEucDMySkuAS9UIzSbAiYGyA9GWCjLKB8fQpviFbjd20fD7uejCDxZS+ftSdBKE6DS+xucJFg==", + "requires": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" + }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + }, + "zone-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/zone-file/-/zone-file-1.0.0.tgz", + "integrity": "sha512-dJynTf/5XCobE6diQBpNWQQRBzXE8d1QhHKemzrkffrZ36F9uKlbBVyIXXbG2CJoaTGZGh8zt2AHX/mG4txtqA==" } } }, @@ -4470,8 +4511,7 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "decompress": { "version": "4.2.0", @@ -5197,7 +5237,8 @@ "es6-promise": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==" + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", + "dev": true }, "es6-promisify": { "version": "5.0.0", @@ -14797,6 +14838,11 @@ "through": "2" } }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -14806,11 +14852,6 @@ "extend-shallow": "^3.0.0" } }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" - }, "squeak": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", @@ -15618,15 +15659,15 @@ } }, "tiny-secp256k1": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.0.1.tgz", - "integrity": "sha512-Wz2kMPWtCI5XBftFeF3bUL8uz2+VlasniKwOkRPjvL7h1QVd9rbhrve/HWUu747kJKzVf1XHonzcdM4Ut8fvww==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.0.tgz", + "integrity": "sha512-DIl0SCUIVcPrk/oOiq8/YgQ69Beayw4XSW2icyXJN8xfKMmxo5XM8gXVG1Ex+rYsHg2xuEpNFeeU6J4CtqQFrA==", "requires": { "bindings": "^1.3.0", "bn.js": "^4.11.8", "create-hmac": "^1.1.7", "elliptic": "^6.4.0", - "nan": "^2.10.0" + "nan": "^2.12.1" } }, "tiny-warning": { diff --git a/package.json b/package.json index 92c66630f..43dd93810 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "bip39": "^2.2.0", "bitcoinjs-lib": "^3.2.0", "blockstack-ui": "^0.0.71", - "blockstack": "^18.3.0", + "blockstack": "^19.1.0", "body-parser": "^1.16.1", "bootstrap": "^4.0.0-beta", "browser-stdout": "^1.3.0", From e81bd71863cca6226c9e3e41d06b222c07763ed4 Mon Sep 17 00:00:00 2001 From: Ludo Galabru <ludovic@galabru.com> Date: Mon, 6 May 2019 19:28:43 -0400 Subject: [PATCH 68/76] Update API --- test-e2e/hello-blockstack-app/index.html | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/test-e2e/hello-blockstack-app/index.html b/test-e2e/hello-blockstack-app/index.html index 7a6fbb4a7..d08711ada 100644 --- a/test-e2e/hello-blockstack-app/index.html +++ b/test-e2e/hello-blockstack-app/index.html @@ -32,18 +32,20 @@ <h1>Hello, <span id="heading-name">Anonymous</span>!</h1> </div> <script> + var userSession = new blockstack.UserSession() + document.addEventListener("DOMContentLoaded", function (event) { document.getElementById('signin-button').addEventListener('click', function (event) { event.preventDefault() if (window.BLOCKSTACK_HOST) { - blockstack.redirectToSignInWithAuthRequest(undefined, window.BLOCKSTACK_HOST) + userSession.redirectToSignInWithAuthRequest(undefined, window.BLOCKSTACK_HOST) } else { - blockstack.redirectToSignIn() + userSession.redirectToSignIn() } }) document.getElementById('signout-button').addEventListener('click', function (event) { event.preventDefault() - blockstack.signUserOut(window.location.href) + userSession.signUserOut(window.location.href) }) function showProfile(profile) { @@ -56,11 +58,11 @@ <h1>Hello, <span id="heading-name">Anonymous</span>!</h1> document.getElementById('section-2').style.display = 'block' } - if (blockstack.isUserSignedIn()) { - var profile = blockstack.loadUserData().profile + if (userSession.isUserSignedIn()) { + var profile = userSession.loadUserData().profile showProfile(profile) - } else if (blockstack.isSignInPending()) { - blockstack.handlePendingSignIn().then(function (userData) { + } else if (userSession.isSignInPending()) { + userSession.handlePendingSignIn().then(function (userData) { window.location = window.location.origin }) } From 37fdea5311269c6daa4dafe355a55937fb86d4e8 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson <thomas.osmonson@gmail.com> Date: Tue, 7 May 2019 09:03:55 -0500 Subject: [PATCH 69/76] remove navbar test for now --- app/js/components/Navbar.js | 1 + test/components/Navbar.test.js | 36 ---------------------------------- 2 files changed, 1 insertion(+), 36 deletions(-) delete mode 100644 test/components/Navbar.test.js diff --git a/app/js/components/Navbar.js b/app/js/components/Navbar.js index f3c7e71e8..ea221ea18 100644 --- a/app/js/components/Navbar.js +++ b/app/js/components/Navbar.js @@ -81,6 +81,7 @@ const NavItem = ({ label, icon, path, active, ...rest }) => ( style={{ userSelect: 'none' }} is={Link} to={path} + dataTestId="NavItem" {...bind} {...focusBind} > diff --git a/test/components/Navbar.test.js b/test/components/Navbar.test.js deleted file mode 100644 index 5fdb6030c..000000000 --- a/test/components/Navbar.test.js +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react' -import { expect } from 'chai' -import { shallow } from 'enzyme' -import Navbar, { - navBarData as sections, - NavItem -} from '../../app/js/components/Navbar' - -describe('<Navbar />', () => { - describe('renders the component', () => { - const wrapper = shallow(<Navbar />) - - it('creates four <NavItem /> components', () => { - expect(wrapper.find(NavItem)).to.have.lengthOf(4) - }) - }) - - sections.forEach(section => { - describe('renders the component with each section', () => { - section.forEach(item => { - describe(`renders the component with active prop ${item.label}`, () => { - const props = { - location: { - pathname: item.path - } - } - const wrapper = shallow(<Navbar {...props} />) - - it(`item is active, ${item.label}`, () => { - expect(wrapper.find('NavItem').prop('active')).to.have.lengthOf(1) - }) - }) - }) - }) - }) -}) From ca4541f99e50b06a250bb222044f291eade75589 Mon Sep 17 00:00:00 2001 From: Ludo Galabru <ludovic@galabru.com> Date: Tue, 7 May 2019 15:25:52 -0400 Subject: [PATCH 70/76] Update vulnerable dependencies --- package-lock.json | 2856 +++++++++++++++------------------------------ package.json | 8 +- 2 files changed, 923 insertions(+), 1941 deletions(-) diff --git a/package-lock.json b/package-lock.json index 01a5f1cc0..80ce68942 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "blockstack-browser", - "version": "0.36.0", + "version": "0.36.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1511,6 +1511,12 @@ "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", "dev": true }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, "adm-zip": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", @@ -1549,12 +1555,6 @@ "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", "dev": true }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -1614,6 +1614,15 @@ "normalize-path": "^2.1.1" } }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -1635,6 +1644,12 @@ "file-type": "^4.2.0" } }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, "arg": { "version": "2.0.0", "resolved": "http://registry.npmjs.org/arg/-/arg-2.0.0.tgz", @@ -1832,32 +1847,6 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - } - } - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1868,50 +1857,6 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, "babel-eslint": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-9.0.0.tgz", @@ -3184,6 +3129,36 @@ } } }, + "caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, "callsites": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", @@ -3229,42 +3204,6 @@ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "dev": true, - "requires": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - } - } - }, - "caniuse-db": { - "version": "1.0.30000938", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000938.tgz", - "integrity": "sha512-1lbcoAGPQFUYOdY7sxpsl8ZDBfn5cyn80XuYnZwk7N4Qp7Behw7uxZCH5jjH2qWTV2WM6hgjvDVpP/uV3M/l9g==", - "dev": true - }, "caniuse-lite": { "version": "1.0.30000938", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000938.tgz", @@ -3463,42 +3402,6 @@ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==" }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "dev": true, - "requires": { - "chalk": "^1.1.3" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -3638,12 +3541,6 @@ } } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -3658,15 +3555,6 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "dev": true, - "requires": { - "q": "^1.1.2" - } - }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -3683,17 +3571,6 @@ "object-visit": "^1.0.0" } }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "dev": true, - "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3709,26 +3586,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "dev": true, - "requires": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" - } - }, "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", @@ -4032,6 +3889,37 @@ "proxy-from-env": "0.0.1" } }, + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -4167,32 +4055,37 @@ "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=" }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, "css-loader": { - "version": "0.28.11", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", - "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": "^3.10.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.1.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" + "schema-utils": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } } }, "css-select": { @@ -4223,51 +4116,6 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, "css-to-react-native": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.0.tgz", @@ -4308,69 +4156,11 @@ "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==" }, "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true, - "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "dev": true, - "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, "cssom": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", @@ -4670,6 +4460,15 @@ "ip-regex": "^2.1.0" } }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -4719,12 +4518,6 @@ } } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", @@ -5188,6 +4981,12 @@ "is-symbol": "^1.0.2" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", @@ -5355,9 +5154,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -6213,12 +6012,6 @@ "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", "dev": true }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true - }, "flow-bin": { "version": "0.75.0", "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.75.0.tgz", @@ -6344,9 +6137,31 @@ "for-in": "^1.0.1" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + } + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { @@ -6438,6 +6253,15 @@ "universalify": "^0.1.0" } }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -7019,16 +6843,16 @@ "dev": true }, "geckodriver": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-1.15.1.tgz", - "integrity": "sha512-VJhDWnnUoRkvjnDyPPFKf9Q8/tlqrMoggTZIX/yFZGdGE/XjqkyS7L2Q1M93QPBOwW+xHZ0D7XfQzcw4pvHMXQ==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-1.16.2.tgz", + "integrity": "sha512-kXZP4QferAv57Ru4Fx2WYuu//ErKJP4hPEkJm4mSETo42jsdYFwdNxwQ4vCGhf14gsCdxU9YrwNupJ8gr1GxPg==", "dev": true, "requires": { "adm-zip": "0.4.11", "bluebird": "3.4.6", "got": "5.6.0", "https-proxy-agent": "2.2.1", - "tar": "4.0.2" + "tar": "4.4.2" }, "dependencies": { "bluebird": { @@ -7061,30 +6885,11 @@ "url-parse-lax": "^1.0.0" } }, - "tar": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.0.2.tgz", - "integrity": "sha512-4lWN4uAEWzw8aHyBUx9HWXvH3vIFEhOyvN22HfBzWpE07HaTBXM8ttSeCQpswRo5On4q3nmmYmk7Tomn0uhUaw==", - "dev": true, - "requires": { - "chownr": "^1.0.1", - "minipass": "^2.2.1", - "minizlib": "^1.0.4", - "mkdirp": "^0.5.0", - "yallist": "^3.0.2" - } - }, "timed-out": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", "dev": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true } } }, @@ -7339,13 +7144,21 @@ "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" }, "gzip-size": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", - "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.0.tgz", + "integrity": "sha512-wfSnvypBDRW94v5W3ckvvz/zFUNdJ81VgOP6tE4bPpRUcc0wGqU+y0eZjJEvKxwubJFix6P84sE8M51YWLT7rQ==", "dev": true, "requires": { "duplexer": "^0.1.1", - "pify": "^3.0.0" + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } } }, "handle-thing": { @@ -7355,26 +7168,15 @@ "dev": true }, "handlebars": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", - "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { - "async": "^2.5.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" - }, - "dependencies": { - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - } } }, "har-schema": { @@ -7488,6 +7290,15 @@ "minimalistic-assert": "^1.0.1" } }, + "hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "dev": true, + "requires": { + "is-stream": "^1.0.1" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -7872,25 +7683,12 @@ "dev": true }, "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.0.tgz", + "integrity": "sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ==", "dev": true, "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - } + "postcss": "^7.0.14" } }, "ieee754": { @@ -8101,9 +7899,9 @@ } }, "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -8402,12 +8200,6 @@ "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", "dev": true }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -8721,15 +8513,6 @@ "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", "dev": true }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -8896,24 +8679,231 @@ } }, "istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, "istanbul-lib-instrument": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", - "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.3", - "semver": "^5.5.0" + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", + "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "istanbul-reports": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.4.tgz", + "integrity": "sha512-QCHGyZEK0bfi9GR215QSm+NJwFKEShbtc7tfbUdLAEzn3kKhLDDZqvljn8rPZM9v8CEOhzL1nlYoO4r1ryl67w==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" } }, "isurl": { @@ -8937,12 +8927,6 @@ "topo": "2.x.x" } }, - "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", - "dev": true - }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -8955,13 +8939,21 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", - "esprima": "^2.6.0" + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } } }, "jsbn": { @@ -9361,12 +9353,6 @@ "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, "lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", @@ -9480,12 +9466,6 @@ "lodash._reinterpolate": "~3.0.0" } }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -9679,12 +9659,6 @@ "object-visit": "^1.0.0" } }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", - "dev": true - }, "md5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", @@ -9861,6 +9835,15 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, "merkle-lib": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", @@ -10270,6 +10253,12 @@ "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", "dev": true }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -10463,24 +10452,6 @@ "remove-trailing-separator": "^1.0.1" } }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, "npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", @@ -10508,12 +10479,6 @@ "boolbase": "~1.0.0" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -10527,1031 +10492,299 @@ "dev": true }, "nyc": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", - "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.0.tgz", + "integrity": "sha512-iy9fEV8Emevz3z/AanIZsoGa8F4U2p0JKevZ/F0sk+/B2r9E6Qn+EPs0bpxEhnAt6UPlTL8mQZIaSJy8sK0ZFw==", "dev": true, "requires": { "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^3.0.1", + "caching-transform": "^3.0.2", "convert-source-map": "^1.6.0", - "find-cache-dir": "^2.0.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", "find-up": "^3.0.0", "foreground-child": "^1.5.6", "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.3", - "istanbul-lib-hook": "^2.0.3", - "istanbul-lib-instrument": "^3.1.0", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.2", - "istanbul-reports": "^2.1.1", - "make-dir": "^1.3.0", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", "merge-source-map": "^1.1.0", "resolve-from": "^4.0.0", "rimraf": "^2.6.3", "signal-exit": "^3.0.2", "spawn-wrap": "^1.4.2", - "test-exclude": "^5.1.0", + "test-exclude": "^5.2.3", "uuid": "^3.3.2", - "yargs": "^12.0.5", - "yargs-parser": "^11.1.1" + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" }, "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, - "dev": true - }, - "append-transform": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "async": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "caching-transform": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^1.3.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.3.0" - } - }, "camelcase": { - "version": "5.0.0", - "bundled": true, + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "cliui": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + } } }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "commander": { - "version": "2.17.1", - "bundled": true, - "dev": true, - "optional": true - }, - "commondir": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "bundled": true, + "execa": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, - "debug": { - "version": "4.1.1", - "bundled": true, + "find-up": { + "version": "3.0.0", + "resolved": false, + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "ms": "^2.1.1" + "locate-path": "^3.0.0" } }, - "decamelize": { - "version": "1.2.0", - "bundled": true, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "default-require-extensions": { - "version": "2.0.0", - "bundled": true, + "get-stream": { + "version": "4.1.0", + "resolved": false, + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "strip-bom": "^3.0.0" + "pump": "^3.0.0" } }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, + "invert-kv": { + "version": "2.0.0", + "resolved": false, + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": false, + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "once": "^1.4.0" + "invert-kv": "^2.0.0" } }, - "error-ex": { - "version": "1.3.2", - "bundled": true, + "locate-path": { + "version": "3.0.0", + "resolved": false, + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "es6-error": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "execa": { - "version": "1.0.0", - "bundled": true, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "bundled": true, - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } + "pify": "^4.0.1", + "semver": "^5.6.0" } }, - "find-cache-dir": { - "version": "2.0.0", - "bundled": true, + "os-locale": { + "version": "3.1.0", + "resolved": false, + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, - "find-up": { - "version": "3.0.0", - "bundled": true, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "p-try": "^2.0.0" } }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, + "p-locate": { + "version": "3.0.0", + "resolved": false, + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" + "p-limit": "^2.0.0" } }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "get-caller-file": { - "version": "1.0.3", - "bundled": true, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "bundled": true, + "pkg-dir": { + "version": "3.0.0", + "resolved": false, + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "pump": "^3.0.0" + "find-up": "^3.0.0" } }, - "glob": { - "version": "7.1.3", - "bundled": true, + "pump": { + "version": "3.0.0", + "resolved": false, + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "graceful-fs": { - "version": "4.1.15", - "bundled": true, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "handlebars": { - "version": "4.1.0", - "bundled": true, + "rimraf": { + "version": "2.6.3", + "resolved": false, + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "hasha": { - "version": "3.0.0", - "bundled": true, + "strip-ansi": { + "version": "4.0.0", + "resolved": false, + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "is-stream": "^1.0.1" + "ansi-regex": "^3.0.0" } }, - "hosted-git-info": { - "version": "2.7.1", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "supports-color": "^6.0.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "handlebars": "^4.1.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "lcid": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "bundled": true, - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "mem": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^2.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.10", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - } - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-is-promise": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "package-hash": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "read-pkg": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" - } - }, - "uglify-js": { - "version": "3.4.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "uuid": { - "version": "3.3.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "2.4.2", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "y18n": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true, + "which-module": { + "version": "2.0.0", + "resolved": false, + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "yargs": { - "version": "12.0.5", - "bundled": true, + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", "dev": true, "requires": { "cliui": "^4.0.0", - "decamelize": "^1.2.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" } }, "yargs-parser": { - "version": "11.1.1", - "bundled": true, + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -11827,6 +11060,12 @@ "arch": "^2.1.0" } }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-locale": { "version": "1.4.0", "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -11951,6 +11190,18 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, "pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -12180,487 +11431,129 @@ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "requires": { - "irregular-plurals": "^1.0.0" - } - }, - "pngquant-bin": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-5.0.2.tgz", - "integrity": "sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA==", - "dev": true, - "requires": { - "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.1", - "execa": "^0.10.0", - "logalot": "^2.0.0" - } - }, - "polished": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/polished/-/polished-1.9.3.tgz", - "integrity": "sha512-4NmSD7fMFlM8roNxs7YXPv7UFRbYzb0gufR5zBxJLRzY54+zFsavxBo6zsQzP9ep6Hh3pC2pTyrpSTBEaB6IkQ==" - }, - "popper.js": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.7.tgz", - "integrity": "sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==" - }, - "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", - "dev": true, - "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "dev": true, - "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "dev": true, - "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "dev": true, - "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "dev": true, - "requires": { - "postcss": "^5.0.14" - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "dev": true, - "requires": { - "postcss": "^5.0.4" - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "dev": true, - "requires": { - "postcss": "^5.0.14" - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "dev": true, - "requires": { - "postcss": "^5.0.16" - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "dev": true, - "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" - } - }, - "postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", - "dev": true, - "requires": { - "postcss": "^5.0.4" - } - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "dev": true, - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "dev": true, - "requires": { - "postcss": "^5.0.4" - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "dev": true, - "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - } - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "dev": true, - "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" - } - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - } + "requires": { + "find-up": "^2.1.0" } }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", "dev": true, "requires": { - "postcss": "^5.0.5" + "irregular-plurals": "^1.0.0" } }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "pngquant-bin": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-5.0.2.tgz", + "integrity": "sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA==", "dev": true, "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.1", + "execa": "^0.10.0", + "logalot": "^2.0.0" } }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "polished": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/polished/-/polished-1.9.3.tgz", + "integrity": "sha512-4NmSD7fMFlM8roNxs7YXPv7UFRbYzb0gufR5zBxJLRzY54+zFsavxBo6zsQzP9ep6Hh3pC2pTyrpSTBEaB6IkQ==" + }, + "popper.js": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.7.tgz", + "integrity": "sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==" + }, + "portfinder": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", "dev": true, "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" } }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", "dev": true, "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "dev": true, "requires": { - "postcss": "^5.0.4" + "postcss": "^7.0.5" } }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", "dev": true, "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" } }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "postcss-modules-scope": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", + "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", "dev": true, "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" } }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", "dev": true, "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" } }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", "dev": true, "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-value-parser": { @@ -12668,17 +11561,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "dev": true, - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - } - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -13451,42 +12333,6 @@ "strip-indent": "^1.0.1" } }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "dev": true, - "requires": { - "balanced-match": "^0.4.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } - } - }, "redux": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", @@ -13708,6 +12554,15 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -14675,6 +13530,31 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "spawn-wrap": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -15198,21 +14078,6 @@ "has-flag": "^3.0.0" } }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "dev": true, - "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - } - }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -15295,6 +14160,29 @@ "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", "dev": true }, + "tar": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.2.tgz", + "integrity": "sha512-BfkE9CciGGgDsATqkikUHrQrraBCO+ke/1f6SFAEMnxyyfN9lxC+nW1NFWMpqH865DhHIy9vQi682gk1X7friw==", + "dev": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, "tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", @@ -15574,6 +14462,112 @@ } } }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -15948,12 +14942,6 @@ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, "unique-concat": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/unique-concat/-/unique-concat-0.2.2.tgz", @@ -16288,12 +15276,6 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "vendors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", - "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", - "dev": true - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -16485,12 +15467,13 @@ } }, "webpack-bundle-analyzer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.0.4.tgz", - "integrity": "sha512-ggDUgtKuQki4vmc93Ej65GlYxeCUR/0THa7gA+iqAGC2FFAxO+r+RM9sAUa8HWdw4gJ3/NZHX/QUcVgRjdIsDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz", + "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==", "dev": true, "requires": { - "acorn": "^5.7.3", + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", "bfj": "^6.1.1", "chalk": "^2.4.1", "commander": "^2.18.0", @@ -16504,16 +15487,10 @@ "ws": "^6.0.0" }, "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true } } @@ -17119,12 +16096,6 @@ } } }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -17411,10 +16382,21 @@ "mkdirp": "^0.5.1" } }, + "write-file-atomic": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { "async-limiter": "~1.0.0" diff --git a/package.json b/package.json index 92c66630f..64910c7d2 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "copy-webpack-plugin": "^4.5.2", "cors": "^2.8.1", "cross-env": "^5.2.0", - "css-loader": "^0.28.11", + "css-loader": "^2.1.1", "enzyme": "^3.3.0", "eslint": "^5.12.1", "eslint-config-airbnb": "^9.0.1", @@ -119,7 +119,7 @@ "flow-bin": "^0.75.0", "flow-typed": "^2.5.1", "font-awesome": "^4.6.3", - "geckodriver": "^1.14.1", + "geckodriver": "^1.16.2", "html-loader": "^0.5.5", "html-webpack-plugin": "^3.1.0", "image-webpack-loader": "^4.3.1", @@ -131,7 +131,7 @@ "mock-require": "^3.0.2", "nock": "^9.0.13", "node-libs-browser": "^1.0.0", - "nyc": "^13.0.1", + "nyc": "^14.1.0", "p-queue": "^3.0.0", "prettier": "^1.16.1", "react-hot-loader": "^4.3.3", @@ -148,7 +148,7 @@ "terser-webpack-plugin": "^1.2.1", "url-loader": "^1.0.1", "webpack": "^4.29.0", - "webpack-bundle-analyzer": "^3.0.2", + "webpack-bundle-analyzer": "^3.3.2", "webpack-cli": "^3.2.1", "webpack-dev-server": "^3.1.14", "webpack-stylish": "^0.1.8", From 3ef6cbc081efb05fabb8aa02bfe12cd1b6c58c7b Mon Sep 17 00:00:00 2001 From: Ludo Galabru <ludovic@galabru.com> Date: Mon, 13 May 2019 09:59:21 -0400 Subject: [PATCH 71/76] Update webpack-cli + webpack-dev-server --- package-lock.json | 432 +++++++++++++++++++++++++++++++++------------- package.json | 4 +- 2 files changed, 315 insertions(+), 121 deletions(-) diff --git a/package-lock.json b/package-lock.json index 55b97f068..667e8fb29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1243,6 +1243,29 @@ "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, "@types/node": { "version": "11.9.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-11.9.4.tgz", @@ -1572,9 +1595,9 @@ } }, "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, "ansi-escapes": { @@ -4701,13 +4724,49 @@ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" }, "default-gateway": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", - "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "dev": true, "requires": { - "execa": "^0.10.0", + "execa": "^1.0.0", "ip-regex": "^2.1.0" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "define-properties": { @@ -7574,9 +7633,9 @@ "dev": true }, "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { "parse-passwd": "^1.0.0" @@ -7807,21 +7866,21 @@ } }, "http-proxy-middleware": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", - "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dev": true, "requires": { - "http-proxy": "^1.16.2", + "http-proxy": "^1.17.0", "is-glob": "^4.0.0", - "lodash": "^4.17.5", - "micromatch": "^3.1.9" + "lodash": "^4.17.11", + "micromatch": "^3.1.10" }, "dependencies": { "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", "dev": true }, "http-proxy": { @@ -8380,13 +8439,21 @@ } }, "internal-ip": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", - "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "dev": true, "requires": { - "default-gateway": "^2.6.0", - "ipaddr.js": "^1.5.2" + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + } } }, "interpret": { @@ -11787,9 +11854,9 @@ "dev": true }, "opn": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "dev": true, "requires": { "is-wsl": "^1.1.0" @@ -12964,9 +13031,9 @@ "dev": true }, "querystringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, "raf": { @@ -14808,9 +14875,9 @@ "dev": true }, "readable-stream": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", - "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -16217,12 +16284,12 @@ } }, "url-parse": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", - "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", "dev": true, "requires": { - "querystringify": "^2.0.0", + "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, @@ -16295,9 +16362,9 @@ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", "dev": true }, "validate-npm-package-license": { @@ -16560,9 +16627,9 @@ } }, "webpack-cli": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.2.3.tgz", - "integrity": "sha512-Ik3SjV6uJtWIAN5jp5ZuBMWEAaP5E4V78XJ2nI+paFPh8v4HPSwo/myN0r29Xc/6ZKnd2IdrAlpSgNOu2CDQ6Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.2.tgz", + "integrity": "sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -16575,7 +16642,7 @@ "loader-utils": "^1.1.0", "supports-color": "^5.5.0", "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.4" + "yargs": "^12.0.5" }, "dependencies": { "ansi-regex": { @@ -16585,9 +16652,9 @@ "dev": true }, "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "cliui": { @@ -16671,9 +16738,9 @@ } }, "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -16689,9 +16756,9 @@ } }, "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "pump": { @@ -16752,61 +16819,61 @@ } }, "webpack-dev-middleware": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", - "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.6.2.tgz", + "integrity": "sha512-A47I5SX60IkHrMmZUlB0ZKSWi29TZTcPz7cha1Z75yYOsgWh/1AcPmQEbC8ZIbU3A1ytSv1PMU0PyPz2Lmz2jg==", "dev": true, "requires": { - "memory-fs": "~0.4.1", + "memory-fs": "^0.4.1", "mime": "^2.3.1", "range-parser": "^1.0.3", "webpack-log": "^2.0.0" }, "dependencies": { "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz", + "integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==", "dev": true } } }, "webpack-dev-server": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz", - "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.3.1.tgz", + "integrity": "sha512-jY09LikOyGZrxVTXK0mgIq9y2IhCoJ05848dKZqX1gAGLU1YDqgpOT71+W53JH/wI4v6ky4hm+KvSyW14JEs5A==", "dev": true, "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.0.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.18.0", + "chokidar": "^2.1.5", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.0", + "express": "^4.16.4", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", "import-local": "^2.0.0", - "internal-ip": "^3.0.1", + "internal-ip": "^4.2.0", "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", + "killable": "^1.0.1", + "loglevel": "^1.6.1", + "opn": "^5.5.0", + "portfinder": "^1.0.20", "schema-utils": "^1.0.0", - "selfsigned": "^1.9.1", - "semver": "^5.6.0", - "serve-index": "^1.7.2", + "selfsigned": "^1.10.4", + "semver": "^6.0.0", + "serve-index": "^1.9.1", "sockjs": "0.3.19", "sockjs-client": "1.3.0", "spdy": "^4.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", "url": "^0.11.0", - "webpack-dev-middleware": "3.4.0", + "webpack-dev-middleware": "^3.6.2", "webpack-log": "^2.0.0", - "yargs": "12.0.2" + "yargs": "12.0.5" }, "dependencies": { "ansi-regex": { @@ -16816,11 +16883,31 @@ "dev": true }, "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "chokidar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", @@ -16843,22 +16930,62 @@ } } }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "dev": true, "requires": { - "xregexp": "4.0.0" + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" } }, "execa": { @@ -16900,6 +17027,30 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, + "is-path-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", + "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -16919,10 +17070,16 @@ "path-exists": "^3.0.0" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true }, "os-locale": { @@ -16937,9 +17094,9 @@ } }, "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -16954,10 +17111,22 @@ "p-limit": "^2.0.0" } }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "pump": { @@ -16970,6 +17139,36 @@ "once": "^1.3.1" } }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -16977,13 +17176,13 @@ "dev": true }, "yargs": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", - "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { "cliui": "^4.0.0", - "decamelize": "^2.0.0", + "decamelize": "^1.2.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^3.0.0", @@ -16993,16 +17192,17 @@ "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^10.1.0" + "yargs-parser": "^11.1.1" } }, "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -17483,12 +17683,6 @@ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true }, - "xregexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", - "dev": true - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index 43dd93810..7614d8963 100644 --- a/package.json +++ b/package.json @@ -149,8 +149,8 @@ "url-loader": "^1.0.1", "webpack": "^4.29.0", "webpack-bundle-analyzer": "^3.0.2", - "webpack-cli": "^3.2.1", - "webpack-dev-server": "^3.1.14", + "webpack-cli": "^3.3.2", + "webpack-dev-server": "^3.3.1", "webpack-stylish": "^0.1.8", "webpackbar": "^3.1.5", "workbox-webpack-plugin": "^3.6.1", From 2db9c60e292f59ef2095057884d5f75e9708a979 Mon Sep 17 00:00:00 2001 From: Hank Stoever <hstove@gmail.com> Date: Tue, 21 May 2019 07:35:31 -0700 Subject: [PATCH 72/76] re-add packages from bad merge --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index 68bfec776..fb4f5fe7f 100644 --- a/package.json +++ b/package.json @@ -133,6 +133,8 @@ "node-libs-browser": "^1.0.0", "nyc": "^14.1.0", "p-queue": "^3.0.0", + "prettier": "^1.16.4", + "react-hot-loader": "^4.6.5", "redux-mock-store": "^1.2.3", "request": "^2.88.0", "require-hacker": "^3.0.1", From e41a2ce28243210c5b2a20fa072d3732f2f675f8 Mon Sep 17 00:00:00 2001 From: Hank Stoever <hstove@gmail.com> Date: Tue, 21 May 2019 13:31:56 -0700 Subject: [PATCH 73/76] removes `Navigation`, its not used --- app/js/components/Navigation.js | 56 ------------------------------ test/components/Navigation.test.js | 35 ------------------- 2 files changed, 91 deletions(-) delete mode 100644 app/js/components/Navigation.js delete mode 100644 test/components/Navigation.test.js diff --git a/app/js/components/Navigation.js b/app/js/components/Navigation.js deleted file mode 100644 index 0bf7a2b69..000000000 --- a/app/js/components/Navigation.js +++ /dev/null @@ -1,56 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import styled from 'styled-components' - -import ChevronLeftIcon from 'mdi-react/ChevronLeftIcon' -const NavBlock = styled.div` - display: flex; - width: 100%; - position: absolute; - top: 20px; - left: 20px; - z-index: 100; - @media (min-width: 800px) { - top: -46px; - left: -10px; - } -` -const NavButton = styled.button` - border: none; - background: transparent; - display: flex; - align-items: center; - font-size: 14px; - font-weight: bold; - opacity: 0.5; - &:hover { - cursor: pointer; - opacity: 1; - } - svg { - display: block; - * { - fill: currentColor; - } - } -` - -const Navigation = props => { - const { previous, previousLabel = 'Back' } = props - - return ( - <NavBlock> - <NavButton onClick={previous}> - <ChevronLeftIcon /> - {previousLabel} - </NavButton> - </NavBlock> - ) -} - -Navigation.propTypes = { - previous: PropTypes.func.isRequired, - previousLabel: PropTypes.string -} - -export default Navigation diff --git a/test/components/Navigation.test.js b/test/components/Navigation.test.js deleted file mode 100644 index 83b3e840c..000000000 --- a/test/components/Navigation.test.js +++ /dev/null @@ -1,35 +0,0 @@ -import React from 'react' -import { expect } from 'chai' -import { shallow } from 'enzyme' -import Navigation from '../../app/js/components/Navigation' - -describe('<Navigation />', () => { - describe('renders the component', () => { - const props = { - previous() {} - } - - const wrapper = shallow(<Navigation {...props} />) - - it('uses a ChevronLeftIcon', () => { - expect(wrapper.find('ChevronLeftIcon').exists()).to.equal(true) - }) - - it('includes the previous label', () => { - expect(wrapper.html()).to.contain('Back') - }) - }) - - describe('renders the component with a label', () => { - const props = { - previous() {}, - previousLabel: 'Previous Page' - } - - const wrapper = shallow(<Navigation {...props} />) - - it('includes the supplied label', () => { - expect(wrapper.html()).to.contain('Previous Page') - }) - }) -}) From 8ae9fd4703306b7e4bc5d108b70c5cb288d2efbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Friedger=20M=C3=BCffke?= <friedger@gmail.com> Date: Mon, 18 Mar 2019 13:55:35 +0100 Subject: [PATCH 74/76] handle relative icon urls, fixes #1783 --- app/js/components/ui/containers/headers.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/js/components/ui/containers/headers.js b/app/js/components/ui/containers/headers.js index f11938203..985ca66a0 100644 --- a/app/js/components/ui/containers/headers.js +++ b/app/js/components/ui/containers/headers.js @@ -64,6 +64,10 @@ const Header = ({ }) => { const renderBugs = () => { if (app) { + const appIcon = app.manifestURI + ? new URL(app.icon, app.manifestURI).toString() + : app.icon + return ( <Bugs> <BlockstackBug invert={invert} size={28} /> @@ -71,7 +75,7 @@ const Header = ({ <ChevronDoubleRightIcon color={'rgba(39, 16, 51, 0.2)'} size={18} /> </StyledBug.Arrows> <Bug size={28} title={app.name}> - <img src={app.icon} alt={app.name} /> + <img src={appIcon} alt={app.name} /> </Bug> </Bugs> ) From c0edba3af89b0f8ac281d810c9a47cc1b519c465 Mon Sep 17 00:00:00 2001 From: Ken <yukanliao@gmail.com> Date: Wed, 19 Jun 2019 15:20:43 -0400 Subject: [PATCH 75/76] Bump version to v0.36.3. --- native/macos/Blockstack/Blockstack/Info.plist | 4 ++-- native/macos/Blockstack/BlockstackLauncher/Info.plist | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/native/macos/Blockstack/Blockstack/Info.plist b/native/macos/Blockstack/Blockstack/Info.plist index 0b325787f..999ce4661 100644 --- a/native/macos/Blockstack/Blockstack/Info.plist +++ b/native/macos/Blockstack/Blockstack/Info.plist @@ -17,7 +17,7 @@ <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> - <string>0.36.1</string> + <string>0.36.3</string> <key>CFBundleURLTypes</key> <array> <dict> @@ -30,7 +30,7 @@ </dict> </array> <key>CFBundleVersion</key> - <string>118</string> + <string>119</string> <key>LSApplicationCategoryType</key> <string>public.app-category.utilities</string> <key>LSMinimumSystemVersion</key> diff --git a/native/macos/Blockstack/BlockstackLauncher/Info.plist b/native/macos/Blockstack/BlockstackLauncher/Info.plist index 78d622445..6b93a140c 100644 --- a/native/macos/Blockstack/BlockstackLauncher/Info.plist +++ b/native/macos/Blockstack/BlockstackLauncher/Info.plist @@ -17,9 +17,9 @@ <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> - <string>0.36.1</string> + <string>0.36.3</string> <key>CFBundleVersion</key> - <string>118</string> + <string>119</string> <key>LSApplicationCategoryType</key> <string>public.app-category.utilities</string> <key>LSBackgroundOnly</key> diff --git a/package.json b/package.json index fb4f5fe7f..d76e0e312 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "blockstack-browser", "description": "The Blockstack browser", - "version": "0.36.1", + "version": "0.36.3", "author": "Blockstack PBC <admin@blockstack.com>", "dependencies": { "bigi": "^1.4.2", From 582b95bcc089d3a174c662f1f1e1151ee3be8e1d Mon Sep 17 00:00:00 2001 From: Ken <yukanliao@gmail.com> Date: Wed, 19 Jun 2019 15:24:18 -0400 Subject: [PATCH 76/76] Bump linux script version. --- native/linux/Blockstack-for-Linux.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native/linux/Blockstack-for-Linux.sh b/native/linux/Blockstack-for-Linux.sh index 9dcbf5248..cf450bbe4 100644 --- a/native/linux/Blockstack-for-Linux.sh +++ b/native/linux/Blockstack-for-Linux.sh @@ -2,7 +2,7 @@ # This script provides a simple interface for folks to use the docker install -TAG=v0.35.4 +TAG=v0.36.3 if [ "$BLOCKSTACK_TAG" ]; then TAG="$BLOCKSTACK_TAG" fi