hotfix: merge with develop
This commit is contained in:
commit
f552b92861
7
.babelrc
7
.babelrc
|
@ -1,10 +1,7 @@
|
||||||
{
|
{
|
||||||
"presets": [
|
"presets": ["@babel/preset-env", "@babel/preset-react", "@babel/preset-flow"],
|
||||||
"@babel/preset-env",
|
|
||||||
"@babel/preset-react",
|
|
||||||
"@babel/preset-flow"
|
|
||||||
],
|
|
||||||
"plugins": [
|
"plugins": [
|
||||||
|
"@babel/plugin-transform-regenerator",
|
||||||
"@babel/plugin-proposal-class-properties",
|
"@babel/plugin-proposal-class-properties",
|
||||||
"@babel/plugin-proposal-object-rest-spread"
|
"@babel/plugin-proposal-object-rest-spread"
|
||||||
]
|
]
|
||||||
|
|
|
@ -42,6 +42,8 @@
|
||||||
"ignorePattern": "<p[^>]*>.*?</p>",
|
"ignorePattern": "<p[^>]*>.*?</p>",
|
||||||
"ignoreTrailingComments": true
|
"ignoreTrailingComments": true
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"consistent-return": 0,
|
||||||
|
"react/destructuring-assignment": 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import { SidebarComponent } from '../../app/components/sidebar';
|
||||||
describe('<Sidebar />', () => {
|
describe('<Sidebar />', () => {
|
||||||
describe('render()', () => {
|
describe('render()', () => {
|
||||||
test('should render correctly', () => {
|
test('should render correctly', () => {
|
||||||
|
// $FlowFixMe
|
||||||
const { asFragment } = render(
|
const { asFragment } = render(
|
||||||
<MemoryRouter>
|
<MemoryRouter>
|
||||||
<SidebarComponent />
|
<SidebarComponent />
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
---
|
||||||
|
name: Button
|
||||||
|
---
|
||||||
|
|
||||||
|
import { Playground, PropsTable } from 'docz'
|
||||||
|
|
||||||
|
import { Button } from './button.js'
|
||||||
|
import { DoczWrapper } from '../theme.js'
|
||||||
|
|
||||||
|
# Button
|
||||||
|
|
||||||
|
<PropsTable of={Button} />
|
||||||
|
|
||||||
|
## Primary
|
||||||
|
|
||||||
|
<Playground>
|
||||||
|
<div style={{ backgroundColor: '#000', padding: '20px' }}>
|
||||||
|
<DoczWrapper>{() => <Button label="Click me!" />}</DoczWrapper>
|
||||||
|
</div>
|
||||||
|
</Playground>
|
||||||
|
|
||||||
|
## Secondary
|
||||||
|
|
||||||
|
<Playground>
|
||||||
|
<div style={{ backgroundColor: '#000', padding: '20px' }}>
|
||||||
|
<DoczWrapper>{() => <Button label="Click me!" onClick={() => alert('Clicked')} variant="secondary" />}</DoczWrapper>
|
||||||
|
</div>
|
||||||
|
</Playground>
|
||||||
|
|
||||||
|
## Primary Disabled
|
||||||
|
|
||||||
|
<Playground>
|
||||||
|
<div style={{ backgroundColor: '#000', padding: '20px' }}>
|
||||||
|
<DoczWrapper>{() => <Button label="Click me!" onClick={() => alert('Clicked')} disabled />}</DoczWrapper>
|
||||||
|
</div>
|
||||||
|
</Playground>
|
||||||
|
|
||||||
|
## Secondary Disabled
|
||||||
|
|
||||||
|
<Playground>
|
||||||
|
<div style={{ backgroundColor: '#000', padding: '20px' }}>
|
||||||
|
<DoczWrapper>
|
||||||
|
{() => <Button label="Click me!" onClick={() => alert('Clicked')} disabled variant="secondary" />}
|
||||||
|
</DoczWrapper>
|
||||||
|
</div>
|
||||||
|
</Playground>
|
||||||
|
|
||||||
|
## Link Button
|
||||||
|
|
||||||
|
<Playground>
|
||||||
|
<div style={{ backgroundColor: '#000', padding: '20px' }}>
|
||||||
|
<DoczWrapper>{() => <Button label="Click me!" isLink to="/my-route" />}</DoczWrapper>
|
||||||
|
</div>
|
||||||
|
</Playground>
|
|
@ -0,0 +1,26 @@
|
||||||
|
---
|
||||||
|
name: Input
|
||||||
|
---
|
||||||
|
|
||||||
|
import { Playground, PropsTable } from 'docz'
|
||||||
|
|
||||||
|
import { InputComponent } from './input.js'
|
||||||
|
import { DoczWrapper } from '../theme.js'
|
||||||
|
|
||||||
|
# Input
|
||||||
|
|
||||||
|
<PropsTable of={InputComponent} />
|
||||||
|
|
||||||
|
## Text Input
|
||||||
|
|
||||||
|
<Playground>
|
||||||
|
<DoczWrapper>{() => <InputComponent inputType="input" value="Hello World!" onChange={console.log} />}</DoczWrapper>
|
||||||
|
</Playground>
|
||||||
|
|
||||||
|
## Textarea
|
||||||
|
|
||||||
|
<Playground>
|
||||||
|
<DoczWrapper>
|
||||||
|
{() => <InputComponent inputType="textarea" value="I'm ZCash Electron Wallet" onChange={console.log} rows={10} />}
|
||||||
|
</DoczWrapper>
|
||||||
|
</Playground>
|
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
name: QRCode
|
||||||
|
---
|
||||||
|
|
||||||
|
import { Playground, PropsTable } from 'docz'
|
||||||
|
|
||||||
|
import { QRCode } from './qrcode.js'
|
||||||
|
|
||||||
|
# QRCode
|
||||||
|
|
||||||
|
<PropsTable of={QRCode} />
|
||||||
|
|
||||||
|
## Basic usage
|
||||||
|
|
||||||
|
<Playground>
|
||||||
|
<QRCode value="https://astrocoders.com" />
|
||||||
|
</Playground>
|
||||||
|
|
||||||
|
## Custom size
|
||||||
|
|
||||||
|
<Playground>
|
||||||
|
<QRCode value="https://astrocoders.com" size={500} />
|
||||||
|
</Playground>
|
|
@ -0,0 +1,94 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import styled from 'styled-components';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
/* eslint-disable import/no-extraneous-dependencies */
|
||||||
|
// $FlowFixMe
|
||||||
|
import { darken } from 'polished';
|
||||||
|
|
||||||
|
const defaultStyles = `
|
||||||
|
padding: 10px 30px;
|
||||||
|
font-family: ${
|
||||||
|
// $FlowFixMe
|
||||||
|
props => props.theme.fontFamily
|
||||||
|
};
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 0.9em;
|
||||||
|
cursor: pointer;
|
||||||
|
outline: none;
|
||||||
|
min-width: 100px;
|
||||||
|
border-radius: 100px;
|
||||||
|
transition: background-color 0.1s ease-in-out;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Primary = styled.button`
|
||||||
|
${defaultStyles};
|
||||||
|
background-color: ${props => props.theme.colors.primary};
|
||||||
|
color: ${props => props.theme.colors.secondary};
|
||||||
|
border: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: ${props => darken(0.1, props.theme.colors.primary(props))};
|
||||||
|
}
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
background-color: #3e3c42;
|
||||||
|
cursor: not-allowed;
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Secondary = styled.button`
|
||||||
|
${defaultStyles};
|
||||||
|
background-color: Transparent;
|
||||||
|
color: ${props => props.theme.colors.secondary};
|
||||||
|
border: 2px solid #3e3c42;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: ${props => props.theme.colors.primary};
|
||||||
|
}
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
background-color: Transparent;
|
||||||
|
cursor: not-allowed;
|
||||||
|
color: #3e3c42;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: #3e3c42;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
label: string,
|
||||||
|
onClick?: () => void,
|
||||||
|
to?: string,
|
||||||
|
variant?: 'primary' | 'secondary',
|
||||||
|
disabled?: boolean,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Button = ({
|
||||||
|
onClick, label, to, variant, disabled,
|
||||||
|
}: Props) => {
|
||||||
|
if (to && onClick) throw new Error('Should define either "to" or "onClick"');
|
||||||
|
|
||||||
|
const component = variant === 'primary' ? (
|
||||||
|
<Primary onClick={onClick} disabled={disabled}>
|
||||||
|
{label}
|
||||||
|
</Primary>
|
||||||
|
) : (
|
||||||
|
<Secondary onClick={onClick} disabled={disabled}>
|
||||||
|
{label}
|
||||||
|
</Secondary>
|
||||||
|
);
|
||||||
|
|
||||||
|
return to ? <Link to={String(to)}>{component}</Link> : component;
|
||||||
|
};
|
||||||
|
|
||||||
|
Button.defaultProps = {
|
||||||
|
to: null,
|
||||||
|
variant: 'primary',
|
||||||
|
onClick: null,
|
||||||
|
disabled: false,
|
||||||
|
};
|
|
@ -0,0 +1,53 @@
|
||||||
|
// @flow
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
// TODO: Missing styles
|
||||||
|
|
||||||
|
const defaultStyles = `
|
||||||
|
padding: 10px;
|
||||||
|
width: 100%;
|
||||||
|
outline: none;
|
||||||
|
font-family: ${props => props.theme.fontFamily}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Input = styled.input.attrs({
|
||||||
|
type: 'text',
|
||||||
|
})`
|
||||||
|
${defaultStyles};
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Textarea = styled.textarea`
|
||||||
|
${defaultStyles};
|
||||||
|
`;
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
inputType?: 'input' | 'textarea' | 'dropdown',
|
||||||
|
value: string,
|
||||||
|
onChange: string => void,
|
||||||
|
rows?: number,
|
||||||
|
disabled?: boolean,
|
||||||
|
type?: string,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const InputComponent = ({ inputType, onChange, ...props }: Props) => {
|
||||||
|
const inputTypes = {
|
||||||
|
input: () => <Input onChange={evt => onChange(evt.target.value)} {...props} />,
|
||||||
|
textarea: () => <Textarea onChange={evt => onChange(evt.target.value)} {...props} />,
|
||||||
|
dropdown: () => null,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!Object.keys(inputTypes).find(key => key === inputType)) {
|
||||||
|
throw new Error(`Invalid input type: ${inputType}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return inputTypes[inputType]();
|
||||||
|
};
|
||||||
|
|
||||||
|
InputComponent.defaultProps = {
|
||||||
|
inputType: 'input',
|
||||||
|
rows: 4,
|
||||||
|
disabled: false,
|
||||||
|
type: 'text',
|
||||||
|
};
|
|
@ -22,9 +22,5 @@ export const LayoutComponent = (props: Props) => {
|
||||||
// $FlowFixMe
|
// $FlowFixMe
|
||||||
const { children } = props; // eslint-disable-line
|
const { children } = props; // eslint-disable-line
|
||||||
|
|
||||||
return (
|
return <Layout>{children}</Layout>;
|
||||||
<Layout>
|
|
||||||
{children}
|
|
||||||
</Layout>
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import QR from 'qrcode.react';
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
value: string,
|
||||||
|
size?: number,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const QRCode = ({ value, size }: Props) => <QR value={value} size={size} />;
|
||||||
|
|
||||||
|
QRCode.defaultProps = {
|
||||||
|
size: 128,
|
||||||
|
};
|
|
@ -4,3 +4,4 @@ export const DASHBOARD_ROUTE = '/';
|
||||||
export const SEND_ROUTE = '/send';
|
export const SEND_ROUTE = '/send';
|
||||||
export const RECEIVE_ROUTE = '/receive';
|
export const RECEIVE_ROUTE = '/receive';
|
||||||
export const SETTINGS_ROUTE = '/settings';
|
export const SETTINGS_ROUTE = '/settings';
|
||||||
|
export const CONSOLE_ROUTE = '/console';
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
// @flow
|
// @flow
|
||||||
|
|
||||||
import {
|
import {
|
||||||
DASHBOARD_ROUTE,
|
DASHBOARD_ROUTE, SEND_ROUTE, RECEIVE_ROUTE, SETTINGS_ROUTE, CONSOLE_ROUTE,
|
||||||
SEND_ROUTE,
|
|
||||||
RECEIVE_ROUTE,
|
|
||||||
SETTINGS_ROUTE,
|
|
||||||
} from './routes';
|
} from './routes';
|
||||||
|
|
||||||
export const MENU_OPTIONS = [
|
export const MENU_OPTIONS = [
|
||||||
|
@ -20,6 +17,10 @@ export const MENU_OPTIONS = [
|
||||||
label: 'Receive',
|
label: 'Receive',
|
||||||
route: RECEIVE_ROUTE,
|
route: RECEIVE_ROUTE,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Console',
|
||||||
|
route: CONSOLE_ROUTE,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: 'Settings',
|
label: 'Settings',
|
||||||
route: SETTINGS_ROUTE,
|
route: SETTINGS_ROUTE,
|
||||||
|
|
|
@ -9,25 +9,15 @@ import { createRootReducer } from './modules/reducer';
|
||||||
|
|
||||||
export const history = createBrowserHistory();
|
export const history = createBrowserHistory();
|
||||||
|
|
||||||
const shouldEnableDevTools = (
|
const shouldEnableDevTools = (process.env.NODE_ENV !== 'production' || process.env.NODE_ENV !== 'staging') && window.devToolsExtension;
|
||||||
process.env.NODE_ENV !== 'production'
|
|
||||||
|| process.env.NODE_ENV !== 'staging'
|
|
||||||
) && window.devToolsExtension;
|
|
||||||
|
|
||||||
export const configureStore = (initialState: Object) => {
|
export const configureStore = (initialState: Object) => {
|
||||||
const middleware = applyMiddleware(
|
const middleware = applyMiddleware(thunk, routerMiddleware(history));
|
||||||
thunk,
|
|
||||||
routerMiddleware(history),
|
|
||||||
);
|
|
||||||
|
|
||||||
const enhancer = compose(
|
const enhancer = compose(
|
||||||
middleware,
|
middleware,
|
||||||
shouldEnableDevTools ? window.devToolsExtension() : f => f,
|
shouldEnableDevTools ? window.devToolsExtension() : f => f,
|
||||||
);
|
);
|
||||||
|
|
||||||
return createStore(
|
return createStore(createRootReducer(history), initialState, enhancer);
|
||||||
createRootReducer(history),
|
|
||||||
initialState,
|
|
||||||
enhancer,
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,11 +2,11 @@
|
||||||
|
|
||||||
import { combineReducers } from 'redux';
|
import { combineReducers } from 'redux';
|
||||||
import { connectRouter } from 'connected-react-router';
|
import { connectRouter } from 'connected-react-router';
|
||||||
import type { History } from 'react-router-dom';
|
import type { RouterHistory } from 'react-router-dom';
|
||||||
|
|
||||||
import todoReducer from './todo';
|
import todoReducer from './todo';
|
||||||
|
|
||||||
export const createRootReducer = (history: History) => combineReducers({
|
export const createRootReducer = (history: RouterHistory) => combineReducers({
|
||||||
todos: todoReducer,
|
todos: todoReducer,
|
||||||
router: connectRouter(history),
|
router: connectRouter(history),
|
||||||
});
|
});
|
||||||
|
|
|
@ -52,10 +52,7 @@ export const updateTodo = (id: string, text: string) => ({
|
||||||
const initialState = [];
|
const initialState = [];
|
||||||
|
|
||||||
// Reducers
|
// Reducers
|
||||||
export default (
|
export default (state: Array<TodoType> = initialState, action: Action): Array<TodoType> => {
|
||||||
state: Array<TodoType> = initialState,
|
|
||||||
action: Action,
|
|
||||||
): Array<TodoType> => {
|
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case ADD_TODO:
|
case ADD_TODO:
|
||||||
return [...state, action.payload];
|
return [...state, action.payload];
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// @flow
|
// @flow
|
||||||
|
import { compose } from 'redux';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { withRouter } from 'react-router-dom';
|
import { withRouter } from 'react-router-dom';
|
||||||
import { RouterComponent } from './router';
|
import { RouterComponent } from './router';
|
||||||
|
@ -9,7 +9,10 @@ const mapStateToProps = (state: AppState) => ({
|
||||||
todos: state.todos,
|
todos: state.todos,
|
||||||
});
|
});
|
||||||
|
|
||||||
export const Router = withRouter(connect(
|
export const Router = compose(
|
||||||
mapStateToProps,
|
withRouter,
|
||||||
null,
|
connect(
|
||||||
)(RouterComponent));
|
mapStateToProps,
|
||||||
|
null,
|
||||||
|
),
|
||||||
|
)(RouterComponent);
|
||||||
|
|
|
@ -10,12 +10,11 @@ import { SendView } from '../views/send';
|
||||||
import { ReceiveView } from '../views/receive';
|
import { ReceiveView } from '../views/receive';
|
||||||
import { SettingsView } from '../views/settings';
|
import { SettingsView } from '../views/settings';
|
||||||
import { NotFoundView } from '../views/not-found';
|
import { NotFoundView } from '../views/not-found';
|
||||||
|
import { ConsoleView } from '../views/console';
|
||||||
import { LayoutComponent } from '../components/layout';
|
import { LayoutComponent } from '../components/layout';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
DASHBOARD_ROUTE,
|
DASHBOARD_ROUTE, SEND_ROUTE, RECEIVE_ROUTE, SETTINGS_ROUTE, CONSOLE_ROUTE,
|
||||||
SEND_ROUTE,
|
|
||||||
RECEIVE_ROUTE,
|
|
||||||
SETTINGS_ROUTE,
|
|
||||||
} from '../constants/routes';
|
} from '../constants/routes';
|
||||||
|
|
||||||
export const RouterComponent = () => (
|
export const RouterComponent = () => (
|
||||||
|
@ -25,23 +24,11 @@ export const RouterComponent = () => (
|
||||||
{/* $FlowFixMe */}
|
{/* $FlowFixMe */}
|
||||||
<LayoutComponent>
|
<LayoutComponent>
|
||||||
<Switch>
|
<Switch>
|
||||||
<Route
|
<Route exact path={DASHBOARD_ROUTE} component={DashboardView} />
|
||||||
exact
|
<Route path={SEND_ROUTE} component={SendView} />
|
||||||
path={DASHBOARD_ROUTE}
|
<Route path={RECEIVE_ROUTE} component={ReceiveView} />
|
||||||
component={DashboardView}
|
<Route path={SETTINGS_ROUTE} component={SettingsView} />
|
||||||
/>
|
<Route path={CONSOLE_ROUTE} component={ConsoleView} />
|
||||||
<Route
|
|
||||||
path={SEND_ROUTE}
|
|
||||||
component={SendView}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
path={RECEIVE_ROUTE}
|
|
||||||
component={ReceiveView}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
path={SETTINGS_ROUTE}
|
|
||||||
component={SettingsView}
|
|
||||||
/>
|
|
||||||
<Route component={NotFoundView} />
|
<Route component={NotFoundView} />
|
||||||
</Switch>
|
</Switch>
|
||||||
</LayoutComponent>
|
</LayoutComponent>
|
||||||
|
|
|
@ -4,9 +4,9 @@ import { PureComponent } from 'react';
|
||||||
import { withRouter } from 'react-router-dom';
|
import { withRouter } from 'react-router-dom';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
location: Object;
|
location: Object,
|
||||||
children: any,
|
children: any,
|
||||||
}
|
};
|
||||||
|
|
||||||
class ScrollTop extends PureComponent<Props> {
|
class ScrollTop extends PureComponent<Props> {
|
||||||
componentDidUpdate(prevProps: Props) {
|
componentDidUpdate(prevProps: Props) {
|
||||||
|
|
16
app/theme.js
16
app/theme.js
|
@ -7,7 +7,7 @@ import { normalize } from 'polished'; // eslint-disable-line
|
||||||
|
|
||||||
import { DARK } from './constants/themes';
|
import { DARK } from './constants/themes';
|
||||||
|
|
||||||
const darkOne = '#212124';
|
const darkOne = '#7B00DD';
|
||||||
const lightOne = '#ffffff';
|
const lightOne = '#ffffff';
|
||||||
const brandOne = '#624cda';
|
const brandOne = '#624cda';
|
||||||
const brandTwo = '#a6ede2';
|
const brandTwo = '#a6ede2';
|
||||||
|
@ -17,13 +17,13 @@ const appTheme = {
|
||||||
fontFamily: 'PT Sans',
|
fontFamily: 'PT Sans',
|
||||||
colors: {
|
colors: {
|
||||||
primary: theme('mode', {
|
primary: theme('mode', {
|
||||||
light: darkOne,
|
|
||||||
dark: lightOne,
|
|
||||||
}),
|
|
||||||
secondary: theme('mode', {
|
|
||||||
light: lightOne,
|
light: lightOne,
|
||||||
dark: darkOne,
|
dark: darkOne,
|
||||||
}),
|
}),
|
||||||
|
secondary: theme('mode', {
|
||||||
|
light: darkOne,
|
||||||
|
dark: lightOne,
|
||||||
|
}),
|
||||||
sidebarBg: brandOne,
|
sidebarBg: brandOne,
|
||||||
sidebarItem: brandTwo,
|
sidebarItem: brandTwo,
|
||||||
sidebarItemActive: lightOne,
|
sidebarItemActive: lightOne,
|
||||||
|
@ -36,11 +36,7 @@ const appTheme = {
|
||||||
|
|
||||||
/* eslint-disable react/prop-types */
|
/* eslint-disable react/prop-types */
|
||||||
// $FlowFixMe
|
// $FlowFixMe
|
||||||
export const DoczWrapper = ({ children }) => (
|
export const DoczWrapper = ({ children }) => <ThemeProvider theme={appTheme}>{children()}</ThemeProvider>;
|
||||||
<ThemeProvider theme={appTheme}>
|
|
||||||
{children()}
|
|
||||||
</ThemeProvider>
|
|
||||||
);
|
|
||||||
|
|
||||||
export const GlobalStyle = createGlobalStyle`${normalize()}`;
|
export const GlobalStyle = createGlobalStyle`${normalize()}`;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// @flow
|
// @flow
|
||||||
|
|
||||||
type State = {| |};
|
type State = {||};
|
||||||
|
|
||||||
export type Action = { type: $Subtype<string>, payload: Object };
|
export type Action = { type: $Subtype<string>, payload: Object };
|
||||||
export type GetState = () => State;
|
export type GetState = () => State;
|
||||||
|
|
|
@ -4,5 +4,5 @@ export type TodoType = {
|
||||||
id: string,
|
id: string,
|
||||||
text: string,
|
text: string,
|
||||||
editing: boolean,
|
editing: boolean,
|
||||||
createdAt: number
|
createdAt: number,
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
import React, { Component, Fragment } from 'react';
|
||||||
|
/* eslint-disable-next-line import/no-extraneous-dependencies */
|
||||||
|
import { ipcRenderer } from 'electron';
|
||||||
|
|
||||||
|
type Props = {};
|
||||||
|
|
||||||
|
type State = {
|
||||||
|
log: string | null,
|
||||||
|
};
|
||||||
|
|
||||||
|
export class ConsoleView extends Component<Props, State> {
|
||||||
|
state = {
|
||||||
|
log: null,
|
||||||
|
};
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
ipcRenderer.on('zcashd-log', (event, message) => {
|
||||||
|
this.setState(() => ({
|
||||||
|
log: message,
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className='dashboard'>
|
||||||
|
{this.state.log
|
||||||
|
&& this.state.log.split('\n').map(item => (
|
||||||
|
<Fragment key={`${item.slice(0, 10)}`}>
|
||||||
|
{item}
|
||||||
|
<br />
|
||||||
|
</Fragment>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,8 +2,4 @@
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
export const DashboardView = () => (
|
export const DashboardView = () => <div className='dashboard'>dashboard</div>;
|
||||||
<div className='dashboard'>
|
|
||||||
dashboard
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
|
@ -2,8 +2,4 @@
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
export const NotFoundView = () => (
|
export const NotFoundView = () => <div className='not found'>not found</div>;
|
||||||
<div className='not found'>
|
|
||||||
not found
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
|
@ -2,8 +2,4 @@
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
export const ReceiveView = () => (
|
export const ReceiveView = () => <div className='send'>receive</div>;
|
||||||
<div className='send'>
|
|
||||||
receive
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
|
@ -2,8 +2,4 @@
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
export const SendView = () => (
|
export const SendView = () => <div className='send'>send</div>;
|
||||||
<div className='send'>
|
|
||||||
send
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
|
@ -2,8 +2,4 @@
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
export const SettingsView = () => (
|
export const SettingsView = () => <div className='settings'>settings</div>;
|
||||||
<div className='settings'>
|
|
||||||
settings
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
|
@ -20,25 +20,14 @@ type Props = {
|
||||||
|
|
||||||
export default (props: Props) => {
|
export default (props: Props) => {
|
||||||
const {
|
const {
|
||||||
addTodo,
|
addTodo, todos, deleteTodo, toggleEdit, updateTodo, cancelUpdateTodo,
|
||||||
todos,
|
|
||||||
deleteTodo,
|
|
||||||
toggleEdit,
|
|
||||||
updateTodo,
|
|
||||||
cancelUpdateTodo,
|
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='todo'>
|
<div className='todo'>
|
||||||
<div className='todo__heading'>
|
<div className='todo__heading'>
|
||||||
<img
|
<img src={checklist} alt='Testing File Loader' className='todo__image' />
|
||||||
src={checklist}
|
<h1 className='todo__header'>Todo List App</h1>
|
||||||
alt='Testing File Loader'
|
|
||||||
className='todo__image'
|
|
||||||
/>
|
|
||||||
<h1 className='todo__header'>
|
|
||||||
Todo List App
|
|
||||||
</h1>
|
|
||||||
</div>
|
</div>
|
||||||
<TodoInput addTodo={addTodo} />
|
<TodoInput addTodo={addTodo} />
|
||||||
<TodoList
|
<TodoList
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,20 @@
|
||||||
|
@echo off
|
||||||
|
|
||||||
|
IF NOT EXIST %AppData%\Zcash (
|
||||||
|
mkdir %AppData%\Zcash
|
||||||
|
)
|
||||||
|
|
||||||
|
IF NOT EXIST %AppData%\ZcashParams (
|
||||||
|
mkdir %AppData%\ZcashParams
|
||||||
|
)
|
||||||
|
|
||||||
|
IF NOT EXIST %AppData%\Zcash\zcash.conf (
|
||||||
|
(
|
||||||
|
echo addnode=mainnet.z.cash
|
||||||
|
echo rpcuser=username
|
||||||
|
echo rpcpassword=password%random%%random%
|
||||||
|
echo daemon=1
|
||||||
|
echo showmetrics=0
|
||||||
|
echo gen=0
|
||||||
|
) > %AppData%\Zcash\zcash.conf
|
||||||
|
)
|
Binary file not shown.
|
@ -0,0 +1,209 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
PARAMS_DIR="$HOME/Library/Application Support/ZcashParams"
|
||||||
|
else
|
||||||
|
PARAMS_DIR="$HOME/.zcash-params"
|
||||||
|
fi
|
||||||
|
|
||||||
|
SPROUT_PKEY_NAME='sprout-proving.key'
|
||||||
|
SPROUT_VKEY_NAME='sprout-verifying.key'
|
||||||
|
SAPLING_SPEND_NAME='sapling-spend.params'
|
||||||
|
SAPLING_OUTPUT_NAME='sapling-output.params'
|
||||||
|
SAPLING_SPROUT_GROTH16_NAME='sprout-groth16.params'
|
||||||
|
SPROUT_URL="https://z.cash/downloads"
|
||||||
|
SPROUT_IPFS="/ipfs/QmZKKx7Xup7LiAtFRhYsE1M7waXcv9ir9eCECyXAFGxhEo"
|
||||||
|
|
||||||
|
SHA256CMD="$(command -v sha256sum || echo shasum)"
|
||||||
|
SHA256ARGS="$(command -v sha256sum >/dev/null || echo '-a 256')"
|
||||||
|
|
||||||
|
WGETCMD="$(command -v wget || echo '')"
|
||||||
|
IPFSCMD="$(command -v ipfs || echo '')"
|
||||||
|
CURLCMD="$(command -v curl || echo '')"
|
||||||
|
|
||||||
|
# fetch methods can be disabled with ZC_DISABLE_SOMETHING=1
|
||||||
|
ZC_DISABLE_WGET="${ZC_DISABLE_WGET:-}"
|
||||||
|
ZC_DISABLE_IPFS="${ZC_DISABLE_IPFS:-}"
|
||||||
|
ZC_DISABLE_CURL="${ZC_DISABLE_CURL:-}"
|
||||||
|
|
||||||
|
function fetch_wget {
|
||||||
|
if [ -z "$WGETCMD" ] || ! [ -z "$ZC_DISABLE_WGET" ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local filename="$1"
|
||||||
|
local dlname="$2"
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
Retrieving (wget): $SPROUT_URL/$filename
|
||||||
|
EOF
|
||||||
|
|
||||||
|
wget \
|
||||||
|
--progress=dot:giga \
|
||||||
|
--output-document="$dlname" \
|
||||||
|
--continue \
|
||||||
|
--retry-connrefused --waitretry=3 --timeout=30 \
|
||||||
|
"$SPROUT_URL/$filename"
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetch_ipfs {
|
||||||
|
if [ -z "$IPFSCMD" ] || ! [ -z "$ZC_DISABLE_IPFS" ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local filename="$1"
|
||||||
|
local dlname="$2"
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
Retrieving (ipfs): $SPROUT_IPFS/$filename
|
||||||
|
EOF
|
||||||
|
|
||||||
|
ipfs get --output "$dlname" "$SPROUT_IPFS/$filename"
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetch_curl {
|
||||||
|
if [ -z "$CURLCMD" ] || ! [ -z "$ZC_DISABLE_CURL" ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local filename="$1"
|
||||||
|
local dlname="$2"
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
Retrieving (curl): $SPROUT_URL/$filename
|
||||||
|
EOF
|
||||||
|
|
||||||
|
curl \
|
||||||
|
--output "$dlname" \
|
||||||
|
-# -L -C - \
|
||||||
|
"$SPROUT_URL/$filename"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetch_failure {
|
||||||
|
cat >&2 <<EOF
|
||||||
|
|
||||||
|
Failed to fetch the Zcash zkSNARK parameters!
|
||||||
|
Try installing one of the following programs and make sure you're online:
|
||||||
|
|
||||||
|
* ipfs
|
||||||
|
* wget
|
||||||
|
* curl
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetch_params {
|
||||||
|
local filename="$1"
|
||||||
|
local output="$2"
|
||||||
|
local dlname="${output}.dl"
|
||||||
|
local expectedhash="$3"
|
||||||
|
|
||||||
|
if ! [ -f "$output" ]
|
||||||
|
then
|
||||||
|
for method in wget ipfs curl failure; do
|
||||||
|
if "fetch_$method" "$filename" "$dlname"; then
|
||||||
|
echo "Download successful!"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
"$SHA256CMD" $SHA256ARGS -c <<EOF
|
||||||
|
$expectedhash $dlname
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Check the exit code of the shasum command:
|
||||||
|
CHECKSUM_RESULT=$?
|
||||||
|
if [ $CHECKSUM_RESULT -eq 0 ]; then
|
||||||
|
mv -v "$dlname" "$output"
|
||||||
|
else
|
||||||
|
echo "Failed to verify parameter checksums!" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Use flock to prevent parallel execution.
|
||||||
|
function lock() {
|
||||||
|
local lockfile=/tmp/fetch_params.lock
|
||||||
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
if shlock -f ${lockfile} -p $$; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# create lock file
|
||||||
|
eval "exec 200>$lockfile"
|
||||||
|
# acquire the lock
|
||||||
|
flock -n 200 \
|
||||||
|
&& return 0 \
|
||||||
|
|| return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit_locked_error {
|
||||||
|
echo "Only one instance of fetch-params.sh can be run at a time." >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
|
||||||
|
lock fetch-params.sh \
|
||||||
|
|| exit_locked_error
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
Zcash - fetch-params.sh
|
||||||
|
|
||||||
|
This script will fetch the Zcash zkSNARK parameters and verify their
|
||||||
|
integrity with sha256sum.
|
||||||
|
|
||||||
|
If they already exist locally, it will exit now and do nothing else.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Now create PARAMS_DIR and insert a README if necessary:
|
||||||
|
if ! [ -d "$PARAMS_DIR" ]
|
||||||
|
then
|
||||||
|
mkdir -p "$PARAMS_DIR"
|
||||||
|
README_PATH="$PARAMS_DIR/README"
|
||||||
|
cat >> "$README_PATH" <<EOF
|
||||||
|
This directory stores common Zcash zkSNARK parameters. Note that it is
|
||||||
|
distinct from the daemon's -datadir argument because the parameters are
|
||||||
|
large and may be shared across multiple distinct -datadir's such as when
|
||||||
|
setting up test networks.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# This may be the first time the user's run this script, so give
|
||||||
|
# them some info, especially about bandwidth usage:
|
||||||
|
cat <<EOF
|
||||||
|
The parameters are currently just under 911MB in size, so plan accordingly
|
||||||
|
for your bandwidth constraints. If the files are already present and
|
||||||
|
have the correct sha256sum, no networking is used.
|
||||||
|
|
||||||
|
Creating params directory. For details about this directory, see:
|
||||||
|
$README_PATH
|
||||||
|
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$PARAMS_DIR"
|
||||||
|
|
||||||
|
# Sprout parameters:
|
||||||
|
fetch_params "$SPROUT_PKEY_NAME" "$PARAMS_DIR/$SPROUT_PKEY_NAME" "8bc20a7f013b2b58970cddd2e7ea028975c88ae7ceb9259a5344a16bc2c0eef7"
|
||||||
|
fetch_params "$SPROUT_VKEY_NAME" "$PARAMS_DIR/$SPROUT_VKEY_NAME" "4bd498dae0aacfd8e98dc306338d017d9c08dd0918ead18172bd0aec2fc5df82"
|
||||||
|
|
||||||
|
# Sapling parameters:
|
||||||
|
fetch_params "$SAPLING_SPEND_NAME" "$PARAMS_DIR/$SAPLING_SPEND_NAME" "8e48ffd23abb3a5fd9c5589204f32d9c31285a04b78096ba40a79b75677efc13"
|
||||||
|
fetch_params "$SAPLING_OUTPUT_NAME" "$PARAMS_DIR/$SAPLING_OUTPUT_NAME" "2f0ebbcbb9bb0bcffe95a397e7eba89c29eb4dde6191c339db88570e3f3fb0e4"
|
||||||
|
fetch_params "$SAPLING_SPROUT_GROTH16_NAME" "$PARAMS_DIR/$SAPLING_SPROUT_GROTH16_NAME" "b685d700c60328498fbde589c8c7c484c722b788b265b72af448a5bf0ee55b50"
|
||||||
|
}
|
||||||
|
|
||||||
|
main
|
||||||
|
rm -f /tmp/fetch_params.lock
|
||||||
|
exit 0
|
|
@ -0,0 +1,24 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
import path from 'path';
|
||||||
|
import cp from 'child_process';
|
||||||
|
|
||||||
|
import getBinariesPath from './get-binaries-path';
|
||||||
|
import log from './logger';
|
||||||
|
|
||||||
|
export default (): Promise<*> => new Promise((resolve, reject) => {
|
||||||
|
const processName = path.join(getBinariesPath(), 'zcash-fetch-params');
|
||||||
|
|
||||||
|
const childProcess = cp.spawn(processName);
|
||||||
|
|
||||||
|
childProcess.stdout.on('data', data => log(data.toString()));
|
||||||
|
childProcess.stderr.on('data', data => log(data.toString()));
|
||||||
|
childProcess.on('error', reject);
|
||||||
|
childProcess.on('exit', (code, err) => {
|
||||||
|
if (code !== 0 || err) {
|
||||||
|
reject(new Error(err));
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,99 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
/* eslint-disable consistent-return */
|
||||||
|
|
||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
import cp from 'child_process';
|
||||||
|
import crypto from 'crypto';
|
||||||
|
import util from 'util';
|
||||||
|
|
||||||
|
import eres from 'eres';
|
||||||
|
import got from 'got';
|
||||||
|
import Queue from 'p-queue';
|
||||||
|
|
||||||
|
// eslint-disable-next-line
|
||||||
|
import { app } from '../electron';
|
||||||
|
import getBinariesPath from './get-binaries-path';
|
||||||
|
import log from './logger';
|
||||||
|
|
||||||
|
const queue = new Queue({ concurrency: 1, autoStart: false });
|
||||||
|
|
||||||
|
const httpClient = got.extend({ baseUrl: 'https://z.cash/downloads/', retry: 3, useElectronNet: true });
|
||||||
|
|
||||||
|
const FILES: Array<{ name: string, hash: string }> = [
|
||||||
|
{ name: 'sprout-proving.key', hash: '8bc20a7f013b2b58970cddd2e7ea028975c88ae7ceb9259a5344a16bc2c0eef7' },
|
||||||
|
{ name: 'sprout-verifying.key', hash: '4bd498dae0aacfd8e98dc306338d017d9c08dd0918ead18172bd0aec2fc5df82' },
|
||||||
|
{ name: 'sapling-spend.params', hash: '8e48ffd23abb3a5fd9c5589204f32d9c31285a04b78096ba40a79b75677efc13' },
|
||||||
|
{ name: 'sapling-output.params', hash: '2f0ebbcbb9bb0bcffe95a397e7eba89c29eb4dde6191c339db88570e3f3fb0e4' },
|
||||||
|
{ name: 'sprout-groth16.params', hash: 'b685d700c60328498fbde589c8c7c484c722b788b265b72af448a5bf0ee55b50' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const checkSha256 = (pathToFile: string, expectedHash: string) => new Promise((resolve, reject) => {
|
||||||
|
fs.readFile(pathToFile, (err, file) => {
|
||||||
|
if (err) return reject(new Error(err));
|
||||||
|
|
||||||
|
const sum = crypto.createHash('sha256');
|
||||||
|
sum.update(file);
|
||||||
|
resolve(sum.digest('hex') === expectedHash);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const downloadFile = ({ file, pathToSave }): Promise<*> => new Promise((resolve, reject) => {
|
||||||
|
log(`Downloading ${file.name}...`);
|
||||||
|
|
||||||
|
httpClient
|
||||||
|
.stream(file.name)
|
||||||
|
.on('end', () => {
|
||||||
|
checkSha256(pathToSave, file.hash).then((isValid) => {
|
||||||
|
if (isValid) {
|
||||||
|
log(`SHA256 validation for file ${file.name} succeeded!`);
|
||||||
|
resolve(file.name);
|
||||||
|
} else {
|
||||||
|
reject(new Error(`SHA256 validation failed for file: ${file.name}`));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.on('error', err => reject(new Error(err)))
|
||||||
|
.pipe(fs.createWriteStream(pathToSave));
|
||||||
|
});
|
||||||
|
|
||||||
|
let missingDownloadParam = false;
|
||||||
|
|
||||||
|
export default (): Promise<*> => new Promise((resolve, reject) => {
|
||||||
|
const firstRunProcess = cp.spawn(path.join(getBinariesPath(), 'win', 'first-run.bat'));
|
||||||
|
firstRunProcess.stdout.on('data', data => log(data.toString()));
|
||||||
|
firstRunProcess.stderr.on('data', data => reject(data.toString()));
|
||||||
|
|
||||||
|
firstRunProcess.on('exit', async (code, err) => {
|
||||||
|
if (code !== 0 || err) return reject(new Error(err));
|
||||||
|
|
||||||
|
await Promise.all(
|
||||||
|
FILES.map(async (file) => {
|
||||||
|
const pathToSave = path.join(app.getPath('userData'), '..', 'ZcashParams', file.name);
|
||||||
|
|
||||||
|
const [cannotAccess] = await eres(util.promisify(fs.access)(pathToSave, fs.constants.F_OK));
|
||||||
|
|
||||||
|
if (cannotAccess) {
|
||||||
|
missingDownloadParam = true;
|
||||||
|
queue.add(() => downloadFile({ file, pathToSave }).then(() => log(`Download ${file.name} finished!`)));
|
||||||
|
} else {
|
||||||
|
const isValid = await checkSha256(pathToSave, file.hash);
|
||||||
|
if (isValid) {
|
||||||
|
log(`${file.name} already is in ${pathToSave}...`);
|
||||||
|
} else {
|
||||||
|
log(`File: ${file.name} failed in the SHASUM validation, downloading again...`);
|
||||||
|
queue.add(() => {
|
||||||
|
downloadFile({ file, pathToSave }).then(() => log(`Download ${file.name} finished!`));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!missingDownloadParam) return resolve();
|
||||||
|
|
||||||
|
queue.onEmpty(resolve);
|
||||||
|
queue.start();
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,8 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
export default () => Math.random()
|
||||||
|
.toString(36)
|
||||||
|
.substring(2, 15)
|
||||||
|
+ Math.random()
|
||||||
|
.toString(36)
|
||||||
|
.substring(2, 15);
|
|
@ -0,0 +1,7 @@
|
||||||
|
// @flow
|
||||||
|
import path from 'path';
|
||||||
|
/* eslint-disable-next-line import/no-extraneous-dependencies */
|
||||||
|
import isDev from 'electron-is-dev';
|
||||||
|
|
||||||
|
// $FlowFixMe
|
||||||
|
export default () => (isDev ? path.join(__dirname, '..', '..', './bin') : path.join(process.resourcesPath, 'bin'));
|
|
@ -0,0 +1,5 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
import os from 'os';
|
||||||
|
|
||||||
|
export default () => (os.platform() === 'win32' ? 'zcashd.exe' : 'zcashd');
|
|
@ -0,0 +1,14 @@
|
||||||
|
// @flow
|
||||||
|
import os from 'os';
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
if (os.platform() === 'darwin') {
|
||||||
|
return 'mac';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (os.platform() === 'win32') {
|
||||||
|
return 'win';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'linux';
|
||||||
|
};
|
|
@ -0,0 +1,4 @@
|
||||||
|
// @flow
|
||||||
|
|
||||||
|
/* eslint-disable-next-line no-console */
|
||||||
|
export default (...message: Array<*>) => console.log('[ZCash Daemon]', ...message);
|
|
@ -0,0 +1,12 @@
|
||||||
|
// @flow
|
||||||
|
import os from 'os';
|
||||||
|
|
||||||
|
import log from './logger';
|
||||||
|
import fetchWindowsParams from './fetch-windows-params';
|
||||||
|
import runUnixFetchParams from './fetch-unix-params';
|
||||||
|
|
||||||
|
export default (): Promise<*> => {
|
||||||
|
log('Fetching params');
|
||||||
|
|
||||||
|
return os.platform() === 'win32' ? fetchWindowsParams() : runUnixFetchParams();
|
||||||
|
};
|
|
@ -0,0 +1,104 @@
|
||||||
|
// @flow
|
||||||
|
import cp from 'child_process';
|
||||||
|
import path from 'path';
|
||||||
|
import os from 'os';
|
||||||
|
import processExists from 'process-exists';
|
||||||
|
/* eslint-disable import/no-extraneous-dependencies */
|
||||||
|
import isDev from 'electron-is-dev';
|
||||||
|
import type { ChildProcess } from 'child_process';
|
||||||
|
import eres from 'eres';
|
||||||
|
/* eslint-disable-next-line import/named */
|
||||||
|
import { mainWindow } from '../electron';
|
||||||
|
|
||||||
|
import getBinariesPath from './get-binaries-path';
|
||||||
|
import getOsFolder from './get-os-folder';
|
||||||
|
import getDaemonName from './get-daemon-name';
|
||||||
|
import fetchParams from './run-fetch-params';
|
||||||
|
import log from './logger';
|
||||||
|
import store from '../electron-store';
|
||||||
|
import generateRandomString from './generate-random-string';
|
||||||
|
|
||||||
|
const getDaemonOptions = ({ username, password }) => {
|
||||||
|
/*
|
||||||
|
-showmetrics
|
||||||
|
Show metrics on stdout
|
||||||
|
-metricsui
|
||||||
|
Set to 1 for a persistent metrics screen, 0 for sequential metrics
|
||||||
|
output
|
||||||
|
-metricsrefreshtime
|
||||||
|
Number of seconds between metrics refreshes
|
||||||
|
*/
|
||||||
|
const defaultOptions = [
|
||||||
|
'-showmetrics',
|
||||||
|
'--metricsui=0',
|
||||||
|
'-metricsrefreshtime=3',
|
||||||
|
`-rpcuser=${username}`,
|
||||||
|
`-rpcpassword=${password}`,
|
||||||
|
];
|
||||||
|
return isDev ? defaultOptions.concat('-testnet') : defaultOptions;
|
||||||
|
};
|
||||||
|
|
||||||
|
let resolved = false;
|
||||||
|
|
||||||
|
const runDaemon: () => Promise<?ChildProcess> = () => new Promise(async (resolve, reject) => {
|
||||||
|
const processName = path.join(getBinariesPath(), getOsFolder(), getDaemonName());
|
||||||
|
|
||||||
|
const [err] = await eres(fetchParams());
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
log('Something went wrong fetching params: ', err);
|
||||||
|
return reject(new Error(err));
|
||||||
|
}
|
||||||
|
|
||||||
|
log('Fetch Params finished!');
|
||||||
|
|
||||||
|
const [, isRunning] = await eres(processExists(processName));
|
||||||
|
|
||||||
|
if (isRunning) {
|
||||||
|
log('Already is running!');
|
||||||
|
return resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasCredentials = store.has('rpcuser') && store.has('rpcpassword');
|
||||||
|
|
||||||
|
const rpcCredentials = hasCredentials
|
||||||
|
? {
|
||||||
|
username: store.get('rpcuser'),
|
||||||
|
password: store.get('rpcpassword'),
|
||||||
|
}
|
||||||
|
: {
|
||||||
|
username: generateRandomString(),
|
||||||
|
password: generateRandomString(),
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!hasCredentials) {
|
||||||
|
store.set('rpcuser', rpcCredentials.username);
|
||||||
|
store.set('rpcpassword', rpcCredentials.password);
|
||||||
|
}
|
||||||
|
|
||||||
|
const childProcess = cp.spawn(processName, getDaemonOptions(rpcCredentials), {
|
||||||
|
stdio: ['ignore', 'pipe', 'pipe'],
|
||||||
|
});
|
||||||
|
|
||||||
|
childProcess.stdout.on('data', (data) => {
|
||||||
|
if (mainWindow) mainWindow.webContents.send('zcashd-log', data.toString());
|
||||||
|
if (!resolved) {
|
||||||
|
resolve(childProcess);
|
||||||
|
resolved = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
childProcess.stderr.on('data', (data) => {
|
||||||
|
log(data.toString());
|
||||||
|
reject(new Error(data.toString()));
|
||||||
|
});
|
||||||
|
|
||||||
|
childProcess.on('error', reject);
|
||||||
|
|
||||||
|
if (os.platform() === 'win32') {
|
||||||
|
resolved = true;
|
||||||
|
resolve(childProcess);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default runDaemon;
|
|
@ -0,0 +1,6 @@
|
||||||
|
// @flow
|
||||||
|
import Store from 'electron-store';
|
||||||
|
|
||||||
|
export default new Store({
|
||||||
|
encryptionKey: 'afr58kk5xg6tz5o4kmvmw',
|
||||||
|
});
|
|
@ -1,4 +1,6 @@
|
||||||
// @flow
|
// @flow
|
||||||
|
import '@babel/polyfill';
|
||||||
|
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
|
||||||
/* eslint-disable import/no-extraneous-dependencies */
|
/* eslint-disable import/no-extraneous-dependencies */
|
||||||
|
@ -7,10 +9,14 @@ import { autoUpdater } from 'electron-updater';
|
||||||
import isDev from 'electron-is-dev';
|
import isDev from 'electron-is-dev';
|
||||||
/* eslint-enable import/no-extraneous-dependencies */
|
/* eslint-enable import/no-extraneous-dependencies */
|
||||||
import type { BrowserWindow as BrowserWindowType } from 'electron';
|
import type { BrowserWindow as BrowserWindowType } from 'electron';
|
||||||
|
import eres from 'eres';
|
||||||
import { registerDebugShortcut } from '../utils/debug-shortcut';
|
import { registerDebugShortcut } from '../utils/debug-shortcut';
|
||||||
|
import runDaemon from './daemon/zcashd-child-process';
|
||||||
|
import zcashLog from './daemon/logger';
|
||||||
|
|
||||||
let mainWindow: BrowserWindowType;
|
let mainWindow: BrowserWindowType;
|
||||||
let updateAvailable: boolean = false;
|
let updateAvailable: boolean = false;
|
||||||
|
let zcashDaemon;
|
||||||
|
|
||||||
const showStatus = (text) => {
|
const showStatus = (text) => {
|
||||||
if (text === 'Update downloaded') updateAvailable = true;
|
if (text === 'Update downloaded') updateAvailable = true;
|
||||||
|
@ -55,17 +61,33 @@ const createWindow = () => {
|
||||||
mainWindow.setVisibleOnAllWorkspaces(true);
|
mainWindow.setVisibleOnAllWorkspaces(true);
|
||||||
registerDebugShortcut(app, mainWindow);
|
registerDebugShortcut(app, mainWindow);
|
||||||
|
|
||||||
mainWindow.loadURL(isDev
|
mainWindow.loadURL(isDev ? 'http://0.0.0.0:8080/' : `file://${path.join(__dirname, '../build/index.html')}`);
|
||||||
? 'http://0.0.0.0:8080/'
|
|
||||||
: `file://${path.join(__dirname, '../build/index.html')}`);
|
|
||||||
|
|
||||||
exports.app = app;
|
exports.app = app;
|
||||||
|
exports.mainWindow = mainWindow;
|
||||||
};
|
};
|
||||||
|
|
||||||
app.on('ready', createWindow);
|
/* eslint-disable-next-line consistent-return */
|
||||||
|
app.on('ready', async () => {
|
||||||
|
createWindow();
|
||||||
|
const [err, proc] = await eres(runDaemon());
|
||||||
|
|
||||||
|
if (err || !proc) return zcashLog(err);
|
||||||
|
|
||||||
|
/* eslint-disable-next-line */
|
||||||
|
zcashLog(`ZCash Daemon running. PID: ${proc.pid}`);
|
||||||
|
|
||||||
|
zcashDaemon = proc;
|
||||||
|
});
|
||||||
app.on('activate', () => {
|
app.on('activate', () => {
|
||||||
if (mainWindow === null) createWindow();
|
if (mainWindow === null) createWindow();
|
||||||
});
|
});
|
||||||
app.on('window-all-closed', () => {
|
app.on('window-all-closed', () => {
|
||||||
if (process.platform !== 'darwin') app.quit();
|
if (process.platform !== 'darwin') app.quit();
|
||||||
});
|
});
|
||||||
|
app.on('before-quit', () => {
|
||||||
|
if (zcashDaemon) {
|
||||||
|
zcashLog('Graceful shutdown ZCash Daemon, this may take a few seconds.');
|
||||||
|
zcashDaemon.kill('SIGINT');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
@ -4,14 +4,13 @@ const autoprefixer = require('autoprefixer');
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
entry: {
|
entry: {
|
||||||
index: './app/index.js',
|
index: ['@babel/polyfill', './app/index.js'],
|
||||||
},
|
},
|
||||||
optimization: {
|
optimization: {
|
||||||
minimizer: [
|
minimizer: [new UglifyJSPlugin({ sourceMap: true })],
|
||||||
new UglifyJSPlugin({ sourceMap: true }),
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
devtool: 'cheap-module-source-map',
|
devtool: 'cheap-module-source-map',
|
||||||
|
target: 'electron-renderer',
|
||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
{
|
{
|
||||||
|
@ -23,21 +22,28 @@ module.exports = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.scss$/,
|
test: /\.scss$/,
|
||||||
use: [{
|
use: [
|
||||||
loader: 'style-loader',
|
{
|
||||||
}, {
|
loader: 'style-loader',
|
||||||
loader: 'css-loader',
|
|
||||||
}, {
|
|
||||||
loader: 'postcss-loader',
|
|
||||||
ident: 'postcss',
|
|
||||||
options: {
|
|
||||||
plugins: () => [autoprefixer({
|
|
||||||
browsers: ['> 1%', 'not ie 11'],
|
|
||||||
})],
|
|
||||||
},
|
},
|
||||||
}, {
|
{
|
||||||
loader: 'sass-loader',
|
loader: 'css-loader',
|
||||||
}],
|
},
|
||||||
|
{
|
||||||
|
loader: 'postcss-loader',
|
||||||
|
ident: 'postcss',
|
||||||
|
options: {
|
||||||
|
plugins: () => [
|
||||||
|
autoprefixer({
|
||||||
|
browsers: ['> 1%', 'not ie 11'],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
loader: 'sass-loader',
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.(png|jpe?g|gif|svg)$/,
|
test: /\.(png|jpe?g|gif|svg)$/,
|
||||||
|
@ -53,13 +59,15 @@ module.exports = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/,
|
test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/,
|
||||||
use: [{
|
use: [
|
||||||
loader: 'file-loader',
|
{
|
||||||
options: {
|
loader: 'file-loader',
|
||||||
name: '[name].[ext]',
|
options: {
|
||||||
outputPath: 'assets/fonts/',
|
name: '[name].[ext]',
|
||||||
|
outputPath: 'assets/fonts/',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
10
doczrc.js
10
doczrc.js
|
@ -5,4 +5,14 @@ export default {
|
||||||
title: 'Zcash Foundation',
|
title: 'Zcash Foundation',
|
||||||
description: 'Zcash Foundation User Interface Styleguide',
|
description: 'Zcash Foundation User Interface Styleguide',
|
||||||
plugins: [css()],
|
plugins: [css()],
|
||||||
|
htmlContext: {
|
||||||
|
head: {
|
||||||
|
links: [
|
||||||
|
{
|
||||||
|
rel: 'stylesheet',
|
||||||
|
href: 'https://fonts.googleapis.com/css?family=PT+Sans:400,700',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
"@babel/core": "^7.0.0",
|
"@babel/core": "^7.0.0",
|
||||||
"@babel/plugin-proposal-class-properties": "^7.0.0",
|
"@babel/plugin-proposal-class-properties": "^7.0.0",
|
||||||
"@babel/plugin-proposal-object-rest-spread": "^7.0.0",
|
"@babel/plugin-proposal-object-rest-spread": "^7.0.0",
|
||||||
|
"@babel/plugin-transform-regenerator": "^7.0.0",
|
||||||
"@babel/preset-env": "^7.0.0",
|
"@babel/preset-env": "^7.0.0",
|
||||||
"@babel/preset-flow": "^7.0.0",
|
"@babel/preset-flow": "^7.0.0",
|
||||||
"@babel/preset-react": "^7.0.0",
|
"@babel/preset-react": "^7.0.0",
|
||||||
|
@ -59,7 +60,7 @@
|
||||||
"eslint-plugin-jsx-a11y": "^6.0.3",
|
"eslint-plugin-jsx-a11y": "^6.0.3",
|
||||||
"eslint-plugin-react": "^7.7.0",
|
"eslint-plugin-react": "^7.7.0",
|
||||||
"file-loader": "^2.0.0",
|
"file-loader": "^2.0.0",
|
||||||
"flow-bin": "^0.87.0",
|
"flow-bin": "0.84.0",
|
||||||
"flow-coverage-report": "^0.6.0",
|
"flow-coverage-report": "^0.6.0",
|
||||||
"flow-typed": "^2.5.1",
|
"flow-typed": "^2.5.1",
|
||||||
"glow": "^1.2.2",
|
"glow": "^1.2.2",
|
||||||
|
@ -83,11 +84,17 @@
|
||||||
"webpack-dev-server": "^3.1.1"
|
"webpack-dev-server": "^3.1.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@babel/polyfill": "^7.0.0",
|
||||||
"@babel/register": "^7.0.0",
|
"@babel/register": "^7.0.0",
|
||||||
"autoprefixer": "^9.3.1",
|
"autoprefixer": "^9.3.1",
|
||||||
"connected-react-router": "^5.0.1",
|
"connected-react-router": "^5.0.1",
|
||||||
|
"electron-store": "^2.0.0",
|
||||||
|
"eres": "^1.0.1",
|
||||||
"got": "^9.3.2",
|
"got": "^9.3.2",
|
||||||
"history": "^4.7.2",
|
"history": "^4.7.2",
|
||||||
|
"p-queue": "^3.0.0",
|
||||||
|
"process-exists": "^3.1.0",
|
||||||
|
"qrcode.react": "^0.8.0",
|
||||||
"react": "^16.6.0",
|
"react": "^16.6.0",
|
||||||
"react-dom": "^16.6.0",
|
"react-dom": "^16.6.0",
|
||||||
"react-redux": "^5.0.7",
|
"react-redux": "^5.0.7",
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
<meta name="theme-color" content="#000000" />
|
<meta name="theme-color" content="#000000" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
||||||
<link rel="shortcut icon" href="favicon.ico" />
|
<link rel="shortcut icon" href="favicon.ico" />
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=PT+Sans:400,700" rel="stylesheet" />
|
||||||
|
|
||||||
<title>Zcash Reference Wallet</title>
|
<title>Zcash Reference Wallet</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
163
yarn.lock
163
yarn.lock
|
@ -694,7 +694,7 @@
|
||||||
"@babel/helper-regex" "^7.0.0"
|
"@babel/helper-regex" "^7.0.0"
|
||||||
regexpu-core "^4.1.3"
|
regexpu-core "^4.1.3"
|
||||||
|
|
||||||
"@babel/polyfill@7.0.0":
|
"@babel/polyfill@7.0.0", "@babel/polyfill@^7.0.0":
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.0.0.tgz#c8ff65c9ec3be6a1ba10113ebd40e8750fb90bff"
|
resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.0.0.tgz#c8ff65c9ec3be6a1ba10113ebd40e8750fb90bff"
|
||||||
integrity sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q==
|
integrity sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q==
|
||||||
|
@ -2570,7 +2570,7 @@ buffer-alloc-unsafe@^1.1.0:
|
||||||
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
|
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
|
||||||
integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
|
integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
|
||||||
|
|
||||||
buffer-alloc@^1.2.0:
|
buffer-alloc@^1.1.0, buffer-alloc@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
|
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
|
||||||
integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
|
integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
|
||||||
|
@ -3416,6 +3416,17 @@ concurrently@^4.1.0:
|
||||||
tree-kill "^1.1.0"
|
tree-kill "^1.1.0"
|
||||||
yargs "^12.0.1"
|
yargs "^12.0.1"
|
||||||
|
|
||||||
|
conf@^2.0.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/conf/-/conf-2.1.0.tgz#43ade5879a82ff23dbeb466995d50209f7dfcd07"
|
||||||
|
integrity sha512-IcWtHiBjeNtyCG+XK/v9Pz8Q4+nsyvO60Zabn6SsHTR2TMaLN6os/jrUtuQnATb12RI82RHKt+PVEXTsH6XMXQ==
|
||||||
|
dependencies:
|
||||||
|
dot-prop "^4.1.0"
|
||||||
|
env-paths "^1.0.0"
|
||||||
|
make-dir "^1.0.0"
|
||||||
|
pkg-up "^2.0.0"
|
||||||
|
write-file-atomic "^2.3.0"
|
||||||
|
|
||||||
configstore@^3.0.0:
|
configstore@^3.0.0:
|
||||||
version "3.1.2"
|
version "3.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f"
|
resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f"
|
||||||
|
@ -4004,6 +4015,19 @@ csstype@^2.5.2:
|
||||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.7.tgz#bf9235d5872141eccfb2d16d82993c6b149179ff"
|
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.7.tgz#bf9235d5872141eccfb2d16d82993c6b149179ff"
|
||||||
integrity sha512-Nt5VDyOTIIV4/nRFswoCKps1R5CD1hkiyjBE9/thNaNZILLEviVw9yWQw15+O+CpNjQKB/uvdcxFFOrSflY3Yw==
|
integrity sha512-Nt5VDyOTIIV4/nRFswoCKps1R5CD1hkiyjBE9/thNaNZILLEviVw9yWQw15+O+CpNjQKB/uvdcxFFOrSflY3Yw==
|
||||||
|
|
||||||
|
csv-parser@^1.6.0:
|
||||||
|
version "1.12.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/csv-parser/-/csv-parser-1.12.1.tgz#391e1ef961b1f9dcb4c7c0f82eb450a1bd916158"
|
||||||
|
integrity sha512-r45M92nLnGP246ot0Yo5RvbiiMF5Bw/OTIdWJ3OQ4Vbv4hpOeoXVIPxdSmUw+fPJlQOseY+iigJyLSfPMIrddQ==
|
||||||
|
dependencies:
|
||||||
|
buffer-alloc "^1.1.0"
|
||||||
|
buffer-from "^1.0.0"
|
||||||
|
generate-function "^1.0.1"
|
||||||
|
generate-object-property "^1.0.0"
|
||||||
|
inherits "^2.0.1"
|
||||||
|
minimist "^1.2.0"
|
||||||
|
ndjson "^1.4.0"
|
||||||
|
|
||||||
currently-unhandled@^0.4.1:
|
currently-unhandled@^0.4.1:
|
||||||
version "0.4.1"
|
version "0.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
|
resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
|
||||||
|
@ -4922,6 +4946,13 @@ electron-publish@20.36.0:
|
||||||
lazy-val "^1.0.3"
|
lazy-val "^1.0.3"
|
||||||
mime "^2.3.1"
|
mime "^2.3.1"
|
||||||
|
|
||||||
|
electron-store@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-2.0.0.tgz#1035cca2a95409d1f54c7466606345852450d64a"
|
||||||
|
integrity sha512-1WCFYHsYvZBqDsoaS0Relnz0rd81ZkBAI0Fgx7Nq2UWU77rSNs1qxm4S6uH7TCZ0bV3LQpJFk7id/is/ZgoOPA==
|
||||||
|
dependencies:
|
||||||
|
conf "^2.0.0"
|
||||||
|
|
||||||
electron-to-chromium@^1.3.62, electron-to-chromium@^1.3.82:
|
electron-to-chromium@^1.3.62, electron-to-chromium@^1.3.82:
|
||||||
version "1.3.84"
|
version "1.3.84"
|
||||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz#2e55df59e818f150a9f61b53471ebf4f0feecc65"
|
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz#2e55df59e818f150a9f61b53471ebf4f0feecc65"
|
||||||
|
@ -5040,6 +5071,11 @@ env-paths@^1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0"
|
resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0"
|
||||||
integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=
|
integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=
|
||||||
|
|
||||||
|
eres@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/eres/-/eres-1.0.1.tgz#6e533359532f78fb8aa00d910df0279431b9f3a4"
|
||||||
|
integrity sha512-y+Ku9iH8Mk5tq4YQOBo/A/XYmvy57itDGq+lRRm8RU7uy9iNT8h3Xh3dpr9Qo9Z+4D6WdskIDbJVwVZJ3wjpyQ==
|
||||||
|
|
||||||
errno@^0.1.1, errno@^0.1.3, errno@~0.1.7:
|
errno@^0.1.1, errno@^0.1.3, errno@~0.1.7:
|
||||||
version "0.1.7"
|
version "0.1.7"
|
||||||
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
|
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
|
||||||
|
@ -5894,10 +5930,10 @@ flow-annotation-check@1.8.1:
|
||||||
glob "7.1.1"
|
glob "7.1.1"
|
||||||
load-pkg "^3.0.1"
|
load-pkg "^3.0.1"
|
||||||
|
|
||||||
flow-bin@^0.87.0:
|
flow-bin@0.84.0:
|
||||||
version "0.87.0"
|
version "0.84.0"
|
||||||
resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.87.0.tgz#fab7f984d8cc767e93fa9eb01cf7d57ed744f19d"
|
resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.84.0.tgz#4cb2364c750fb37a7840524fa62456b53f64cdcb"
|
||||||
integrity sha512-mnvBXXZkUp4y6A96bR5BHa3q1ioIIN2L10w5osxJqagAakTXFYZwjl0t9cT3y2aCEf1wnK6n91xgYypQS/Dqbw==
|
integrity sha512-ocji8eEYp+YfICsm+F6cIHUcD7v5sb0/ADEXm6gyUKdjQzmSckMrPUdZtyfP973t3YGHKliUMxMvIBHyR5LbXQ==
|
||||||
|
|
||||||
flow-coverage-report@^0.6.0:
|
flow-coverage-report@^0.6.0:
|
||||||
version "0.6.0"
|
version "0.6.0"
|
||||||
|
@ -6031,7 +6067,7 @@ friendly-errors-webpack-plugin@^1.7.0:
|
||||||
error-stack-parser "^2.0.0"
|
error-stack-parser "^2.0.0"
|
||||||
string-width "^2.0.0"
|
string-width "^2.0.0"
|
||||||
|
|
||||||
from2@^2.1.0:
|
from2@^2.1.0, from2@^2.1.1:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
|
resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
|
||||||
integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
|
integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
|
||||||
|
@ -6169,6 +6205,18 @@ gaze@^1.0.0, gaze@~1.1.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
globule "^1.0.0"
|
globule "^1.0.0"
|
||||||
|
|
||||||
|
generate-function@^1.0.1:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-1.1.0.tgz#54c21b080192b16d9877779c5bb81666e772365f"
|
||||||
|
integrity sha1-VMIbCAGSsW2Yd3ecW7gWZudyNl8=
|
||||||
|
|
||||||
|
generate-object-property@^1.0.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
|
||||||
|
integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=
|
||||||
|
dependencies:
|
||||||
|
is-property "^1.0.0"
|
||||||
|
|
||||||
get-caller-file@^1.0.1:
|
get-caller-file@^1.0.1:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
|
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
|
||||||
|
@ -6205,6 +6253,14 @@ get-stdin@^4.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
|
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
|
||||||
integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
|
integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
|
||||||
|
|
||||||
|
get-stream@^2.1.0:
|
||||||
|
version "2.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
|
||||||
|
integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
|
||||||
|
dependencies:
|
||||||
|
object-assign "^4.0.1"
|
||||||
|
pinkie-promise "^2.0.0"
|
||||||
|
|
||||||
get-stream@^3.0.0:
|
get-stream@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
|
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
|
||||||
|
@ -7206,6 +7262,13 @@ interpret@^1.1.0:
|
||||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
|
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
|
||||||
integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=
|
integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=
|
||||||
|
|
||||||
|
into-stream@^2.0.0:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-2.0.1.tgz#db9b003694453eae091d8a5c84cc11507b781d31"
|
||||||
|
integrity sha1-25sANpRFPq4JHYpchMwRUHt4HTE=
|
||||||
|
dependencies:
|
||||||
|
from2 "^2.1.1"
|
||||||
|
|
||||||
invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4:
|
invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4:
|
||||||
version "2.2.4"
|
version "2.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
|
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
|
||||||
|
@ -7579,6 +7642,11 @@ is-promise@^2.1.0:
|
||||||
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
|
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
|
||||||
integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
|
integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
|
||||||
|
|
||||||
|
is-property@^1.0.0:
|
||||||
|
version "1.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
|
||||||
|
integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
|
||||||
|
|
||||||
is-redirect@^1.0.0:
|
is-redirect@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
|
resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
|
||||||
|
@ -9571,6 +9639,25 @@ natural-compare@^1.4.0:
|
||||||
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||||
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
|
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
|
||||||
|
|
||||||
|
ndjson@^1.4.0:
|
||||||
|
version "1.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-1.5.0.tgz#ae603b36b134bcec347b452422b0bf98d5832ec8"
|
||||||
|
integrity sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg=
|
||||||
|
dependencies:
|
||||||
|
json-stringify-safe "^5.0.1"
|
||||||
|
minimist "^1.2.0"
|
||||||
|
split2 "^2.1.0"
|
||||||
|
through2 "^2.0.3"
|
||||||
|
|
||||||
|
neat-csv@^2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/neat-csv/-/neat-csv-2.1.0.tgz#06f58360c4c3b955bd467ddc85ae4511a3907a4c"
|
||||||
|
integrity sha1-BvWDYMTDuVW9Rn3cha5FEaOQekw=
|
||||||
|
dependencies:
|
||||||
|
csv-parser "^1.6.0"
|
||||||
|
get-stream "^2.1.0"
|
||||||
|
into-stream "^2.0.0"
|
||||||
|
|
||||||
needle@^2.2.1:
|
needle@^2.2.1:
|
||||||
version "2.2.4"
|
version "2.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
|
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
|
||||||
|
@ -10183,6 +10270,11 @@ p-map@^1.1.1:
|
||||||
resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
|
resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
|
||||||
integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==
|
integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==
|
||||||
|
|
||||||
|
p-queue@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-3.0.0.tgz#0ef247082f0dd5a21b66e2cfe8fb7b06db13fb52"
|
||||||
|
integrity sha512-2tv/MRmPXfmfnjLLJAHl+DdU8p2DhZafAnlpm/C/T5BpF5L9wKz5tMin4A4N2zVpJL2YMhPlRmtO7s5EtNrjfA==
|
||||||
|
|
||||||
p-reduce@^1.0.0:
|
p-reduce@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
|
resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
|
||||||
|
@ -10498,7 +10590,7 @@ phin@^2.9.1:
|
||||||
resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
|
resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
|
||||||
integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
|
integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
|
||||||
|
|
||||||
pify@^2.0.0:
|
pify@^2.0.0, pify@^2.2.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
||||||
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
|
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
|
||||||
|
@ -10563,7 +10655,7 @@ pkg-dir@^3.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
find-up "^3.0.0"
|
find-up "^3.0.0"
|
||||||
|
|
||||||
pkg-up@2.0.0:
|
pkg-up@2.0.0, pkg-up@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
|
resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
|
||||||
integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
|
integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
|
||||||
|
@ -11045,6 +11137,13 @@ private@^0.1.6, private@~0.1.5:
|
||||||
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
|
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
|
||||||
integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
|
integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
|
||||||
|
|
||||||
|
process-exists@^3.1.0:
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/process-exists/-/process-exists-3.1.0.tgz#86cae049e1e7b51382690ec9fd8dfd74ff7a17c8"
|
||||||
|
integrity sha512-X11vso1oNLtyDa2j8fsMol2fph1+5PoQ4vpEc1it/rM8eLuRTmrmTg4jfn82WhNur241AYitgjKCgmlgMRZesw==
|
||||||
|
dependencies:
|
||||||
|
ps-list "^4.0.0"
|
||||||
|
|
||||||
process-nextick-args@~1.0.6:
|
process-nextick-args@~1.0.6:
|
||||||
version "1.0.7"
|
version "1.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
|
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
|
||||||
|
@ -11139,6 +11238,14 @@ prr@~1.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
|
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
|
||||||
integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
|
integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
|
||||||
|
|
||||||
|
ps-list@^4.0.0:
|
||||||
|
version "4.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ps-list/-/ps-list-4.1.0.tgz#8ffd6434add37f9dd1a9f19ab1beb42c9db60dae"
|
||||||
|
integrity sha512-DSpMj8PI5W7v2G4+rE+BymTKZPjlu6t/M1N6rPAa6Hwn+/e8jDmFJaq8/kpoGCvwd75g2h5DbjF2MduOMNyrsQ==
|
||||||
|
dependencies:
|
||||||
|
pify "^3.0.0"
|
||||||
|
tasklist "^3.1.0"
|
||||||
|
|
||||||
pseudomap@^1.0.2:
|
pseudomap@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
|
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
|
||||||
|
@ -11211,6 +11318,19 @@ q@~0.9.6:
|
||||||
resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75"
|
resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75"
|
||||||
integrity sha1-TeLmyzspCIyeTLwDv51C+5bOL3U=
|
integrity sha1-TeLmyzspCIyeTLwDv51C+5bOL3U=
|
||||||
|
|
||||||
|
qr.js@0.0.0:
|
||||||
|
version "0.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f"
|
||||||
|
integrity sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8=
|
||||||
|
|
||||||
|
qrcode.react@^0.8.0:
|
||||||
|
version "0.8.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/qrcode.react/-/qrcode.react-0.8.0.tgz#413b31cc3b62910e39513f7bead945e01c4c34fb"
|
||||||
|
integrity sha512-16wKpuFvLwciIq2YAsfmPUCnSR8GrYPsXRK5KVdcIuX0+W/MKZbBkFhl44ttRx4TWZHqRjfztoWOxdPF0Hb9JA==
|
||||||
|
dependencies:
|
||||||
|
prop-types "^15.6.0"
|
||||||
|
qr.js "0.0.0"
|
||||||
|
|
||||||
qs@6.5.2, qs@~6.5.2:
|
qs@6.5.2, qs@~6.5.2:
|
||||||
version "6.5.2"
|
version "6.5.2"
|
||||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
|
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
|
||||||
|
@ -12535,6 +12655,11 @@ seamless-immutable@^7.1.3:
|
||||||
resolved "https://registry.yarnpkg.com/seamless-immutable/-/seamless-immutable-7.1.4.tgz#6e9536def083ddc4dea0207d722e0e80d0f372f8"
|
resolved "https://registry.yarnpkg.com/seamless-immutable/-/seamless-immutable-7.1.4.tgz#6e9536def083ddc4dea0207d722e0e80d0f372f8"
|
||||||
integrity sha512-XiUO1QP4ki4E2PHegiGAlu6r82o5A+6tRh7IkGGTVg/h+UoeX4nFBeCGPOhb4CYjvkqsfm/TUtvOMYC1xmV30A==
|
integrity sha512-XiUO1QP4ki4E2PHegiGAlu6r82o5A+6tRh7IkGGTVg/h+UoeX4nFBeCGPOhb4CYjvkqsfm/TUtvOMYC1xmV30A==
|
||||||
|
|
||||||
|
sec@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/sec/-/sec-1.0.0.tgz#033d60a3ad20ecf2e00940d14f97823465774335"
|
||||||
|
integrity sha1-Az1go60g7PLgCUDRT5eCNGV3QzU=
|
||||||
|
|
||||||
select-hose@^2.0.0:
|
select-hose@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
|
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
|
||||||
|
@ -13022,6 +13147,13 @@ split-string@^3.0.1, split-string@^3.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
extend-shallow "^3.0.0"
|
extend-shallow "^3.0.0"
|
||||||
|
|
||||||
|
split2@^2.1.0:
|
||||||
|
version "2.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493"
|
||||||
|
integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==
|
||||||
|
dependencies:
|
||||||
|
through2 "^2.0.2"
|
||||||
|
|
||||||
split@^1.0.0:
|
split@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
|
resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
|
||||||
|
@ -13518,6 +13650,15 @@ tar@^4:
|
||||||
safe-buffer "^5.1.2"
|
safe-buffer "^5.1.2"
|
||||||
yallist "^3.0.2"
|
yallist "^3.0.2"
|
||||||
|
|
||||||
|
tasklist@^3.1.0:
|
||||||
|
version "3.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/tasklist/-/tasklist-3.1.1.tgz#84cb49f8359b9ed0451dd1d9b6111da18107dbd5"
|
||||||
|
integrity sha512-G3I7QWUBSNWaekrJcDabydF6dcvy+vZ2PrX04JYq1p914TOLgpN+ryMtheGavs1LYVevTbTmwjQY8aeX8yLsyA==
|
||||||
|
dependencies:
|
||||||
|
neat-csv "^2.1.0"
|
||||||
|
pify "^2.2.0"
|
||||||
|
sec "^1.0.0"
|
||||||
|
|
||||||
temp-file@^3.2.0:
|
temp-file@^3.2.0:
|
||||||
version "3.3.2"
|
version "3.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.3.2.tgz#69b6daf1bbe23231d0a5d03844e3d96f3f531aaa"
|
resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.3.2.tgz#69b6daf1bbe23231d0a5d03844e3d96f3f531aaa"
|
||||||
|
@ -13618,7 +13759,7 @@ throttleit@^1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
|
resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
|
||||||
integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=
|
integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=
|
||||||
|
|
||||||
through2@^2.0.0:
|
through2@^2.0.0, through2@^2.0.2, through2@^2.0.3:
|
||||||
version "2.0.5"
|
version "2.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
|
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
|
||||||
integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
|
integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
|
||||||
|
@ -15002,7 +15143,7 @@ wrappy@1:
|
||||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||||
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
||||||
|
|
||||||
write-file-atomic@^2.0.0, write-file-atomic@^2.1.0:
|
write-file-atomic@^2.0.0, write-file-atomic@^2.1.0, write-file-atomic@^2.3.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
|
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
|
||||||
integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==
|
integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==
|
||||||
|
|
Loading…
Reference in New Issue