(undefined);
-
-const stateReducer = (state: State, action: ActionType): State => {
- switch (action.type) {
- case 'connected':
- return action.state || initialState;
- case 'disconnected':
- return initialState;
- default:
- return initialState;
- }
-};
-
-const initialState = {
- loading: true,
- alias: '',
- syncedToChain: false,
- version: '',
- mayorVersion: 0,
- minorVersion: 0,
- revision: 0,
- chainBalance: 0,
- chainPending: 0,
- channelBalance: 0,
- channelPending: 0,
-};
-
-const StatusProvider = ({ children }: any) => {
- const [state, dispatch] = useReducer(stateReducer, initialState);
-
- return (
-
-
- {children}
-
-
- );
-};
-
-const useStatusState = () => {
- const context = useContext(StateContext);
- if (context === undefined) {
- throw new Error('useStatusState must be used within a StatusProvider');
- }
- return context;
-};
-
-const useStatusDispatch = () => {
- const context = useContext(DispatchContext);
- if (context === undefined) {
- throw new Error(
- 'useStatusDispatch must be used within a StatusProvider',
- );
- }
- return context;
-};
-
-export { StatusProvider, useStatusState, useStatusDispatch };
diff --git a/client/src/graphql/hodlhodl/query.ts b/client/src/graphql/hodlhodl/query.ts
deleted file mode 100644
index 7d260c1f..00000000
--- a/client/src/graphql/hodlhodl/query.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import gql from 'graphql-tag';
-
-export const GET_HODL_COUNTRIES = gql`
- query GetCountries {
- getCountries {
- code
- name
- native_name
- currency_code
- currency_name
- }
- }
-`;
-
-export const GET_HODL_CURRENCIES = gql`
- query GetCurrencies {
- getCurrencies {
- code
- name
- type
- }
- }
-`;
-
-export const GET_HODL_OFFERS = gql`
- query GetOffers($filter: String) {
- getOffers(filter: $filter) {
- id
- asset_code
- country
- country_code
- working_now
- side
- title
- description
- currency_code
- price
- min_amount
- max_amount
- first_trade_limit
- fee {
- author_fee_rate
- }
- balance
- payment_window_minutes
- confirmations
- payment_method_instructions {
- id
- version
- payment_method_id
- payment_method_type
- payment_method_name
- }
- trader {
- login
- online_status
- rating
- trades_count
- url
- verified
- verified_by
- strong_hodler
- country
- country_code
- average_payment_time_minutes
- average_release_time_minutes
- days_since_last_trade
- }
- }
- }
-`;
diff --git a/client/src/graphql/mutation.ts b/client/src/graphql/mutation.ts
deleted file mode 100644
index 1e6270a2..00000000
--- a/client/src/graphql/mutation.ts
+++ /dev/null
@@ -1,159 +0,0 @@
-import gql from 'graphql-tag';
-
-export const CLOSE_CHANNEL = gql`
- mutation CloseChannel(
- $id: String!
- $auth: authType!
- $forceClose: Boolean
- $target: Int
- $tokens: Int
- ) {
- closeChannel(
- id: $id
- forceClose: $forceClose
- targetConfirmations: $target
- tokensPerVByte: $tokens
- auth: $auth
- ) {
- transactionId
- transactionOutputIndex
- }
- }
-`;
-
-export const OPEN_CHANNEL = gql`
- mutation openChannel(
- $amount: Int!
- $partnerPublicKey: String!
- $auth: authType!
- $tokensPerVByte: Int
- $isPrivate: Boolean
- ) {
- openChannel(
- amount: $amount
- partnerPublicKey: $partnerPublicKey
- auth: $auth
- tokensPerVByte: $tokensPerVByte
- isPrivate: $isPrivate
- ) {
- transactionId
- transactionOutputIndex
- }
- }
-`;
-
-export const PAY_INVOICE = gql`
- mutation PayInvoice($request: String!, $auth: authType!) {
- pay(request: $request, auth: $auth) {
- isConfirmed
- }
- }
-`;
-
-export const CREATE_INVOICE = gql`
- mutation PayInvoice($amount: Int!, $auth: authType!) {
- createInvoice(amount: $amount, auth: $auth) {
- request
- }
- }
-`;
-
-export const CREATE_ADDRESS = gql`
- mutation CreateAddress($nested: Boolean, $auth: authType!) {
- createAddress(nested: $nested, auth: $auth)
- }
-`;
-
-export const PAY_ADDRESS = gql`
- mutation PayAddress(
- $auth: authType!
- $address: String!
- $tokens: Int
- $fee: Int
- $target: Int
- $sendAll: Boolean
- ) {
- sendToAddress(
- auth: $auth
- address: $address
- tokens: $tokens
- fee: $fee
- target: $target
- sendAll: $sendAll
- ) {
- confirmationCount
- id
- isConfirmed
- isOutgoing
- tokens
- }
- }
-`;
-
-export const DECODE_REQUEST = gql`
- mutation decodeRequest($auth: authType!, $request: String!) {
- decodeRequest(auth: $auth, request: $request) {
- chainAddress
- cltvDelta
- description
- descriptionHash
- destination
- expiresAt
- id
- routes {
- baseFeeMTokens
- channel
- cltvDelta
- feeRate
- publicKey
- }
- tokens
- }
- }
-`;
-
-export const UPDATE_FEES = gql`
- mutation updateFees(
- $auth: authType!
- $transactionId: String
- $transactionVout: Int
- $baseFee: Int
- $feeRate: Int
- ) {
- updateFees(
- auth: $auth
- transactionId: $transactionId
- transactionVout: $transactionVout
- baseFee: $baseFee
- feeRate: $feeRate
- )
- }
-`;
-
-export const PAY_VIA_ROUTE = gql`
- mutation PayViaRoute($auth: authType!, $route: String!) {
- payViaRoute(auth: $auth, route: $route)
- }
-`;
-
-export const REMOVE_PEER = gql`
- mutation RemovePeer($auth: authType!, $publicKey: String!) {
- removePeer(auth: $auth, publicKey: $publicKey)
- }
-`;
-
-export const ADD_PEER = gql`
- mutation AddPeer(
- $auth: authType!
- $publicKey: String!
- $socket: String!
- $isTemporary: Boolean
- ) {
- addPeer(
- auth: $auth
- publicKey: $publicKey
- socket: $socket
- isTemporary: $isTemporary
- )
- }
-`;
diff --git a/client/src/graphql/query.ts b/client/src/graphql/query.ts
deleted file mode 100644
index a8607b66..00000000
--- a/client/src/graphql/query.ts
+++ /dev/null
@@ -1,378 +0,0 @@
-import gql from 'graphql-tag';
-
-export const GET_NETWORK_INFO = gql`
- query GetNetworkInfo($auth: authType!) {
- getNetworkInfo(auth: $auth) {
- averageChannelSize
- channelCount
- maxChannelSize
- medianChannelSize
- minChannelSize
- nodeCount
- notRecentlyUpdatedPolicyCount
- totalCapacity
- }
- }
-`;
-
-export const GET_CAN_CONNECT = gql`
- query GetNodeInfo($auth: authType!) {
- getNodeInfo(auth: $auth) {
- chains
- color
- active_channels_count
- closed_channels_count
- alias
- is_synced_to_chain
- peers_count
- pending_channels_count
- version
- }
- }
-`;
-
-export const GET_CAN_ADMIN = gql`
- query AdminCheck($auth: authType!) {
- adminCheck(auth: $auth)
- }
-`;
-
-export const GET_NODE_INFO = gql`
- query GetNodeInfo($auth: authType!) {
- getNodeInfo(auth: $auth) {
- chains
- color
- active_channels_count
- closed_channels_count
- alias
- is_synced_to_chain
- peers_count
- pending_channels_count
- version
- }
- getChainBalance(auth: $auth)
- getPendingChainBalance(auth: $auth)
- getChannelBalance(auth: $auth) {
- confirmedBalance
- pendingBalance
- }
- }
-`;
-
-export const GET_CHANNEL_AMOUNT_INFO = gql`
- query GetChannelAmountInfo($auth: authType!) {
- getNodeInfo(auth: $auth) {
- active_channels_count
- closed_channels_count
- pending_channels_count
- }
- }
-`;
-
-export const GET_CHANNELS = gql`
- query GetChannels($auth: authType!, $active: Boolean) {
- getChannels(auth: $auth, active: $active) {
- capacity
- commit_transaction_fee
- commit_transaction_weight
- id
- is_active
- is_closing
- is_opening
- is_partner_initiated
- is_private
- is_static_remote_key
- local_balance
- local_reserve
- partner_public_key
- received
- remote_balance
- remote_reserve
- sent
- time_offline
- time_online
- transaction_id
- transaction_vout
- unsettled_balance
- partner_node_info {
- alias
- capacity
- channel_count
- color
- updated_at
- }
- }
- }
-`;
-
-export const GET_PENDING_CHANNELS = gql`
- query GetPendingChannels($auth: authType!) {
- getPendingChannels(auth: $auth) {
- close_transaction_id
- is_active
- is_closing
- is_opening
- local_balance
- local_reserve
- partner_public_key
- received
- remote_balance
- remote_reserve
- sent
- transaction_fee
- transaction_id
- transaction_vout
- partner_node_info {
- alias
- capacity
- channel_count
- color
- updated_at
- }
- }
- }
-`;
-
-export const GET_CLOSED_CHANNELS = gql`
- query GetClosedChannels($auth: authType!) {
- getClosedChannels(auth: $auth) {
- capacity
- close_confirm_height
- close_transaction_id
- final_local_balance
- final_time_locked_balance
- id
- is_breach_close
- is_cooperative_close
- is_funding_cancel
- is_local_force_close
- is_remote_force_close
- partner_public_key
- transaction_id
- transaction_vout
- partner_node_info {
- alias
- capacity
- channel_count
- color
- updated_at
- }
- }
- }
-`;
-
-export const GET_RESUME = gql`
- query GetResume($auth: authType!, $token: String) {
- getResume(auth: $auth, token: $token) {
- token
- resume
- }
- }
-`;
-
-export const GET_BITCOIN_PRICE = gql`
- query GetBitcoinPrice {
- getBitcoinPrice
- }
-`;
-
-export const GET_BITCOIN_FEES = gql`
- query GetBitcoinFees {
- getBitcoinFees {
- fast
- halfHour
- hour
- }
- }
-`;
-
-export const GET_FORWARD_REPORT = gql`
- query GetForwardReport($time: String, $auth: authType!) {
- getForwardReport(time: $time, auth: $auth)
- }
-`;
-
-export const GET_LIQUID_REPORT = gql`
- query GetLiquidReport($auth: authType!) {
- getChannelReport(auth: $auth) {
- local
- remote
- maxIn
- maxOut
- }
- }
-`;
-
-export const GET_FORWARD_CHANNELS_REPORT = gql`
- query GetForwardChannelsReport(
- $time: String
- $order: String
- $type: String
- $auth: authType!
- ) {
- getForwardChannelsReport(
- time: $time
- order: $order
- auth: $auth
- type: $type
- )
- }
-`;
-
-export const GET_IN_OUT = gql`
- query GetInOut($auth: authType!, $time: String) {
- getInOut(auth: $auth, time: $time) {
- invoices
- payments
- confirmedInvoices
- unConfirmedInvoices
- }
- }
-`;
-
-export const GET_CHAIN_TRANSACTIONS = gql`
- query GetChainTransactions($auth: authType!) {
- getChainTransactions(auth: $auth) {
- block_id
- confirmation_count
- confirmation_height
- created_at
- fee
- id
- output_addresses
- tokens
- }
- }
-`;
-
-export const GET_FORWARDS = gql`
- query GetForwards($auth: authType!, $time: String) {
- getForwards(auth: $auth, time: $time) {
- forwards {
- created_at
- fee
- fee_mtokens
- incoming_channel
- incoming_alias
- incoming_color
- mtokens
- outgoing_channel
- outgoing_alias
- outgoing_color
- tokens
- }
- token
- }
- }
-`;
-
-export const GET_CONNECT_INFO = gql`
- query GetNodeInfo($auth: authType!) {
- getNodeInfo(auth: $auth) {
- public_key
- uris
- }
- }
-`;
-
-export const GET_BACKUPS = gql`
- query GetBackups($auth: authType!) {
- getBackups(auth: $auth)
- }
-`;
-
-export const VERIFY_BACKUPS = gql`
- query VerifyBackups($auth: authType!, $backup: String!) {
- verifyBackups(auth: $auth, backup: $backup)
- }
-`;
-
-export const SIGN_MESSAGE = gql`
- query SignMessage($auth: authType!, $message: String!) {
- signMessage(auth: $auth, message: $message)
- }
-`;
-
-export const VERIFY_MESSAGE = gql`
- query VerifyMessage(
- $auth: authType!
- $message: String!
- $signature: String!
- ) {
- verifyMessage(auth: $auth, message: $message, signature: $signature)
- }
-`;
-
-export const RECOVER_FUNDS = gql`
- query RecoverFunds($auth: authType!, $backup: String!) {
- recoverFunds(auth: $auth, backup: $backup)
- }
-`;
-
-export const CHANNEL_FEES = gql`
- query GetChannelFees($auth: authType!) {
- getChannelFees(auth: $auth) {
- alias
- color
- baseFee
- feeRate
- transactionId
- transactionVout
- }
- }
-`;
-
-export const GET_ROUTES = gql`
- query GetRoutes(
- $auth: authType!
- $outgoing: String!
- $incoming: String!
- $tokens: Int!
- $maxFee: Int
- ) {
- getRoutes(
- auth: $auth
- outgoing: $outgoing
- incoming: $incoming
- tokens: $tokens
- maxFee: $maxFee
- )
- }
-`;
-
-export const GET_PEERS = gql`
- query GetPeers($auth: authType!) {
- getPeers(auth: $auth) {
- bytes_received
- bytes_sent
- is_inbound
- is_sync_peer
- ping_time
- public_key
- socket
- tokens_received
- tokens_sent
- partner_node_info {
- alias
- capacity
- channel_count
- color
- updated_at
- }
- }
- }
-`;
-
-export const GET_UTXOS = gql`
- query GetUtxos($auth: authType!) {
- getUtxos(auth: $auth) {
- address
- address_format
- confirmation_count
- output_script
- tokens
- transaction_id
- transaction_vout
- }
- }
-`;
diff --git a/client/src/helpers/Helpers.tsx b/client/src/helpers/Helpers.tsx
deleted file mode 100644
index 9d6d4336..00000000
--- a/client/src/helpers/Helpers.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import numeral from 'numeral';
-
-const getValueString = (amount: number): string => {
- if (amount >= 100000) {
- return `${amount / 1000000}m`;
- } else if (amount >= 1000) {
- return `${amount / 1000}k`;
- }
- return `${amount}`;
-};
-
-interface GetNumberProps {
- amount: string | number;
- price: number;
- symbol: string;
- currency: string;
- breakNumber?: boolean;
-}
-
-export const getValue = ({
- amount,
- price,
- symbol,
- currency,
- breakNumber,
-}: GetNumberProps): string => {
- let value: number = 0;
- if (typeof amount === 'string') {
- value = parseInt(amount);
- } else {
- value = amount;
- }
-
- if (currency === 'btc') {
- if (!value) return `₿0.0`;
- const amountInBtc = value / 100000000;
- return `₿${amountInBtc}`;
- } else if (currency === 'sat') {
- const breakAmount = breakNumber
- ? getValueString(value)
- : numeral(value).format('0,0');
- return `${breakAmount} sats`;
- } else {
- const amountInFiat = (value / 100000000) * price;
- return `${symbol}${numeral(amountInFiat).format('0,0.00')}`;
- }
-};
-
-export const getPercent = (
- local: number,
- remote: number,
- withDecimals?: boolean,
-): number => {
- const total = remote + local;
- const percent = (local / total) * 100;
-
- if (remote === 0 && local === 0) {
- return 0;
- }
-
- if (withDecimals) {
- return Math.round(percent * 100) / 100;
- }
-
- return Math.round(percent);
-};
-
-export const saveToPc = (jsonData: string, filename: string) => {
- const fileData = jsonData;
- const blob = new Blob([fileData], { type: 'text/plain' });
- const url = URL.createObjectURL(blob);
- const link = document.createElement('a');
- link.download = `${filename}.txt`;
- link.href = url;
- link.click();
-};
diff --git a/client/src/hooks/UseInterval.tsx b/client/src/hooks/UseInterval.tsx
deleted file mode 100644
index fa27fb71..00000000
--- a/client/src/hooks/UseInterval.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { useEffect, useRef } from 'react';
-
-export const useInterval = (callback: any, delay: number) => {
- const savedCallback = useRef(callback);
-
- useEffect(() => {
- savedCallback.current = callback;
- }, [callback]);
-
- useEffect(() => {
- const tick = () => {
- savedCallback.current();
- };
- let id = setInterval(tick, delay);
- return () => clearInterval(id);
- }, [delay]);
-};
diff --git a/client/src/hooks/UseSize.tsx b/client/src/hooks/UseSize.tsx
deleted file mode 100644
index 85621e73..00000000
--- a/client/src/hooks/UseSize.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { useState, useEffect } from 'react';
-import debounce from 'lodash.debounce';
-
-const getSize = () => {
- const isClient = typeof window === 'object';
- return {
- width: isClient ? window.innerWidth : 0,
- height: isClient ? window.innerHeight : 0,
- };
-};
-
-export const useSize = () => {
- const [windowSize, setWindowSize] = useState(getSize());
-
- useEffect(() => {
- const handleResize = () => {
- setWindowSize(getSize());
- };
-
- handleResize();
-
- const debouncedHandle = debounce(handleResize, 250);
- window.addEventListener('resize', debouncedHandle);
- return () => window.removeEventListener('resize', debouncedHandle);
- }, []);
-
- return windowSize;
-};
diff --git a/client/src/index.tsx b/client/src/index.tsx
deleted file mode 100644
index ac0f46dc..00000000
--- a/client/src/index.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react';
-import ReactDOM from 'react-dom';
-import App from './App';
-import './styles/FontStyles.css';
-import * as serviceWorker from './serviceWorker';
-
-ReactDOM.render( , document.getElementById('root'));
-
-// If you want your app to work offline and load faster, you can change
-// unregister() to register() below. Note this comes with some pitfalls.
-// Learn more about service workers: https://bit.ly/CRA-PWA
-serviceWorker.unregister();
diff --git a/client/src/react-app-env.d.ts b/client/src/react-app-env.d.ts
deleted file mode 100644
index 6431bc5f..00000000
--- a/client/src/react-app-env.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/client/src/sections/content/Content.tsx b/client/src/sections/content/Content.tsx
deleted file mode 100644
index e6f76b4a..00000000
--- a/client/src/sections/content/Content.tsx
+++ /dev/null
@@ -1,104 +0,0 @@
-import React from 'react';
-import styled from 'styled-components';
-import { Navigation } from '../../sections/navigation/Navigation';
-import { Switch, Route } from 'react-router';
-
-import { Home } from '../../views/home/Home';
-import { NotFound } from '../../views/notFound/NotFound';
-import { ChannelView } from '../../views/channels/ChannelView';
-import { SettingsView } from '../../views/settings/Settings';
-import { TransactionList } from '../../views/transactions/TransactionList';
-import { FeesView } from '../../views/fees/Fees';
-import { ForwardsList } from '../../views/forwards/ForwardList';
-import { TermsView } from '../../views/other/terms/TermsView';
-import { PrivacyView } from '../../views/other/privacy/PrivacyView';
-import { FaqView } from '../../views/other/faq/FaqView';
-import { Section } from 'components/section/Section';
-import { BitcoinPrice } from '../../components/bitcoinInfo/BitcoinPrice';
-import { BitcoinFees } from '../../components/bitcoinInfo/BitcoinFees';
-import { mediaWidths } from 'styles/Themes';
-import { useConnectionState } from 'context/ConnectionContext';
-import { LoadingView, ErrorView } from 'views/stateViews/StateCards';
-import { BalanceView } from 'views/balance/Balance';
-import { PeersList } from 'views/peers/PeersList';
-import { ToolsView } from 'views/tools';
-import { ChainView } from 'views/chain/ChainView';
-import { TraderView } from 'views/trader/TraderView';
-
-const Container = styled.div`
- display: grid;
- grid-template-areas: 'nav content content';
- grid-template-columns: auto 1fr 200px;
- gap: 16px;
-
- @media (${mediaWidths.mobile}) {
- display: flex;
- flex-direction: column;
- }
-`;
-
-const ContentStyle = styled.div`
- grid-area: content;
-`;
-
-const Content = () => {
- const { loading, error } = useConnectionState();
-
- const renderSettings = (type: string) => (
-
- getGrid(SettingsView)} />
-
- getGrid(type === 'error' ? ErrorView : LoadingView)
- }
- />
-
- );
-
- if (loading) return renderSettings('loading');
- if (error) return renderSettings('error');
-
- return (
- <>
-
-
-
- getGrid(Home)} />
- getGrid(PeersList)} />
- getGrid(ChannelView)} />
- getGrid(BalanceView)} />
- getGrid(ToolsView)} />
- getGrid(TransactionList)}
- />
- getGrid(ForwardsList)} />
- getGrid(ChainView)}
- />
- getGrid(SettingsView)} />
- getGrid(FeesView)} />
- getGrid(TraderView)} />
- } />
- } />
- } />
- } />
-
- >
- );
-};
-
-const getGrid = (Content: any) => (
-
-);
-
-export default Content;
diff --git a/client/src/sections/footer/Footer.tsx b/client/src/sections/footer/Footer.tsx
deleted file mode 100644
index 462ac8c2..00000000
--- a/client/src/sections/footer/Footer.tsx
+++ /dev/null
@@ -1,158 +0,0 @@
-import React from 'react';
-import styled from 'styled-components';
-import {
- headerColor,
- headerTextColor,
- fontColors,
- mediaWidths,
-} from 'styles/Themes';
-import { Section } from 'components/section/Section';
-import { Link } from 'components/link/Link';
-import { Emoji } from 'components/emoji/Emoji';
-import { useAccount } from 'context/AccountContext';
-import { Link as RouterLink } from 'react-router-dom';
-import { HomeButton } from 'views/entry/homepage/HomePage.styled';
-import { Zap } from 'components/generic/Icons';
-
-const FooterStyle = styled.div`
- padding: 40px 0;
- min-height: 300px;
- color: ${headerTextColor};
- display: flex;
- justify-content: space-between;
-
- @media (${mediaWidths.mobile}) {
- flex-direction: column;
- padding: 0 0 40px;
- justify-content: center;
- align-items: center;
- }
-`;
-
-const SideFooter = styled.div`
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- align-items: flex-start;
-
- @media (${mediaWidths.mobile}) {
- width: 100%;
- justify-content: center;
- align-items: center;
- text-align: center;
- }
-`;
-
-const RightFooter = styled(SideFooter)`
- justify-content: flex-start;
- align-items: flex-end;
- width: 80%;
-
- @media (${mediaWidths.mobile}) {
- margin-top: 32px;
- }
-`;
-
-const Title = styled.div`
- font-weight: 900;
- color: ${headerTextColor};
-`;
-
-const SideText = styled.p`
- font-size: 14px;
- color: ${fontColors.grey7};
-
- @media (${mediaWidths.mobile}) {
- padding-right: 0;
- }
-`;
-
-const CopyrightText = styled(SideText)`
- font-size: 12px;
- color: ${fontColors.blue};
-`;
-
-const StyledRouter = styled(RouterLink)`
- margin-top: 12px;
-
- ${HomeButton} {
- font-size: 14px;
- }
-`;
-
-const Line = styled.div`
- display: flex;
- justify-content: center;
- align-items: flex-end;
-`;
-
-const Version = styled.div`
- font-size: 12px;
- margin-left: 8px;
-`;
-
-const APP_VERSION = process.env.REACT_APP_VERSION || '0.0.0';
-
-export const Footer = () => {
- const { loggedIn } = useAccount();
- return (
-
-
-
-
-
- ThunderHub
-
- {`v${APP_VERSION}`}
-
-
- Open-source lightning node manager to control and
- monitor your LND node.
-
-
- Made in Munich with{' '}
- and{' '}
- .
-
-
- Copyright © 2020. All rights reserved. ThunderHub
-
-
-
-
- FAQ
-
-
- Github
-
-
- Twitter
-
-
- Terms of Use
-
-
- Privacy Policy
-
- {!loggedIn && (
-
-
-
- LOGIN
-
-
- )}
-
-
-
- );
-};
diff --git a/client/src/sections/header/Header.tsx b/client/src/sections/header/Header.tsx
deleted file mode 100644
index 8b1f4b96..00000000
--- a/client/src/sections/header/Header.tsx
+++ /dev/null
@@ -1,173 +0,0 @@
-import React, { useState } from 'react';
-import styled, { css } from 'styled-components';
-import {
- headerColor,
- headerTextColor,
- themeColors,
- mediaWidths,
- mediaDimensions,
-} from '../../styles/Themes';
-import { HomeButton } from '../../views/entry/homepage/HomePage.styled';
-import { Link } from 'react-router-dom';
-import { useAccount } from '../../context/AccountContext';
-import { SingleLine, ResponsiveLine } from '../../components/generic/Styled';
-import {
- Cpu,
- MenuIcon,
- XSvg,
- Zap,
- Circle,
-} from '../../components/generic/Icons';
-import { BurgerMenu } from 'components/burgerMenu/BurgerMenu';
-import { useSize } from 'hooks/UseSize';
-import { useTransition, animated } from 'react-spring';
-import { Section } from 'components/section/Section';
-import { useStatusState } from 'context/StatusContext';
-
-const HeaderStyle = styled.div`
- padding: 16px 0;
-`;
-
-const IconPadding = styled.div`
- padding-right: 6px;
- margin-bottom: -4px;
-`;
-
-const HeaderTitle = styled.div`
- color: ${headerTextColor};
- font-weight: 900;
- display: flex;
- align-items: center;
- justify-content: center;
-
- ${({ withPadding }: { withPadding: boolean }) =>
- withPadding &&
- css`
- @media (${mediaWidths.mobile}) {
- margin-bottom: 16px;
- }
- `}
-`;
-
-const IconWrapper = styled.div`
- display: flex;
- justify-content: center;
- align-items: center;
- width: 24px;
- height: 24px;
-`;
-
-const LinkWrapper = styled.div`
- color: ${headerTextColor};
- margin: ${({ last }: { last?: boolean }) =>
- last ? '0 16px 0 4px' : '0 4px'};
-
- :hover {
- color: ${themeColors.blue2};
- }
-`;
-
-const AnimatedBurger = animated(MenuIcon);
-const AnimatedClose = animated(XSvg);
-
-export const Header = () => {
- const { width } = useSize();
- const { loggedIn } = useAccount();
- const [open, setOpen] = useState(false);
- const { syncedToChain } = useStatusState();
-
- const transitions = useTransition(open, null, {
- from: { position: 'absolute', opacity: 0 },
- enter: { opacity: 1 },
- leave: { opacity: 0 },
- });
-
- const renderLoggedIn = () => {
- if (width <= mediaDimensions.mobile) {
- return (
- setOpen((prev) => !prev)}>
- {transitions.map(({ item, key, props }) =>
- item ? (
-
- ) : (
-
- ),
- )}
-
- );
- } else {
- return (
-
- );
- }
- };
-
- const renderLoggedOut = () => (
- <>
-
- Faq
-
-
- Terms
-
-
- Privacy
-
-
-
-
-
-
- >
- );
-
- const HeaderWrapper =
- width <= mediaDimensions.mobile && !loggedIn
- ? ResponsiveLine
- : SingleLine;
-
- return (
- <>
-
-
-
-
-
-
-
-
- ThunderHub
-
-
-
- {loggedIn ? renderLoggedIn() : renderLoggedOut()}
-
-
-
-
- {open && width <= mediaDimensions.mobile && (
-
- )}
- >
- );
-};
diff --git a/client/src/sections/navigation/Navigation.tsx b/client/src/sections/navigation/Navigation.tsx
deleted file mode 100644
index e2466971..00000000
--- a/client/src/sections/navigation/Navigation.tsx
+++ /dev/null
@@ -1,211 +0,0 @@
-import React from 'react';
-import styled, { css } from 'styled-components';
-import { Link, useLocation } from 'react-router-dom';
-import { NodeInfo } from './nodeInfo/NodeInfo';
-import { SideSettings } from './sideSettings/SideSettings';
-import {
- unSelectedNavButton,
- navBackgroundColor,
- navTextColor,
- subCardColor,
- cardBorderColor,
- mediaWidths,
-} from '../../styles/Themes';
-import {
- Home,
- Cpu,
- Server,
- Settings,
- Shield,
- Crosshair,
- GitPullRequest,
- LinkIcon,
- RepeatIcon,
- Users,
- CreditCard,
-} from '../../components/generic/Icons';
-import { useSettings } from '../../context/SettingsContext';
-import { useConnectionState } from 'context/ConnectionContext';
-
-const NavigationStyle = styled.div`
- grid-area: nav;
- width: ${({ isOpen }: { isOpen: boolean }) => (isOpen ? '200px' : '60px')};
-
- @media (${mediaWidths.mobile}) {
- display: none;
- }
-`;
-
-const StickyCard = styled.div`
- position: -webkit-sticky;
- position: sticky;
- top: 16px;
-`;
-
-const LinkView = styled.div`
- display: flex;
- flex-direction: column;
- align-items: flex-start;
- padding: 8px 0;
-`;
-
-const ButtonSection = styled.div`
- width: 100%;
- ${({ isOpen }: { isOpen: boolean }) =>
- !isOpen &&
- css`
- margin: 8px 0;
- `}
-`;
-
-const NavSeparation = styled.div`
- margin-left: 8px;
- font-size: 14px;
-`;
-
-interface NavProps {
- selected: boolean;
- isOpen?: boolean;
-}
-
-const NavButton = styled(({ isOpen, ...rest }) => )(
- () => css`
- padding: 4px;
- border-radius: 4px;
- background: ${({ selected }: NavProps) =>
- selected && navBackgroundColor};
- display: flex;
- align-items: center;
- ${({ isOpen }: NavProps) => !isOpen && 'justify-content: center'};
- width: 100%;
- text-decoration: none;
- margin: 4px 0;
- color: ${({ selected }: NavProps) =>
- selected ? navTextColor : unSelectedNavButton};
-
- &:hover {
- color: ${navTextColor};
- background: ${navBackgroundColor};
- }
- `,
-);
-
-const BurgerRow = styled.div`
- display: flex;
- justify-content: flex-start;
- align-items: center;
- overflow: scroll;
- background: ${cardBorderColor};
- margin: 0 -16px;
- padding: 16px;
-`;
-
-const BurgerNav = styled(({ selectedColor, ...rest }) => )(
- () => css`
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- padding: 16px 16px 8px;
- border-radius: 4px;
- text-decoration: none;
- background: ${({ selected }: NavProps) => selected && subCardColor};
- ${({ isOpen }: NavProps) => !isOpen && 'justify-content: center'};
- color: ${({ selected }: NavProps) =>
- selected ? navTextColor : unSelectedNavButton};
- `,
-);
-
-const HOME = '/';
-const PEERS = '/peers';
-const CHANNEL = '/channels';
-const BALANCE = '/balance';
-const TRANS = '/transactions';
-const FORWARDS = '/forwards';
-const CHAIN_TRANS = '/chainTransactions';
-const TOOLS = '/tools';
-const SETTINGS = '/settings';
-const FEES = '/fees';
-const TRADER = '/trading';
-
-interface NavigationProps {
- isBurger?: boolean;
- setOpen?: (state: boolean) => void;
-}
-
-export const Navigation = ({ isBurger, setOpen }: NavigationProps) => {
- const { pathname } = useLocation();
- const { sidebar, setSettings } = useSettings();
- const { connected } = useConnectionState();
-
- const renderNavButton = (
- title: string,
- link: string,
- NavIcon: any,
- open: boolean = true,
- ) => (
-
-
- {open && {title} }
-
- );
-
- const renderBurgerNav = (title: string, link: string, NavIcon: any) => (
- setOpen && setOpen(false)}
- >
-
- {title}
-
- );
-
- const renderLinks = () => (
-
- {renderNavButton('Home', HOME, Home, sidebar)}
- {renderNavButton('Peers', PEERS, Users, sidebar)}
- {renderNavButton('Channels', CHANNEL, Cpu, sidebar)}
- {renderNavButton('Balance', BALANCE, RepeatIcon, sidebar)}
- {renderNavButton('Fees', FEES, Crosshair, sidebar)}
- {renderNavButton('Transactions', TRANS, Server, sidebar)}
- {renderNavButton('Forwards', FORWARDS, GitPullRequest, sidebar)}
- {renderNavButton('Chain', CHAIN_TRANS, LinkIcon, sidebar)}
- {renderNavButton('Tools', TOOLS, Shield, sidebar)}
- {renderNavButton('P2P Trading', TRADER, CreditCard, sidebar)}
- {renderNavButton('Settings', SETTINGS, Settings, sidebar)}
-
- );
-
- const renderBurger = () => (
-
- {renderBurgerNav('Home', HOME, Home)}
- {renderBurgerNav('Peers', PEERS, Users)}
- {renderBurgerNav('Channels', CHANNEL, Cpu)}
- {renderBurgerNav('Balance', BALANCE, RepeatIcon)}
- {renderBurgerNav('Fees', FEES, Crosshair)}
- {renderBurgerNav('Transactions', TRANS, Server)}
- {renderBurgerNav('Forwards', FORWARDS, GitPullRequest)}
- {renderBurgerNav('Chain', CHAIN_TRANS, LinkIcon)}
- {renderBurgerNav('Tools', TOOLS, Shield)}
- {renderBurgerNav('Trading', TRADER, CreditCard)}
- {renderBurgerNav('Settings', SETTINGS, Settings)}
-
- );
-
- if (isBurger) {
- return renderBurger();
- }
-
- return (
-
-
-
- {connected && }
- {renderLinks()}
-
-
-
-
- );
-};
diff --git a/client/src/sections/navigation/nodeInfo/NodeInfo.tsx b/client/src/sections/navigation/nodeInfo/NodeInfo.tsx
deleted file mode 100644
index 31ddfa85..00000000
--- a/client/src/sections/navigation/nodeInfo/NodeInfo.tsx
+++ /dev/null
@@ -1,295 +0,0 @@
-import React from 'react';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_NODE_INFO } from '../../../graphql/query';
-import { useSettings } from '../../../context/SettingsContext';
-import {
- Separation,
- SingleLine,
- SubTitle,
- Sub4Title,
-} from '../../../components/generic/Styled';
-import {
- QuestionIcon,
- Zap,
- Anchor,
- Circle,
-} from '../../../components/generic/Icons';
-import { getTooltipType } from '../../../components/generic/Helpers';
-import { useAccount } from '../../../context/AccountContext';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import { textColorMap, unSelectedNavButton } from '../../../styles/Themes';
-import ReactTooltip from 'react-tooltip';
-import styled from 'styled-components';
-import ScaleLoader from 'react-spinners/ScaleLoader';
-import { getPrice } from 'components/price/Price';
-import { AnimatedNumber } from 'components/animated/AnimatedNumber';
-import { useStatusState } from 'context/StatusContext';
-import { usePriceState } from 'context/PriceContext';
-
-const Closed = styled.div`
- display: flex;
- justify-content: center;
- align-items: center;
- flex-direction: column;
- width: 100%;
-`;
-
-const Margin = styled.div`
- margin: 8px 0 2px;
-`;
-
-const Title = styled.div`
- font-size: 18px;
- font-weight: bold;
- display: flex;
- justify-content: center;
- align-items: center;
-`;
-
-const Info = styled.div`
- font-size: 14px;
- color: #bfbfbf;
- border-bottom: 2px solid
- ${({ bottomColor }: { bottomColor: string }) => bottomColor};
-`;
-
-const Balance = styled.div`
- display: flex;
- justify-content: center;
- align-items: center;
- margin: 2px 0;
- padding: 0 5px;
- cursor: default;
-`;
-
-const Alias = styled.div`
- border-bottom: 2px solid
- ${({ bottomColor }: { bottomColor: string }) => bottomColor};
-`;
-
-interface NodeInfoProps {
- isOpen?: boolean;
- isBurger?: boolean;
-}
-
-export const NodeInfo = ({ isOpen, isBurger }: NodeInfoProps) => {
- const {
- syncedToChain,
- chainBalance,
- chainPending,
- channelBalance,
- channelPending,
- } = useStatusState();
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data } = useQuery(GET_NODE_INFO, {
- variables: { auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- const { theme, currency } = useSettings();
- const priceContext = usePriceState();
- const format = getPrice(currency, priceContext);
-
- const tooltipType = getTooltipType(theme);
-
- if (loading || !data || !data.getNodeInfo) {
- return (
-
-
-
- );
- }
-
- const {
- color,
- active_channels_count,
- closed_channels_count,
- alias,
- peers_count,
- pending_channels_count,
- version,
- } = data.getNodeInfo;
-
- const formatCB = format({ amount: chainBalance });
- const formatPB = format({ amount: chainPending });
- const formatCCB = format({ amount: channelBalance });
- const formatPCB = format({ amount: channelPending });
-
- if (isBurger) {
- return (
- <>
-
- {alias}
-
-
-
- Channels
- {`${active_channels_count} / ${pending_channels_count} / ${closed_channels_count} / ${peers_count}`}
-
-
-
- {channelPending > 0 ? (
- `${formatCCB} / ${formatPCB}`
- ) : (
-
- )}
-
-
-
- {chainPending > 0 ? (
- `${formatCB} / ${formatPB}`
- ) : (
-
- )}
-
- >
- );
- }
-
- if (!isOpen) {
- return (
- <>
-
-
-
- {(channelPending > 0 || chainPending > 0) && (
-
-
-
- )}
-
-
-
-
-
-
- {active_channels_count}
- {pending_channels_count}
- {closed_channels_count}
- {peers_count}
-
-
-
-
- {`Channel Balance: ${formatCCB}`}
- {`Pending Channel Balance: ${formatPCB}`}
- {`Chain Balance: ${formatCB}`}
- {`Pending Chain Balance: ${formatPB}`}
-
-
- {`Active Channels: ${active_channels_count}`}
- {`Pending Channels: ${pending_channels_count}`}
- {`Closed Channels: ${closed_channels_count}`}
- {`Peers: ${peers_count}`}
-
- >
- );
- }
-
- return (
- <>
-
- {alias}
- {isOpen && (
-
- )}
-
-
-
-
-
-
-
-
-
-
- {`${active_channels_count} / ${pending_channels_count} / ${closed_channels_count} / ${peers_count}`}
-
-
- {syncedToChain ? 'Synced' : 'Not Synced'}
-
-
-
-
-
- {`Channel Balance: ${formatCCB}`}
- {`Pending Channel Balance: ${formatPCB}`}
-
-
- {`Chain Balance: ${formatCB}`}
- {`Pending Chain Balance: ${formatPB}`}
-
-
- {`Active Channels: ${active_channels_count}`}
- {`Pending Channels: ${pending_channels_count}`}
- {`Closed Channels: ${closed_channels_count}`}
- {`Peers: ${peers_count}`}
-
- >
- );
-};
diff --git a/client/src/sections/navigation/sideSettings/SideSettings.tsx b/client/src/sections/navigation/sideSettings/SideSettings.tsx
deleted file mode 100644
index 7390cf6c..00000000
--- a/client/src/sections/navigation/sideSettings/SideSettings.tsx
+++ /dev/null
@@ -1,206 +0,0 @@
-import React from 'react';
-import { Separation, SingleLine } from '../../../components/generic/Styled';
-import { useSettings } from '../../../context/SettingsContext';
-import {
- Sun,
- Moon,
- ChevronLeft,
- ChevronRight,
-} from '../../../components/generic/Icons';
-import styled from 'styled-components';
-import {
- progressBackground,
- iconButtonHover,
- inverseTextColor,
- unSelectedNavButton,
-} from '../../../styles/Themes';
-
-const SelectedIcon = styled.div`
- display: flex;
- justify-content: center;
- align-items: center;
- outline: none;
- width: 30px;
- height: 30px;
- border-radius: 100%;
- margin: 0 5px;
- cursor: pointer;
-
- @media (min-width: 579px) {
- &:hover {
- background-color: ${iconButtonHover};
- color: ${inverseTextColor};
- }
- }
- background-color: ${({ selected }: { selected: boolean }) =>
- selected ? progressBackground : ''};
-`;
-
-const Symbol = styled.div`
- margin-top: 2px;
- font-weight: bold;
-`;
-
-const IconRow = styled.div`
- margin: 5px 0;
- display: flex;
- justify-content: center;
- align-items: center;
- ${({ center }: { center?: boolean }) => center && 'width: 100%'}
-`;
-
-const BurgerPadding = styled(SingleLine)`
- margin: 16px 0;
-`;
-
-const currencyArray = ['sat', 'btc', 'EUR', 'USD'];
-const themeArray = ['light', 'dark'];
-const currencyMap: { [key: string]: string } = {
- sat: 'S',
- btc: '₿',
- EUR: '€',
- USD: '$',
-};
-const themeMap: { [key: string]: string } = {
- light: Sun,
- dark: Moon,
-};
-
-const getNextValue = (array: string[], current: string): string => {
- const length = array.length;
- const index = array.indexOf(current);
-
- let value = '';
- if (index + 1 === length) {
- value = array[0];
- } else {
- value = array[index + 1];
- }
-
- return value;
-};
-
-interface SideSettingsProps {
- isOpen?: boolean;
- isBurger?: boolean;
- setIsOpen?: (state: any) => void;
-}
-
-export const SideSettings = ({
- isOpen,
- isBurger,
- setIsOpen,
-}: SideSettingsProps) => {
- const { theme, currency, setSettings } = useSettings();
-
- const renderIcon = (
- type: string,
- value: string,
- text: string,
- on: boolean = false,
- Icon?: any,
- ) => (
- {
- localStorage.setItem(type, value);
- type === 'currency' &&
- setSettings({
- currency:
- isOpen || isBurger
- ? value
- : getNextValue(currencyArray, value),
- });
- type === 'theme' && setSettings({ theme: value });
- }}
- >
- {type === 'currency' && {text} }
- {type === 'theme' && }
-
- );
-
- const renderContent = () => {
- if (!isOpen) {
- return (
- <>
-
-
- {renderIcon(
- 'currency',
- currency,
- currencyMap[currency],
- true,
- )}
-
-
- {renderIcon(
- 'theme',
- getNextValue(themeArray, theme),
- '',
- true,
- themeMap[getNextValue(themeArray, theme)],
- )}
-
- >
- );
- } else {
- return (
- <>
-
-
- {renderIcon('currency', 'sat', 'S')}
- {renderIcon('currency', 'btc', '₿')}
- {renderIcon('currency', 'EUR', '€')}
- {renderIcon('currency', 'USD', '$')}
-
-
- {renderIcon('theme', 'light', '', false, Sun)}
- {renderIcon('theme', 'dark', '', false, Moon)}
-
- >
- );
- }
- };
-
- if (isBurger) {
- return (
-
-
- {renderIcon('currency', 'sat', 'S')}
- {renderIcon('currency', 'btc', '₿')}
- {renderIcon('currency', 'EUR', '€')}
- {renderIcon('currency', 'USD', '$')}
-
-
- {renderIcon('theme', 'light', '', false, Sun)}
- {renderIcon('theme', 'dark', '', false, Moon)}
-
-
- );
- }
-
- return (
- <>
- {renderContent()}
- {setIsOpen && (
-
- {
- localStorage.setItem(
- 'sidebar',
- (!isOpen).toString(),
- );
- setIsOpen({ sidebar: !isOpen });
- }}
- >
- {isOpen ? : }
-
-
- )}
- >
- );
-};
diff --git a/client/src/serviceWorker.ts b/client/src/serviceWorker.ts
deleted file mode 100644
index 46722238..00000000
--- a/client/src/serviceWorker.ts
+++ /dev/null
@@ -1,144 +0,0 @@
-// This optional code is used to register a service worker.
-// register() is not called by default.
-
-// This lets the app load faster on subsequent visits in production, and gives
-// it offline capabilities. However, it also means that developers (and users)
-// will only see deployed updates on subsequent visits to a page, after all the
-// existing tabs open on the page have been closed, since previously cached
-// resources are updated in the background.
-
-// To learn more about the benefits of this model and instructions on how to
-// opt-in, read https://bit.ly/CRA-PWA
-
-const isLocalhost = Boolean(
- window.location.hostname === 'localhost' ||
- // [::1] is the IPv6 localhost address.
- window.location.hostname === '[::1]' ||
- // 127.0.0.1/8 is considered localhost for IPv4.
- window.location.hostname.match(
- /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/,
- ),
-);
-
-type Config = {
- onSuccess?: (registration: ServiceWorkerRegistration) => void;
- onUpdate?: (registration: ServiceWorkerRegistration) => void;
-};
-
-export function register(config?: Config) {
- if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
- // The URL constructor is available in all browsers that support SW.
- const publicUrl = new URL(
- (process as { env: { [key: string]: string } }).env.PUBLIC_URL,
- window.location.href,
- );
- if (publicUrl.origin !== window.location.origin) {
- // Our service worker won't work if PUBLIC_URL is on a different origin
- // from what our page is served on. This might happen if a CDN is used to
- // serve assets; see https://github.com/facebook/create-react-app/issues/2374
- return;
- }
-
- window.addEventListener('load', () => {
- const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
-
- if (isLocalhost) {
- // This is running on localhost. Let's check if a service worker still exists or not.
- checkValidServiceWorker(swUrl, config);
-
- // Add some additional logging to localhost, pointing developers to the
- // service worker/PWA documentation.
- navigator.serviceWorker.ready.then(() => {
- console.log(
- 'This web app is being served cache-first by a service ' +
- 'worker. To learn more, visit https://bit.ly/CRA-PWA',
- );
- });
- } else {
- // Is not localhost. Just register service worker
- registerValidSW(swUrl, config);
- }
- });
- }
-}
-
-function registerValidSW(swUrl: string, config?: Config) {
- navigator.serviceWorker
- .register(swUrl)
- .then((registration) => {
- registration.onupdatefound = () => {
- const installingWorker = registration.installing;
- if (installingWorker == null) {
- return;
- }
- installingWorker.onstatechange = () => {
- if (installingWorker.state === 'installed') {
- if (navigator.serviceWorker.controller) {
- // At this point, the updated precached content has been fetched,
- // but the previous service worker will still serve the older
- // content until all client tabs are closed.
- console.log(
- 'New content is available and will be used when all ' +
- 'tabs for this page are closed. See https://bit.ly/CRA-PWA.',
- );
-
- // Execute callback
- if (config && config.onUpdate) {
- config.onUpdate(registration);
- }
- } else {
- // At this point, everything has been precached.
- // It's the perfect time to display a
- // "Content is cached for offline use." message.
- console.log('Content is cached for offline use.');
-
- // Execute callback
- if (config && config.onSuccess) {
- config.onSuccess(registration);
- }
- }
- }
- };
- };
- })
- .catch((error) => {
- console.error('Error during service worker registration:', error);
- });
-}
-
-function checkValidServiceWorker(swUrl: string, config?: Config) {
- // Check if the service worker can be found. If it can't reload the page.
- fetch(swUrl)
- .then((response) => {
- // Ensure service worker exists, and that we really are getting a JS file.
- const contentType = response.headers.get('content-type');
- if (
- response.status === 404 ||
- (contentType != null &&
- contentType.indexOf('javascript') === -1)
- ) {
- // No service worker found. Probably a different app. Reload the page.
- navigator.serviceWorker.ready.then((registration) => {
- registration.unregister().then(() => {
- window.location.reload();
- });
- });
- } else {
- // Service worker found. Proceed as normal.
- registerValidSW(swUrl, config);
- }
- })
- .catch(() => {
- console.log(
- 'No internet connection found. App is running in offline mode.',
- );
- });
-}
-
-export function unregister() {
- if ('serviceWorker' in navigator) {
- navigator.serviceWorker.ready.then((registration) => {
- registration.unregister();
- });
- }
-}
diff --git a/client/src/styles/FontStyles.css b/client/src/styles/FontStyles.css
deleted file mode 100644
index 8bbaad79..00000000
--- a/client/src/styles/FontStyles.css
+++ /dev/null
@@ -1,53 +0,0 @@
-@font-face {
- font-family: 'Manrope';
- font-style: normal;
- font-weight: 900;
- src: url('../assets/fonts/Manrope/otf/Manrope-ExtraBold.otf')
- format('opentype');
-}
-
-@font-face {
- font-family: 'Manrope';
- font-style: normal;
- font-weight: 700;
- src: url('../assets/fonts/Manrope/otf/Manrope-Bold.otf') format('opentype');
-}
-
-@font-face {
- font-family: 'Manrope';
- font-style: normal;
- font-weight: 600;
- src: url('../assets/fonts/Manrope/otf/Manrope-SemiBold.otf')
- format('opentype');
-}
-
-@font-face {
- font-family: 'Manrope';
- font-style: normal;
- font-weight: 500;
- src: url('../assets/fonts/Manrope/otf/Manrope-Medium.otf')
- format('opentype');
-}
-
-@font-face {
- font-family: 'Manrope';
- font-style: normal;
- font-weight: 400;
- src: url('../assets/fonts/Manrope/otf/Manrope-Regular.otf')
- format('opentype');
-}
-
-@font-face {
- font-family: 'Manrope';
- font-style: normal;
- font-weight: 200;
- src: url('../assets/fonts/Manrope/otf/Manrope-Light.otf') format('opentype');
-}
-
-@font-face {
- font-family: 'Manrope';
- font-style: normal;
- font-weight: 100;
- src: url('../assets/fonts/Manrope/otf/Manrope-ExtraLight.otf')
- format('opentype');
-}
diff --git a/client/src/utils/auth.ts b/client/src/utils/auth.ts
deleted file mode 100644
index 9eb178e3..00000000
--- a/client/src/utils/auth.ts
+++ /dev/null
@@ -1,187 +0,0 @@
-import base64url from 'base64url';
-import { saveAccounts } from './storage';
-import { v5 as uuidv5 } from 'uuid';
-
-const THUNDERHUB_NAMESPACE = '00000000-0000-0000-0000-000000000000';
-
-interface BuildProps {
- name?: string;
- host: string;
- admin?: string;
- viewOnly?: string;
- cert?: string;
- accounts: any;
-}
-
-export const saveUserAuth = ({
- name = '',
- host,
- admin = '',
- viewOnly = '',
- cert = '',
- accounts,
-}: BuildProps) => {
- const id = getAccountId(host, viewOnly, admin, cert);
- const newAccount = {
- name,
- host,
- admin,
- viewOnly,
- cert,
- id,
- };
-
- const newAccounts = [...accounts, newAccount];
- saveAccounts(newAccounts);
-};
-
-export const getAccountId = (
- host: string = '',
- viewOnly: string = '',
- admin: string = '',
- cert: string = '',
-) =>
- uuidv5(
- `${host}-${viewOnly}-${admin !== '' ? 1 : 0}-${cert}`,
- THUNDERHUB_NAMESPACE,
- );
-
-export const saveSessionAuth = (sessionAdmin: string) =>
- sessionStorage.setItem('session', sessionAdmin);
-
-export const getAuth = (account?: string) => {
- const accounts = JSON.parse(localStorage.getItem('accounts') || '[]');
- const currentActive = Math.max(
- parseInt(account ?? (localStorage.getItem('active') || '0')),
- 0,
- );
- const sessionAdmin = sessionStorage.getItem('session') || '';
-
- const accountsLength = accounts.length;
-
- const active =
- accountsLength > 0 && currentActive >= accountsLength
- ? 0
- : currentActive;
-
- const defaultAccount = {
- name: '',
- host: '',
- admin: '',
- viewOnly: '',
- cert: '',
- id: '',
- };
-
- const activeAccount =
- accountsLength > 0 && active < accountsLength
- ? accounts[active]
- : defaultAccount;
-
- const { name, host, admin, viewOnly, cert, id } = activeAccount;
- const currentId =
- id ??
- uuidv5(
- `${host}-${viewOnly}-${admin !== '' ? 1 : 0}-${cert}`,
- THUNDERHUB_NAMESPACE,
- );
- const loggedIn = host !== '' && (viewOnly !== '' || sessionAdmin !== '');
-
- return {
- name,
- host,
- admin,
- viewOnly,
- cert,
- id: currentId,
- accounts,
- loggedIn,
- };
-};
-
-export const getAuthLnd = (lndconnect: string) => {
- const auth = lndconnect.replace('lndconnect', 'https');
-
- let url;
-
- try {
- url = new URL(auth);
- } catch (error) {
- return {
- cert: '',
- macaroon: '',
- socket: '',
- };
- }
-
- const cert = url.searchParams.get('cert') || '';
- const macaroon = url.searchParams.get('macaroon') || '';
- const socket = url.host;
-
- return {
- cert: base64url.toBase64(cert),
- macaroon: base64url.toBase64(macaroon),
- socket,
- };
-};
-
-export const getBase64CertfromDerFormat = (base64: string) => {
- if (!base64) return null;
-
- const prefix = '-----BEGIN CERTIFICATE-----\n';
- const postfix = '-----END CERTIFICATE-----';
- const pem = base64.match(/.{0,64}/g) || [];
- const pemString = pem.join('\n');
- const pemComplete = prefix + pemString + postfix;
- const pemText = base64url.encode(pemComplete);
-
- return pemText;
-};
-
-const emptyObject = {
- cert: undefined,
- admin: undefined,
- viewOnly: undefined,
- host: undefined,
-};
-
-export const getConfigLnd = (json: string) => {
- const parsedJson = JSON.parse(json);
-
- const config = parsedJson.configurations;
-
- if (config && config.length >= 1) {
- const cert = config[0].certificateThumbprint || '';
- const admin = config[0].adminMacaroon;
- const viewOnly = config[0].readonlyMacaroon;
- const host = config[0].host;
- const port = config[0].port;
-
- return {
- cert,
- admin,
- viewOnly,
- host: `${host}:${port}`,
- };
- }
-
- return emptyObject;
-};
-
-export const getQRConfig = (json: string) => {
- const config = JSON.parse(json);
-
- if (config) {
- const { name = '', cert = '', admin, viewOnly, host } = config;
-
- return {
- name,
- cert,
- admin,
- viewOnly,
- host,
- };
- }
-
- return { ...emptyObject, name: undefined };
-};
diff --git a/client/src/utils/error.tsx b/client/src/utils/error.tsx
deleted file mode 100644
index 9cd0357f..00000000
--- a/client/src/utils/error.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import React, { ReactNode } from 'react';
-import { ApolloError } from 'apollo-boost';
-
-export const getErrorContent = (error: ApolloError): ReactNode => {
- const errors = error.graphQLErrors.map((x) => x.message);
-
- const renderMessage = errors.map((error, i) => {
- try {
- const errorMsg = JSON.parse(error);
- return (
- {`${errorMsg.details} [${errorMsg.msg}/${errorMsg.code}]`}
- );
- } catch (e) {
- return error;
- }
- });
-
- return {renderMessage}
;
-};
diff --git a/client/src/utils/storage.ts b/client/src/utils/storage.ts
deleted file mode 100644
index 3e2371cf..00000000
--- a/client/src/utils/storage.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-export const saveAccounts = (accounts: any[]) => {
- localStorage.setItem('accounts', JSON.stringify(accounts));
-};
-
-export const deleteAccountPermissions = (
- id: string,
- accounts: any[],
- admin?: boolean,
-): void => {
- const changedAccounts = [...accounts];
- changedAccounts.find((account, index) => {
- if (account.id === id) {
- if (admin) {
- changedAccounts[index] = { ...account, viewOnly: '' };
- } else {
- changedAccounts[index] = { ...account, admin: '' };
- }
- return true;
- }
- return false;
- });
- saveAccounts(changedAccounts);
-};
-
-export const deleteStorage = () => {
- localStorage.clear();
- sessionStorage.clear();
-};
diff --git a/client/src/views/balance/Balance.styled.tsx b/client/src/views/balance/Balance.styled.tsx
deleted file mode 100644
index f69cefcd..00000000
--- a/client/src/views/balance/Balance.styled.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import styled from 'styled-components';
-import { mediaWidths } from 'styles/Themes';
-
-export const HopCard = styled.div`
- margin-left: 16px;
-`;
-
-export const CardPadding = styled.div`
- @media (${mediaWidths.mobile}) {
- padding: 16px 0;
- }
-`;
-
-export const Padding = styled.div`
- padding-right: 8px;
-`;
-
-export const CirclePadding = styled(Padding)`
- display: flex;
- align-items: center;
-`;
-
-export const ChannelColumnSection = styled.div`
- display: flex;
- flex-direction: column;
- align-items: stretch;
- flex-wrap: wrap;
-
- @media (${mediaWidths.mobile}) {
- min-width: unset;
- width: 100%;
- }
-`;
-
-export const ChannelLineSection = styled.div`
- display: flex;
- align-items: center;
- max-width: 300px;
-
- @media (${mediaWidths.mobile}) {
- max-width: unset;
- justify-content: center;
- width: 100%;
- padding-bottom: 8px;
- }
-`;
diff --git a/client/src/views/balance/Balance.tsx b/client/src/views/balance/Balance.tsx
deleted file mode 100644
index 09aa5c58..00000000
--- a/client/src/views/balance/Balance.tsx
+++ /dev/null
@@ -1,230 +0,0 @@
-import React, { useState } from 'react';
-import {
- CardWithTitle,
- Card,
- SubTitle,
- Sub4Title,
- ResponsiveLine,
- DarkSubTitle,
- NoWrapTitle,
- SingleLine,
-} from 'components/generic/Styled';
-import { useAccount } from 'context/AccountContext';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_CHANNELS } from 'graphql/query';
-import { toast } from 'react-toastify';
-import { getErrorContent } from 'utils/error';
-import { LoadingCard } from 'components/loading/LoadingCard';
-import { getPercent } from 'helpers/Helpers';
-import { Input } from 'components/input/Input';
-import sortBy from 'lodash.sortby';
-import { BalanceCard } from './BalanceCard';
-import { BalanceRoute } from './BalanceRoute';
-import { Price } from 'components/price/Price';
-import { useStatusState } from 'context/StatusContext';
-import { Text } from 'views/other/OtherViews.styled';
-
-export const BalanceView = () => {
- const { minorVersion } = useStatusState();
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const [outgoing, setOutgoing] = useState<{ id: string } | null>();
- const [incoming, setIncoming] = useState();
- const [amount, setAmount] = useState();
-
- const [maxFee, setMaxFee] = useState();
-
- const [blocked, setBlocked] = useState(false);
-
- const { loading, data } = useQuery(GET_CHANNELS, {
- variables: { auth, active: true },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- if (minorVersion < 9) {
- return (
-
-
- Channel Balancing
-
-
-
- Channel balancing is only available for nodes with LND
- versions 0.9.0-beta and up.
-
-
- If you want to use this feature please update your node.
-
-
-
- );
- }
-
- if (loading || !data || !data.getChannels) {
- return ;
- }
-
- const handleReset = (type: string) => {
- switch (type) {
- case 'outgoing':
- setOutgoing(undefined);
- setIncoming(undefined);
- break;
- case 'incoming':
- setIncoming(undefined);
- break;
- case 'all':
- setMaxFee(undefined);
- setAmount(undefined);
- setOutgoing(undefined);
- setIncoming(undefined);
- setBlocked(false);
- break;
- default:
- break;
- }
- };
-
- const renderIncoming = () => {
- if (!outgoing) return null;
-
- return (
- <>
- Incoming Channel
- {incoming ? (
- handleReset('incoming'),
- }}
- />
- ) : (
- renderChannels()
- )}
- >
- );
- };
-
- const renderOutgoing = () => {
- return (
- <>
- Outgoing Channel
- {outgoing ? (
- handleReset('outgoing'),
- }}
- />
- ) : (
- renderChannels(true)
- )}
- >
- );
- };
-
- const renderChannels = (isOutgoing?: boolean) => {
- const channels = sortBy(data.getChannels, [
- (channel: any) =>
- getPercent(channel.remote_balance, channel.local_balance),
- ]);
-
- const finalChannels = isOutgoing ? channels : channels.reverse();
-
- return finalChannels.map((channel: any, index: number) => {
- if (!isOutgoing && outgoing && outgoing.id === channel.id) {
- return null;
- }
-
- const callback = isOutgoing
- ? !outgoing && { callback: () => setOutgoing(channel) }
- : outgoing &&
- !incoming && { callback: () => setIncoming(channel) };
-
- return (
-
- );
- });
- };
-
- return (
-
-
- Channel Balancing
-
-
- {renderOutgoing()}
- {renderIncoming()}
-
- Amount
-
-
-
-
-
-
- {!blocked && (
- {
- setAmount(parseInt(e.target.value));
- }}
- withMargin={'0 0 8px'}
- />
- )}
-
- Max Fee
-
-
-
-
-
-
- {!blocked && (
- {
- setMaxFee(parseInt(e.target.value));
- }}
- withMargin={'0 0 24px'}
- />
- )}
- {incoming && outgoing && amount && (
- setBlocked(true),
- callback: () => handleReset('all'),
- }}
- />
- )}
-
-
- );
-};
diff --git a/client/src/views/balance/BalanceCard.tsx b/client/src/views/balance/BalanceCard.tsx
deleted file mode 100644
index 3fd533ab..00000000
--- a/client/src/views/balance/BalanceCard.tsx
+++ /dev/null
@@ -1,113 +0,0 @@
-import React from 'react';
-import {
- SubCard,
- SingleLine,
- DarkSubTitle,
- ResponsiveLine,
-} from 'components/generic/Styled';
-import { MainInfo } from 'views/channels/Channels.style';
-import { Circle, ChevronRight, XSvg } from 'components/generic/Icons';
-import { getPercent } from 'helpers/Helpers';
-import { Price } from 'components/price/Price';
-import { themeColors, chartColors } from 'styles/Themes';
-import {
- ChannelColumnSection,
- Padding,
- ChannelLineSection,
- CirclePadding,
-} from './Balance.styled';
-import numeral from 'numeral';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-
-type BalanceCardProps = {
- index: number;
- channel: any;
- withArrow?: boolean;
- withColor?: boolean;
- callback?: () => void;
- closeCallback?: () => void;
-};
-
-const getColor = (balance: number) => {
- const difference = Math.abs(balance * 100 - 50);
-
- switch (true) {
- case difference <= 5:
- return chartColors.green;
- case difference <= 10:
- return chartColors.darkyellow;
- case difference <= 15:
- return chartColors.orange;
- case difference <= 20:
- return chartColors.orange2;
- default:
- return chartColors.red;
- }
-};
-
-export const BalanceCard = ({
- index,
- channel,
- withArrow,
- withColor,
- callback,
- closeCallback,
-}: BalanceCardProps) => {
- const { partner_node_info, local_balance, remote_balance, id } = channel;
- const { alias } = partner_node_info;
-
- const balancedness = getPercent(remote_balance, local_balance) / 100;
- const formatBalance = numeral(balancedness).format('0,0.00');
-
- const props = withColor ? { color: themeColors.blue3 } : {};
-
- return (
-
- callback && callback()}>
-
-
- {alias === '' ? `Unknown - ${id}` : `${alias} - ${id}`}
-
-
-
-
- Local
-
-
-
-
-
-
- Remote
-
-
-
-
-
-
- Balance
-
- {formatBalance}
-
-
-
-
-
-
-
- {withArrow && }
- {closeCallback && (
-
-
-
- )}
-
-
-
-
-
- );
-};
diff --git a/client/src/views/balance/BalanceRoute.tsx b/client/src/views/balance/BalanceRoute.tsx
deleted file mode 100644
index 0a2cfbd7..00000000
--- a/client/src/views/balance/BalanceRoute.tsx
+++ /dev/null
@@ -1,162 +0,0 @@
-import React from 'react';
-import {
- SubCard,
- Sub4Title,
- Separation,
- SingleLine,
-} from 'components/generic/Styled';
-import { useMutation, useLazyQuery } from '@apollo/react-hooks';
-import { toast } from 'react-toastify';
-import { getErrorContent } from 'utils/error';
-import { themeColors, chartColors } from 'styles/Themes';
-import { renderLine } from 'components/generic/Helpers';
-import { HopCard } from './Balance.styled';
-import { SecureButton } from 'components/buttons/secureButton/SecureButton';
-import { PAY_VIA_ROUTE } from 'graphql/mutation';
-import { GET_ROUTES } from 'graphql/query';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-import { Price } from 'components/price/Price';
-import { getPercent } from 'helpers/Helpers';
-import { AdminSwitch } from 'components/adminSwitch/AdminSwitch';
-
-type BalancedRouteProps = {
- incoming: any;
- outgoing: any;
- amount: number;
- maxFee?: number;
- auth: {};
- blocked: boolean;
- setBlocked: () => void;
- callback: () => void;
-};
-
-export const BalanceRoute = ({
- incoming,
- outgoing,
- amount,
- maxFee,
- auth,
- blocked,
- setBlocked,
- callback,
-}: BalancedRouteProps) => {
- const [getRoute, { loading, data, called }] = useLazyQuery(GET_ROUTES, {
- fetchPolicy: 'no-cache',
- onError: (error) => {
- callback();
- toast.error(getErrorContent(error));
- },
- });
-
- const canShow = (): boolean =>
- incoming && outgoing && amount && data && data.getRoutes && blocked;
-
- const [payRoute, { loading: loadingP }] = useMutation(PAY_VIA_ROUTE, {
- onError: (error) => {
- callback();
- toast.error(getErrorContent(error));
- },
- onCompleted: () => {
- callback();
- toast.success('Balancing finished');
- },
- refetchQueries: ['GetChannels'],
- });
-
- const renderHop = (hop: any, index: number) => (
-
- {renderLine('Channel', hop.channel)}
- {renderLine('Fee', hop.fee)}
-
- );
-
- const renderGetRoute = () => (
- {
- setBlocked();
- getRoute({
- variables: {
- auth,
- outgoing: outgoing.id,
- incoming: incoming.partner_public_key,
- tokens: amount,
- ...(maxFee && { maxFee }),
- },
- });
- }}
- >
- {called ? 'Get Another Route' : 'Get Route'}
-
- );
-
- const renderRoute = () => {
- if (canShow()) {
- const route = JSON.parse(data.getRoutes);
- return (
- <>
- Route
-
- {renderLine(
- 'Total Tokens',
- ,
- )}
- {renderLine(
- 'Fee %',
- `${getPercent(
- route.fee,
- route.tokens - route.fee,
- true,
- )} %`,
- )}
- {renderLine('Fee', `${route.fee} sats`)}
- {renderLine('Confidence', route.confidence)}
- {renderLine('Hops', route.hops.length)}
-
- {route.hops.map((hop: any, index: number) =>
- renderLine(
- `${index + 1}`,
- renderHop(hop, index),
- index,
- ),
- )}
-
- >
- );
- }
- return null;
- };
-
- const renderButton = () => {
- if (canShow()) {
- return (
-
-
- Reset
-
-
- Balance Channel
-
-
- );
- }
- return null;
- };
-
- return (
- <>
- {renderGetRoute()}
- {renderRoute()}
- {renderButton()}
- >
- );
-};
diff --git a/client/src/views/chain/ChainView.tsx b/client/src/views/chain/ChainView.tsx
deleted file mode 100644
index 554d93b5..00000000
--- a/client/src/views/chain/ChainView.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from 'react';
-
-import { ChainTransactions } from './transactions/ChainTransactions';
-import { ChainUtxos } from './utxos/ChainUtxos';
-
-export const ChainView = () => {
- return (
- <>
-
-
- >
- );
-};
diff --git a/client/src/views/chain/transactions/ChainTransactions.tsx b/client/src/views/chain/transactions/ChainTransactions.tsx
deleted file mode 100644
index 1db8bfa9..00000000
--- a/client/src/views/chain/transactions/ChainTransactions.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import React, { useState } from 'react';
-import {
- SubTitle,
- Card,
- CardWithTitle,
-} from '../../../components/generic/Styled';
-import { useAccount } from '../../../context/AccountContext';
-import { GET_CHAIN_TRANSACTIONS } from '../../../graphql/query';
-import { useQuery } from '@apollo/react-hooks';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import { LoadingCard } from '../../../components/loading/LoadingCard';
-import { TransactionsCard } from './TransactionsCard';
-
-export const ChainTransactions = () => {
- const [indexOpen, setIndexOpen] = useState(0);
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data } = useQuery(GET_CHAIN_TRANSACTIONS, {
- variables: { auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- if (loading || !data || !data.getChainTransactions) {
- return ;
- }
-
- return (
-
- Chain Transactions
-
- {data.getChainTransactions.map(
- (transaction: any, index: number) => (
-
- ),
- )}
-
-
- );
-};
diff --git a/client/src/views/chain/transactions/TransactionsCard.tsx b/client/src/views/chain/transactions/TransactionsCard.tsx
deleted file mode 100644
index 6982b006..00000000
--- a/client/src/views/chain/transactions/TransactionsCard.tsx
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react';
-import {
- Separation,
- SubCard,
- SingleLine,
- DarkSubTitle,
- ResponsiveLine,
-} from '../../../components/generic/Styled';
-import { MainInfo } from '../../channels/Channels.style';
-import {
- getDateDif,
- getFormatDate,
- renderLine,
-} from '../../../components/generic/Helpers';
-import styled from 'styled-components';
-import { getPrice } from 'components/price/Price';
-import { useSettings } from 'context/SettingsContext';
-import { usePriceState } from 'context/PriceContext';
-
-const AddMargin = styled.div`
- margin-right: 10px;
-`;
-
-interface TransactionsCardProps {
- transaction: any;
- index: number;
- setIndexOpen: (index: number) => void;
- indexOpen: number;
-}
-
-export const TransactionsCard = ({
- transaction,
- index,
- setIndexOpen,
- indexOpen,
-}: TransactionsCardProps) => {
- const { currency } = useSettings();
- const priceContext = usePriceState();
- const format = getPrice(currency, priceContext);
-
- const {
- block_id,
- confirmation_count,
- confirmation_height,
- created_at,
- fee,
- id,
- output_addresses,
- tokens,
- } = transaction;
-
- const formatAmount = format({ amount: tokens });
-
- const handleClick = () => {
- if (indexOpen === index) {
- setIndexOpen(0);
- } else {
- setIndexOpen(index);
- }
- };
-
- const renderDetails = () => {
- return (
- <>
-
- {renderLine('Transaction Id: ', id)}
- {renderLine('Block Id: ', block_id)}
- {renderLine('Confirmations: ', confirmation_count)}
- {renderLine('Confirmation Height: ', confirmation_height)}
- {renderLine('Fee: ', fee)}
- {renderLine('Output Addresses: ', output_addresses.length)}
- {output_addresses.map((address: any, index: number) =>
- renderLine(`${index + 1}`, address, `${index}`),
- )}
- >
- );
- };
-
- return (
-
- handleClick()}>
-
- {`${
- fee !== null ? 'Sent' : 'Received'
- }: ${formatAmount}`}
-
-
- {`(${getDateDif(
- created_at,
- )} ago)`}
-
- {getFormatDate(created_at)}
-
-
-
- {index === indexOpen && renderDetails()}
-
- );
-};
diff --git a/client/src/views/chain/utxos/ChainUtxos.tsx b/client/src/views/chain/utxos/ChainUtxos.tsx
deleted file mode 100644
index 96abb695..00000000
--- a/client/src/views/chain/utxos/ChainUtxos.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import React, { useState } from 'react';
-import {
- SubTitle,
- Card,
- CardWithTitle,
-} from '../../../components/generic/Styled';
-import { useAccount } from '../../../context/AccountContext';
-import { GET_UTXOS } from '../../../graphql/query';
-import { useQuery } from '@apollo/react-hooks';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import { LoadingCard } from '../../../components/loading/LoadingCard';
-import { UtxoCard } from './UtxoCard';
-
-export const ChainUtxos = () => {
- const [indexOpen, setIndexOpen] = useState(0);
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data } = useQuery(GET_UTXOS, {
- variables: { auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- if (loading || !data || !data.getUtxos) {
- return ;
- }
-
- return (
-
- Unspent Utxos
-
- {data.getUtxos.map((utxo: any, index: number) => (
-
- ))}
-
-
- );
-};
diff --git a/client/src/views/chain/utxos/UtxoCard.tsx b/client/src/views/chain/utxos/UtxoCard.tsx
deleted file mode 100644
index b58d3aa2..00000000
--- a/client/src/views/chain/utxos/UtxoCard.tsx
+++ /dev/null
@@ -1,68 +0,0 @@
-import React from 'react';
-import { Separation, SubCard } from '../../../components/generic/Styled';
-import { MainInfo } from '../../channels/Channels.style';
-import { renderLine } from '../../../components/generic/Helpers';
-import { getPrice } from 'components/price/Price';
-import { useSettings } from 'context/SettingsContext';
-import { usePriceState } from 'context/PriceContext';
-
-interface TransactionsCardProps {
- utxo: any;
- index: number;
- setIndexOpen: (index: number) => void;
- indexOpen: number;
-}
-
-export const UtxoCard = ({
- utxo,
- index,
- setIndexOpen,
- indexOpen,
-}: TransactionsCardProps) => {
- const { currency } = useSettings();
- const priceContext = usePriceState();
- const format = getPrice(currency, priceContext);
-
- const {
- address,
- address_format,
- confirmation_count,
- output_script,
- tokens,
- transaction_id,
- transaction_vout,
- } = utxo;
-
- const formatAmount = format({ amount: tokens });
-
- const handleClick = () => {
- if (indexOpen === index) {
- setIndexOpen(0);
- } else {
- setIndexOpen(index);
- }
- };
-
- const renderDetails = () => {
- return (
- <>
-
- {renderLine('Address Format:', address_format)}
- {renderLine('Confirmations: ', confirmation_count)}
- {renderLine('Output Script: ', output_script)}
- {renderLine('Transaction Id: ', transaction_id)}
- {renderLine('Transaction Vout: ', transaction_vout)}
- >
- );
- };
-
- return (
-
- handleClick()}>
- {renderLine('Address', address)}
- {renderLine('Amount', formatAmount)}
-
- {index === indexOpen && renderDetails()}
-
- );
-};
diff --git a/client/src/views/channels/ChannelView.tsx b/client/src/views/channels/ChannelView.tsx
deleted file mode 100644
index da2ee3b3..00000000
--- a/client/src/views/channels/ChannelView.tsx
+++ /dev/null
@@ -1,114 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { Channels } from './channels/Channels';
-import { PendingChannels } from './pendingChannels/PendingChannels';
-import { ClosedChannels } from './closedChannels/ClosedChannels';
-import {
- CardWithTitle,
- SubTitle,
- CardTitle,
- SingleLine,
- ColorButton,
-} from '../../components/generic/Styled';
-import { useQuery } from '@apollo/react-hooks';
-import { useAccount } from '../../context/AccountContext';
-import { GET_CHANNEL_AMOUNT_INFO } from '../../graphql/query';
-import { useSettings } from '../../context/SettingsContext';
-import { textColorMap } from '../../styles/Themes';
-
-export const ChannelView = () => {
- const [view, setView] = useState(1);
- const [amounts, setAmounts] = useState({
- active: 0,
- pending: 0,
- closed: 0,
- });
-
- const { theme } = useSettings();
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { data } = useQuery(GET_CHANNEL_AMOUNT_INFO, {
- variables: { auth },
- });
-
- useEffect(() => {
- if (data && data.getNodeInfo) {
- const {
- active_channels_count,
- closed_channels_count,
- pending_channels_count,
- } = data.getNodeInfo;
-
- setAmounts({
- active: active_channels_count,
- pending: pending_channels_count,
- closed: closed_channels_count,
- });
- }
- }, [data]);
-
- const showActive = amounts.pending > 0 || amounts.closed > 0;
- const showPending = amounts.active > 0 || amounts.closed > 0;
- const showClosed = amounts.pending > 0 || amounts.active > 0;
-
- const getView = () => {
- switch (view) {
- case 2:
- return ;
- case 3:
- return ;
- default:
- return ;
- }
- };
-
- const getTitle = () => {
- switch (view) {
- case 2:
- return 'Pending Channels';
- case 3:
- return 'Closed Channels';
- default:
- return 'Open Channels';
- }
- };
-
- return (
-
-
- {getTitle()}
-
- {showActive && amounts.active > 0 && (
- setView(1)}
- >
- {`Open (${amounts.active})`}
-
- )}
- {showPending && amounts.pending > 0 && (
- setView(2)}
- >
- {`Pending (${amounts.pending})`}
-
- )}
- {showClosed && amounts.closed > 0 && (
- setView(3)}
- >
- {`Closed (${amounts.closed})`}
-
- )}
-
-
- {getView()}
-
- );
-};
diff --git a/client/src/views/channels/Channels.style.tsx b/client/src/views/channels/Channels.style.tsx
deleted file mode 100644
index f1e74f7e..00000000
--- a/client/src/views/channels/Channels.style.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-import styled from 'styled-components';
-import {
- progressBackground,
- progressFirst,
- progressSecond,
- mediaWidths,
-} from '../../styles/Themes';
-
-export const Progress = styled.div`
- margin: 5px;
- background: ${progressBackground};
-`;
-
-interface ProgressBar {
- percent: number;
- order?: number;
-}
-
-export const ProgressBar = styled.div`
- height: 10px;
- background-image: linear-gradient(
- to bottom,
- rgba(255, 255, 255, 0.3),
- rgba(0, 0, 0, 0.05)
- );
- background-color: ${({ order }: ProgressBar) =>
- order === 2 ? progressFirst : progressSecond};
- width: ${({ percent }: ProgressBar) => `${percent}%`};
-`;
-
-export const NodeTitle = styled.div`
- font-size: 16px;
- font-weight: bold;
- width: 240px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-
- @media (${mediaWidths.mobile}) {
- width: unset;
- margin-bottom: 8px;
- }
-`;
-
-export const StatusLine = styled.div`
- width: 100%;
- position: relative;
- right: -8px;
- top: -8px;
- display: flex;
- justify-content: flex-end;
- margin: 0 0 -8px 0;
-`;
-
-export const StatusDot = styled.div`
- margin: 0 2px;
- height: 8px;
- width: 8px;
- border-radius: 100%;
- background-color: ${({ color }: { color: string }) => color};
-`;
-
-export const DetailLine = styled.div`
- margin: 4px 0;
- font-size: 14px;
- word-wrap: break-word;
- display: flex;
- justify-content: space-between;
-
- @media (${mediaWidths.mobile}) {
- flex-wrap: wrap;
- }
-`;
-
-export const MainInfo = styled.div`
- cursor: pointer;
-`;
diff --git a/client/src/views/channels/channels/ChannelCard.tsx b/client/src/views/channels/channels/ChannelCard.tsx
deleted file mode 100644
index 2ef3e2ba..00000000
--- a/client/src/views/channels/channels/ChannelCard.tsx
+++ /dev/null
@@ -1,254 +0,0 @@
-import React, { useState } from 'react';
-import { getPercent } from '../../../helpers/Helpers';
-import {
- Progress,
- ProgressBar,
- NodeTitle,
- StatusLine,
- MainInfo,
-} from '../Channels.style';
-import ReactTooltip from 'react-tooltip';
-import {
- SubCard,
- Separation,
- Sub4Title,
- RightAlign,
- ResponsiveLine,
- ResponsiveSingle,
- ResponsiveCol,
-} from '../../../components/generic/Styled';
-import { useSettings } from '../../../context/SettingsContext';
-import {
- getStatusDot,
- getTooltipType,
- getFormatDate,
- getDateDif,
- renderLine,
-} from '../../../components/generic/Helpers';
-import {
- getTransactionLink,
- getNodeLink,
-} from '../../../components/generic/Helpers';
-import Modal from '../../../components/modal/ReactModal';
-import { CloseChannel } from '../../../components/modal/closeChannel/CloseChannel';
-import styled from 'styled-components';
-import { AdminSwitch } from '../../../components/adminSwitch/AdminSwitch';
-import { DownArrow, UpArrow, EyeOff } from '../../../components/generic/Icons';
-import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
-import { getPrice } from 'components/price/Price';
-import { usePriceState } from 'context/PriceContext';
-
-const IconPadding = styled.div`
- margin-left: 16px;
- margin-right: 8px;
-`;
-
-const getSymbol = (status: boolean) => {
- return status ? : ;
-};
-
-const getPrivate = (status: boolean) => {
- return status && ;
-};
-
-interface ChannelCardProps {
- channelInfo: any;
- index: number;
- setIndexOpen: (index: number) => void;
- indexOpen: number;
-}
-
-export const ChannelCard = ({
- channelInfo,
- index,
- setIndexOpen,
- indexOpen,
-}: ChannelCardProps) => {
- const [modalOpen, setModalOpen] = useState(false);
-
- const { theme, currency } = useSettings();
- const priceContext = usePriceState();
- const format = getPrice(currency, priceContext);
-
- const tooltipType = getTooltipType(theme);
-
- const {
- capacity,
- commit_transaction_fee,
- commit_transaction_weight,
- id,
- is_active,
- is_closing,
- is_opening,
- is_partner_initiated,
- is_private,
- is_static_remote_key,
- local_balance,
- local_reserve,
- partner_public_key,
- received,
- remote_balance,
- remote_reserve,
- sent,
- time_offline,
- time_online,
- transaction_id,
- transaction_vout,
- unsettled_balance,
- partner_node_info,
- } = channelInfo;
-
- const {
- alias,
- capacity: node_capacity,
- channel_count,
- color: nodeColor,
- updated_at,
- } = partner_node_info;
-
- const formatBalance = format({ amount: capacity });
- const formatLocal = format({ amount: local_balance });
- const formatRemote = format({ amount: remote_balance });
- const formatReceived = format({ amount: received });
- const formatSent = format({ amount: sent });
- const commitFee = format({ amount: commit_transaction_fee });
- const commitWeight = format({ amount: commit_transaction_weight });
- const localReserve = format({ amount: local_reserve });
- const remoteReserve = format({ amount: remote_reserve });
- const nodeCapacity = format({ amount: node_capacity });
-
- const handleClick = () => {
- if (indexOpen === index) {
- setIndexOpen(0);
- } else {
- setIndexOpen(index);
- }
- };
-
- const renderDetails = () => {
- return (
- <>
-
- {renderLine(
- 'Balancedness:',
- getPercent(local_balance, remote_balance) / 100,
- )}
- {renderLine('Local Balance:', formatLocal)}
- {renderLine('Remote Balance:', formatRemote)}
- {renderLine('Received:', formatReceived)}
- {renderLine('Sent:', formatSent)}
- {renderLine(
- 'Node Public Key:',
- getNodeLink(partner_public_key),
- )}
- {renderLine(
- 'Transaction Id:',
- getTransactionLink(transaction_id),
- )}
- {renderLine('Channel Id:', id)}
- {renderLine('Commit Fee:', commitFee)}
- {renderLine('Commit Weight:', commitWeight)}
- {renderLine('Is Static Remote Key:', is_static_remote_key)}
- {renderLine('Local Reserve:', localReserve)}
- {renderLine('Remote Reserve:', remoteReserve)}
- {renderLine('Time Offline:', time_offline)}
- {renderLine('Time Online:', time_online)}
- {renderLine('Transaction Vout:', transaction_vout)}
- {renderLine('Unsettled Balance:', unsettled_balance)}
- Partner Node Info
- {renderLine('Node Capacity:', nodeCapacity)}
- {renderLine('Channel Count:', channel_count)}
- {renderLine(
- 'Last Update:',
- `${getDateDif(updated_at)} ago (${getFormatDate(
- updated_at,
- )})`,
- )}
-
-
-
- setModalOpen(true)}
- >
- Close Channel
-
-
-
- >
- );
- };
-
- return (
-
- handleClick()}>
-
- {getStatusDot(is_active, 'active')}
- {getStatusDot(is_opening, 'opening')}
- {getStatusDot(is_closing, 'closing')}
-
-
-
- {alias ? alias : 'Unknown'}
-
-
- {formatBalance}
-
- {getPrivate(is_private)}
- {getSymbol(is_partner_initiated)}
-
-
-
-
-
-
-
-
-
-
-
-
- {index === indexOpen && renderDetails()}
-
- {`Local Balance: ${formatLocal}`}
- {`Remote Balance: ${formatRemote}`}
-
-
- {`Received: ${formatReceived}`}
- {`Sent: ${formatSent}`}
-
- setModalOpen(false)}>
-
-
-
- );
-};
diff --git a/client/src/views/channels/channels/Channels.tsx b/client/src/views/channels/channels/Channels.tsx
deleted file mode 100644
index e3fe302e..00000000
--- a/client/src/views/channels/channels/Channels.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import React, { useState } from 'react';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_CHANNELS } from '../../../graphql/query';
-import { Card } from '../../../components/generic/Styled';
-import { ChannelCard } from './ChannelCard';
-import { useAccount } from '../../../context/AccountContext';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import { LoadingCard } from '../../../components/loading/LoadingCard';
-
-export const Channels = () => {
- const [indexOpen, setIndexOpen] = useState(0);
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data } = useQuery(GET_CHANNELS, {
- variables: { auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- if (loading || !data || !data.getChannels) {
- return ;
- }
-
- return (
-
- {data.getChannels.map((channel: any, index: number) => (
-
- ))}
-
- );
-};
diff --git a/client/src/views/channels/closedChannels/ClosedCard.tsx b/client/src/views/channels/closedChannels/ClosedCard.tsx
deleted file mode 100644
index 0a329c6e..00000000
--- a/client/src/views/channels/closedChannels/ClosedCard.tsx
+++ /dev/null
@@ -1,142 +0,0 @@
-import React from 'react';
-import { NodeTitle, MainInfo } from '../Channels.style';
-import {
- SubCard,
- Separation,
- SingleLine,
- DarkSubTitle,
- ResponsiveLine,
-} from '../../../components/generic/Styled';
-import {
- getTransactionLink,
- renderLine,
-} from '../../../components/generic/Helpers';
-import { getNodeLink } from '../../../components/generic/Helpers';
-import styled from 'styled-components';
-import { Price } from 'components/price/Price';
-
-const Padding = styled.div`
- padding-left: 8px;
-`;
-
-interface PendingCardProps {
- channelInfo: any;
- index: number;
- setIndexOpen: (index: number) => void;
- indexOpen: number;
-}
-
-const Column = styled.div`
- display: flex;
- flex-direction: column;
- flex-basis: 30%;
- width: 100%;
-`;
-
-export const ClosedCard = ({
- channelInfo,
- index,
- setIndexOpen,
- indexOpen,
-}: PendingCardProps) => {
- const {
- capacity,
- close_confirm_height,
- close_transaction_id,
- final_local_balance,
- final_time_locked_balance,
- id,
- is_breach_close,
- is_cooperative_close,
- is_funding_cancel,
- is_local_force_close,
- is_remote_force_close,
- partner_public_key,
- transaction_id,
- transaction_vout,
- partner_node_info,
- } = channelInfo;
-
- const { alias, color: nodeColor } = partner_node_info;
-
- const formatCapacity = ;
-
- const getCloseType = (): string => {
- let types: string[] = [];
-
- if (is_breach_close) {
- types.push('Breach');
- }
- if (is_cooperative_close) {
- types.push('Cooperative');
- }
- if (is_funding_cancel) {
- types.push('Funding Cancel');
- }
- if (is_local_force_close) {
- types.push('Local Force Close');
- }
- if (is_remote_force_close) {
- types.push('Remote Force Close');
- }
-
- return types.join(', ');
- };
-
- const handleClick = () => {
- if (indexOpen === index) {
- setIndexOpen(0);
- } else {
- setIndexOpen(index);
- }
- };
-
- const renderDetails = () => {
- return (
- <>
-
- {renderLine('Channel Id:', id)}
- {renderLine(
- 'Node Public Key:',
- getNodeLink(partner_public_key),
- )}
- {renderLine(
- 'Transaction Id:',
- getTransactionLink(transaction_id),
- )}
- {renderLine('Transaction Vout:', transaction_vout)}
- {renderLine(
- 'Close Transaction Id:',
- getTransactionLink(close_transaction_id),
- )}
- {renderLine('Close Confirm Height:', close_confirm_height)}
- {renderLine('Final Local Balance:', final_local_balance)}
- {renderLine(
- 'Final Time Lock Balance:',
- final_time_locked_balance,
- )}
- >
- );
- };
-
- return (
-
- handleClick()}>
-
- {alias ? alias : 'Unknown'}
-
-
- Size:
- {formatCapacity}
-
-
- Close Type:
- {getCloseType()}
-
-
-
-
- {index === indexOpen && renderDetails()}
-
- );
-};
diff --git a/client/src/views/channels/closedChannels/ClosedChannels.tsx b/client/src/views/channels/closedChannels/ClosedChannels.tsx
deleted file mode 100644
index 6bafaeb2..00000000
--- a/client/src/views/channels/closedChannels/ClosedChannels.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import React, { useState } from 'react';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_CLOSED_CHANNELS } from '../../../graphql/query';
-import { Card } from '../../../components/generic/Styled';
-import { ClosedCard } from './ClosedCard';
-import { useAccount } from '../../../context/AccountContext';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import { LoadingCard } from '../../../components/loading/LoadingCard';
-
-export const ClosedChannels = () => {
- const [indexOpen, setIndexOpen] = useState(0);
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data } = useQuery(GET_CLOSED_CHANNELS, {
- variables: { auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- if (loading || !data || !data.getClosedChannels) {
- return ;
- }
-
- return (
-
- {data.getClosedChannels.map((channel: any, index: number) => (
-
- ))}
-
- );
-};
diff --git a/client/src/views/channels/pendingChannels/PendingCard.tsx b/client/src/views/channels/pendingChannels/PendingCard.tsx
deleted file mode 100644
index 0868c812..00000000
--- a/client/src/views/channels/pendingChannels/PendingCard.tsx
+++ /dev/null
@@ -1,189 +0,0 @@
-import React from 'react';
-import { getPercent } from '../../../helpers/Helpers';
-import {
- Progress,
- ProgressBar,
- NodeTitle,
- StatusLine,
- MainInfo,
-} from '../Channels.style';
-import ReactTooltip from 'react-tooltip';
-import {
- SubCard,
- Separation,
- Sub4Title,
- ResponsiveLine,
- ResponsiveSingle,
- ResponsiveCol,
-} from '../../../components/generic/Styled';
-import { useSettings } from '../../../context/SettingsContext';
-import {
- getStatusDot,
- getTooltipType,
- getTransactionLink,
- renderLine,
- getDateDif,
- getFormatDate,
-} from '../../../components/generic/Helpers';
-import { getNodeLink } from '../../../components/generic/Helpers';
-import { getPrice } from 'components/price/Price';
-import { usePriceState } from 'context/PriceContext';
-
-interface PendingCardProps {
- channelInfo: any;
- index: number;
- setIndexOpen: (index: number) => void;
- indexOpen: number;
-}
-
-export const PendingCard = ({
- channelInfo,
- index,
- setIndexOpen,
- indexOpen,
-}: PendingCardProps) => {
- const { theme, currency } = useSettings();
- const priceContext = usePriceState();
- const format = getPrice(currency, priceContext);
-
- const tooltipType = getTooltipType(theme);
-
- const {
- close_transaction_id,
- is_active,
- is_closing,
- is_opening,
- local_balance,
- local_reserve,
- partner_public_key,
- received,
- remote_balance,
- remote_reserve,
- sent,
- transaction_fee,
- transaction_id,
- transaction_vout,
- partner_node_info,
- } = channelInfo;
-
- const {
- alias,
- capacity,
- channelCount,
- color: nodeColor,
- updated_at,
- } = partner_node_info;
-
- const formatBalance = format({ amount: local_balance + remote_balance });
- const formatLocal = format({ amount: local_balance });
- const formatRemote = format({ amount: remote_balance });
- const formatReceived = format({ amount: received });
- const formatSent = format({ amount: sent });
-
- const handleClick = () => {
- if (indexOpen === index) {
- setIndexOpen(0);
- } else {
- setIndexOpen(index);
- }
- };
-
- const renderDetails = () => {
- return (
- <>
-
- {renderLine('State:', is_active ? 'Active' : 'Inactive')}
- {renderLine('Status:', is_opening ? 'Opening' : 'Closing')}
- {renderLine('Local Balance:', local_balance)}
- {renderLine('Remote Balance:', remote_balance)}
- {renderLine(
- 'Node Public Key:',
- getNodeLink(partner_public_key),
- )}
- {renderLine(
- 'Transaction Id:',
- getTransactionLink(transaction_id),
- )}
- {renderLine('Transaction Vout:', transaction_vout)}
- {renderLine(
- 'Transaction Fee:',
- getTransactionLink(transaction_fee),
- )}
- {renderLine(
- 'Close Transaction Id:',
- getTransactionLink(close_transaction_id),
- )}
- {renderLine('Local Reserve:', local_reserve)}
- {renderLine('Remote Reserve:', remote_reserve)}
- Partner Node Info
- {renderLine('Node Capacity:', capacity)}
- {renderLine('Channels:', channelCount)}
- {renderLine(
- 'Last Update:',
- `${getDateDif(updated_at)} ago (${getFormatDate(
- updated_at,
- )})`,
- )}
- >
- );
- };
-
- return (
-
- handleClick()}>
-
- {getStatusDot(is_active, 'active')}
- {getStatusDot(is_opening, 'opening')}
- {getStatusDot(is_closing, 'closing')}
-
-
- {alias ? alias : 'Unknown'}
-
- {formatBalance}
-
-
-
-
-
-
-
-
-
-
-
- {index === indexOpen && renderDetails()}
-
- {`Local Balance: ${formatLocal}`}
- {`Remote Balance: ${formatRemote}`}
-
-
- {`received: ${formatReceived}`}
- {`Sent: ${formatSent}`}
-
-
- );
-};
diff --git a/client/src/views/channels/pendingChannels/PendingChannels.tsx b/client/src/views/channels/pendingChannels/PendingChannels.tsx
deleted file mode 100644
index cefe3127..00000000
--- a/client/src/views/channels/pendingChannels/PendingChannels.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import React, { useState } from 'react';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_PENDING_CHANNELS } from '../../../graphql/query';
-import { Card } from '../../../components/generic/Styled';
-import { PendingCard } from './PendingCard';
-import { useAccount } from '../../../context/AccountContext';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import { LoadingCard } from '../../../components/loading/LoadingCard';
-
-export const PendingChannels = () => {
- const [indexOpen, setIndexOpen] = useState(0);
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data } = useQuery(GET_PENDING_CHANNELS, {
- variables: { auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- if (loading || !data || !data.getPendingChannels) {
- return ;
- }
-
- return (
-
- {data.getPendingChannels.map((channel: any, index: number) => (
-
- ))}
-
- );
-};
diff --git a/client/src/views/entry/Entry.tsx b/client/src/views/entry/Entry.tsx
deleted file mode 100644
index 092c721c..00000000
--- a/client/src/views/entry/Entry.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import React, { useEffect } from 'react';
-import { LoginView } from './login/Login';
-import { SessionLogin } from './login/SessionLogin';
-import { useHistory, Switch, Route, useLocation } from 'react-router';
-import { HomePageView } from './homepage/HomePage';
-import { TermsView } from 'views/other/terms/TermsView';
-import { PrivacyView } from 'views/other/privacy/PrivacyView';
-import { FaqView } from 'views/other/faq/FaqView';
-
-interface HomeProps {
- session?: boolean;
-}
-
-const allowedSites = ['/', '/login', '/faq', '/terms', '/privacy'];
-
-const EntryView = ({ session }: HomeProps) => {
- const { push } = useHistory();
- const location = useLocation();
-
- useEffect(() => {
- if (allowedSites.indexOf(location.pathname) < 0) {
- push('/');
- }
- }, [location, push]);
-
- const getView = () => {
- return session ? : ;
- };
-
- return (
-
- } />
- } />
- } />
- } />
- getView()} />
-
- );
-};
-
-export default EntryView;
diff --git a/client/src/views/entry/homepage/HomePage.styled.ts b/client/src/views/entry/homepage/HomePage.styled.ts
deleted file mode 100644
index e8f5b5cd..00000000
--- a/client/src/views/entry/homepage/HomePage.styled.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import styled, { keyframes } from 'styled-components';
-import { ReactComponent as HeadlineImage } from '../../../assets/images/ThunderHub.svg';
-import { fontColors, mediaWidths } from 'styles/Themes';
-
-export const Headline = styled.div`
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 48px 0 140px;
-
- @media (${mediaWidths.mobile}) {
- flex-direction: column-reverse;
- }
-`;
-
-export const LeftHeadline = styled.div`
- width: 50%;
- display: flex;
- flex-direction: column;
-
- @media (${mediaWidths.mobile}) {
- width: 100%;
- text-align: center;
- }
-`;
-
-const flicker = keyframes`
- 0% { opacity: 1; }
- 3% { opacity: 0.4; }
- 6% { opacity: 1; }
- 7% { opacity: 0.4; }
- 8% { opacity: 1; }
- 9% { opacity: 0.4; }
- 10% { opacity: 0; }
- 100% { opacity: 0; }
-`;
-
-export const StyledImage = styled(HeadlineImage)`
- width: 500px;
-
- & .glowEffect {
- animation: ${flicker} 3s infinite step-end;
- }
- & .glowEffectTwo {
- animation: ${flicker} 5s infinite step-end;
- }
- & .glowEffectThree {
- animation: ${flicker} 7s infinite step-end;
- }
- & .glowEffectFour {
- animation: ${flicker} 3.5s infinite step-end;
- }
-
- @media (${mediaWidths.mobile}) {
- width: unset;
- }
-`;
-
-export const HomeButton = styled.button`
- cursor: pointer;
- outline: none;
- padding: 8px 24px;
- text-decoration: 2px solid blue;
- font-size: 16px;
- background-image: linear-gradient(to right, #fd5f00, #f99325);
- color: white;
- border: none;
- display: flex;
- align-items: center;
- justify-content: center;
- border-radius: 8px;
- white-space: nowrap;
- width: 100%;
-`;
-
-export const Title = styled.h1`
- width: 100%;
- text-align: center;
- color: ${({ textColor }: { textColor?: string }) =>
- textColor ? textColor : fontColors.white};
- font-size: 32px;
- margin-bottom: 0;
-`;
-
-export const Text = styled.p`
- color: ${fontColors.white};
- text-align: justify;
- max-width: 400px;
-`;
diff --git a/client/src/views/entry/homepage/Sections/CallToAction.tsx b/client/src/views/entry/homepage/Sections/CallToAction.tsx
deleted file mode 100644
index 797eebc8..00000000
--- a/client/src/views/entry/homepage/Sections/CallToAction.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import React from 'react';
-import { Center } from 'views/other/OtherViews.styled';
-import { Section } from 'components/section/Section';
-import { Padding, StyledH2, StyledH1 } from './Sections.styled';
-import { homeBackgroundColor, homeBackgroundSecondColor } from 'styles/Themes';
-import { Link } from 'react-router-dom';
-import { HomeButton } from '../HomePage.styled';
-import { Zap } from 'components/generic/Icons';
-import styled from 'styled-components';
-
-const CallToActionButton = styled(HomeButton)`
- margin: 16px 0 0;
-`;
-
-export const CallToAction = () => {
- return (
- <>
-
-
-
-
- Ready to take control of your Lightning Node?
-
-
-
-
-
-
-
-
- Control The Lightning
-
-
-
-
- >
- );
-};
diff --git a/client/src/views/entry/homepage/Sections/Compatible.tsx b/client/src/views/entry/homepage/Sections/Compatible.tsx
deleted file mode 100644
index 42fd6853..00000000
--- a/client/src/views/entry/homepage/Sections/Compatible.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import React from 'react';
-import { Center } from 'views/other/OtherViews.styled';
-import { Section } from 'components/section/Section';
-import { WrapSingleLine, StyledH2, StyledP } from './Sections.styled';
-import { homeBackgroundColor } from 'styles/Themes';
-
-export const Compatible = () => {
- return (
-
-
-
- Compatible with the latest LND node versions.
-
-
-
- v0.7.1-beta
- v0.8.0-beta
- v0.8.1-beta
- v0.8.2-beta
- v0.9.0-beta
-
-
- );
-};
diff --git a/client/src/views/entry/homepage/Sections/DetailSection.tsx b/client/src/views/entry/homepage/Sections/DetailSection.tsx
deleted file mode 100644
index 4b8f0a2f..00000000
--- a/client/src/views/entry/homepage/Sections/DetailSection.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-import React from 'react';
-import {
- Card,
- SubTitle,
- ColumnLine,
- Sub4Title,
- SingleLine,
-} from '../../../../components/generic/Styled';
-import styled from 'styled-components';
-import {
- Eye,
- Send,
- Key,
- Server,
- Sliders,
- Users,
-} from '../../../../components/generic/Icons';
-import { cardColor, mediaWidths } from '../../../../styles/Themes';
-import { Section } from 'components/section/Section';
-
-const Padding = styled.div`
- padding: ${({ padding }: { padding?: string }) =>
- padding ? padding : '16px'};
-`;
-
-const DetailCard = styled(Card)`
- background-color: ${cardColor};
- margin-bottom: 0;
- margin: 8px 16px;
- z-index: 1;
- flex: 1 0 30%;
-
- @media (${mediaWidths.mobile}) {
- flex: 1 0 100%;
- }
-`;
-
-const DetailLine = styled.div`
- margin: 0 -16px;
- display: flex;
- justify-content: center;
- align-items: center;
- flex-wrap: wrap;
- @media (${mediaWidths.mobile}) {
- margin: 0;
- }
-`;
-
-const detailCardContent = (title: string, text: string, Icon: any) => (
-
-
-
-
-
-
- {title}
- {text}
-
-
-
-);
-
-export const DetailSection = () => {
- return (
-
-
- {detailCardContent(
- 'Make Payments',
- 'Send and receive both Lightning and On-Chain payments.',
- Send,
- )}
- {detailCardContent(
- 'Multiple Nodes',
- 'Connect to multiple nodes and quickly switch between them.',
- Server,
- )}
- {detailCardContent(
- 'View-Only Mode',
- `Check the status of your node any time without risk.`,
- Eye,
- )}
- {detailCardContent(
- 'AES Encryption',
- 'Your Macaroon is AES encrypted with a password only you know.',
- Key,
- )}
- {detailCardContent(
- 'Open Source',
- `Don't trust anyone. Verify the code yourself.`,
- Users,
- )}
- {detailCardContent(
- 'Manage Channels',
- 'Open, close and monitor channel status and liquidity',
- Sliders,
- )}
-
-
- );
-};
diff --git a/client/src/views/entry/homepage/Sections/InfoSection.tsx b/client/src/views/entry/homepage/Sections/InfoSection.tsx
deleted file mode 100644
index 7481cab8..00000000
--- a/client/src/views/entry/homepage/Sections/InfoSection.tsx
+++ /dev/null
@@ -1,98 +0,0 @@
-import React from 'react';
-import { Section } from 'components/section/Section';
-import {
- InfoRow,
- ImageSection,
- ImagePlace,
- TextSection,
-} from './Sections.styled';
-import { Text } from 'views/other/OtherViews.styled';
-import Transactions from '../../../../assets/images/Transactions.png';
-import Reports from '../../../../assets/images/Reports.png';
-import Forwards from '../../../../assets/images/Forwards.png';
-import Channels from '../../../../assets/images/Channels.png';
-import NightLight from '../../../../assets/images/NightLight.png';
-
-export const InfoSection = () => {
- return (
- <>
-
-
-
- Send and Receive
-
- Send and receive both Lightning and Bitcoin payments
- in a simple and easy to use interface with both
- basic and advanced features.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Transaction Reports
-
- Have a quick overview of the invoices coming into
- your node and payments being made. Check both the
- amount and value of your transactions. See total
- amount together with confirmed and unconfirmed
- invoices.
-
-
-
-
-
-
-
- Channel Management
-
- See all your channels and get a quick preview of how
- balanced and active they are. Open new channels or
- close them.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Forwarded Payments
-
- Quick glance at the forwarded payments that have
- been going through your node. See the incoming and
- outgoing channels being used.
-
-
-
-
-
-
-
- Night/Day Mode
-
- Prefer working in the dark? We have an awesome night
- mode just for you. Want it more bright? Got you
- covered as well.
-
-
-
-
-
-
-
- >
- );
-};
diff --git a/client/src/views/entry/homepage/Sections/Sections.styled.tsx b/client/src/views/entry/homepage/Sections/Sections.styled.tsx
deleted file mode 100644
index 800d5014..00000000
--- a/client/src/views/entry/homepage/Sections/Sections.styled.tsx
+++ /dev/null
@@ -1,91 +0,0 @@
-import styled from 'styled-components';
-import { SingleLine } from 'components/generic/Styled';
-import { headerColor, mediaWidths } from 'styles/Themes';
-
-export const Padding = styled.div`
- padding: 4px 4px 0 0;
-`;
-
-export const SlantedWrapper = styled.div`
- width: 100%;
- height: 200px;
- margin-bottom: -260px;
- overflow: hidden;
- z-index: -5;
-`;
-
-export const SlantedEdge = styled.div`
- content: '';
- width: 100%;
- height: 100%;
- background: ${headerColor};
- -webkit-transform-origin: 100% 0;
- -ms-transform-origin: 100% 0;
- transform-origin: 100% 0;
- -webkit-transform: skew(84deg);
- -ms-transform: skew(84deg);
- transform: skew(88deg);
- z-index: -5;
-`;
-
-export const FullWidth = styled.div`
- display: flex;
- justify-content: center;
- width: 100%;
- margin-top: 18px;
-`;
-
-export const InfoRow = styled.div`
- display: flex;
- align-items: center;
- justify-content: space-between;
- align-items: stretch;
-
- @media (${mediaWidths.mobile}) {
- flex-direction: ${({ reverse }: { reverse?: boolean }) =>
- reverse ? 'column-reverse' : 'column'};
- }
-`;
-
-export const HalfSection = styled.div`
- width: 50%;
- display: flex;
- flex-direction: column;
-
- @media (${mediaWidths.mobile}) {
- width: 100%;
- text-align: center;
- }
-`;
-
-export const ImageSection = styled(HalfSection)`
- align-self: center;
-`;
-
-export const TextSection = styled(HalfSection)`
- padding: 0 32px;
-
- @media (${mediaWidths.mobile}) {
- padding: 0 8px;
- }
-`;
-
-export const ImagePlace = styled.img`
- display: flex;
- width: 100%;
- height: auto;
- justify-content: center;
- align-items: center;
-`;
-
-export const WrapSingleLine = styled(SingleLine)`
- flex-wrap: wrap;
- justify-content: space-around;
- flex-grow: 1;
-`;
-
-export const StyledH1 = styled.h1``;
-
-export const StyledH2 = styled.h2``;
-
-export const StyledP = styled.p``;
diff --git a/client/src/views/entry/homepage/Sections/Top.tsx b/client/src/views/entry/homepage/Sections/Top.tsx
deleted file mode 100644
index f7a747a1..00000000
--- a/client/src/views/entry/homepage/Sections/Top.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import React from 'react';
-import {
- Headline,
- LeftHeadline,
- StyledImage,
- HomeButton,
- Title,
- Text,
-} from '../HomePage.styled';
-import { Zap } from '../../../../components/generic/Icons';
-import { headerColor, inverseTextColor } from '../../../../styles/Themes';
-import { Link } from 'react-router-dom';
-import { Section } from 'components/section/Section';
-import {
- FullWidth,
- Padding,
- SlantedWrapper,
- SlantedEdge,
-} from './Sections.styled';
-
-export const TopSection = () => {
- return (
- <>
-
-
-
- Control The Power of Lightning
-
-
- Take full control of your lightning node for
- quick monitoring and management inside your
- browser.
-
-
-
-
-
-
-
-
- Control The Lightning
-
-
-
-
-
-
-
-
-
-
- >
- );
-};
diff --git a/client/src/views/entry/login/Login.tsx b/client/src/views/entry/login/Login.tsx
deleted file mode 100644
index bc8a1d89..00000000
--- a/client/src/views/entry/login/Login.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-import React, { useState } from 'react';
-import { Card, Separation } from '../../../components/generic/Styled';
-import styled from 'styled-components';
-import { Section } from 'components/section/Section';
-import {
- MultiButton,
- SingleButton,
-} from 'components/buttons/multiButton/MultiButton';
-import { Text } from 'views/other/OtherViews.styled';
-import { Link } from 'components/link/Link';
-import { Auth } from 'components/auth';
-
-const ConnectTitle = styled.h1`
- width: 100%;
- text-align: center;
-`;
-
-export const LoginView = () => {
- const [isType, setIsType] = useState('login');
- const [status, setStatus] = useState('none');
-
- const renderButtons = () => (
- <>
-
- setIsType('login')}
- >
- Details
-
- setIsType('connect')}
- >
- LndConnect
-
- setIsType('btcpay')}
- >
- BTCPayServer
-
- setIsType('qrcode')}
- >
- QR Code
-
-
- >
- );
-
- const renderText = () => {
- switch (isType) {
- case 'btcpay':
- return (
- <>
-
-
- To connect with your BTCPayServer instance you need
- the connection JSON that they provide.
-
-
- To access this JSON in your BPS instance, go to:
-
-
- Server Settings > Services > gRPC server > Show QR
- Code > QR Code Information > Open Config file
-
-
- Then copy the complete JSON and paste it below.
-
-
- >
- );
- case 'connect':
- return (
- <>
-
-
- To connect via LNDConnect paste the LNDConnectUrl
- down below.
- {' Find the url format specification '}
-
- here.
-
-
-
- >
- );
- default:
- return null;
- }
- };
-
- return (
-
- {'How do you want to connect?'}
-
- {status === 'none' && renderButtons()}
- {status === 'none' && renderText()}
- setStatus('none')}
- />
-
-
- );
-};
diff --git a/client/src/views/entry/login/SessionLogin.tsx b/client/src/views/entry/login/SessionLogin.tsx
deleted file mode 100644
index 7b630a7b..00000000
--- a/client/src/views/entry/login/SessionLogin.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import React, { useState } from 'react';
-import { useAccount } from '../../../context/AccountContext';
-import {
- SingleLine,
- Sub4Title,
- CardWithTitle,
- Card,
- SubTitle,
-} from '../../../components/generic/Styled';
-import CryptoJS from 'crypto-js';
-import { toast } from 'react-toastify';
-import { saveSessionAuth } from '../../../utils/auth';
-import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
-import { Input } from 'components/input/Input';
-import { Section } from 'components/section/Section';
-
-export const SessionLogin = () => {
- const { name, admin, refreshAccount } = useAccount();
- const [pass, setPass] = useState('');
-
- const handleClick = () => {
- try {
- const bytes = CryptoJS.AES.decrypt(admin, pass);
- const decrypted = bytes.toString(CryptoJS.enc.Utf8);
-
- saveSessionAuth(decrypted);
- refreshAccount();
- } catch (error) {
- toast.error('Wrong Password');
- }
- };
-
- return (
-
- );
-};
diff --git a/client/src/views/fees/FeeCard.tsx b/client/src/views/fees/FeeCard.tsx
deleted file mode 100644
index 42b3f9f0..00000000
--- a/client/src/views/fees/FeeCard.tsx
+++ /dev/null
@@ -1,164 +0,0 @@
-import React, { useState } from 'react';
-import {
- SubCard,
- Separation,
- SingleLine,
- DarkSubTitle,
- ResponsiveLine,
- NoWrapTitle,
-} from '../../components/generic/Styled';
-import { renderLine } from '../../components/generic/Helpers';
-import { MainInfo, NodeTitle, ColLine } from './Fees.style';
-import { useMutation } from '@apollo/react-hooks';
-import { UPDATE_FEES } from '../../graphql/mutation';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../utils/error';
-import { ChevronRight } from '../../components/generic/Icons';
-import { SecureButton } from '../../components/buttons/secureButton/SecureButton';
-import { useSettings } from '../../context/SettingsContext';
-import { textColorMap } from '../../styles/Themes';
-import { Input } from '../../components/input/Input';
-import { AdminSwitch } from 'components/adminSwitch/AdminSwitch';
-
-interface FeeCardProps {
- channelInfo: any;
- index: number;
- setIndexOpen: (index: number) => void;
- indexOpen: number;
-}
-
-export const FeeCard = ({
- channelInfo,
- index,
- setIndexOpen,
- indexOpen,
-}: FeeCardProps) => {
- const [newBaseFee, setBaseFee] = useState(0);
- const [newFeeRate, setFeeRate] = useState(0);
-
- const { theme } = useSettings();
-
- const {
- alias,
- color,
- baseFee,
- feeRate,
- transactionId,
- transactionVout,
- } = channelInfo;
-
- const [updateFees] = useMutation(UPDATE_FEES, {
- onError: (error) => toast.error(getErrorContent(error)),
- onCompleted: (data) => {
- setIndexOpen(0);
- data.updateFees
- ? toast.success('Channel fees updated')
- : toast.error('Error updating channel fees');
- },
- refetchQueries: ['GetChannelFees'],
- });
-
- const handleClick = () => {
- if (indexOpen === index) {
- setIndexOpen(0);
- } else {
- setIndexOpen(index);
- }
- };
-
- const renderDetails = () => {
- return (
- <>
-
- {renderLine('Transaction Id:', transactionId)}
- {renderLine('Transaction Vout:', transactionVout)}
-
-
-
-
- {`Base Fee:`}
-
-
- setBaseFee(parseInt(e.target.value))
- }
- />
-
-
-
- {`Fee Rate:`}
-
-
- setFeeRate(parseInt(e.target.value))
- }
- />
-
-
- Update Fees
-
-
-
- >
- );
- };
-
- return (
-
- handleClick()}>
-
- {alias ? alias : 'Unknown'}
-
-
-
- {`Base Fee:`}
-
-
- {baseFee}
-
- {baseFee === 1 ? 'sat' : 'sats'}
-
-
-
-
-
- {`Fee Rate:`}
-
-
- {feeRate}
-
- {feeRate === 1
- ? 'sat/million'
- : 'sats/million'}
-
-
-
-
-
-
- {index === indexOpen && renderDetails()}
-
- );
-};
diff --git a/client/src/views/fees/Fees.style.tsx b/client/src/views/fees/Fees.style.tsx
deleted file mode 100644
index ba1ecc38..00000000
--- a/client/src/views/fees/Fees.style.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import styled from 'styled-components';
-
-export const ColLine = styled.div`
- display: flex;
- flex-direction: column;
- flex-basis: 30%;
- width: 100%;
-`;
-
-export const NodeTitle = styled.div`
- font-size: 16px;
- font-weight: bold;
-`;
-
-export const StatusLine = styled.div`
- width: 100%;
- position: relative;
- right: -8px;
- top: -8px;
- display: flex;
- justify-content: flex-end;
- margin: 0 0 -8px 0;
-`;
-
-export const StatusDot = styled.div`
- margin: 0 2px;
- height: 8px;
- width: 8px;
- border-radius: 100%;
- background-color: ${({ color }: { color: string }) => color};
-`;
-
-export const DetailLine = styled.div`
- font-size: 14px;
- word-wrap: break-word;
- display: flex;
- justify-content: space-between;
-`;
-
-export const MainInfo = styled.div`
- cursor: pointer;
-`;
diff --git a/client/src/views/fees/Fees.tsx b/client/src/views/fees/Fees.tsx
deleted file mode 100644
index f5c1e8f1..00000000
--- a/client/src/views/fees/Fees.tsx
+++ /dev/null
@@ -1,135 +0,0 @@
-import React, { useState } from 'react';
-import { useQuery, useMutation } from '@apollo/react-hooks';
-import { CHANNEL_FEES } from '../../graphql/query';
-import {
- Card,
- CardWithTitle,
- SubTitle,
- SingleLine,
- Sub4Title,
- Separation,
- DarkSubTitle,
- RightAlign,
- ResponsiveLine,
-} from 'components/generic/Styled';
-import { useAccount } from '../../context/AccountContext';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../utils/error';
-import { LoadingCard } from 'components/loading/LoadingCard';
-import { FeeCard } from './FeeCard';
-import { UPDATE_FEES } from '../../graphql/mutation';
-import { XSvg, ChevronRight } from 'components/generic/Icons';
-import { SecureButton } from 'components/buttons/secureButton/SecureButton';
-import { AdminSwitch } from 'components/adminSwitch/AdminSwitch';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-import { Input } from 'components/input/Input';
-
-export const FeesView = () => {
- const [indexOpen, setIndexOpen] = useState(0);
- const [isEdit, setIsEdit] = useState(false);
- const [baseFee, setBaseFee] = useState(0);
- const [feeRate, setFeeRate] = useState(0);
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data } = useQuery(CHANNEL_FEES, {
- variables: { auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- const [updateFees] = useMutation(UPDATE_FEES, {
- onError: (error) => toast.error(getErrorContent(error)),
- onCompleted: (data) => {
- setIsEdit(false);
- data.updateFees
- ? toast.success('Fees Updated')
- : toast.error('Error updating fees');
- },
- refetchQueries: ['GetChannelFees'],
- });
-
- if (loading || !data || !data.getChannelFees) {
- return ;
- }
-
- return (
- <>
-
-
- Update Channel Fees
-
-
- Channel Fees
- setIsEdit((prev) => !prev)}
- >
- {isEdit ? : 'Update'}
-
-
- {isEdit && (
- <>
-
-
- {`Base Fee (Sats):`}
-
- setBaseFee(parseInt(e.target.value))
- }
- />
-
-
- {`Fee Rate (Sats/Million):`}
-
- setFeeRate(parseInt(e.target.value))
- }
- />
-
-
-
- Update Fees
-
-
-
- >
- )}
-
-
-
-
- Channel Fees
-
- {data.getChannelFees.map((channel: any, index: number) => (
-
- ))}
-
-
- >
- );
-};
diff --git a/client/src/views/forwards/ForwardList.tsx b/client/src/views/forwards/ForwardList.tsx
deleted file mode 100644
index 45ee9099..00000000
--- a/client/src/views/forwards/ForwardList.tsx
+++ /dev/null
@@ -1,94 +0,0 @@
-import React, { useState } from 'react';
-import {
- SubTitle,
- Card,
- CardWithTitle,
- CardTitle,
- ColorButton,
- SingleLine,
-} from '../../components/generic/Styled';
-import { useAccount } from '../../context/AccountContext';
-import { GET_FORWARDS } from '../../graphql/query';
-import { useQuery } from '@apollo/react-hooks';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../utils/error';
-import { LoadingCard } from '../../components/loading/LoadingCard';
-import { ForwardCard } from './ForwardsCard';
-import { textColorMap } from '../../styles/Themes';
-import { useSettings } from '../../context/SettingsContext';
-import { ForwardBox } from 'views/home/reports/forwardReport';
-
-const timeMap: { [key: string]: string } = {
- day: 'today',
- week: 'this week',
- month: 'this month',
- threeMonths: 'these past 3 months',
-};
-
-export const ForwardsList = () => {
- const [time, setTime] = useState('week');
- const [indexOpen, setIndexOpen] = useState(0);
-
- const { theme } = useSettings();
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data } = useQuery(GET_FORWARDS, {
- variables: { auth, time },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- if (loading || !data || !data.getForwards) {
- return ;
- }
-
- const renderButton = (selectedTime: string, title: string) => (
- setTime(selectedTime)}
- selected={time === selectedTime}
- >
- {title}
-
- );
-
- const renderNoForwards = () => (
- {`Your node has not forwarded any payments ${timeMap[time]}.`}
- );
-
- return (
- <>
-
-
-
- Forwards
-
- {renderButton('day', 'D')}
- {renderButton('week', '1W')}
- {renderButton('month', '1M')}
- {renderButton('threeMonths', '3M')}
-
-
-
- {data.getForwards.forwards.length <= 0 &&
- renderNoForwards()}
- {data.getForwards.forwards.map(
- (forward: any, index: number) => (
-
- ),
- )}
-
-
- >
- );
-};
diff --git a/client/src/views/forwards/ForwardsCard.tsx b/client/src/views/forwards/ForwardsCard.tsx
deleted file mode 100644
index 374800d5..00000000
--- a/client/src/views/forwards/ForwardsCard.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import React from 'react';
-import {
- Separation,
- SubCard,
- ColumnLine,
- ResponsiveLine,
- ResponsiveSingle,
-} from '../../components/generic/Styled';
-import { MainInfo } from '../channels/Channels.style';
-import {
- getDateDif,
- getFormatDate,
- renderLine,
-} from '../../components/generic/Helpers';
-import { Price } from 'components/price/Price';
-
-interface ForwardCardProps {
- forward: any;
- index: number;
- setIndexOpen: (index: number) => void;
- indexOpen: number;
-}
-
-export const ForwardCard = ({
- forward,
- index,
- setIndexOpen,
- indexOpen,
-}: ForwardCardProps) => {
- const {
- created_at,
- fee,
- fee_mtokens,
- incoming_channel,
- incoming_alias,
- outgoing_channel,
- outgoing_alias,
- tokens,
- } = forward;
-
- const formatAmount = ;
- const formatFee = ;
-
- const handleClick = () => {
- if (indexOpen === index) {
- setIndexOpen(0);
- } else {
- setIndexOpen(index);
- }
- };
-
- const renderDetails = () => {
- return (
- <>
-
- {renderLine('Incoming Channel: ', incoming_channel)}
- {renderLine('Outgoing Channel: ', outgoing_channel)}
- {renderLine('Fee MilliTokens: ', fee_mtokens)}
- {renderLine('Date: ', getFormatDate(created_at))}
- >
- );
- };
-
- return (
-
- handleClick()}>
-
-
-
- {renderLine('Incoming:', incoming_alias)}
- {renderLine('Outgoing:', outgoing_alias)}
-
-
-
- {renderLine('Amount:', formatAmount)}
- {renderLine('Fee:', formatFee)}
- {renderLine('Date:', `${getDateDif(created_at)} ago`)}
-
-
-
- {index === indexOpen && renderDetails()}
-
- );
-};
diff --git a/client/src/views/home/Home.tsx b/client/src/views/home/Home.tsx
deleted file mode 100644
index 3123d6c5..00000000
--- a/client/src/views/home/Home.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import React from 'react';
-import { NetworkInfo } from './networkInfo/NetworkInfo';
-import { AccountInfo } from './account/AccountInfo';
-import { QuickActions } from './quickActions/QuickActions';
-import { FlowBox } from './reports/flow';
-import { ForwardBox } from './reports/forwardReport';
-import { LiquidReport } from './reports/liquidReport/LiquidReport';
-import { ConnectCard } from './connect/Connect';
-import { NodeBar } from 'components/nodeInfo/NodeBar';
-
-export const Home = () => {
- return (
- <>
-
-
-
-
-
-
-
-
- >
- );
-};
diff --git a/client/src/views/home/account/AccountInfo.tsx b/client/src/views/home/account/AccountInfo.tsx
deleted file mode 100644
index 05304ea8..00000000
--- a/client/src/views/home/account/AccountInfo.tsx
+++ /dev/null
@@ -1,269 +0,0 @@
-import React, { useState, ReactNode } from 'react';
-import {
- Card,
- CardWithTitle,
- SubTitle,
- SingleLine,
- Separation,
- DarkSubTitle,
- ColorButton,
-} from '../../../components/generic/Styled';
-import styled from 'styled-components';
-import {
- UpArrow,
- Zap,
- Anchor,
- Pocket,
- DownArrow,
- XSvg,
-} from '../../../components/generic/Icons';
-import { PayCard } from './pay/pay';
-import { CreateInvoiceCard } from './createInvoice/CreateInvoice';
-import { SendOnChainCard } from './sendOnChain/SendOnChain';
-import { ReceiveOnChainCard } from './receiveOnChain/ReceiveOnChain';
-import { LoadingCard } from '../../../components/loading/LoadingCard';
-import { AdminSwitch } from '../../../components/adminSwitch/AdminSwitch';
-import { useSize } from '../../../hooks/UseSize';
-import { Price } from 'components/price/Price';
-import { mediaWidths, mediaDimensions } from 'styles/Themes';
-import { useStatusState } from 'context/StatusContext';
-
-const Tile = styled.div`
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- align-items: ${({ startTile }: { startTile?: boolean }) =>
- startTile ? 'flex-start' : 'flex-end'};
-`;
-
-const ButtonRow = styled.div`
- display: flex;
-`;
-
-const Responsive = styled(SingleLine)`
- @media (${mediaWidths.mobile}) {
- flex-direction: column;
- }
-`;
-
-const sectionColor = '#FFD300';
-
-interface WrapperProps {
- width?: number;
- children: ReactNode;
-}
-
-const ResponsiveWrapper = ({ children, width = 0 }: WrapperProps) => {
- if (width <= mediaDimensions.mobile) {
- return {children} ;
- }
- return <>{children}>;
-};
-
-export const AccountInfo = () => {
- const { width } = useSize();
- const [state, setState] = useState('none');
-
- const {
- loading,
- chainBalance,
- chainPending,
- channelBalance,
- channelPending,
- } = useStatusState();
-
- if (loading) {
- return (
- <>
-
-
- >
- );
- }
-
- const formatCB = ;
- const formatPB = ;
- const formatCCB = ;
- const formatPCB = ;
-
- const totalB = ;
- const totalPB = ;
-
- const renderContent = () => {
- switch (state) {
- case 'send_ln':
- return setState('none')} />;
- case 'receive_ln':
- return ;
- case 'send_chain':
- return setState('none')} />;
- case 'receive_chain':
- return ;
- default:
- return null;
- }
- };
-
- const getTitle = () => {
- switch (state) {
- case 'send_ln':
- return 'Send Sats over Lightning';
- case 'receive_ln':
- return 'Receive Sats over Lightning';
- case 'send_chain':
- return 'Send To On Chain Address';
- case 'receive_chain':
- return 'Create Address to Receive';
- default:
- return 'Your Accounts';
- }
- };
-
- const showLn =
- state === 'send_ln' || state === 'receive_ln' || state === 'none';
- const showChain =
- state === 'send_chain' || state === 'receive_chain' || state === 'none';
-
- const renderLnAccount = () => (
-
-
-
-
- Account
- Lightning
-
-
-
-
- Current Balance
- {formatCCB}
-
-
- Pending Balance
- {formatPCB}
-
-
-
-
- {showLn && showChain && (
-
- setState('send_ln')}
- >
-
-
- setState('receive_ln')}
- >
-
-
-
- )}
- {showLn && !showChain && (
- setState('none')}
- >
-
-
- )}
-
-
-
- );
-
- const renderChainAccount = () => (
-
-
-
-
- Account
- Bitcoin
-
-
-
-
- Current Balance
- {formatCB}
-
-
- Pending Balance
- {formatPB}
-
-
-
-
- {showLn && showChain && (
-
- setState('send_chain')}
- >
-
-
- setState('receive_chain')}
- >
-
-
-
- )}
- {!showLn && showChain && (
- setState('none')}
- >
-
-
- )}
-
-
-
- );
-
- return (
- <>
-
- Resume
-
-
-
-
- Account
- Total
-
-
-
- Current Balance
- {totalB}
-
-
- Pending Balance
- {totalPB}
-
-
-
-
-
-
- {getTitle()}
-
- {showLn && renderLnAccount()}
- {showLn && }
- {showChain && renderChainAccount()}
- {!showLn && showChain && }
- {renderContent()}
-
-
- >
- );
-};
diff --git a/client/src/views/home/account/createInvoice/CreateInvoice.tsx b/client/src/views/home/account/createInvoice/CreateInvoice.tsx
deleted file mode 100644
index 1b1aa3af..00000000
--- a/client/src/views/home/account/createInvoice/CreateInvoice.tsx
+++ /dev/null
@@ -1,124 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import {
- NoWrapTitle,
- ResponsiveLine,
-} from '../../../../components/generic/Styled';
-import { useMutation } from '@apollo/react-hooks';
-import { CREATE_INVOICE } from '../../../../graphql/mutation';
-import { Copy } from '../../../../components/generic/Icons';
-import styled from 'styled-components';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../../utils/error';
-import { SecureButton } from '../../../../components/buttons/secureButton/SecureButton';
-import QRCode from 'qrcode.react';
-import { ColorButton } from '../../../../components/buttons/colorButton/ColorButton';
-import CopyToClipboard from 'react-copy-to-clipboard';
-import { Input } from '../../../../components/input/Input';
-import { useSize } from '../../../../hooks/UseSize';
-import { mediaWidths, mediaDimensions } from 'styles/Themes';
-
-const Responsive = styled.div`
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- @media (${mediaWidths.mobile}) {
- flex-direction: column;
- }
-`;
-
-const WrapRequest = styled.div`
- overflow-wrap: break-word;
- word-wrap: break-word;
- -ms-word-break: break-all;
- word-break: break-word;
- margin: 24px;
- font-size: 14px;
-`;
-
-const QRWrapper = styled.div`
- width: 200px;
- margin: 16px;
-`;
-
-const Column = styled.div`
- width: 100%;
- height: 100%;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
-`;
-
-export const CreateInvoiceCard = ({ color }: { color: string }) => {
- const { width } = useSize();
- const [amount, setAmount] = useState(0);
- const [request, setRequest] = useState('');
-
- const [createInvoice, { data, loading }] = useMutation(CREATE_INVOICE, {
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- useEffect(() => {
- if (
- !loading &&
- data &&
- data.createInvoice &&
- data.createInvoice.request
- ) {
- setRequest(data.createInvoice.request);
- }
- }, [data, loading]);
-
- const renderQr = () => (
-
-
-
-
-
- {request}
- toast.success('Request Copied')}
- >
-
-
- Copy
-
-
-
-
- );
-
- const renderContent = () => (
-
- Amount to receive:
- setAmount(parseInt(e.target.value))}
- />
-
- Create Invoice
-
-
- );
-
- return request !== '' ? renderQr() : renderContent();
-};
diff --git a/client/src/views/home/account/pay/pay.tsx b/client/src/views/home/account/pay/pay.tsx
deleted file mode 100644
index 2d1b97a1..00000000
--- a/client/src/views/home/account/pay/pay.tsx
+++ /dev/null
@@ -1,123 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import {
- Sub4Title,
- ResponsiveLine,
- SubTitle,
- Separation,
- SingleLine,
-} from '../../../../components/generic/Styled';
-import { useMutation } from '@apollo/react-hooks';
-import { PAY_INVOICE, DECODE_REQUEST } from '../../../../graphql/mutation';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../../utils/error';
-import { SecureButton } from '../../../../components/buttons/secureButton/SecureButton';
-import { Input } from '../../../../components/input/Input';
-import { useSize } from '../../../../hooks/UseSize';
-import Modal from 'components/modal/ReactModal';
-import { useAccount } from 'context/AccountContext';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-import { renderLine, getNodeLink } from 'components/generic/Helpers';
-import { Price } from 'components/price/Price';
-import { mediaDimensions } from 'styles/Themes';
-
-export const PayCard = ({ setOpen }: { setOpen: () => void }) => {
- const { width } = useSize();
- const [request, setRequest] = useState('');
- const [modalOpen, setModalOpen] = useState(false);
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const [makePayment, { loading }] = useMutation(PAY_INVOICE, {
- onError: (error) => toast.error(getErrorContent(error)),
- onCompleted: () => {
- toast.success('Payment Sent');
- setRequest('');
- setModalOpen(false);
- setOpen();
- },
- });
-
- const [decode, { data, loading: decodeLoading }] = useMutation(
- DECODE_REQUEST,
- {
- onError: (error) => toast.error(getErrorContent(error)),
- },
- );
-
- useEffect(() => {
- if (data && data.decodeRequest) setModalOpen(true);
- }, [data, setModalOpen]);
-
- const renderData = () => {
- if (!data || !data.decodeRequest) return null;
-
- const {
- description,
- destination,
- expiresAt,
- tokens,
- } = data.decodeRequest;
-
- return (
- <>
-
- Pay Invoice
-
-
-
- {renderLine('Description:', description)}
- {renderLine('Destination:', getNodeLink(destination))}
- {renderLine('Expires At:', expiresAt)}
- >
- );
- };
-
- return (
- <>
-
- Invoice:
- setRequest(e.target.value)}
- />
- {
- decode({ variables: { request, auth } });
- }}
- >
- Send Sats
-
-
- setModalOpen(false)}>
- {renderData()}
-
- Send
-
-
- >
- );
-};
diff --git a/client/src/views/home/account/receiveOnChain/ReceiveOnChain.tsx b/client/src/views/home/account/receiveOnChain/ReceiveOnChain.tsx
deleted file mode 100644
index ed116b14..00000000
--- a/client/src/views/home/account/receiveOnChain/ReceiveOnChain.tsx
+++ /dev/null
@@ -1,113 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import {
- NoWrapTitle,
- DarkSubTitle,
- OverflowText,
- ResponsiveLine,
-} from '../../../../components/generic/Styled';
-import { useMutation } from '@apollo/react-hooks';
-import { CREATE_ADDRESS } from '../../../../graphql/mutation';
-import styled from 'styled-components';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../../utils/error';
-import { SecureButton } from '../../../../components/buttons/secureButton/SecureButton';
-import { useSize } from '../../../../hooks/UseSize';
-import CopyToClipboard from 'react-copy-to-clipboard';
-import { ColorButton } from '../../../../components/buttons/colorButton/ColorButton';
-import {
- MultiButton,
- SingleButton,
-} from 'components/buttons/multiButton/MultiButton';
-import { mediaDimensions } from 'styles/Themes';
-
-const ButtonRow = styled.div`
- width: auto;
- display: flex;
-`;
-
-const TitleWithSpacing = styled(NoWrapTitle)`
- margin-right: 10px;
-`;
-
-export const ReceiveOnChainCard = () => {
- const { width } = useSize();
-
- const [nested, setNested] = useState(false);
- const [received, setReceived] = useState(false);
-
- const [createAddress, { data, loading }] = useMutation(CREATE_ADDRESS, {
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- useEffect(() => {
- data && data.createAddress && setReceived(true);
- }, [data]);
-
- return (
- <>
- {data && data.createAddress ? (
- <>
-
- New Address:
- {data.createAddress}
- toast.success('Address Copied')}
- >
-
- Copy
-
-
-
- >
- ) : (
-
-
- Type of Address:
-
- {
- setNested(false);
- }}
- >
- P2WPKH
-
- {
- setNested(true);
- }}
- >
- NP2WPKH
-
-
-
-
- Create Address
-
-
- )}
- >
- );
-};
diff --git a/client/src/views/home/account/sendOnChain/SendOnChain.tsx b/client/src/views/home/account/sendOnChain/SendOnChain.tsx
deleted file mode 100644
index ccabf774..00000000
--- a/client/src/views/home/account/sendOnChain/SendOnChain.tsx
+++ /dev/null
@@ -1,261 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import {
- NoWrapTitle,
- DarkSubTitle,
- Separation,
- SingleLine,
- ResponsiveLine,
- SubTitle,
-} from '../../../../components/generic/Styled';
-import { useMutation } from '@apollo/react-hooks';
-import { PAY_ADDRESS } from '../../../../graphql/mutation';
-import styled from 'styled-components';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../../utils/error';
-import { useBitcoinState } from '../../../../context/BitcoinContext';
-import { SecureButton } from '../../../../components/buttons/secureButton/SecureButton';
-import { Input } from '../../../../components/input/Input';
-import { useSize } from '../../../../hooks/UseSize';
-import {
- MultiButton,
- SingleButton,
-} from 'components/buttons/multiButton/MultiButton';
-import { Price, getPrice } from 'components/price/Price';
-import { mediaWidths, mediaDimensions } from 'styles/Themes';
-import { useSettings } from 'context/SettingsContext';
-import Modal from 'components/modal/ReactModal';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-import { renderLine } from 'components/generic/Helpers';
-import { usePriceState } from 'context/PriceContext';
-
-const ResponsiveWrap = styled(SingleLine)`
- @media (${mediaWidths.mobile}) {
- flex-wrap: wrap;
- }
-`;
-
-const NoWrap = styled.div`
- margin-left: 8px;
- white-space: nowrap;
-`;
-
-const Margin = styled.div`
- margin-left: 8px;
- margin-right: 24px;
-`;
-
-export const SendOnChainCard = ({ setOpen }: { setOpen: () => void }) => {
- const { currency } = useSettings();
- const priceContext = usePriceState();
- const format = getPrice(currency, priceContext);
-
- const [modalOpen, setModalOpen] = useState(false);
-
- const { width } = useSize();
- const [address, setAddress] = useState('');
- const [tokens, setTokens] = useState(0);
- const [type, setType] = useState('none');
- const [amount, setAmount] = useState(0);
- const [sendAll, setSendAll] = useState(false);
-
- const canSend = address !== '' && (sendAll || tokens > 0) && amount > 0;
-
- const { fast, halfHour, hour } = useBitcoinState();
-
- const [payAddress, { loading }] = useMutation(PAY_ADDRESS, {
- onError: (error) => toast.error(getErrorContent(error)),
- onCompleted: () => {
- toast.success('Payment Sent!');
- setOpen();
- },
- refetchQueries: ['GetNodeInfo', 'GetBalances'],
- });
-
- useEffect(() => {
- if (type === 'none' && amount === 0) {
- setAmount(fast);
- }
- }, [type, amount, fast]);
-
- const feeFormat = (amount: number) => {
- if (type === 'fee' || type === 'none') {
- return format({ amount });
- } else {
- return `${amount} blocks`;
- }
- };
-
- const typeAmount =
- type === 'fee'
- ? { fee: amount }
- : type === 'target'
- ? { target: amount }
- : {};
-
- const tokenAmount = sendAll ? { sendAll } : { tokens };
-
- const renderButton = (
- onClick: () => void,
- text: string,
- selected: boolean,
- ) => (
-
- {text}
-
- );
-
- return (
- <>
-
- Send to Address:
- setAddress(e.target.value)}
- />
-
-
-
- Send All:
-
- {renderButton(() => setSendAll(true), 'Yes', sendAll)}
- {renderButton(() => setSendAll(false), 'No', !sendAll)}
-
-
- {!sendAll && (
-
-
- Amount:
-
-
-
-
-
-
-
-
- setTokens(parseInt(e.target.value))}
- />
-
- )}
-
-
- Fee:
-
- {renderButton(
- () => {
- setType('none');
- setAmount(fast);
- },
- 'Auto',
- type === 'none',
- )}
- {renderButton(
- () => {
- setType('fee');
- setAmount(0);
- },
- 'Fee (Sats/Byte)',
- type === 'fee',
- )}
- {renderButton(
- () => {
- setType('target');
- setAmount(0);
- },
- 'Target Confirmations',
- type === 'target',
- )}
-
-
-
-
- Fee Amount:
-
- {`(~${
- type === 'target'
- ? `${amount} blocks`
- : feeFormat(amount * 223)
- })`}
-
-
- {type !== 'none' && (
- <>
-
- setAmount(parseInt(e.target.value))
- }
- />
- >
- )}
- {type === 'none' && (
-
- {renderButton(
- () => setAmount(fast),
- `Fastest (${fast} sats)`,
- amount === fast,
- )}
- {halfHour !== fast &&
- renderButton(
- () => setAmount(halfHour),
- `Half Hour (${halfHour} sats)`,
- amount === halfHour,
- )}
- {renderButton(
- () => setAmount(hour),
- `Hour (${hour} sats)`,
- amount === hour,
- )}
-
- )}
-
-
- {
- setModalOpen(true);
- }}
- >
- Send
-
- setModalOpen(false)}>
-
- Send to Address
-
- {renderLine('Amount:', )}
- {renderLine('Address:', address)}
- {renderLine(
- 'Fee:',
- type === 'target'
- ? `${amount} Blocks`
- : `${amount} Sats/Byte`,
- )}
-
- Send To Address
-
-
- >
- );
-};
diff --git a/client/src/views/home/connect/Connect.tsx b/client/src/views/home/connect/Connect.tsx
deleted file mode 100644
index 7c3a2134..00000000
--- a/client/src/views/home/connect/Connect.tsx
+++ /dev/null
@@ -1,123 +0,0 @@
-import React from 'react';
-import { useQuery } from '@apollo/react-hooks';
-import { useAccount } from '../../../context/AccountContext';
-import { GET_CONNECT_INFO } from '../../../graphql/query';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import { LoadingCard } from '../../../components/loading/LoadingCard';
-import {
- CardWithTitle,
- CardTitle,
- SubTitle,
- Card,
- SingleLine,
- DarkSubTitle,
- ColorButton,
-} from '../../../components/generic/Styled';
-import { Radio, Copy } from '../../../components/generic/Icons';
-import styled from 'styled-components';
-import CopyToClipboard from 'react-copy-to-clipboard';
-import { mediaWidths } from 'styles/Themes';
-
-const Key = styled.div`
- overflow: hidden;
- text-overflow: ellipsis;
- max-width: 400px;
-
- overflow-wrap: break-word;
- word-wrap: break-word;
-
- -ms-word-break: break-all;
- word-break: break-all;
-`;
-
-const Responsive = styled(SingleLine)`
- @media (${mediaWidths.mobile}) {
- flex-direction: column;
- }
-`;
-
-const Tile = styled.div`
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- align-items: ${({ startTile }: { startTile?: boolean }) =>
- startTile ? 'flex-start' : 'flex-end'};
-
- @media (${mediaWidths.mobile}) {
- margin: 16px 0;
- }
-`;
-
-const TextPadding = styled.span`
- margin-left: 5px;
-`;
-
-const sectionColor = '#fa541c';
-
-export const ConnectCard = () => {
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data } = useQuery(GET_CONNECT_INFO, {
- variables: { auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- if (!data || loading) {
- return ;
- }
-
- const { public_key, uris } = data.getNodeInfo;
-
- const onionAddress = uris.find((uri: string) => uri.indexOf('onion') >= 0);
- const normalAddress = uris.find((uri: string) => uri.indexOf('onion') < 0);
-
- return (
-
-
- Connect
-
-
-
-
-
- Public Key
- {public_key}
-
-
- {onionAddress ? (
-
- toast.success('Onion Address Copied')
- }
- >
-
-
- Onion
-
-
- ) : null}
- {normalAddress ? (
-
- toast.success('Public Address Copied')
- }
- >
-
-
-
-
- ) : null}
-
-
-
-
- );
-};
diff --git a/client/src/views/home/networkInfo/NetworkInfo.tsx b/client/src/views/home/networkInfo/NetworkInfo.tsx
deleted file mode 100644
index 61a92c50..00000000
--- a/client/src/views/home/networkInfo/NetworkInfo.tsx
+++ /dev/null
@@ -1,157 +0,0 @@
-import React from 'react';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_NETWORK_INFO } from '../../../graphql/query';
-import {
- Card,
- CardWithTitle,
- SubTitle,
- SingleLine,
- Separation,
-} from '../../../components/generic/Styled';
-import { useAccount } from '../../../context/AccountContext';
-import styled from 'styled-components';
-import { unSelectedNavButton, mediaWidths } from '../../../styles/Themes';
-import { Globe, Cpu } from '../../../components/generic/Icons';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import { LoadingCard } from '../../../components/loading/LoadingCard';
-import { Price } from 'components/price/Price';
-
-const Tile = styled.div`
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- margin: 0 16px;
- align-items: ${({ start }: { start?: boolean }) =>
- start ? 'flex-start' : 'flex-end'};
-
- @media (${mediaWidths.mobile}) {
- margin: 0 0 8px;
- flex-direction: row;
- width: 100%;
- }
-`;
-
-const TileTitle = styled.div`
- font-size: 14px;
- color: ${unSelectedNavButton};
- margin-bottom: 10px;
-
- @media (${mediaWidths.mobile}) {
- margin-bottom: 0;
- }
-`;
-
-const Title = styled.div`
- display: flex;
- justify-content: flex-start;
- align-items: center;
- width: 120px;
-
- @media (${mediaWidths.mobile}) {
- justify-content: center;
- padding-bottom: 16px;
- width: 100%;
- }
-`;
-
-const ResponsiveLine = styled(SingleLine)`
- flex-wrap: wrap;
-`;
-
-const Padding = styled.span`
- margin-bottom: -2px;
- margin-right: 2px;
-`;
-
-export const NetworkInfo = () => {
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data } = useQuery(GET_NETWORK_INFO, {
- variables: { auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- if (loading || !data || !data.getNetworkInfo) {
- return ;
- }
-
- const {
- averageChannelSize,
- channelCount,
- maxChannelSize,
- medianChannelSize,
- minChannelSize,
- nodeCount,
- notRecentlyUpdatedPolicyCount,
- totalCapacity,
- } = data.getNetworkInfo;
-
- const capacity = ;
- const maxSize = ;
- const averageSize = ;
- const medianSize = ;
- const minSize = ;
-
- return (
-
- Network Info
-
-
-
-
-
-
- Global
-
-
- Capacity
- {capacity}
-
-
- Channels
- {channelCount}
-
-
- Nodes
- {nodeCount}
-
-
- Zombie Nodes
- {notRecentlyUpdatedPolicyCount}
-
-
-
-
-
-
-
-
- Channel Size
-
-
- Max
- {maxSize}
-
-
- Average
- {averageSize}
-
-
- Median
- {medianSize}
-
-
- Min
- {minSize}
-
-
-
-
- );
-};
diff --git a/client/src/views/home/quickActions/QuickActions.tsx b/client/src/views/home/quickActions/QuickActions.tsx
deleted file mode 100644
index 0ea89ef0..00000000
--- a/client/src/views/home/quickActions/QuickActions.tsx
+++ /dev/null
@@ -1,106 +0,0 @@
-import React, { useState } from 'react';
-import {
- CardWithTitle,
- SubTitle,
- Card,
- CardTitle,
- ColorButton,
-} from '../../../components/generic/Styled';
-import styled from 'styled-components';
-import { XSvg, Layers, GitBranch } from '../../../components/generic/Icons';
-import { unSelectedNavButton } from '../../../styles/Themes';
-import { DecodeCard } from './decode/Decode';
-import { OpenChannelCard } from './openChannel/OpenChannel';
-import { AdminSwitch } from '../../../components/adminSwitch/AdminSwitch';
-
-const sectionColor = '#69c0ff';
-
-const QuickCard = styled(Card)`
- height: 100px;
- width: 100px;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- margin-bottom: 25px;
- padding: 10px;
- margin-right: 10px;
- cursor: pointer;
-
- &:hover {
- border: 1px solid ${sectionColor};
- }
-`;
-
-const QuickTitle = styled.div`
- font-size: 14px;
- color: ${unSelectedNavButton};
- margin-top: 10px;
-`;
-
-const QuickRow = styled.div`
- display: flex;
-`;
-
-export const QuickActions = () => {
- const [openCard, setOpenCard] = useState('none');
-
- const getTitle = () => {
- switch (openCard) {
- case 'decode':
- return 'Decode a Lightning Request';
- case 'open_channel':
- return 'Open a Channel';
- default:
- return 'Quick Actions';
- }
- };
-
- const renderContent = () => {
- switch (openCard) {
- case 'decode':
- return ;
- case 'open_channel':
- return (
-
- );
- default:
- return (
-
-
- setOpenCard('open_channel')}
- >
-
- Open
-
-
- setOpenCard('decode')}>
-
- Decode
-
-
- );
- }
- };
-
- return (
-
-
- {getTitle()}
- {openCard !== 'none' && (
- setOpenCard('none')}
- color={sectionColor}
- >
-
-
- )}
-
- {renderContent()}
-
- );
-};
diff --git a/client/src/views/home/quickActions/decode/Decode.tsx b/client/src/views/home/quickActions/decode/Decode.tsx
deleted file mode 100644
index aabd3711..00000000
--- a/client/src/views/home/quickActions/decode/Decode.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-import React, { useState } from 'react';
-import {
- Card,
- Sub4Title,
- Separation,
- ResponsiveLine,
-} from '../../../../components/generic/Styled';
-import { renderLine } from '../../../../components/generic/Helpers';
-import { useMutation } from '@apollo/react-hooks';
-import { useAccount } from '../../../../context/AccountContext';
-import { DECODE_REQUEST } from '../../../../graphql/mutation';
-import { getErrorContent } from '../../../../utils/error';
-import { toast } from 'react-toastify';
-import { getNodeLink } from '../../../../components/generic/Helpers';
-import { ColorButton } from '../../../../components/buttons/colorButton/ColorButton';
-import { Input } from '../../../../components/input/Input';
-import { useSize } from '../../../../hooks/UseSize';
-import { Price } from 'components/price/Price';
-import { mediaDimensions } from 'styles/Themes';
-
-export const DecodeCard = ({ color }: { color: string }) => {
- const { width } = useSize();
- const [request, setRequest] = useState('');
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const [decode, { data, loading }] = useMutation(DECODE_REQUEST, {
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- const renderData = () => {
- if (!data || !data.decodeRequest) return null;
-
- const {
- chainAddress,
- cltvDelta,
- description,
- descriptionHash,
- destination,
- expiresAt,
- id,
- tokens,
- } = data.decodeRequest;
-
- return (
- <>
-
- {renderLine('Id:', id)}
- {renderLine('Destination:', getNodeLink(destination))}
- {renderLine('Description:', description)}
- {renderLine('Description Hash:', descriptionHash)}
- {renderLine('Chain Address:', chainAddress)}
- {renderLine('CLTV Delta:', cltvDelta)}
- {renderLine('Expires At:', expiresAt)}
- {renderLine('Amount:', )}
- >
- );
- };
-
- return (
-
-
- Request:
- setRequest(e.target.value)}
- />
- {
- setRequest('');
- decode({ variables: { request, auth } });
- }}
- >
- Decode
-
-
- {renderData()}
-
- );
-};
diff --git a/client/src/views/home/quickActions/openChannel/OpenChannel.tsx b/client/src/views/home/quickActions/openChannel/OpenChannel.tsx
deleted file mode 100644
index d6e7be69..00000000
--- a/client/src/views/home/quickActions/openChannel/OpenChannel.tsx
+++ /dev/null
@@ -1,198 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import {
- Card,
- SingleLine,
- Separation,
- DarkSubTitle,
- NoWrapTitle,
- ResponsiveLine,
-} from '../../../../components/generic/Styled';
-import { useMutation } from '@apollo/react-hooks';
-import { ChevronRight } from '../../../../components/generic/Icons';
-import { OPEN_CHANNEL } from '../../../../graphql/mutation';
-import { getErrorContent } from '../../../../utils/error';
-import { toast } from 'react-toastify';
-import { useBitcoinState } from '../../../../context/BitcoinContext';
-import styled from 'styled-components';
-import { SecureButton } from '../../../../components/buttons/secureButton/SecureButton';
-import { Input } from '../../../../components/input/Input';
-import { useSize } from '../../../../hooks/UseSize';
-import {
- SingleButton,
- MultiButton,
-} from 'components/buttons/multiButton/MultiButton';
-import { Price } from 'components/price/Price';
-import { mediaWidths, mediaDimensions } from 'styles/Themes';
-
-const ResponsiveWrap = styled(SingleLine)`
- @media (${mediaWidths.mobile}) {
- flex-wrap: wrap;
- }
-`;
-
-interface OpenChannelProps {
- color: string;
- setOpenCard: (card: string) => void;
-}
-
-export const OpenChannelCard = ({ color, setOpenCard }: OpenChannelProps) => {
- const { width } = useSize();
- const [size, setSize] = useState(0);
- const [fee, setFee] = useState(0);
- const [publicKey, setPublicKey] = useState('');
- const [privateChannel, setPrivateChannel] = useState(false);
- const [type, setType] = useState('none');
-
- const { fast, halfHour, hour } = useBitcoinState();
-
- const [openChannel] = useMutation(OPEN_CHANNEL, {
- onError: (error) => toast.error(getErrorContent(error)),
- onCompleted: () => {
- toast.success('Channel Opened');
- setOpenCard('none');
- },
- refetchQueries: ['GetChannels', 'GetPendingChannels'],
- });
-
- const canOpen = publicKey !== '' && size > 0 && fee > 0;
-
- useEffect(() => {
- if (type === 'none' && fee === 0) {
- setFee(fast);
- }
- }, [type, fee, fast]);
-
- const renderButton = (
- onClick: () => void,
- text: string,
- selected: boolean,
- ) => (
-
- {text}
-
- );
-
- return (
-
-
- Node Public Key:
- setPublicKey(e.target.value)}
- />
-
-
-
- Channel Size:
-
-
-
-
-
-
- setSize(parseInt(e.target.value))}
- />
-
-
-
- Private Channel:
-
- {renderButton(
- () => setPrivateChannel(true),
- 'Yes',
- privateChannel,
- )}
- {renderButton(
- () => setPrivateChannel(false),
- 'No',
- !privateChannel,
- )}
-
-
-
-
- Fee:
-
- {renderButton(
- () => {
- setType('none');
- setFee(fast);
- },
- 'Auto',
- type === 'none',
- )}
- {renderButton(
- () => setType('fee'),
- 'Fee (Sats/Byte)',
- type === 'fee',
- )}
-
-
-
-
- Fee Amount:
-
-
-
-
- {type !== 'none' && (
- setFee(parseInt(e.target.value))}
- />
- //
- )}
- {type === 'none' && (
-
- {renderButton(
- () => setFee(fast),
- `Fastest (${fast} sats)`,
- fee === fast,
- )}
- {halfHour !== fast &&
- renderButton(
- () => setFee(halfHour),
- `Half Hour (${halfHour} sats)`,
- fee === halfHour,
- )}
- {renderButton(
- () => setFee(hour),
- `Hour (${hour} sats)`,
- fee === hour,
- )}
-
- )}
-
-
-
- Open Channel
-
-
-
- );
-};
diff --git a/client/src/views/home/reports/flow/FlowPie.tsx b/client/src/views/home/reports/flow/FlowPie.tsx
deleted file mode 100644
index f0be44df..00000000
--- a/client/src/views/home/reports/flow/FlowPie.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import React from 'react';
-import { DarkSubTitle } from '../../../../components/generic/Styled';
-import { useSettings } from '../../../../context/SettingsContext';
-import { VictoryPie } from 'victory';
-import { chartAxisColor } from '../../../../styles/Themes';
-import { Row, Col, PieRow } from '../flow';
-import { getPrice } from 'components/price/Price';
-import { usePriceState } from 'context/PriceContext';
-
-interface Props {
- flowPie: { x: string; y: number }[];
- isType: string;
-}
-
-export const FlowPie = ({ flowPie, isType }: Props) => {
- const { theme, currency } = useSettings();
- const priceContext = usePriceState();
- const format = getPrice(currency, priceContext);
-
- return (
-
-
-
- {flowPie[0].x}
- {isType === 'tokens'
- ? format({ amount: flowPie[0].y })
- : flowPie[0].y}
-
-
- {flowPie[1].x}
- {isType === 'tokens'
- ? format({ amount: flowPie[1].y })
- : flowPie[1].y}
-
-
- ''}
- padAngle={3}
- innerRadius={50}
- labelRadius={55}
- data={flowPie}
- style={{
- labels: { fontSize: 24, fill: chartAxisColor[theme] },
- }}
- />
-
- );
-};
diff --git a/client/src/views/home/reports/flow/FlowReport.tsx b/client/src/views/home/reports/flow/FlowReport.tsx
deleted file mode 100644
index b5f03551..00000000
--- a/client/src/views/home/reports/flow/FlowReport.tsx
+++ /dev/null
@@ -1,159 +0,0 @@
-import React from 'react';
-import numeral from 'numeral';
-import { useSettings } from '../../../../context/SettingsContext';
-import {
- VictoryBar,
- VictoryChart,
- VictoryAxis,
- VictoryVoronoiContainer,
- VictoryGroup,
-} from 'victory';
-import {
- chartAxisColor,
- chartGridColor,
- // chartColors,
- flowBarColor,
- flowBarColor2,
-} from '../../../../styles/Themes';
-import { getPrice } from 'components/price/Price';
-import { usePriceState } from 'context/PriceContext';
-// import { WaterfallProps } from '.';
-
-// const beforeMap = {
-// amount: 'amountBefore',
-// tokens: 'tokensBefore',
-// };
-
-interface Props {
- isTime: string;
- isType: string;
- // isGraph: string;
- parsedData: {}[];
- parsedData2: {}[];
- // waterfall: WaterfallProps[];
-}
-
-export const FlowReport = ({
- isTime,
- isType,
- // isGraph,
- parsedData,
- parsedData2,
-}: // waterfall,
-Props) => {
- const { theme, currency } = useSettings();
- const priceContext = usePriceState();
- const format = getPrice(currency, priceContext);
-
- let domain = 24;
- let barWidth = 3;
- if (isTime === 'week') {
- domain = 7;
- barWidth = 15;
- } else if (isTime === 'month') {
- domain = 30;
- barWidth = 3;
- }
-
- const getLabelString = (value: number) => {
- if (isType === 'amount') {
- return numeral(value).format('0,0');
- }
- return format({ amount: value });
- };
-
- return (
- `${getLabelString(datum[isType])}`}
- />
- }
- >
- ''}
- style={{
- axis: { stroke: chartGridColor[theme] },
- }}
- />
-
- isType === 'tokens' ? format({ amount: a }) : a
- }
- />
-
-
-
- {/* {isGraph === 'graph' && (
- {
- console.log(data, index);
- return data[index][isType] -
- data[index][beforeMap[isType]] >
- 0
- ? chartColors.green
- : 'red';
- },
- width: barWidth,
- },
- labels: {
- fontSize: '12px',
- },
- }}
- />
- )} */}
-
-
- );
-};
diff --git a/client/src/views/home/reports/flow/Helpers.tsx b/client/src/views/home/reports/flow/Helpers.tsx
deleted file mode 100644
index e885537d..00000000
--- a/client/src/views/home/reports/flow/Helpers.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { PeriodProps, WaterfallProps } from './';
-
-export const getWaterfall = (
- invoices: PeriodProps[],
- payments: PeriodProps[],
-): WaterfallProps[] => {
- const initialInvoicePeriod = invoices[0]?.period;
- const initialPaymentPeriod = payments[0]?.period;
-
- const initialPeriod = Math.min(initialInvoicePeriod, initialPaymentPeriod);
-
- const lastInvoicePeriod = invoices[invoices.length - 1]?.period;
- const lastPaymentPeriod = payments[payments.length - 1]?.period;
-
- const lastPeriod = Math.max(lastInvoicePeriod, lastPaymentPeriod);
-
- let waterfall = [];
-
- let previousAmount = 0;
- let previousTokens = 0;
-
- for (let i = initialPeriod; i <= lastPeriod; i++) {
- const currentInvoice = invoices.find(
- (invoice) => invoice.period === i,
- ) ?? { period: undefined, amount: 0, tokens: 0 };
- const currentPayment = payments.find(
- (payment) => payment.period === i,
- ) ?? { period: undefined, amount: 0, tokens: 0 };
-
- const amountChange = currentInvoice.amount - currentPayment.amount;
- const tokensChange = currentInvoice.tokens - currentPayment.tokens;
-
- if (waterfall.length <= 0) {
- waterfall.push({
- period: i,
- amount: amountChange,
- tokens: tokensChange,
- amountBefore: 0,
- tokensBefore: 0,
- });
-
- previousAmount = amountChange;
- previousTokens = tokensChange;
- } else if (currentInvoice.period || currentPayment.period) {
- waterfall.push({
- period: i,
- amount: amountChange + previousAmount,
- tokens: tokensChange + previousTokens,
- amountBefore: previousAmount,
- tokensBefore: previousTokens,
- });
-
- previousAmount = amountChange + previousAmount;
- previousTokens = tokensChange + previousTokens;
- }
- }
-
- return waterfall;
-};
diff --git a/client/src/views/home/reports/flow/InvoicePie.tsx b/client/src/views/home/reports/flow/InvoicePie.tsx
deleted file mode 100644
index 42591ca2..00000000
--- a/client/src/views/home/reports/flow/InvoicePie.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import React from 'react';
-import { DarkSubTitle } from '../../../../components/generic/Styled';
-import { useSettings } from '../../../../context/SettingsContext';
-import { VictoryPie } from 'victory';
-import { chartAxisColor } from '../../../../styles/Themes';
-import { Row, Col, PieRow } from '../flow';
-
-interface Props {
- invoicePie: { x: string; y: string }[];
-}
-
-export const InvoicePie = ({ invoicePie }: Props) => {
- const { theme } = useSettings();
-
- return (
-
-
-
- Confirmed:
- {invoicePie[0].y}
-
-
- Unconfirmed:
- {invoicePie[1].y}
-
-
- ''}
- padAngle={3}
- innerRadius={50}
- labelRadius={55}
- data={invoicePie}
- style={{
- labels: { fontSize: 24, fill: chartAxisColor[theme] },
- }}
- />
-
- );
-};
diff --git a/client/src/views/home/reports/flow/index.tsx b/client/src/views/home/reports/flow/index.tsx
deleted file mode 100644
index 0285aba4..00000000
--- a/client/src/views/home/reports/flow/index.tsx
+++ /dev/null
@@ -1,221 +0,0 @@
-import React, { useState } from 'react';
-import styled, { css } from 'styled-components';
-import {
- CardWithTitle,
- SubTitle,
- Card,
- CardTitle,
- Sub4Title,
-} from '../../../../components/generic/Styled';
-import { ButtonRow } from '../forwardReport/Buttons';
-import { FlowReport } from './FlowReport';
-import { useAccount } from '../../../../context/AccountContext';
-import { GET_IN_OUT } from '../../../../graphql/query';
-import { useQuery } from '@apollo/react-hooks';
-import { FlowPie } from './FlowPie';
-import { InvoicePie } from './InvoicePie';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../../utils/error';
-import { LoadingCard } from '../../../../components/loading/LoadingCard';
-import { useSize } from 'hooks/UseSize';
-import { mediaDimensions } from 'styles/Themes';
-// import { getWaterfall } from './Helpers';
-
-export const ChannelRow = styled.div`
- font-size: 14px;
- display: flex;
- justify-content: space-between;
- align-items: center;
-`;
-
-export const Row = styled.div`
- display: flex;
-
- @media (max-width: 770px) {
- ${({ noWrap }: { noWrap?: boolean }) =>
- !noWrap &&
- css`
- flex-wrap: wrap;
- `};
- }
-`;
-
-export const PieRow = styled(Row)`
- justify-content: space-between;
-`;
-
-export const Col = styled.div`
- display: flex;
- flex-direction: column;
- justify-content: space-around;
- min-width: 200px;
-
- @media (max-width: 770px) {
- min-width: unset;
- width: 100%;
- padding-bottom: 16px;
- }
-`;
-
-const HalfCardWithTitle = styled(CardWithTitle)`
- width: 50%;
-`;
-
-export interface PeriodProps {
- period: number;
- amount: number;
- tokens: number;
-}
-
-export interface WaterfallProps {
- period: number;
- amount: number;
- tokens: number;
- amountBefore: number;
- tokensBefore: number;
-}
-
-const timeMap: { [key: string]: string } = {
- day: 'today',
- week: 'this week',
- month: 'this month',
-};
-
-export const FlowBox = () => {
- const { width } = useSize();
- const [isTime, setIsTime] = useState('month');
- const [isType, setIsType] = useState('amount');
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
- const { data, loading } = useQuery(GET_IN_OUT, {
- variables: { time: isTime, auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- const buttonProps = {
- isTime,
- isType,
- // isGraph,
- setIsTime,
- setIsType,
- // setIsGraph,
- };
-
- if (!data || loading) {
- return ;
- }
-
- const parsedData: PeriodProps[] = JSON.parse(data.getInOut.invoices);
- const parsedData2: PeriodProps[] = JSON.parse(data.getInOut.payments);
-
- // const waterfall: WaterfallProps[] = getWaterfall(parsedData, parsedData2);
-
- if (parsedData.length <= 0 && parsedData2.length <= 0) {
- return (
-
-
- Invoices and Payments Report
-
-
-
- {`Your node has not forwarded any payments ${timeMap[isTime]}.`}
-
-
- );
- }
-
- const reduce = (array: PeriodProps[]) =>
- array.reduce((p, c) => {
- return {
- tokens: p.tokens + c.tokens,
- period: 0,
- amount: p.amount + c.amount,
- };
- });
-
- const emptyArray = {
- tokens: 0,
- period: 0,
- amount: 0,
- };
-
- const totalInvoices: any =
- parsedData.length > 0 ? reduce(parsedData) : emptyArray;
- const totalPayments: any =
- parsedData2.length > 0 ? reduce(parsedData2) : emptyArray;
-
- const flowPie = [
- { x: 'Invoice', y: totalInvoices[isType] },
- { x: 'Payments', y: totalPayments[isType] },
- ];
-
- const invoicePie = [
- { x: 'Confirmed', y: data.getInOut.confirmedInvoices },
- { x: 'Unconfirmed', y: data.getInOut.unConfirmedInvoices },
- ];
-
- const props = {
- isTime,
- isType,
- parsedData,
- parsedData2,
- };
- const pieProps = { invoicePie };
- const flowProps = { flowPie, isType };
-
- return (
- <>
-
-
- Invoices and Payments Report
-
-
-
-
-
-
-
-
-
- Total
-
-
-
-
-
-
-
-
- Invoices
-
-
-
-
-
-
- >
- );
-};
diff --git a/client/src/views/home/reports/forwardReport/Buttons.tsx b/client/src/views/home/reports/forwardReport/Buttons.tsx
deleted file mode 100644
index fff08819..00000000
--- a/client/src/views/home/reports/forwardReport/Buttons.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import React from 'react';
-import { CardTitle, ColorButton } from '../../../../components/generic/Styled';
-
-interface ButtonProps {
- isTime: string;
- isType: string;
- // isGraph?: string;
- setIsTime: (text: string) => void;
- setIsType: (text: string) => void;
- // setIsGraph?: (text: string) => void;
-}
-
-const availableTimes = ['day', 'week', 'month'];
-const mappedTimes = ['Day', 'Week', 'Month'];
-const availableTypes = ['amount', 'tokens'];
-const mappedTypes = ['Amount', 'Value'];
-// const availableGraphs = ['waterfall', 'bar'];
-// const mappedGraphs = ['Waterfall', 'Bar'];
-const buttonBorder = `#FD5F00`;
-
-export const ButtonRow = ({
- isTime,
- setIsTime,
- isType,
- setIsType,
-}: // isGraph = 'bar',
-// setIsGraph,
-ButtonProps) => {
- const timeIndex = availableTimes.indexOf(isTime);
- const typeIndex = availableTypes.indexOf(isType);
- // const graphIndex = availableGraphs.indexOf(isGraph);
-
- const toggleButtons = (array: string[], index: number) => {
- if (index === array.length - 1) {
- return array[0];
- }
- return array[index + 1];
- };
-
- const buttonToShow = (
- setFn: (text: string) => void,
- array: string[],
- mapped: string[],
- index: number,
- ) => {
- return (
- setFn(toggleButtons(array, index))}
- >
- {mapped[index]}
-
- );
- };
-
- return (
-
- {buttonToShow(setIsTime, availableTimes, mappedTimes, timeIndex)}
- {buttonToShow(setIsType, availableTypes, mappedTypes, typeIndex)}
- {/* {setIsGraph &&
- buttonToShow(
- setIsGraph,
- availableGraphs,
- mappedGraphs,
- graphIndex,
- )} */}
-
- );
-};
diff --git a/client/src/views/home/reports/forwardReport/ForwardChannelReport.tsx b/client/src/views/home/reports/forwardReport/ForwardChannelReport.tsx
deleted file mode 100644
index f1425d15..00000000
--- a/client/src/views/home/reports/forwardReport/ForwardChannelReport.tsx
+++ /dev/null
@@ -1,234 +0,0 @@
-import React, { useState } from 'react';
-import {
- DarkSubTitle,
- ColorButton,
- SingleLine,
-} from '../../../../components/generic/Styled';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_FORWARD_CHANNELS_REPORT } from '../../../../graphql/query';
-import { useAccount } from '../../../../context/AccountContext';
-import { CardContent } from '../forwardReport';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../../utils/error';
-import {
- GitCommit,
- DownArrow,
- UpArrow,
-} from '../../../../components/generic/Icons';
-import styled from 'styled-components';
-import { LoadingCard } from '../../../../components/loading/LoadingCard';
-import { getPrice } from 'components/price/Price';
-import { useSettings } from 'context/SettingsContext';
-import { usePriceState } from 'context/PriceContext';
-
-const ChannelRow = styled.div`
- font-size: 14px;
- display: flex;
- justify-content: space-between;
- align-items: center;
-`;
-
-const ButtonRow = styled.div`
- display: flex;
- margin-bottom: 5px;
-`;
-
-const TriButton = styled(ColorButton)`
- margin: 0;
- border-radius: 0;
-`;
-
-const LeftButton = styled(TriButton)`
- border-bottom-left-radius: 5px;
- border-top-left-radius: 5px;
-`;
-
-const RightButton = styled(TriButton)`
- border-bottom-right-radius: 5px;
- border-top-right-radius: 5px;
-`;
-
-const TableLine = styled.div`
- width: 35%;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-`;
-
-const LastTableLine = styled(TableLine)`
- width: auto;
- text-align: right;
-`;
-
-interface Props {
- isTime: string;
- isType: string;
- color: string;
-}
-
-export const ForwardChannelsReport = ({ isTime, isType, color }: Props) => {
- const [type, setType] = useState('route');
-
- const { currency } = useSettings();
- const priceContext = usePriceState();
- const format = getPrice(currency, priceContext);
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { data, loading } = useQuery(GET_FORWARD_CHANNELS_REPORT, {
- variables: { time: isTime, order: isType, auth, type },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- if (!data || loading) {
- return ;
- }
-
- const report = data.getForwardChannelsReport;
-
- const fillArray = (array: {}[]) => {
- const lengthMissing = 10 - array.length;
- if (lengthMissing === 10) {
- return [];
- }
- if (lengthMissing > 0) {
- for (let i = 0; i < lengthMissing; i++) {
- array.push({
- aliasIn: '-',
- aliasOut: '-',
- alias: '-',
- name: '-',
- amount: '',
- fee: '',
- tokens: '',
- });
- }
- }
- return array;
- };
-
- const parsed = fillArray(JSON.parse(report));
-
- const getFormatString = (amount: number | string) => {
- if (typeof amount === 'string') return amount;
- if (isType !== 'amount') {
- return format({ amount: amount });
- }
- return amount;
- };
-
- const renderRoute = (parsed: {}[]) => {
- const routes = parsed.map((channel: any, index: number) => (
-
- {channel.aliasIn}
- {channel.aliasOut}
-
- {getFormatString(channel[isType])}
-
-
- ));
-
- return (
- <>
-
- Incoming
- Outgoing
-
-
- {routes}
- >
- );
- };
-
- const renderChannels = (parsed: {}[]) => {
- const channels = parsed.map((channel: any, index: number) => (
-
- {`${channel.alias}`}
- {`${channel.name}`}
-
- {getFormatString(channel[isType])}
-
-
- ));
-
- return (
- <>
-
- Alias
- ID
-
-
- {channels}
- >
- );
- };
-
- const renderContent = (parsed: {}[]) => {
- switch (type) {
- case 'route':
- return renderRoute(parsed);
- default:
- return renderChannels(parsed);
- }
- };
-
- const renderButtons = () => (
-
- setType('incoming')}
- >
-
-
- setType('route')}
- color={color}
- >
-
-
- setType('outgoing')}
- >
-
-
-
- );
-
- const renderTop = (title: string) => (
-
- {title}
- {renderButtons()}
-
- );
-
- const renderTitle = () => {
- switch (type) {
- case 'route':
- return renderTop('Routes');
- case 'incoming':
- return renderTop('Incoming');
- default:
- return renderTop('Outgoing');
- }
- };
-
- if (parsed.length <= 0) {
- return null;
- }
-
- return (
-
- {renderTitle()}
- {renderContent(parsed)}
-
- );
-};
diff --git a/client/src/views/home/reports/forwardReport/ForwardReport.tsx b/client/src/views/home/reports/forwardReport/ForwardReport.tsx
deleted file mode 100644
index a12a17a4..00000000
--- a/client/src/views/home/reports/forwardReport/ForwardReport.tsx
+++ /dev/null
@@ -1,151 +0,0 @@
-import React from 'react';
-import { Sub4Title } from '../../../../components/generic/Styled';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_FORWARD_REPORT } from '../../../../graphql/query';
-import numeral from 'numeral';
-import { useSettings } from '../../../../context/SettingsContext';
-import { useAccount } from '../../../../context/AccountContext';
-import {
- VictoryBar,
- VictoryChart,
- VictoryAxis,
- VictoryVoronoiContainer,
-} from 'victory';
-import {
- chartAxisColor,
- chartBarColor,
- chartGridColor,
-} from '../../../../styles/Themes';
-import { CardContent } from '../forwardReport';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../../utils/error';
-import { LoadingCard } from '../../../../components/loading/LoadingCard';
-import { getPrice } from 'components/price/Price';
-import { usePriceState } from 'context/PriceContext';
-
-interface Props {
- isTime: string;
- isType: string;
-}
-
-const timeMap: { [key: string]: string } = {
- day: 'today',
- week: 'this week',
- month: 'this month',
-};
-
-export const ForwardReport = ({ isTime, isType }: Props) => {
- const { theme, currency } = useSettings();
- const priceContext = usePriceState();
- const format = getPrice(currency, priceContext);
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { data, loading } = useQuery(GET_FORWARD_REPORT, {
- variables: { time: isTime, auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- if (!data || loading) {
- return ;
- }
-
- let domain = 24;
- let barWidth = 10;
- if (isTime === 'week') {
- domain = 7;
- barWidth = 15;
- } else if (isTime === 'month') {
- domain = 30;
- barWidth = 5;
- }
-
- const parsedData: {}[] = JSON.parse(data.getForwardReport);
-
- const getLabelString = (value: number) => {
- if (isType === 'amount') {
- return numeral(value).format('0,0');
- }
- return format({ amount: value });
- };
-
- const total = getLabelString(
- parsedData
- .map((x: any) => x[isType])
- .reduce((a: number, c: number) => a + c, 0),
- );
-
- const renderContent = () => {
- if (parsedData.length <= 0) {
- return (
- {`Your node has not forwarded any payments ${timeMap[isTime]}.`}
- );
- }
- return (
- <>
-
-
- `${getLabelString(datum[isType])}`
- }
- />
- }
- >
- ''}
- style={{
- axis: { stroke: chartGridColor[theme] },
- }}
- />
-
- isType === 'tokens'
- ? format({ amount: a, breakNumber: true })
- : a
- }
- />
-
-
-
- {`Total: ${total}`}
- >
- );
- };
-
- return {renderContent()} ;
-};
diff --git a/client/src/views/home/reports/forwardReport/index.tsx b/client/src/views/home/reports/forwardReport/index.tsx
deleted file mode 100644
index 89752dc8..00000000
--- a/client/src/views/home/reports/forwardReport/index.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import React, { useState } from 'react';
-import { ForwardReport } from './ForwardReport';
-import { ForwardChannelsReport } from './ForwardChannelReport';
-import styled from 'styled-components';
-import {
- CardWithTitle,
- SubTitle,
- Card,
- CardTitle,
-} from '../../../../components/generic/Styled';
-import { ButtonRow } from './Buttons';
-import { mediaWidths, mediaDimensions } from 'styles/Themes';
-import { useSize } from 'hooks/UseSize';
-
-export const CardContent = styled.div`
- height: 100%;
- display: flex;
- flex-flow: column;
- width: 50%;
- padding: 0 16px;
-
- @media (${mediaWidths.mobile}) {
- width: 100%;
- padding: 0 8px;
- }
-`;
-
-const Row = styled.div`
- display: flex;
-
- @media (${mediaWidths.mobile}) {
- flex-wrap: wrap;
- }
-`;
-
-const availableTimes = ['day', 'week', 'month'];
-const mappedTimes = ['Day', 'Week', 'Month'];
-const availableTypes = ['amount', 'fee', 'tokens'];
-const mappedTypes = ['Amount', 'Fees', 'Value'];
-const buttonBorder = `#6938f1`;
-
-export const ForwardBox = () => {
- const { width } = useSize();
- const [isTime, setIsTime] = useState('week');
- const [isType, setIsType] = useState('amount');
-
- const props = { isTime, isType, color: buttonBorder };
-
- const buttonProps = {
- isTime,
- isType,
- setIsTime,
- setIsType,
- availableTimes,
- availableTypes,
- mappedTimes,
- mappedTypes,
- buttonBorder,
- };
-
- return (
-
-
- Foward Report
-
-
-
-
-
-
-
-
-
- );
-};
diff --git a/client/src/views/home/reports/liquidReport/LiquidReport.tsx b/client/src/views/home/reports/liquidReport/LiquidReport.tsx
deleted file mode 100644
index a9637f90..00000000
--- a/client/src/views/home/reports/liquidReport/LiquidReport.tsx
+++ /dev/null
@@ -1,129 +0,0 @@
-import React from 'react';
-import {
- CardWithTitle,
- SubTitle,
- Card,
-} from '../../../../components/generic/Styled';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_LIQUID_REPORT } from '../../../../graphql/query';
-import { useAccount } from '../../../../context/AccountContext';
-import {
- VictoryChart,
- VictoryAxis,
- VictoryBar,
- VictoryVoronoiContainer,
- VictoryTooltip,
-} from 'victory';
-import { useSettings } from '../../../../context/SettingsContext';
-import {
- chartGridColor,
- chartAxisColor,
- liquidityBarColor,
- mediaDimensions,
-} from '../../../../styles/Themes';
-import { LoadingCard } from '../../../../components/loading/LoadingCard';
-import { getPrice } from 'components/price/Price';
-import { useSize } from 'hooks/UseSize';
-import { usePriceState } from 'context/PriceContext';
-
-export const LiquidReport = () => {
- const { width } = useSize();
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { theme, currency } = useSettings();
- const priceContext = usePriceState();
- const format = getPrice(currency, priceContext);
-
- const { data, loading } = useQuery(GET_LIQUID_REPORT, {
- variables: { auth },
- });
-
- if (loading) {
- return ;
- }
-
- if (!data || !data.getChannelReport) {
- return null;
- }
-
- const { local, remote, maxIn, maxOut } = data.getChannelReport;
- const liquidity = [
- { x: 'Max Outgoing', y: maxOut },
- { x: 'Max Incoming', y: maxIn },
- { x: 'Local Balance', y: local },
- { x: 'Remote Balance', y: remote },
- ];
-
- return (
-
- Liquidity Report
-
-
- `${format({ amount: datum.y })}`
- }
- labelComponent={
-
- }
- />
- }
- >
-
- `${format({ amount: a })}`}
- />
-
-
-
-
- );
-};
diff --git a/client/src/views/notFound/NotFound.tsx b/client/src/views/notFound/NotFound.tsx
deleted file mode 100644
index 00583151..00000000
--- a/client/src/views/notFound/NotFound.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import React from 'react';
-import { Card } from '../../components/generic/Styled';
-
-export const NotFound = () => {
- return Not Found ;
-};
diff --git a/client/src/views/other/ContactSection.tsx b/client/src/views/other/ContactSection.tsx
deleted file mode 100644
index e21c8d06..00000000
--- a/client/src/views/other/ContactSection.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import React from 'react';
-import { Section } from 'components/section/Section';
-import { fontColors, homeBackgroundColor } from 'styles/Themes';
-import { Send, GithubIcon, MailIcon } from 'components/generic/Icons';
-import {
- Center,
- Question,
- SectionTitle,
- DetailCard,
- DetailLine,
- SmallText,
- IconMargin,
- IconTitle,
-} from './OtherViews.styled';
-
-export const ContactSection = () => (
-
-
-
- Need to contact us?
-
-
-
-
-
-
-
-
-
- Telegram
-
-
-
- Write to me on Telegram @apotdevin. Usually a quick
- response.
-
-
-
-
-
-
-
-
- Github
-
-
-
- See the code, open issues or contribute on github.
-
-
-
-
-
-
-
-
- Email
-
-
-
- Write us an email at thunderhub@protonmail.com
-
-
-
-
-);
diff --git a/client/src/views/other/OtherViews.styled.ts b/client/src/views/other/OtherViews.styled.ts
deleted file mode 100644
index 9a8f8dc3..00000000
--- a/client/src/views/other/OtherViews.styled.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-import styled from 'styled-components';
-import { Card, CardProps } from 'components/generic/Styled';
-import { fontColors, mediaWidths, textColor } from 'styles/Themes';
-
-export const Center = styled.div`
- display: flex;
- justify-content: center;
- align-items: center;
- text-align: center;
-`;
-
-export const Title = styled.h1`
- width: 100%;
- text-align: center;
- color: ${({ textColor }: { textColor?: string }) =>
- textColor ? textColor : fontColors.grey3};
- font-size: 40px;
-
- @media (${mediaWidths.mobile}) {
- font-size: 24px;
- }
-`;
-
-export const SectionTitle = styled.h2`
- color: ${({ textColor }: { textColor?: string }) =>
- textColor ? textColor : fontColors.blue};
- font-size: 24px;
-`;
-
-export const Subtitle = styled.h2`
- color: ${({ textColor }: { textColor?: string }) =>
- textColor ? textColor : fontColors.blue};
- font-size: 16px;
- max-width: 600px;
-`;
-
-export const Question = styled.h3`
- color: ${fontColors.grey8};
-`;
-
-export const Text = styled.p`
- color: ${fontColors.grey6};
- text-align: justify;
-`;
-
-export const SmallText = styled(Text)`
- color: ${textColor};
- text-align: start;
-`;
-
-export const BulletPoint = styled(Text)`
- margin-left: 32px;
-`;
-
-export const DetailCard = styled(Card)`
- margin-bottom: 0;
- margin: 8px 16px;
- z-index: 1;
- flex: 1 0 30%;
-
- @media (${mediaWidths.mobile}) {
- flex: 1 0 100%;
- }
-`;
-
-export const DetailLine = styled.div`
- margin: 0 -16px;
- display: flex;
- justify-content: center;
- align-items: center;
- flex-wrap: wrap;
- @media (${mediaWidths.mobile}) {
- margin: 0;
- }
-`;
-
-export const IconTitle = styled.div`
- display: flex;
- color: ${textColor};
-`;
-
-export const IconMargin = styled.span`
- margin-right: 4px;
-`;
diff --git a/client/src/views/other/faq/FaqView.tsx b/client/src/views/other/faq/FaqView.tsx
deleted file mode 100644
index 881bb6e0..00000000
--- a/client/src/views/other/faq/FaqView.tsx
+++ /dev/null
@@ -1,131 +0,0 @@
-import React from 'react';
-import { Section } from 'components/section/Section';
-import { themeColors } from 'styles/Themes';
-import { Title, Center, Subtitle, Question, Text } from '../OtherViews.styled';
-import { ContactSection } from '../ContactSection';
-import styled from 'styled-components';
-
-const FaqTitle = styled(Title)`
- margin-bottom: 0px;
-`;
-
-export const FaqView = () => {
- return (
- <>
-
- FAQ: Answers to Common Questions
-
-
- Learn about ThunderHub by reading these frequently asked
- questions.
-
-
-
-
- What is ThunderHub?
-
- ThunderHub is a LND node manager that you can open in
- any browser and on any device.
-
-
-
- How much does it cost?
-
- No cost , ThunderHub is open-source so no need to
- spend any precious sats here.
-
-
-
- What is the value of ThunderHub?
-
- ThunderHub brings a full lightning node manager
- directly to your device without the need of installing
- plugins, extensions or apps, having specific browsers or
- operating systems and is completely open-source.
-
-
- ThunderHub provides a simple and easy to use manager
- without needing to give us any private information.
- Everything is stored directly in your browser and sensitive
- information (like your admin macaroon) are AES-256 encrypted
- with a password only you know.
-
-
- The code is public and available for anyone to audit.
-
-
-
- Is ThunderHub safe to use?
-
- ThunderHub is open-source and available for anyone to audit.
-
- This still doesn't mean it's completely bullet proof
- against attackers.
-
-
-
- If you connect using your admin macaroon, it is
- AES-256 encrypted, password protected and
- stored only in your browser.
- The password is only known by you and you need to unlock
- your account everytime you want to perform an admin only
- change such as managing channels or sending and receiving
- bitcoin or lightning payments.
-
-
- The ThunderHub server uses your credentials to connect to
- your node but they are never stored outside of your browser.
- Still, this involves a certain degree of trust you must be
- aware of.
-
-
- If you want a more secure alternative, you can connect using
- a view-only macaroon and use ThunderHub only for monitoring
- your node.
-
-
-
- What happens if I forget my password?
-
- The password is only known by you and is used to unlock an
- encrypted macaroon stored only on your browser making it
- impossible for us to help you with this situation.
-
-
- The fix is simple. Delete that account on ThunderHub
- (Don't worry, this doesn't delete anything or affect in any
- way your node) and connect again with your desired
- macaroons.
-
-
-
- Am I being tracked in anyway?
-
- We do not track anything from our users and
- store no information on our servers.
- Should it be needed in the future, we will notify users and
- ask for explicit consent before hand.
-
-
-
-
- Can I use ThunderHub without having my own Lightning Node?
-
-
- ThunderHub provides full lightning node management which is
- only possible when you are the owner of the lightning node
- to which it is connecting. So in short,
- no you cannot use ThunderHub without having your
- own node.
-
-
- Nowadays with the posibility of using pruned bitcoin nodes
- (Bitcoin nodes which only have a section of the Bitcoin
- blockchain), you can get a lightning node up and running in
- the cloud for under €15/month.
-
-
-
- >
- );
-};
diff --git a/client/src/views/other/privacy/PrivacyView.tsx b/client/src/views/other/privacy/PrivacyView.tsx
deleted file mode 100644
index 228cf1ed..00000000
--- a/client/src/views/other/privacy/PrivacyView.tsx
+++ /dev/null
@@ -1,172 +0,0 @@
-import React from 'react';
-import { Section } from 'components/section/Section';
-import { themeColors, fontColors } from 'styles/Themes';
-import { Title, Question, Text, BulletPoint } from '../OtherViews.styled';
-import { ContactSection } from '../ContactSection';
-import { Link } from 'components/link/Link';
-
-export const PrivacyView = () => {
- const props = { color: fontColors.blue2, underline: fontColors.blue2 };
-
- const renderLinks = (terms: string, privacy: string) => (
- <>
-
- Privacy Policy
- {' '}
- and{' '}
-
- Terms of Service
-
- >
- );
-
- return (
- <>
-
-
- Last Updated: February 12, 2020
-
-
-
- ThunderHub takes your privacy very seriously, and as a
- general rule, will never collect unnecessary data from you
- without your explicit consent. However, through using it,
- you will end up providing us with some sensitive
- information, so we want to be explicit about that.
-
-
- This Privacy Policy describes our policies and procedures
- regarding our collection and use of your information in
- connection with your access and use of{' '}
-
- https://thunderhub.io
- {' '}
- (the "Site"). By using this service, you acknowledge and
- agree to this Privacy Policy.
-
-
- The terms "us," "we," or "our" refer to ThunderHub. The
- terms "you", "your", or "user" refer to those accessing our
- site.
-
-
-
- Collection, Storage, and Use of Information
-
- ThunderHub's site is designed to collect as little
- information as possible. The following outlines what is (and
- is not) collected, and how it's handled. What we do collect
- from users is stored either locally on the user's device, or
- using browser storage APIs that keep inaccessible to us
- without user action. Sensitive information such as
- authentication credentials are AES-256 encrypted and stored
- using a password known only to the user.
-
-
- Node Credentials - In order to communicate with your
- Lightning node, we ask for sensitive information to do so.
- This information is stored using your browser's own storage
- APIs, and is encrypted using a password only known to the
- user. This information is used by the server to connect to
- your node but is never recorded outside of the user's
- browser storage.
-
-
- Error Reporting / Usage Statistics - No information
- is recorded. If information must be recorded further on, it
- will be with explicit user consent from the user and efforts
- will be taken to keep the information anonymous and private.
-
-
- Personal information - Information such as your name,
- IP address, email address, or browsing activity are never
- collected without explicit consent. While there is no plan
- to ever ask for permission to passively collect it, some
- interactions such as support requests or bug reports may
- optionally ask for it.
-
-
-
- Third Parties
-
- The following is a list of third parties who may obtain user
- information through use of the Site and App, as well as
- links to their respective privacy policies. While we aim to
- only leverage third parties that we find to be
- privacy-friendly, and try to keep them as opt-in as
- possible, we are not liable for any privacy violations as a
- result of the user's interaction with third party services.
- Any services found to be exploiting our user's information
- will be removed as quickly as possible.
-
-
- Hosting - The following services are used for the
- hosting and distrubtion of our site and application. Your
- information is subject to their policies when interacting
- with them.
-
-
- Github - Github's{' '}
- {renderLinks(
- 'https://help.github.com/en/articles/github-privacy-statement',
- 'https://help.github.com/en/articles/github-terms-of-service',
- )}
-
-
- AWS - AWS's{' '}
- {renderLinks(
- 'https://aws.amazon.com/privacy/',
- 'https://aws.amazon.com/service-terms/',
- )}
-
-
- APIs - For information that your node can't get
- alone, we link to or use APIs in our application that
- leverage the following services. Your information is subject
- to their policies when interacting with them.
-
-
- Earn.com's Bitcoin Fee API - Earn.com's{' '}
- {renderLinks(
- 'https://earn.com/privacy/',
- 'https://earn.com/terms-of-use/',
- )}
-
-
- Blockchain Explorer and Price API - Blockchain's{' '}
- {renderLinks(
- 'https://www.blockchain.com/legal/privacy',
- 'https://www.blockchain.com/legal/terms',
- )}
-
-
-
- Law Enforcement Purposes
-
- If required by a subpoena or court order, we will share
- information to law enforcement agencies in order to comply
- with legal requirements. We will make reasonable efforts to
- notify any subjects of such informational disclosure as is
- permitted by law.
-
-
-
- Amendments
-
- We may alter this Privacy Policy at its discretion at any
- time for any or no reason. Any changes will include a
- corresponding “Last updated” date shown at the top of this
- page and such changes will go in effect immediately.
- Prominent notice of any changes may be posted on our site,
- in our application, or on social media. Such notice is not
- guaranteed and you should check for updates regularly. The
- latest version of the Privacy Policy will be considered as
- superseding any previous version unless otherwise noted.
-
-
-
- >
- );
-};
diff --git a/client/src/views/other/terms/TermsView.tsx b/client/src/views/other/terms/TermsView.tsx
deleted file mode 100644
index a855e5ab..00000000
--- a/client/src/views/other/terms/TermsView.tsx
+++ /dev/null
@@ -1,93 +0,0 @@
-import React from 'react';
-import { Section } from 'components/section/Section';
-import { themeColors, fontColors } from 'styles/Themes';
-import { Title, Question, Text } from '../OtherViews.styled';
-import { ContactSection } from '../ContactSection';
-import { Link } from 'components/link/Link';
-
-export const TermsView = () => {
- const props = { color: fontColors.blue2, underline: fontColors.blue2 };
-
- return (
- <>
-
-
- Last Updated: January 28, 2020
-
-
- 1. Terms
-
- ThunderHub ("us", "we", or "our") provides the website{' '}
-
- https://thunderhub.io
- {' '}
- (the "Site"). Your use of or access to the site is subject
- to the following Terms of Service (the "Agreement").
-
-
-
- 2. Disclaimer
-
- We are not responsible for any loss. LND, the ThunderHub
- website, and some of the underlying Javascript libraries we
- use are under active development. While every release is
- tested, there is always the possibility something unexpected
- happens that causes your funds to be lost. Please do not
- invest more than you are willing to lose. Please be careful.
-
-
-
- 3. Limitations
-
- In no event shall ThunderHub be liable for any damages
- (including, without limitation, damages for loss of data or
- profit, or due to business interruption) arising out of the
- use or inability to use the materials on our website, even
- if we or an authorized representative of ours has been
- notified orally or in writing of the possibility of such
- damage. Because some jurisdictions do not allow limitations
- on implied warranties, or limitations of liability for
- consequential or incidental damages, these limitations may
- not apply to you.
-
-
-
- 4. Accuracy of Materials
-
- The materials appearing on our website could include
- technical, typographical, or photographic errors. We do not
- warrant that any of the material on the website is accurate,
- complete or current. We may make changes to the material
- contained on the website at any time without notice. However
- we do not make any commitment to update the material.
-
-
-
- 5. Modifications
-
- We may revise these terms of service for the website at any
- time without notice. By using this website you are agreeing
- to be bound by the then current version of these terms of
- service.
-
-
-
- 6. Privacy Policy
-
- Our Privacy Policy describes the way we do and do not
- collect, use, store, and disclose your personal information,
- and is hereby incorporated by this reference into these
- Terms. You agree to the collection, use, storage, and
- disclosure of your data in accordance with our{' '}
-
- Privacy Policy
-
- .
-
-
-
- >
- );
-};
diff --git a/client/src/views/peers/AddPeer.tsx b/client/src/views/peers/AddPeer.tsx
deleted file mode 100644
index 8c2710a6..00000000
--- a/client/src/views/peers/AddPeer.tsx
+++ /dev/null
@@ -1,127 +0,0 @@
-import React, { useState } from 'react';
-import {
- CardWithTitle,
- SubTitle,
- Card,
- SingleLine,
- DarkSubTitle,
- NoWrapTitle,
- Separation,
- ResponsiveLine,
- Sub4Title,
-} from 'components/generic/Styled';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-import { XSvg } from 'components/generic/Icons';
-import {
- MultiButton,
- SingleButton,
-} from 'components/buttons/multiButton/MultiButton';
-import { Input } from 'components/input/Input';
-import { mediaDimensions } from 'styles/Themes';
-import { useSize } from 'hooks/UseSize';
-import { useMutation } from '@apollo/react-hooks';
-import { toast } from 'react-toastify';
-import { getErrorContent } from 'utils/error';
-import { ADD_PEER } from 'graphql/mutation';
-import { SecureButton } from 'components/buttons/secureButton/SecureButton';
-
-export const AddPeer = () => {
- const [isAdding, setIsAdding] = useState(false);
- const [temp, setTemp] = useState(false);
- const [key, setKey] = useState('');
- const [socket, setSocket] = useState('');
-
- const { width } = useSize();
-
- const [addPeer, { loading }] = useMutation(ADD_PEER, {
- onError: (error) => toast.error(getErrorContent(error)),
- onCompleted: () => {
- toast.success('Peer Added');
- setIsAdding(false);
- setTemp(false);
- setKey('');
- setSocket('');
- },
- refetchQueries: ['GetPeers'],
- });
-
- const renderButton = (
- onClick: () => void,
- text: string,
- selected: boolean,
- ) => (
-
- {text}
-
- );
-
- const renderAdding = () => (
- <>
-
-
-
- Peer Public Key:
-
- setKey(e.target.value)}
- />
-
-
-
- Peer Socket:
-
- setSocket(e.target.value)}
- />
-
-
- Is Temporary:
-
- {renderButton(() => setTemp(true), 'Yes', temp)}
- {renderButton(() => setTemp(false), 'No', !temp)}
-
-
-
- Add
-
- >
- );
-
- return (
-
- Peer Management
-
-
- Add Peer
- setIsAdding((prev) => !prev)}
- >
- {isAdding ? : 'Add'}
-
-
- {isAdding && renderAdding()}
-
-
- );
-};
diff --git a/client/src/views/peers/PeersCard.tsx b/client/src/views/peers/PeersCard.tsx
deleted file mode 100644
index 41b189b1..00000000
--- a/client/src/views/peers/PeersCard.tsx
+++ /dev/null
@@ -1,201 +0,0 @@
-import React, { useState } from 'react';
-import {
- SubCard,
- Separation,
- Sub4Title,
- ResponsiveLine,
- ResponsiveSingle,
- ResponsiveCol,
- RightAlign,
-} from 'components/generic/Styled';
-import {
- renderLine,
- getDateDif,
- getFormatDate,
- getTooltipType,
- getNodeLink,
-} from 'components/generic/Helpers';
-import styled from 'styled-components';
-import { DownArrow, UpArrow } from 'components/generic/Icons';
-import {
- Progress,
- ProgressBar,
- NodeTitle,
- MainInfo,
-} from 'views/channels/Channels.style';
-import { getPercent } from 'helpers/Helpers';
-import { useSettings } from 'context/SettingsContext';
-import ReactTooltip from 'react-tooltip';
-import { usePriceState } from 'context/PriceContext';
-import { getPrice } from 'components/price/Price';
-import { AdminSwitch } from 'components/adminSwitch/AdminSwitch';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-import Modal from 'components/modal/ReactModal';
-import { RemovePeerModal } from 'components/modal/removePeer/RemovePeer';
-
-const IconPadding = styled.div`
- margin-left: 16px;
- margin-right: 8px;
-`;
-
-const getSymbol = (status: boolean) => {
- return status ? : ;
-};
-
-interface PeerProps {
- peer: any;
- index: number;
- setIndexOpen: (index: number) => void;
- indexOpen: number;
-}
-
-export const PeersCard = ({
- peer,
- index,
- setIndexOpen,
- indexOpen,
-}: PeerProps) => {
- const [modalOpen, setModalOpen] = useState(false);
-
- const { theme, currency } = useSettings();
- const priceContext = usePriceState();
-
- const format = getPrice(currency, priceContext);
- const tooltipType = getTooltipType(theme);
-
- const {
- bytes_received,
- bytes_sent,
- is_inbound,
- is_sync_peer,
- ping_time,
- public_key,
- socket,
- tokens_received,
- tokens_sent,
- partner_node_info = {},
- } = peer;
-
- const formatReceived = format({ amount: tokens_received });
- const formatSent = format({ amount: tokens_sent });
-
- const {
- alias,
- capacity,
- channel_count,
- color,
- updated_at,
- } = partner_node_info;
-
- const handleClick = () => {
- if (indexOpen === index) {
- setIndexOpen(0);
- } else {
- setIndexOpen(index);
- }
- };
-
- const renderDetails = () => {
- return (
- <>
-
- {renderLine('Tokens Received:', formatReceived)}
- {renderLine('Tokens Sent:', formatSent)}
- {renderLine('bytes Received:', bytes_received)}
- {renderLine('bytes Sent:', bytes_sent)}
- {renderLine('Public Key:', getNodeLink(public_key))}
- {renderLine('Socket:', socket)}
- {renderLine('Is Inbound:', is_inbound.toString())}
- {renderLine('Is Sync Peer:', is_sync_peer.toString())}
- {renderLine('Ping Time:', ping_time)}
- Partner Node Info
- {renderLine('Node Capacity:', capacity)}
- {renderLine('Channel Count:', channel_count)}
- {renderLine(
- 'Last Update:',
- `${getDateDif(updated_at)} ago (${getFormatDate(
- updated_at,
- )})`,
- )}
-
-
-
- setModalOpen(true)}
- >
- Remove Peer
-
-
-
- >
- );
- };
-
- return (
-
- handleClick()}>
-
-
- {alias ? alias : 'Unknown'}
-
-
- {getSymbol(is_inbound)}
-
-
-
-
-
-
-
-
-
-
-
- {index === indexOpen && renderDetails()}
-
- {`bytes Received: ${bytes_received}`}
- {`bytes Sent: ${bytes_sent}`}
-
-
- {`Tokens Received: ${formatReceived}`}
- {`Tokens Sent: ${formatSent}`}
-
- setModalOpen(false)}>
-
-
-
- );
-};
diff --git a/client/src/views/peers/PeersList.tsx b/client/src/views/peers/PeersList.tsx
deleted file mode 100644
index e7b57f54..00000000
--- a/client/src/views/peers/PeersList.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import React, { useState } from 'react';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_PEERS } from 'graphql/query';
-import { useAccount } from 'context/AccountContext';
-import { CardWithTitle, SubTitle, Card } from 'components/generic/Styled';
-import { PeersCard } from './PeersCard';
-import { LoadingCard } from 'components/loading/LoadingCard';
-import { AddPeer } from './AddPeer';
-
-export const PeersList = () => {
- const [indexOpen, setIndexOpen] = useState(0);
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data } = useQuery(GET_PEERS, {
- variables: { auth },
- });
-
- if (loading || !data || !data.getPeers) {
- return ;
- }
-
- return (
- <>
-
-
- Peers
-
- {data.getPeers.map((peer: any, index: number) => (
-
- ))}
-
-
- >
- );
-};
diff --git a/client/src/views/settings/Account.tsx b/client/src/views/settings/Account.tsx
deleted file mode 100644
index bd0b04d6..00000000
--- a/client/src/views/settings/Account.tsx
+++ /dev/null
@@ -1,134 +0,0 @@
-import React, { useState } from 'react';
-import {
- CardWithTitle,
- SubTitle,
- Card,
- SingleLine,
- Sub4Title,
- Separation,
-} from '../../components/generic/Styled';
-import { SettingsLine } from './Settings';
-import { useAccount } from '../../context/AccountContext';
-import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
-import { XSvg } from '../../components/generic/Icons';
-import {
- MultiButton,
- SingleButton,
-} from 'components/buttons/multiButton/MultiButton';
-import { useHistory } from 'react-router-dom';
-import { useConnectionDispatch } from 'context/ConnectionContext';
-import { useStatusDispatch } from 'context/StatusContext';
-import { Auth } from 'components/auth';
-
-export const AccountSettings = () => {
- const [status, setStatus] = useState('none');
-
- const { push } = useHistory();
- const { id, changeAccount, accounts } = useAccount();
-
- const dispatch = useConnectionDispatch();
- const dispatchState = useStatusDispatch();
-
- const [isType, setIsType] = useState('login');
- const [willAdd, setWillAdd] = useState(false);
-
- const renderButtons = () => (
-
- Connection Type:
-
- setIsType('login')}
- >
- Connection Details
-
- setIsType('connect')}
- >
- LndConnect Url
-
- setIsType('btcpay')}
- >
- BTCPayServer Info
-
- setIsType('qrcode')}
- >
- QR Code
-
-
-
- );
-
- const renderChangeAccount = () => {
- if (accounts.length <= 1) {
- return null;
- }
-
- return (
-
- Change Account
-
- {accounts.map(({ name: accountName, id: accountId }) => {
- return (
- {
- if (accountId !== id) {
- dispatch({ type: 'disconnected' });
- dispatchState({
- type: 'disconnected',
- });
- changeAccount(accountId);
- push('/');
- }
- }}
- >
- {accountName}
-
- );
- })}
-
-
- );
- };
-
- return (
-
- Account
-
- {renderChangeAccount()}
-
- Add Account
- {
- if (willAdd) {
- setIsType('login');
- }
- setWillAdd((prev) => !prev);
- }}
- >
- {willAdd ? : 'Add New Account'}
-
-
- {willAdd && (
- <>
-
- {status === 'none' && renderButtons()}
- setStatus('none')}
- />
- >
- )}
-
-
- );
-};
diff --git a/client/src/views/settings/Current.tsx b/client/src/views/settings/Current.tsx
deleted file mode 100644
index 20495fa1..00000000
--- a/client/src/views/settings/Current.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import React from 'react';
-import {
- CardWithTitle,
- SubTitle,
- Card,
- Sub4Title,
-} from '../../components/generic/Styled';
-import styled from 'styled-components';
-import { chartLinkColor, colorButtonBackground } from '../../styles/Themes';
-import { useAccount } from '../../context/AccountContext';
-
-const CurrentField = styled.textarea`
- width: 100%;
- color: ${chartLinkColor};
- margin: 10px 0;
- font-size: 14px;
- padding: 5px 10px;
- border-radius: 5px;
- background-color: ${colorButtonBackground};
- border: none;
- word-wrap: break-word;
- resize: none;
-`;
-
-export const CurrentSettings = () => {
- const { name, host, admin, viewOnly, cert } = useAccount();
-
- const renderField = (
- title: string,
- field: string | null,
- rows?: number,
- ) => {
- if (!field) return null;
-
- return (
- <>
- {title}
-
- >
- );
- };
-
- return (
-
- Current Account:
-
- {renderField('Name:', name, 2)}
- {renderField('Host:', host, 2)}
- {renderField('AES-256 Encrypted Admin Macaroon:', admin)}
- {renderField('Read-only Macaroon:', viewOnly)}
- {renderField('Certificate:', cert)}
-
-
- );
-};
diff --git a/client/src/views/settings/Danger.tsx b/client/src/views/settings/Danger.tsx
deleted file mode 100644
index d2b83c1f..00000000
--- a/client/src/views/settings/Danger.tsx
+++ /dev/null
@@ -1,179 +0,0 @@
-import React from 'react';
-import {
- Card,
- CardWithTitle,
- SubTitle,
- SingleLine,
- SimpleButton,
- Sub4Title,
-} from '../../components/generic/Styled';
-import { deleteStorage } from '../../utils/storage';
-import { useAccount } from '../../context/AccountContext';
-import styled from 'styled-components';
-import { deleteAccountPermissions } from '../../utils/storage';
-import { textColor, fontColors } from '../../styles/Themes';
-import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
-import {
- MultiButton,
- SingleButton,
-} from 'components/buttons/multiButton/MultiButton';
-import { AlertCircle } from 'components/generic/Icons';
-import { useConnectionDispatch } from 'context/ConnectionContext';
-import { useStatusDispatch } from 'context/StatusContext';
-import { useHistory } from 'react-router-dom';
-
-export const ButtonRow = styled.div`
- width: auto;
- display: flex;
-`;
-
-const OutlineCard = styled(Card)`
- &:hover {
- border: 1px solid red;
- }
-`;
-
-export const SettingsLine = styled(SingleLine)`
- margin: 10px 0;
-`;
-
-export const SettingsButton = styled(SimpleButton)`
- padding: 10px;
-
- &:hover {
- border: 1px solid ${textColor};
- }
-`;
-
-export const CheckboxText = styled.div`
- font-size: 13px;
- color: ${fontColors.grey7};
- text-align: justify;
-`;
-
-export const StyledContainer = styled.div`
- display: flex;
- justify-content: center;
- align-items: center;
- margin-top: 16px;
-`;
-
-export const FixedWidth = styled.div`
- height: 18px;
- width: 18px;
- margin: 0px;
- margin-right: 8px;
-`;
-
-export const DangerView = () => {
- const {
- deleteAccount,
- refreshAccount,
- changeAccount,
- accounts,
- admin,
- viewOnly,
- id,
- } = useAccount();
-
- const dispatch = useConnectionDispatch();
- const dispatchState = useStatusDispatch();
-
- const { push } = useHistory();
-
- const renderButton = () => {
- if (accounts.length > 1) {
- return (
-
- {accounts.map(({ name: accountName, id: accountId }) => {
- return (
- {
- deleteAccount(accountId);
- }}
- >
- {accountName}
-
- );
- })}
-
- );
- } else if (accounts.length === 1) {
- return (
- {
- deleteAccount(accounts[0].id);
- }}
- >
- {accounts[0].name}
-
- );
- }
- return null;
- };
-
- const handleDelete = (admin?: boolean) => {
- deleteAccountPermissions(id, accounts, admin);
- dispatch({ type: 'disconnected' });
- dispatchState({
- type: 'disconnected',
- });
- changeAccount(id);
- push('/');
- };
-
- const renderSwitch = () => {
- return (
-
- Change Permissions
-
- handleDelete()}>
- View-Only
-
- handleDelete(true)}>
- Admin-Only
-
-
-
- );
- };
-
- return (
-
- Danger Zone
-
- {admin && viewOnly && renderSwitch()}
-
- Delete Account:
- {renderButton()}
-
-
- Delete all Accounts and Settings:
-
- {
- deleteStorage();
- refreshAccount();
- }}
- >
- Delete All
-
-
-
-
-
-
-
-
- This does not affect in any way your node, only the
- ThunderHub accounts saved in this browser.
-
-
-
-
- );
-};
diff --git a/client/src/views/settings/Interface.tsx b/client/src/views/settings/Interface.tsx
deleted file mode 100644
index 8f68212c..00000000
--- a/client/src/views/settings/Interface.tsx
+++ /dev/null
@@ -1,95 +0,0 @@
-import React from 'react';
-import {
- CardWithTitle,
- SubTitle,
- Card,
- Sub4Title,
-} from '../../components/generic/Styled';
-import { SettingsLine } from './Settings';
-import { useSettings } from '../../context/SettingsContext';
-
-import {
- MultiButton,
- SingleButton,
-} from 'components/buttons/multiButton/MultiButton';
-import { useAccount } from 'context/AccountContext';
-
-export const InterfaceSettings = () => {
- const {
- theme,
- currency,
- nodeInfo,
- setSettings,
- refreshSettings,
- } = useSettings();
-
- const { accounts } = useAccount();
-
- const viewOnlyAccounts = accounts.filter(
- (account) => account.viewOnly !== '',
- );
-
- const renderButton = (
- title: string,
- value: string,
- type: string,
- current: string,
- ) => (
- {
- localStorage.setItem(type, value);
- type === 'theme' && setSettings({ theme: value });
- type === 'currency' && setSettings({ currency: value });
- type === 'nodeInfo' &&
- setSettings({ nodeInfo: value === 'true' ? true : false });
- refreshSettings();
- }}
- >
- {title}
-
- );
-
- return (
-
- Interface
-
-
- Theme:
-
- {renderButton('Light', 'light', 'theme', theme)}
- {renderButton('Dark', 'dark', 'theme', theme)}
-
-
- {viewOnlyAccounts.length > 1 && (
-
- Show all accounts on homepage:
-
- {renderButton(
- 'Yes',
- 'true',
- 'nodeInfo',
- `${nodeInfo}`,
- )}
- {renderButton(
- 'No',
- 'false',
- 'nodeInfo',
- `${nodeInfo}`,
- )}
-
-
- )}
-
- Currency:
-
- {renderButton('Bitcoin', 'btc', 'currency', currency)}
- {renderButton('Satoshis', 'sat', 'currency', currency)}
- {renderButton('Euro', 'EUR', 'currency', currency)}
- {renderButton('US Dollar', 'USD', 'currency', currency)}
-
-
-
-
- );
-};
diff --git a/client/src/views/settings/Sync.tsx b/client/src/views/settings/Sync.tsx
deleted file mode 100644
index 3ab3a97a..00000000
--- a/client/src/views/settings/Sync.tsx
+++ /dev/null
@@ -1,172 +0,0 @@
-import React, { useState } from 'react';
-import {
- CardWithTitle,
- SubTitle,
- Card,
- Sub4Title,
- Separation,
-} from '../../components/generic/Styled';
-import { SettingsLine } from './Settings';
-import {
- MultiButton,
- SingleButton,
-} from 'components/buttons/multiButton/MultiButton';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-import { XSvg } from 'components/generic/Icons';
-import { useAccount } from 'context/AccountContext';
-import QRCode from 'qrcode.react';
-import styled from 'styled-components';
-import { useInterval } from 'hooks/UseInterval';
-import Modal from 'components/modal/ReactModal';
-import { themeColors } from 'styles/Themes';
-
-const QRWrapper = styled.div`
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- width: 100%;
-`;
-
-export const SyncSettings = () => {
- const { name, host, admin, viewOnly, cert } = useAccount();
-
- const getValue = () => {
- switch (true) {
- case !!viewOnly:
- return 'viewOnly';
- default:
- return 'adminOnly';
- }
- };
-
- const [state, setState] = useState('none');
- const [type, setType] = useState(getValue());
-
- const getObject = () => {
- switch (type) {
- case 'complete':
- return { viewOnly, admin };
- case 'adminOnly':
- return { admin };
- default:
- return { viewOnly };
- }
- };
-
- const renderSettings = () => (
- <>
-
-
- Sync Type
-
- {viewOnly && (
- setType('viewOnly')}
- >
- View-Only
-
- )}
- {admin && (
- setType('adminOnly')}
- >
- Admin-Only
-
- )}
- {viewOnly && admin && (
- setType('complete')}
- >
- Admin and View
-
- )}
-
-
-
- setState('finish')}
- >
- Generate QR
-
-
- >
- );
-
- const renderQRCode = () => {
- const connection = JSON.stringify({
- name,
- host,
- cert,
- ...getObject(),
- });
-
- return (
- setState('none')}
- >
-
-
- Scan with ThunderHub
-
-
-
-
- );
- };
-
- return (
-
- Sync
-
-
- Sync account to another device
-
- setState((prev: string) =>
- prev !== 'none' ? 'none' : 'generate',
- )
- }
- >
- {state !== 'none' ? : 'Sync'}
-
-
- {state === 'generate' && renderSettings()}
- {state === 'finish' && renderQRCode()}
-
-
- );
-};
-
-const QRLoop = ({ connection }: { connection: string }) => {
- const textArray = connection.match(/.{1,100}/g) ?? [];
- const length = textArray.length;
-
- const objectArray = textArray.map((value: string, index: number) =>
- JSON.stringify({
- index: index,
- total: length,
- auth: value,
- }),
- );
-
- const [count, setCount] = useState(0);
-
- useInterval(() => {
- setCount((prev: number) => {
- if (prev < length - 1) {
- return prev + 1;
- }
- return 0;
- });
- }, 1000);
-
- return ;
-};
diff --git a/client/src/views/stateViews/StateCards.tsx b/client/src/views/stateViews/StateCards.tsx
deleted file mode 100644
index e37fa32a..00000000
--- a/client/src/views/stateViews/StateCards.tsx
+++ /dev/null
@@ -1,68 +0,0 @@
-import React from 'react';
-import ScaleLoader from 'react-spinners/ScaleLoader';
-import styled from 'styled-components';
-import { SubTitle, Card, SingleLine } from 'components/generic/Styled';
-import { themeColors, mediaWidths, fontColors } from 'styles/Themes';
-import { Link } from '../../components/link/Link';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-import { SectionTitle } from 'views/other/OtherViews.styled';
-
-const FullDiv = styled.div`
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- align-items: center;
- width: 100%;
- height: 100%;
- min-height: 400px;
-
- @media (${mediaWidths.mobile}) {
- justify-content: center;
- }
-`;
-
-export const LoadingView = () => (
-
- Connecting to your Node
-
-
-);
-
-const StyledTitle = styled(SectionTitle)`
- text-align: center;
- margin: 16px 0 32px;
-`;
-
-const StyledSubtitle = styled(SubTitle)`
- text-align: center;
- margin: 48px 0 4px;
-`;
-
-const StyledParagraph = styled.p`
- color: ${fontColors.grey7};
- text-align: center;
- margin: 4px 0;
-`;
-
-export const ErrorView = () => (
-
- Connection Error
-
- ThunderHub was unable to connect to your node.
-
-
- Please make sure it's online and that the connection details are
- correct.
-
-
- If the problem persists please contact us.
-
-
-
-
- Go to settings
-
-
-
-
-);
diff --git a/client/src/views/tools/Tools.styled.tsx b/client/src/views/tools/Tools.styled.tsx
deleted file mode 100644
index 06e1689c..00000000
--- a/client/src/views/tools/Tools.styled.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import styled from 'styled-components';
-
-export const NoWrap = styled.div`
- margin-right: 16px;
- white-space: nowrap;
-`;
-
-export const WrapRequest = styled.div`
- overflow-wrap: break-word;
- word-wrap: break-word;
- -ms-word-break: break-all;
- word-break: break-word;
- margin: 24px;
- font-size: 14px;
-`;
-
-export const Column = styled.div`
- width: 100%;
- height: 100%;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
-`;
diff --git a/client/src/views/tools/backups/Backups.tsx b/client/src/views/tools/backups/Backups.tsx
deleted file mode 100644
index ba0a3133..00000000
--- a/client/src/views/tools/backups/Backups.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import React from 'react';
-import {
- CardWithTitle,
- CardTitle,
- SubTitle,
- Card,
- Separation,
- Sub4Title,
- ResponsiveLine,
- DarkSubTitle,
-} from '../../../components/generic/Styled';
-import { DownloadBackups } from './DownloadBackups';
-import { VerifyBackups } from './VerifyBackups';
-import { RecoverFunds } from './RecoverFunds';
-import { AdminSwitch } from '../../../components/adminSwitch/AdminSwitch';
-import { getDateDif, getFormatDate } from 'components/generic/Helpers';
-
-export const BackupsView = () => {
- const lastDate = localStorage.getItem('lastBackup');
-
- const getDate = () => {
- if (lastDate) {
- return `${getDateDif(lastDate)} ago (${getFormatDate(lastDate)})`;
- }
- return 'Has not been backed up!';
- };
-
- return (
-
-
- Backups
-
-
-
- Last Backup Date:
- {getDate()}
-
-
-
-
-
-
-
-
-
- );
-};
diff --git a/client/src/views/tools/backups/DownloadBackups.tsx b/client/src/views/tools/backups/DownloadBackups.tsx
deleted file mode 100644
index 50e52e4b..00000000
--- a/client/src/views/tools/backups/DownloadBackups.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import React, { useEffect } from 'react';
-import { DarkSubTitle, SingleLine } from '../../../components/generic/Styled';
-import { saveToPc } from '../../../helpers/Helpers';
-import { useLazyQuery } from '@apollo/react-hooks';
-import { GET_BACKUPS } from '../../../graphql/query';
-import { useAccount } from '../../../context/AccountContext';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
-
-export const DownloadBackups = () => {
- const { name, host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const [getBackups, { data, loading }] = useLazyQuery(GET_BACKUPS, {
- variables: { auth },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- useEffect(() => {
- if (!loading && data && data.getBackups) {
- saveToPc(data.getBackups, `Backup-${name}`);
- localStorage.setItem('lastBackup', new Date().toString());
- toast.success('Downloaded');
- }
- }, [data, loading, name]);
-
- return (
-
- Backup All Channels
- getBackups()}
- loading={loading}
- >
- Download
-
-
- );
-};
diff --git a/client/src/views/tools/backups/RecoverFunds.tsx b/client/src/views/tools/backups/RecoverFunds.tsx
deleted file mode 100644
index e7bcbcd2..00000000
--- a/client/src/views/tools/backups/RecoverFunds.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { useLazyQuery } from '@apollo/react-hooks';
-import { RECOVER_FUNDS } from '../../../graphql/query';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import { SingleLine, DarkSubTitle } from '../../../components/generic/Styled';
-import { XSvg } from '../../../components/generic/Icons';
-import { SecureButton } from '../../../components/buttons/secureButton/SecureButton';
-import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
-import { Input } from 'components/input/Input';
-import { NoWrap } from '../Tools.styled';
-
-export const RecoverFunds = () => {
- const [backupString, setBackupString] = useState('');
- const [isPasting, setIsPasting] = useState(false);
-
- const [recoverFunds, { data, loading }] = useLazyQuery(RECOVER_FUNDS, {
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- useEffect(() => {
- if (!loading && data && data.recoverFunds) {
- toast.success(`Recovery Succesfull`);
- }
- }, [data, loading]);
-
- const renderInput = () => (
- <>
-
-
- Backup String:
-
- setBackupString(e.target.value)} />
-
-
- Recover
-
- >
- );
-
- return (
- <>
-
- Recover Funds from Channels
- setIsPasting((prev) => !prev)}
- >
- {isPasting ? : 'Recover'}
-
-
- {isPasting && renderInput()}
- >
- );
-};
diff --git a/client/src/views/tools/backups/VerifyBackups.tsx b/client/src/views/tools/backups/VerifyBackups.tsx
deleted file mode 100644
index 9c274e23..00000000
--- a/client/src/views/tools/backups/VerifyBackups.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { useAccount } from '../../../context/AccountContext';
-import { useLazyQuery } from '@apollo/react-hooks';
-import { VERIFY_BACKUPS } from '../../../graphql/query';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import {
- SingleLine,
- DarkSubTitle,
- Separation,
-} from '../../../components/generic/Styled';
-import { XSvg } from '../../../components/generic/Icons';
-import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
-import { Input } from 'components/input/Input';
-import { NoWrap } from '../Tools.styled';
-
-export const VerifyBackups = () => {
- const [backupString, setBackupString] = useState('');
- const [isPasting, setIsPasting] = useState(false);
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const [verifyBackup, { data, loading }] = useLazyQuery(VERIFY_BACKUPS, {
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- useEffect(() => {
- if (!loading && data && data.verifyBackups) {
- toast.success(`Valid Backup String`);
- }
- if (!loading && data && !data.verifyBackups) {
- toast.error(`Invalid Backup String`);
- }
- }, [data, loading]);
-
- const renderInput = () => (
- <>
-
-
- Backup String:
-
- setBackupString(e.target.value)}
- />
-
-
- verifyBackup({
- variables: { auth, backup: backupString },
- })
- }
- >
- Verify
-
-
- >
- );
-
- return (
- <>
-
- Verify Channels Backup
- setIsPasting((prev) => !prev)}
- >
- {isPasting ? : 'Verify'}
-
-
- {isPasting && renderInput()}
- >
- );
-};
diff --git a/client/src/views/tools/index.tsx b/client/src/views/tools/index.tsx
deleted file mode 100644
index 77474968..00000000
--- a/client/src/views/tools/index.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import React from 'react';
-import { BackupsView } from './backups/Backups';
-import { MessagesView } from './messages/Messages';
-
-export const ToolsView = () => (
- <>
-
-
- >
-);
diff --git a/client/src/views/tools/messages/Messages.tsx b/client/src/views/tools/messages/Messages.tsx
deleted file mode 100644
index 65c93a07..00000000
--- a/client/src/views/tools/messages/Messages.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import React from 'react';
-import { CardWithTitle, SubTitle, Card } from 'components/generic/Styled';
-import styled from 'styled-components';
-import { SignMessage } from './SignMessage';
-import { VerifyMessage } from './VerifyMessage';
-
-export const NoWrap = styled.div`
- margin-right: 16px;
- white-space: nowrap;
-`;
-
-export const MessagesView = () => {
- return (
-
- Messages
-
-
-
-
-
- );
-};
diff --git a/client/src/views/tools/messages/SignMessage.tsx b/client/src/views/tools/messages/SignMessage.tsx
deleted file mode 100644
index f4f318e5..00000000
--- a/client/src/views/tools/messages/SignMessage.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { useAccount } from '../../../context/AccountContext';
-import { useLazyQuery } from '@apollo/react-hooks';
-import { SIGN_MESSAGE } from '../../../graphql/query';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import {
- SingleLine,
- DarkSubTitle,
- Separation,
-} from '../../../components/generic/Styled';
-import { XSvg, Copy } from '../../../components/generic/Icons';
-import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
-import { NoWrap } from './Messages';
-import { Input } from 'components/input/Input';
-import { SecureButton } from 'components/buttons/secureButton/SecureButton';
-import CopyToClipboard from 'react-copy-to-clipboard';
-import { AdminSwitch } from 'components/adminSwitch/AdminSwitch';
-import { Column, WrapRequest } from '../Tools.styled';
-
-export const SignMessage = () => {
- const [message, setMessage] = useState('');
- const [isPasting, setIsPasting] = useState(false);
- const [signed, setSigned] = useState('');
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const [signMessage, { data, loading }] = useLazyQuery(SIGN_MESSAGE, {
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- useEffect(() => {
- if (!loading && data && data.signMessage) {
- setSigned(data.signMessage);
- }
- }, [loading, data]);
-
- const renderInput = () => (
- <>
-
-
- Message:
-
- setMessage(e.target.value)}
- />
-
-
- Sign
-
-
- >
- );
-
- const renderMessage = () => (
-
- {signed}
- toast.success('Signature Copied')}
- >
-
-
- Copy
-
-
-
- );
-
- return (
-
-
- Sign Message
- setIsPasting((prev) => !prev)}
- >
- {isPasting ? : 'Sign'}
-
-
- {isPasting && renderInput()}
- {signed !== '' && isPasting && renderMessage()}
-
- );
-};
diff --git a/client/src/views/tools/messages/VerifyMessage.tsx b/client/src/views/tools/messages/VerifyMessage.tsx
deleted file mode 100644
index 7aaebb2a..00000000
--- a/client/src/views/tools/messages/VerifyMessage.tsx
+++ /dev/null
@@ -1,109 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { useAccount } from '../../../context/AccountContext';
-import { useLazyQuery } from '@apollo/react-hooks';
-import { VERIFY_MESSAGE } from '../../../graphql/query';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../../utils/error';
-import {
- SingleLine,
- DarkSubTitle,
- Separation,
-} from '../../../components/generic/Styled';
-import { XSvg, Copy } from '../../../components/generic/Icons';
-import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
-import { NoWrap } from './Messages';
-import { Input } from 'components/input/Input';
-import CopyToClipboard from 'react-copy-to-clipboard';
-import { Column, WrapRequest } from '../Tools.styled';
-
-export const VerifyMessage = () => {
- const [message, setMessage] = useState('');
- const [signature, setSignature] = useState('');
- const [isPasting, setIsPasting] = useState(false);
- const [signedBy, setSignedBy] = useState('');
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const [signMessage, { data, loading }] = useLazyQuery(VERIFY_MESSAGE, {
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- useEffect(() => {
- if (!loading && data && data.verifyMessage) {
- setSignedBy(data.verifyMessage);
- }
- }, [loading, data]);
-
- const renderInput = () => (
- <>
-
-
- Message:
-
- setMessage(e.target.value)}
- />
-
-
-
- Signature:
-
- setSignature(e.target.value)}
- />
-
-
- signMessage({ variables: { auth, message, signature } })
- }
- >
- Verify
-
-
- >
- );
-
- const renderMessage = () => (
-
- {signedBy}
- toast.success('Public Node Key Copied')}
- >
-
-
- Copy
-
-
-
- );
-
- return (
- <>
-
- Verify Message
- setIsPasting((prev) => !prev)}
- >
- {isPasting ? : 'Verify'}
-
-
- {isPasting && renderInput()}
- {signedBy !== '' && isPasting && renderMessage()}
- >
- );
-};
diff --git a/client/src/views/trader/MethodBoxes.tsx b/client/src/views/trader/MethodBoxes.tsx
deleted file mode 100644
index f97d5554..00000000
--- a/client/src/views/trader/MethodBoxes.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import React from 'react';
-import styled from 'styled-components';
-import { themeColors, subCardColor } from 'styles/Themes';
-
-interface MethodProps {
- id: string;
- payment_method_type: string;
- payment_method_name: string;
-}
-
-interface MethodBoxesProps {
- methods: MethodProps[] | undefined;
-}
-
-const StyledMethodBoxes = styled.div`
- width: 100%;
- position: relative;
- right: -16px;
- top: -26px;
- display: flex;
- justify-content: flex-end;
- margin: 0 0 -24px 0;
- flex-wrap: wrap;
- overflow: hidden;
- height: 24px;
-`;
-
-const StyledMethod = styled.div`
- font-size: 12px;
- margin: 0 0 0 8px;
- border: 1px solid ${themeColors.blue2};
- border-radius: 4px;
- padding: 2px 4px;
- background: ${subCardColor};
- white-space: nowrap;
-`;
-
-export const MethodBoxes = ({ methods }: MethodBoxesProps) => {
- if (!methods) return null;
-
- return (
-
- {methods.map((method) => (
- {method.payment_method_name}
- ))}
-
- );
-};
diff --git a/client/src/views/trader/Modal/FilterModal.tsx b/client/src/views/trader/Modal/FilterModal.tsx
deleted file mode 100644
index abcaaf03..00000000
--- a/client/src/views/trader/Modal/FilterModal.tsx
+++ /dev/null
@@ -1,163 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { SubTitle } from 'components/generic/Styled';
-import { SortOptions, NewOptions } from '../OfferConfigs';
-import { FilterType } from '../OfferFilters';
-import { useQuery } from '@apollo/react-hooks';
-import {
- GET_HODL_COUNTRIES,
- GET_HODL_CURRENCIES,
-} from 'graphql/hodlhodl/query';
-import { themeColors } from 'styles/Themes';
-import ScaleLoader from 'react-spinners/ScaleLoader';
-import { FilteredList } from './FilteredList';
-import { OptionsLoading } from '../OfferCard.styled';
-import { toast } from 'react-toastify';
-
-interface FilterProps {
- type: string;
- dispatch: any;
- final?: {};
- newOptions?: FilterType[];
- setModalType: (type: string) => void;
-}
-
-interface CountryType {
- code: string;
- name: string;
- native_name: string;
- currency_code: string;
- currency_name: string;
-}
-
-interface CurrencyType {
- code: string;
- name: string;
- type: string;
-}
-
-export const FilterModal = ({
- type,
- dispatch,
- final,
- newOptions,
- setModalType,
-}: FilterProps) => {
- const searchable: boolean = final?.['searchable'] || false;
- const skipable: boolean = type !== 'Country' && type !== 'Currency';
-
- const [selected, setSelected] = useState<{} | undefined>();
-
- const [options, setOptions] = useState(newOptions ?? []);
- const [title, setTitle] = useState(final?.['title'] || '');
-
- const query = type === 'Country' ? GET_HODL_COUNTRIES : GET_HODL_CURRENCIES;
-
- const { loading, data, error } = useQuery(query, {
- skip: skipable,
- onError: () => toast.error('Error Loading Options. Please try again.'),
- });
-
- useEffect(() => {
- switch (type) {
- case 'sort':
- setTitle('Sort Offers by:');
- setOptions(SortOptions);
- break;
- case 'new':
- setTitle('Add New Filter:');
- setOptions(NewOptions);
- break;
- default:
- break;
- }
- }, [type]);
-
- useEffect(() => {
- if (!loading && data && data.getCountries) {
- const countryOptions = data.getCountries.map(
- (country: CountryType) => {
- const { code, name, native_name } = country;
- return { name: code, title: `${name} (${native_name})` };
- },
- );
-
- setOptions(countryOptions);
- }
- if (!loading && data && data.getCurrencies) {
- const filtered = data.getCurrencies.filter(
- (currency: CurrencyType) => currency.type === 'fiat',
- );
-
- const currencyOptions = filtered.map((currency: CurrencyType) => {
- const { code, name } = currency;
- return { name: code, title: name };
- });
-
- setOptions(currencyOptions);
- }
- }, [data, loading]);
-
- const handleClick = (name: string, option?: {}) => () => {
- if (final) {
- dispatch({
- type: 'addFilter',
- newItem: { [final['name']]: name },
- });
- setModalType('none');
- }
- switch (type) {
- case 'sort':
- if (name === 'none') {
- dispatch({
- type: 'removeSort',
- });
- } else {
- dispatch({
- type: 'addSort',
- newItem: { by: name },
- });
- }
- setModalType('none');
- break;
- case 'new':
- setSelected(option);
- break;
- default:
- break;
- }
- };
-
- if (error) {
- return null;
- }
-
- if (selected) {
- return (
- <>
-
- >
- );
- }
-
- return (
- <>
- {title}
-
-
- {loading && (
-
- )}
-
- >
- );
-};
diff --git a/client/src/views/trader/Modal/FilteredList.tsx b/client/src/views/trader/Modal/FilteredList.tsx
deleted file mode 100644
index eabf1135..00000000
--- a/client/src/views/trader/Modal/FilteredList.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-import { OfferModalBox } from '../OfferCard.styled';
-import { Input } from 'components/input/Input';
-import { Sub4Title } from 'components/generic/Styled';
-
-interface FilteredProps {
- searchable: boolean;
- options: any;
- handleClick: any;
-}
-
-export const FilteredList = ({
- searchable,
- options,
- handleClick,
-}: FilteredProps) => {
- const [searchTerm, setSearchTerm] = useState('');
- const [filteredOptions, setOptions] = useState<
- { name: string; title: string }[]
- >(options);
-
- useEffect(() => {
- const filtered = options.filter(
- (option: { name: string; title: string }) => {
- const inName = option.name
- .toLowerCase()
- .includes(searchTerm.toLowerCase());
- const inTitle = option.title
- .toLowerCase()
- .includes(searchTerm.toLowerCase());
-
- return inName || inTitle;
- },
- );
- setOptions(filtered);
- }, [searchTerm, options]);
-
- const handleChange = (event: any) => {
- setSearchTerm(event.target.value);
- };
-
- return (
- <>
- {searchable && (
-
- )}
-
- {filteredOptions.length > 0 ? (
- filteredOptions.map(
- (
- option: { name: string; title: string },
- index: number,
- ) => (
-
- {option.title}
-
- ),
- )
- ) : (
- No results
- )}
-
- >
- );
-};
diff --git a/client/src/views/trader/OfferCard.styled.tsx b/client/src/views/trader/OfferCard.styled.tsx
deleted file mode 100644
index b81e3153..00000000
--- a/client/src/views/trader/OfferCard.styled.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import styled from 'styled-components';
-import { unSelectedNavButton, mediaWidths } from 'styles/Themes';
-import { ChevronRight } from 'components/generic/Icons';
-
-export const TradesAmount = styled.div`
- font-size: 14px;
- color: ${unSelectedNavButton};
- margin: 0 4px;
-`;
-
-export const StyleArrow = styled(ChevronRight)`
- margin-bottom: -3px;
-`;
-
-export const OfferModalBox = styled.div`
- overflow-y: auto;
- max-height: 640px;
- min-height: 240px;
- @media (${mediaWidths.mobile}) {
- max-height: 240px;
- min-height: 120px;
- }
-`;
-
-export const StyledTitle = styled.div`
- font-size: 14px;
- margin: 16px 0;
-
- @media (${mediaWidths.mobile}) {
- text-align: center;
- margin-top: 8px;
- }
-`;
-
-export const StyledLogin = styled.div`
- max-width: 160px;
- overflow: hidden;
- text-overflow: ellipsis;
-`;
-
-export const StyledDescription = styled(StyledLogin)`
- max-width: unset;
- overflow-y: auto;
- font-size: 14px;
- max-height: 160px;
-`;
-
-export const OptionsLoading = styled.div`
- display: flex;
- height: 100%;
- width: 100%;
- justify-content: center;
- align-items: center;
-`;
diff --git a/client/src/views/trader/OfferCard.tsx b/client/src/views/trader/OfferCard.tsx
deleted file mode 100644
index 62a55f63..00000000
--- a/client/src/views/trader/OfferCard.tsx
+++ /dev/null
@@ -1,195 +0,0 @@
-import React from 'react';
-import {
- SubCard,
- Sub4Title,
- SubTitle,
- SingleLine,
- ResponsiveLine,
- Separation,
-} from 'components/generic/Styled';
-import { Rating } from 'components/rating/Rating';
-import {
- TradesAmount,
- StyleArrow,
- StyledTitle,
- StyledLogin,
- StyledDescription,
-} from './OfferCard.styled';
-import { MainInfo } from 'views/channels/Channels.style';
-import { themeColors } from 'styles/Themes';
-import { renderLine } from 'components/generic/Helpers';
-import numeral from 'numeral';
-import { MethodBoxes } from './MethodBoxes';
-import { Link } from 'components/link/Link';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-
-const format = (value: number | string, format: string = '0,0.00') =>
- numeral(value).format(format);
-
-interface OfferCardProps {
- offer: any;
- index: number;
- setIndexOpen: (index: number) => void;
- indexOpen: number;
-}
-
-export const OfferCard = ({
- offer,
- index,
- setIndexOpen,
- indexOpen,
-}: OfferCardProps) => {
- const {
- id,
- asset_code,
- country,
- country_code,
- working_now,
- side,
- title,
- description,
- currency_code,
- price,
- min_amount,
- max_amount,
- first_trade_limit,
- fee,
- balance,
- payment_window_minutes,
- confirmations,
- payment_method_instructions,
- trader,
- } = offer;
-
- const { author_fee_rate } = fee;
-
- const {
- login,
- online_status,
- rating,
- trades_count = 0,
- url,
- verified,
- verified_by,
- strong_hodler,
- country: traderCountry,
- country_code: traderCode,
- average_payment_time_minutes,
- average_release_time_minutes,
- days_since_last_trade,
- } = trader;
-
- const handleClick = () => {
- if (indexOpen === index) {
- setIndexOpen(0);
- } else {
- setIndexOpen(index);
- }
- };
-
- const renderPayments = (): string => {
- if (payment_method_instructions) {
- const methods = payment_method_instructions.map(
- (method: {
- payment_method_name: string;
- payment_method_type: string;
- }) =>
- `${method.payment_method_name} (${method.payment_method_type})`,
- );
-
- return methods.join(', ');
- }
- return '';
- };
-
- const renderDetails = () => (
- <>
-
- {description}
-
- {renderLine('Price', format(price))}
- {renderLine('Min Amount:', format(min_amount))}
- {renderLine('Max Amount:', format(max_amount))}
- {renderLine(`First Trade Limit:`, format(first_trade_limit))}
- {renderLine(`Payment Options:`, renderPayments())}
- {renderLine('Country:', `${country} (${country_code})`)}
- {renderLine('Available Now:', working_now ? 'Yes' : 'No')}
- {renderLine(`Balance:`, format(balance))}
- {renderLine(`Payment Window (min):`, payment_window_minutes)}
- {renderLine(`Confirmations:`, confirmations)}
- {renderLine(`Fee Rate:`, `${format(author_fee_rate * 100)}%`)}
-
- Trader
- {renderLine('User:', login)}
- {renderLine('Online:', online_status)}
- {renderLine('Rating:', rating)}
- {renderLine('Amount of Trades:', trades_count)}
- {renderLine('Verified:', verified)}
- {renderLine('Verified By:', verified_by)}
- {renderLine('Strong Hodler:', strong_hodler)}
- {renderLine('Country:', `${traderCountry} (${traderCode})`)}
- {renderLine(
- 'Average Payment Time (min):',
- average_payment_time_minutes,
- )}
- {renderLine(
- 'Average Release Time (min):',
- average_release_time_minutes,
- )}
- {renderLine('Days since last trade:', days_since_last_trade)}
-
-
-
- View Offer
-
-
-
-
- View trader
-
-
-
- >
- );
-
- return (
-
- handleClick()}>
-
-
-
- {side !== 'buy' ? asset_code : currency_code}
-
- {side !== 'buy' ? currency_code : asset_code}
-
-
- {login}
- {trades_count > 0 && (
- {`(${trades_count}) `}
- )}
-
-
-
- {title}
- {renderLine('Price:', format(price))}
- {renderLine(
- `Min/Max amount:`,
- `${format(min_amount, '0a')}/${format(max_amount, '0a')}`,
- )}
-
- {index === indexOpen && renderDetails()}
-
- );
-};
diff --git a/client/src/views/trader/OfferConfigs.tsx b/client/src/views/trader/OfferConfigs.tsx
deleted file mode 100644
index c25acb50..00000000
--- a/client/src/views/trader/OfferConfigs.tsx
+++ /dev/null
@@ -1,141 +0,0 @@
-export const SortOptions = [
- {
- name: 'none',
- title: 'None',
- },
- {
- name: 'price',
- title: 'Price',
- },
- {
- name: 'payment_window_minutes',
- title: 'Payment Window',
- },
- {
- name: 'user_average_payment_time_minutes',
- title: 'Average Payment Time',
- },
- {
- name: 'user_average_release_time_minutes',
- title: 'Average Release Time',
- },
- {
- name: 'rating',
- title: 'Rating',
- },
-];
-
-export const NewOptions = [
- {
- name: 'asset_code',
- title: 'Asset Code',
- options: [
- {
- name: 'BTC',
- title: 'Bitcoin',
- },
- {
- name: 'BTCLN',
- title: 'Lightning Bitcoin',
- },
- ],
- },
- {
- name: 'side',
- title: 'Side',
- options: [
- {
- name: 'buy',
- title: 'I want to sell Bitcoin',
- },
- {
- name: 'sell',
- title: 'I want to buy Bitcoin',
- },
- ],
- },
- {
- name: 'include_global',
- title: 'Include Global Offers',
- options: [
- {
- name: 'true',
- title: 'Yes',
- },
- {
- name: 'false',
- title: 'No',
- },
- ],
- },
- {
- name: 'only_working_now',
- title: 'Only Working Now Offers',
- options: [
- {
- name: 'true',
- title: 'Yes',
- },
- {
- name: 'false',
- title: 'No',
- },
- ],
- },
- {
- name: 'country',
- title: 'Country',
- searchable: true,
- },
- {
- name: 'currency_code',
- title: 'Currency',
- searchable: true,
- },
- {
- name: 'payment_method_type',
- title: 'Payment Type',
- options: [
- {
- name: 'Bank wire',
- title: 'Bank wire',
- },
- {
- name: 'Cash',
- title: 'Cash',
- },
- {
- name: 'Cryptocurrency',
- title: 'Cryptocurrency',
- },
- {
- name: 'Online payment system',
- title: 'Online payment system',
- },
- ],
- },
- // {
- // name: 'payment_method_id',
- // title: 'Payment Id',
- // },
- // {
- // name: 'payment_method_name',
- // title: 'Payment Name',
- // },
- // {
- // name: 'volume',
- // title: 'Volume',
- // },
- // {
- // name: 'payment_window_minutes_max',
- // title: 'Max Payment Window',
- // },
- // {
- // name: 'user_average_payment_time_minutes_max',
- // title: 'Max User Payment Time',
- // },
- // {
- // name: 'user_average_release_time_minutes_max',
- // title: 'Max User Release Time',
- // },
-];
diff --git a/client/src/views/trader/OfferFilters.tsx b/client/src/views/trader/OfferFilters.tsx
deleted file mode 100644
index a1d02e5e..00000000
--- a/client/src/views/trader/OfferFilters.tsx
+++ /dev/null
@@ -1,253 +0,0 @@
-import React, { useState, useReducer } from 'react';
-import {
- SingleLine,
- Separation,
- ResponsiveLine,
- NoWrapTitle,
-} from 'components/generic/Styled';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-import {
- MultiButton,
- SingleButton,
-} from 'components/buttons/multiButton/MultiButton';
-import Modal from 'components/modal/ReactModal';
-import { FilterModal } from './Modal/FilterModal';
-import { useHistory } from 'react-router-dom';
-import { SortOptions } from './OfferConfigs';
-import { QueryProps } from './TraderView';
-import { XSvg } from 'components/generic/Icons';
-import { renderLine } from 'components/generic/Helpers';
-import { chartColors } from 'styles/Themes';
-
-type ActionType = {
- type:
- | 'addFilter'
- | 'addSort'
- | 'removeSort'
- | 'removeFilter'
- | 'changeLimit';
- state?: QueryProps;
- newItem?: {};
- removeKey?: string;
- changeLimit?: number;
-};
-
-const reducer = (state: QueryProps, action: ActionType): QueryProps => {
- const { sort, filters } = state;
- switch (action.type) {
- case 'addSort':
- let direction = {};
- if (sort && !sort.direction) {
- direction = { direction: 'desc' };
- }
- const newSort = { ...sort, ...direction, ...action.newItem };
- return { ...state, sort: newSort };
- case 'removeSort':
- return { ...state, sort: { by: '', direction: '' } };
- case 'addFilter':
- const newFilters = { ...filters, ...action.newItem };
- return { ...state, filters: newFilters };
- case 'removeFilter':
- if (action.removeKey) {
- const remaining = { ...filters };
- delete remaining[action.removeKey];
- return { ...state, filters: remaining };
- }
- return state;
- case 'changeLimit':
- if (action.changeLimit) {
- return {
- ...state,
- pagination: { limit: action.changeLimit, offset: 0 },
- };
- }
- return state;
- default:
- throw new Error();
- }
-};
-
-interface FilterProps {
- offerFilters: QueryProps;
-}
-
-export interface FilterType {
- name: string;
- title: string;
- optionOne?: string;
- optionTwo?: string;
-}
-
-export const OfferFilters = ({ offerFilters }: FilterProps) => {
- const { push } = useHistory();
-
- const [filterState, dispatch] = useReducer(reducer, offerFilters);
-
- const [modalType, setModalType] = useState('none');
- const [willApply, setWillApply] = useState(false);
-
- const renderButton = (
- onClick: () => void,
- text: string,
- selected: boolean,
- ) => (
-
- {text}
-
- );
-
- const handleSave = () =>
- push({ search: `?filter=${btoa(JSON.stringify(filterState))}` });
-
- const handleRemoveAll = () => push({ search: '' });
-
- const handleRemove = (removeKey: string) => {
- dispatch({ type: 'removeFilter', removeKey });
- };
-
- const renderAppliedFilters = () => {
- const currentFilters = filterState.filters;
- let activeFilters = [];
- for (const key in currentFilters) {
- if (currentFilters.hasOwnProperty(key)) {
- const element = currentFilters[key];
- activeFilters.push(
- renderLine(key, element, `${key}-${element}`, () =>
- handleRemove(key),
- ),
- );
- }
- }
- return <>{activeFilters.map((filter) => filter)}>;
- };
-
- const renderLimitOptions = () => {
- const currentLimit = filterState.pagination.limit;
-
- const renderButton = (value: number, margin?: string) => (
-
- dispatch({ type: 'changeLimit', changeLimit: value })
- }
- selected={currentLimit === value}
- withMargin={margin}
- >
- {value}
-
- );
-
- return (
-
- {renderButton(25)}
- {renderButton(50, '0 4px 0')}
- {renderButton(100)}
-
- );
- };
-
- const renderFilters = () => {
- return (
- <>
-
-
- Results:
- {renderLimitOptions()}
-
-
-
- Filters
- setModalType('new')}
- >
- New Filter
-
-
- {Object.keys(filterState.filters).length > 0 &&
- renderAppliedFilters()}
-
-
- Sort By:
- setModalType('sort')}
- >
- {SortOptions.find(
- (option) => option.name === filterState.sort.by,
- )?.title ?? 'None'}
-
-
- {!!filterState.sort.by && (
-
- Sort Direction:
-
- {renderButton(
- () => {
- dispatch({
- type: 'addSort',
- newItem: { direction: 'asc' },
- });
- },
- 'Asc',
- filterState.sort.direction === 'asc',
- )}
- {renderButton(
- () => {
- dispatch({
- type: 'addSort',
- newItem: { direction: 'desc' },
- });
- },
- 'Desc',
- filterState.sort.direction !== 'asc',
- )}
-
-
- )}
-
-
-
- Filter
-
-
- Remove All
-
-
- >
- );
- };
-
- return (
- <>
-
- Filters
- setWillApply((prev) => !prev)}
- >
- {willApply ? : 'Apply'}
-
-
- {willApply && renderFilters()}
- setModalType('none')}
- >
-
-
- >
- );
-};
diff --git a/client/src/views/trader/TraderView.tsx b/client/src/views/trader/TraderView.tsx
deleted file mode 100644
index 90d63ad3..00000000
--- a/client/src/views/trader/TraderView.tsx
+++ /dev/null
@@ -1,148 +0,0 @@
-import React, { useState } from 'react';
-import {
- CardWithTitle,
- SubTitle,
- Card,
- DarkSubTitle,
- ResponsiveLine,
-} from 'components/generic/Styled';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_HODL_OFFERS } from 'graphql/hodlhodl/query';
-import { LoadingCard } from 'components/loading/LoadingCard';
-import { OfferCard } from './OfferCard';
-import { OfferFilters } from './OfferFilters';
-import { useLocation } from 'react-router-dom';
-import qs from 'qs';
-import { toast } from 'react-toastify';
-import { Link } from 'components/link/Link';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-
-export interface QueryProps {
- pagination: {
- limit: number;
- offset: number;
- };
- filters: {};
- sort: {
- by: string;
- direction: string;
- };
-}
-
-const defaultQuery: QueryProps = {
- pagination: {
- limit: 25,
- offset: 0,
- },
- filters: {},
- sort: {
- by: '',
- direction: '',
- },
-};
-
-export const TraderView = () => {
- const { search } = useLocation();
-
- const query = qs.parse(search, { ignoreQueryPrefix: true });
-
- let decoded: QueryProps = defaultQuery;
- if (!!query.filter) {
- try {
- decoded = JSON.parse(atob(query.filter));
- } catch (error) {
- toast.error('Incorrect url.');
- }
- }
-
- const queryObject = {
- ...defaultQuery,
- ...decoded,
- };
-
- const [indexOpen, setIndexOpen] = useState(0);
- const [page, setPage] = useState(1);
- const [fetching, setFetching] = useState(false);
-
- const { data, loading, fetchMore, error } = useQuery(GET_HODL_OFFERS, {
- variables: { filter: JSON.stringify(queryObject) },
- onError: () => toast.error('Error getting offers. Please try again.'),
- });
-
- if (error) {
- return null;
- }
-
- if (loading || !data || !data.getOffers) {
- return ;
- }
-
- const amountOfOffers = data.getOffers.length;
- const {
- pagination: { limit },
- } = queryObject;
-
- return (
-
-
- P2P Trading
-
- Powered by{' '}
- HodlHodl
-
-
-
-
-
-
- {amountOfOffers <= 0 && (
- No Offers Found
- )}
- {data.getOffers.map((offer: any, index: number) => (
-
- ))}
-
- {amountOfOffers > 0 && amountOfOffers === limit * page && (
- {
- setFetching(true);
-
- fetchMore({
- variables: {
- filter: JSON.stringify({
- ...queryObject,
- pagination: { limit, offset: limit * page },
- }),
- },
- updateQuery: (
- prev,
- { fetchMoreResult: result },
- ) => {
- if (!result) return prev;
-
- setFetching(false);
- setPage((prev) => (prev += 1));
- return {
- getOffers: [
- ...prev.getOffers,
- ...result.getOffers,
- ],
- };
- },
- });
- }}
- >
- Show More
-
- )}
-
- );
-};
diff --git a/client/src/views/transactions/InvoiceCard.tsx b/client/src/views/transactions/InvoiceCard.tsx
deleted file mode 100644
index 25e4eb8c..00000000
--- a/client/src/views/transactions/InvoiceCard.tsx
+++ /dev/null
@@ -1,113 +0,0 @@
-import React from 'react';
-import {
- Separation,
- SubCard,
- SingleLine,
- ResponsiveLine,
- DarkSubTitle,
-} from '../../components/generic/Styled';
-import { StatusLine, NodeTitle, MainInfo } from '../channels/Channels.style';
-import {
- getStatusDot,
- getDateDif,
- getFormatDate,
- renderLine,
-} from '../../components/generic/Helpers';
-import { Price } from 'components/price/Price';
-
-interface InvoiceCardProps {
- invoice: any;
- index: number;
- setIndexOpen: (index: number) => void;
- indexOpen: number;
-}
-
-export const InvoiceCard = ({
- invoice,
- index,
- setIndexOpen,
- indexOpen,
-}: InvoiceCardProps) => {
- const {
- date,
- confirmed_at,
- created_at,
- description,
- expires_at,
- is_confirmed,
- // received,
- tokens,
- chain_address,
- description_hash,
- id,
- is_canceled,
- is_held,
- is_outgoing,
- is_private,
- // payments,
- // received_mtokens,
- // request,
- secret,
- } = invoice;
-
- const formatAmount = ;
-
- const handleClick = () => {
- if (indexOpen === index) {
- setIndexOpen(0);
- } else {
- setIndexOpen(index);
- }
- };
-
- const renderDetails = () => {
- return (
- <>
-
- {is_confirmed &&
- renderLine(
- 'Confirmed:',
- `${getDateDif(confirmed_at)} ago (${getFormatDate(
- confirmed_at,
- )})`,
- )}
- {renderLine(
- 'Created:',
- `${getDateDif(created_at)} ago (${getFormatDate(
- created_at,
- )})`,
- )}
- {renderLine(
- 'Expires:',
- `${getDateDif(expires_at)} ago (${getFormatDate(
- expires_at,
- )})`,
- )}
- {renderLine('Id:', id)}
- {renderLine('Chain Address:', chain_address)}
- {renderLine('Description Hash:', description_hash)}
- {renderLine('Is Canceled:', is_canceled)}
- {renderLine('Is Held:', is_held)}
- {renderLine('Is Outgoing:', is_outgoing)}
- {renderLine('Is Private:', is_private)}
- {renderLine('Secret:', secret)}
- >
- );
- };
-
- return (
-
- handleClick()}>
- {getStatusDot(is_confirmed, 'active')}
-
-
- {description ? description : 'Invoice'}
-
- {`(${getDateDif(date)} ago)`}
- {formatAmount}
-
-
- {index === indexOpen && renderDetails()}
-
- );
-};
diff --git a/client/src/views/transactions/PaymentsCards.tsx b/client/src/views/transactions/PaymentsCards.tsx
deleted file mode 100644
index 4b4a571b..00000000
--- a/client/src/views/transactions/PaymentsCards.tsx
+++ /dev/null
@@ -1,101 +0,0 @@
-import React from 'react';
-import {
- Separation,
- SubCard,
- DarkSubTitle,
- ResponsiveLine,
-} from '../../components/generic/Styled';
-import { StatusLine, NodeTitle, MainInfo } from '../channels/Channels.style';
-import {
- getStatusDot,
- getDateDif,
- getFormatDate,
- getNodeLink,
- renderLine,
-} from '../../components/generic/Helpers';
-import styled from 'styled-components';
-import { Price } from 'components/price/Price';
-
-interface PaymentsCardProps {
- payment: any;
- index: number;
- setIndexOpen: (index: number) => void;
- indexOpen: number;
-}
-
-const RedValue = styled.div`
- color: red;
-`;
-
-export const PaymentsCard = ({
- payment,
- index,
- setIndexOpen,
- indexOpen,
-}: PaymentsCardProps) => {
- const {
- alias,
- date,
- created_at,
- destination,
- fee,
- fee_mtokens,
- hops,
- is_confirmed,
- tokens,
- id,
- is_outgoing,
- mtokens,
- secret,
- } = payment;
-
- const formatAmount = ;
- const formatFee = ;
-
- const handleClick = () => {
- if (indexOpen === index) {
- setIndexOpen(0);
- } else {
- setIndexOpen(index);
- }
- };
-
- const renderDetails = () => {
- return (
- <>
-
- {renderLine(
- 'Created:',
- `${getDateDif(created_at)} ago (${getFormatDate(
- created_at,
- )})`,
- )}
- {renderLine('Destination Node:', getNodeLink(destination))}
- {renderLine('Fee:', formatFee)}
- {renderLine('Fee msats:', `${fee_mtokens} millisats`)}
- {renderLine('Hops:', hops.length)}
- {hops.map((hop: any, index: number) =>
- renderLine(`Hop ${index + 1}:`, hop),
- )}
- {renderLine('Id:', id)}
- {renderLine('Is Outgoing:', is_outgoing ? 'true' : 'false')}
- {renderLine('Secret:', secret)}
- {renderLine('M Tokens:', `${mtokens} millisats`)}
- >
- );
- };
-
- return (
-
- handleClick()}>
- {getStatusDot(is_confirmed, 'active')}
-
- {`Payment to: ${alias}`}
- {`(${getDateDif(date)} ago)`}
- {formatAmount}
-
-
- {index === indexOpen && renderDetails()}
-
- );
-};
diff --git a/client/src/views/transactions/TransactionList.tsx b/client/src/views/transactions/TransactionList.tsx
deleted file mode 100644
index f013356f..00000000
--- a/client/src/views/transactions/TransactionList.tsx
+++ /dev/null
@@ -1,113 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { useQuery } from '@apollo/react-hooks';
-import { GET_RESUME } from '../../graphql/query';
-import { Card, CardWithTitle, SubTitle } from '../../components/generic/Styled';
-import { InvoiceCard } from './InvoiceCard';
-import { useAccount } from '../../context/AccountContext';
-import { toast } from 'react-toastify';
-import { getErrorContent } from '../../utils/error';
-import { PaymentsCard } from './PaymentsCards';
-import { LoadingCard } from '../../components/loading/LoadingCard';
-import { ColorButton } from 'components/buttons/colorButton/ColorButton';
-import { FlowBox } from 'views/home/reports/flow';
-
-export const TransactionList = () => {
- const [indexOpen, setIndexOpen] = useState(0);
- const [token, setToken] = useState('');
- const [fetching, setFetching] = useState(false);
-
- const { host, viewOnly, cert, sessionAdmin } = useAccount();
- const auth = {
- host,
- macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
- cert,
- };
-
- const { loading, data, fetchMore } = useQuery(GET_RESUME, {
- variables: { auth, token: '' },
- onError: (error) => toast.error(getErrorContent(error)),
- });
-
- useEffect(() => {
- if (!loading && data && data.getResume && data.getResume.token) {
- setToken(data.getResume.token);
- }
- }, [data, loading]);
-
- if (loading || !data || !data.getResume) {
- return ;
- }
-
- const resumeList = JSON.parse(data.getResume.resume);
-
- return (
- <>
-
-
- Transactions
-
- {resumeList.map((entry: any, index: number) => {
- if (entry.type === 'invoice') {
- return (
-
- );
- } else {
- return (
-
- );
- }
- })}
-
- {
- setFetching(true);
- fetchMore({
- variables: { auth, token },
- updateQuery: (
- prev,
- { fetchMoreResult: result },
- ) => {
- if (!result) return prev;
- const newToken = result.getResume.token || '';
- const prevEntries = JSON.parse(
- prev.getResume.resume,
- );
- const newEntries = JSON.parse(
- result.getResume.resume,
- );
-
- setFetching(false);
- return {
- getResume: {
- token: newToken,
- resume: JSON.stringify([
- ...prevEntries,
- ...newEntries,
- ]),
- __typename: 'getResumeType',
- },
- };
- },
- });
- }}
- >
- Show More
-
-
- >
- );
-};
diff --git a/client/tsconfig.json b/client/tsconfig.json
deleted file mode 100644
index fdf40ac4..00000000
--- a/client/tsconfig.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "compilerOptions": {
- "outDir": "build/dist",
- "module": "esnext",
- "target": "es2018",
- "lib": ["dom", "dom.iterable", "esnext"],
- "sourceMap": true,
- "rootDirs": ["src"],
- "baseUrl": "src",
- "moduleResolution": "node",
- "allowJs": true,
- "skipLibCheck": true,
- "esModuleInterop": true,
- "allowSyntheticDefaultImports": true,
- "strict": true,
- "forceConsistentCasingInFileNames": true,
- "resolveJsonModule": true,
- "isolatedModules": true,
- "noEmit": true,
- "jsx": "react",
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noImplicitAny": true,
- "strictNullChecks": true,
- "suppressImplicitAnyIndexErrors": true,
- // "noUnusedLocals": true,
- "declaration": true,
- "experimentalDecorators": true,
- "emitDecoratorMetadata": true
- },
- "include": ["src"],
- "exclude": ["node_modules", "build", "scripts", "**/*.stories.tsx"]
-}
diff --git a/config/apolloClient.tsx b/config/apolloClient.tsx
new file mode 100644
index 00000000..e9e3da74
--- /dev/null
+++ b/config/apolloClient.tsx
@@ -0,0 +1,25 @@
+import { ApolloClient, InMemoryCache, HttpLink } from 'apollo-boost';
+import fetch from 'isomorphic-unfetch';
+import withApollo from 'next-with-apollo';
+
+const GRAPHQL_URL = '/api/v1';
+
+const link = new HttpLink({
+ uri: GRAPHQL_URL,
+ credentials: 'same-origin',
+ fetch,
+});
+
+// Export a HOC from next-with-apollo
+// Docs: https://www.npmjs.com/package/next-with-apollo
+export default withApollo(
+ // You can get headers and ctx (context) from the callback params
+ // e.g. ({ headers, ctx, initialState })
+ ({ initialState }) =>
+ new ApolloClient({
+ link,
+ cache: new InMemoryCache()
+ // rehydrate the cache using the initial data passed from the server:
+ .restore(initialState || {}),
+ })
+);
diff --git a/docker-compose.yml b/docker-compose.yml
deleted file mode 100644
index b54d0742..00000000
--- a/docker-compose.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-version: "3"
-services:
- ##########################
- ### SETUP SERVER CONTAINER
- ##########################
- backend:
- image: apotdevin/thunderhub-server
- build:
- context: ./server
- dockerfile: Dockerfile
- environment:
- - NODE_ENV=production
- ports:
- - "3001:3001"
- volumes:
- - ./server/
- restart: always
- ##########################
- ### SETUP CLIENT CONTAINER
- ##########################
- frontend:
- image: apotdevin/thunderhub-client
- build:
- context: ./client
- dockerfile: Dockerfile
- ports:
- - "5000:5000"
- volumes:
- - ./client/
- depends_on:
- - backend
- restart: always
diff --git a/assets/Home.png b/docs/Home.png
similarity index 100%
rename from assets/Home.png
rename to docs/Home.png
diff --git a/lerna.json b/lerna.json
deleted file mode 100644
index c9b6e599..00000000
--- a/lerna.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "packages": ["client", "server"],
- "npmClient": "yarn",
- "useWorkspaces": true,
- "version": "0.2.2"
-}
diff --git a/next-env.d.ts b/next-env.d.ts
new file mode 100644
index 00000000..7b7aa2c7
--- /dev/null
+++ b/next-env.d.ts
@@ -0,0 +1,2 @@
+///
+///
diff --git a/next.config.js b/next.config.js
new file mode 100644
index 00000000..2cb7b5c7
--- /dev/null
+++ b/next.config.js
@@ -0,0 +1,13 @@
+const { parsed: localEnv } = require('dotenv').config();
+const webpack = require('webpack');
+module.exports = {
+ webpack: config => {
+ config.plugins.push(new webpack.EnvironmentPlugin(localEnv));
+ return config;
+ },
+};
+
+const withBundleAnalyzer = require('@next/bundle-analyzer')({
+ enabled: process.env.ANALYZE === 'true',
+});
+module.exports = withBundleAnalyzer({});
diff --git a/package.json b/package.json
index f06925cb..93af2171 100644
--- a/package.json
+++ b/package.json
@@ -1,33 +1,98 @@
{
- "name": "root",
- "private": true,
+ "name": "thunderhub",
+ "version": "0.2.2",
+ "description": "",
+ "main": "index.js",
"scripts": {
- "server:dev": "lerna run build:dev --stream --scope @thunderhub/server",
- "server:prod": "lerna run build --stream --scope @thunderhub/server",
- "server:start": "lerna run start --stream --scope @thunderhub/server",
- "deploy": "lerna run deploy --stream",
- "version:bump": "lerna version --allow-branch master --conventional-commits"
- },
- "workspaces": {
- "packages": [
- "client",
- "server"
- ]
+ "dev": "cross-env NODE_OPTIONS='--insecure-http-parser' next",
+ "build": "next build",
+ "start": "cross-env NODE_OPTIONS='--insecure-http-parser' next start",
+ "tslint": "tslint -p . -c tslint.json",
+ "prettier": "prettier --write **/*.{ts,tsx,js,css,html}",
+ "release": "standard-version",
+ "release:test": "standard-version --dry-run",
+ "analyze": "cross-env ANALYZE=true next build",
+ "storybook": "start-storybook -p 6006 -c .storybook"
},
+ "keywords": [],
+ "author": "",
+ "license": "MIT",
"dependencies": {
+ "@apollo/react-hooks": "^3.1.4",
+ "apollo-boost": "^0.4.7",
+ "apollo-server-micro": "^2.12.0",
"base64url": "^3.0.1",
- "date-fns": "^2.0.0-beta.5",
- "graphql": "^14.6.0"
+ "crypto-js": "^4.0.0",
+ "date-fns": "^2.12.0",
+ "dotenv": "^8.2.0",
+ "graphql": "^15.0.0",
+ "graphql-iso-date": "^3.6.1",
+ "graphql-rate-limit": "^2.0.1",
+ "graphql-tag": "^2.10.3",
+ "intersection-observer": "^0.7.0",
+ "isomorphic-unfetch": "^3.0.0",
+ "ln-service": "^47.16.0",
+ "lodash.debounce": "^4.0.8",
+ "lodash.merge": "^4.6.2",
+ "micro-cors": "^0.1.1",
+ "next": "^9.3.4",
+ "next-with-apollo": "^5.0.0",
+ "numeral": "^2.0.6",
+ "qrcode.react": "^1.0.0",
+ "react": "^16.13.1",
+ "react-copy-to-clipboard": "^5.0.2",
+ "react-dom": "^16.13.1",
+ "react-intersection-observer": "^8.26.1",
+ "react-qr-reader": "^2.2.1",
+ "react-spinners": "^0.8.1",
+ "react-spring": "^8.0.27",
+ "react-toastify": "^5.5.0",
+ "react-tooltip": "^4.2.2",
+ "styled-components": "^5.1.0",
+ "styled-react-modal": "^2.0.1",
+ "styled-theming": "^2.2.0",
+ "underscore": "^1.10.2",
+ "uuid": "^7.0.3",
+ "victory": "^34.1.3",
+ "winston": "^3.2.1",
+ "zxcvbn": "^4.4.2"
},
"devDependencies": {
- "husky": "^4.2.3",
- "lerna": "^3.20.2",
- "prettier": "2.0.2",
- "pretty-quick": "^2.0.1"
+ "@babel/core": "^7.9.0",
+ "@commitlint/cli": "^8.3.5",
+ "@commitlint/config-conventional": "^8.3.4",
+ "@next/bundle-analyzer": "^9.3.4",
+ "@storybook/addon-actions": "^5.3.18",
+ "@storybook/addon-knobs": "^5.3.18",
+ "@storybook/addon-viewport": "^5.3.18",
+ "@storybook/react": "^5.3.18",
+ "@types/node": "^13.11.1",
+ "@types/react": "^16.9.34",
+ "@types/storybook__react": "^5.2.1",
+ "babel-loader": "^8.1.0",
+ "babel-plugin-inline-react-svg": "^1.1.1",
+ "babel-plugin-styled-components": "^1.10.7",
+ "babel-preset-react-app": "^9.1.2",
+ "cross-env": "^7.0.2",
+ "husky": "^4.2.5",
+ "lint-staged": "^10.1.3",
+ "prettier": "^2.0.4",
+ "standard-version": "^7.1.0",
+ "tslint": "^6.1.1",
+ "tslint-config-airbnb": "^5.11.2",
+ "tslint-react-hooks": "^2.2.2",
+ "typescript": "^3.8.3"
},
"husky": {
"hooks": {
- "pre-commit": "npx lerna run --concurrency 1 --stream precommit"
+ "pre-commit": "lint-staged",
+ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
+ },
+ "lint-staged": {
+ "*.+(ts|tsx)": [
+ "prettier --write",
+ "tslint"
+ ]
}
}
diff --git a/pages/_app.tsx b/pages/_app.tsx
new file mode 100644
index 00000000..18e6bfdf
--- /dev/null
+++ b/pages/_app.tsx
@@ -0,0 +1,79 @@
+import App from 'next/app';
+import React from 'react';
+import { ContextProvider } from '../src/context/ContextProvider';
+import { ThemeProvider } from 'styled-components';
+import { useSettings } from '../src/context/SettingsContext';
+import { ModalProvider, BaseModalBackground } from 'styled-react-modal';
+import { GlobalStyles } from '../src/styles/GlobalStyle';
+import { Header } from '../src/layouts/header/Header';
+import { Footer } from '../src/layouts/footer/Footer';
+import { ApolloProvider } from '@apollo/react-hooks';
+import withApollo from '../config/apolloClient';
+import { useAccount } from '../src/context/AccountContext';
+import { BitcoinFees } from '../src/components/bitcoinInfo/BitcoinFees';
+import { BitcoinPrice } from '../src/components/bitcoinInfo/BitcoinPrice';
+import { GridWrapper } from '../src/components/gridWrapper/GridWrapper';
+import { useRouter } from 'next/router';
+import { useConnectionState } from '../src/context/ConnectionContext';
+import {
+ LoadingView,
+ ErrorView,
+} from '../src/components/stateViews/StateCards';
+import { toast } from 'react-toastify';
+import 'react-toastify/dist/ReactToastify.css';
+import '../src/styles/FontStyles.css';
+
+toast.configure({ draggable: false });
+
+const withoutGrid = ['/', '/login', '/faq', '/privacy', '/terms'];
+
+const Wrapper: React.FC = ({ children }) => {
+ const { theme } = useSettings();
+ const { loggedIn } = useAccount();
+ const { pathname } = useRouter();
+ const { connected, loading, error } = useConnectionState();
+
+ const isInArray = withoutGrid.includes(pathname);
+
+ const renderContent = () => {
+ if (loading) return ;
+ if (error) return ;
+ return <>{children}>;
+ };
+
+ const renderGetters = () => (
+ <>
+
+
+ >
+ );
+
+ return (
+
+
+
+ {loggedIn && renderGetters()}
+
+ {renderContent()}
+
+
+
+ );
+};
+
+class MyApp extends App {
+ render() {
+ const { Component, pageProps, apollo } = this.props;
+ return (
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withApollo(MyApp);
diff --git a/pages/_document.tsx b/pages/_document.tsx
new file mode 100644
index 00000000..7df80076
--- /dev/null
+++ b/pages/_document.tsx
@@ -0,0 +1,29 @@
+import Document from 'next/document';
+import { ServerStyleSheet } from 'styled-components';
+
+export default class MyDocument extends Document {
+ static async getInitialProps(ctx) {
+ const sheet = new ServerStyleSheet();
+ const originalRenderPage = ctx.renderPage;
+
+ try {
+ ctx.renderPage = () =>
+ originalRenderPage({
+ enhanceApp: App => props => sheet.collectStyles( ),
+ });
+
+ const initialProps = await Document.getInitialProps(ctx);
+ return {
+ ...initialProps,
+ styles: (
+ <>
+ {initialProps.styles}
+ {sheet.getStyleElement()}
+ >
+ ),
+ };
+ } finally {
+ sheet.seal();
+ }
+ }
+}
diff --git a/pages/api/v1.tsx b/pages/api/v1.tsx
new file mode 100644
index 00000000..50a8ebf3
--- /dev/null
+++ b/pages/api/v1.tsx
@@ -0,0 +1,26 @@
+import { ApolloServer } from 'apollo-server-micro';
+import { thunderHubSchema } from '../../src/api/schemas';
+import { getIp } from '../../src/api/helpers/helpers';
+import Cors from 'micro-cors';
+
+const cors = Cors({
+ origin: true,
+});
+
+const apolloServer = new ApolloServer({
+ schema: thunderHubSchema,
+ context: async ({ req }: any) => {
+ const ip = getIp(req);
+ return { ip };
+ },
+});
+
+const handler = apolloServer.createHandler({ path: '/api/v1' });
+
+export const config = {
+ api: {
+ bodyParser: false,
+ },
+};
+
+export default cors(handler);
diff --git a/pages/balance.tsx b/pages/balance.tsx
new file mode 100644
index 00000000..8413ac21
--- /dev/null
+++ b/pages/balance.tsx
@@ -0,0 +1,229 @@
+import React, { useState } from 'react';
+import {
+ CardWithTitle,
+ Card,
+ SubTitle,
+ Sub4Title,
+ ResponsiveLine,
+ DarkSubTitle,
+ NoWrapTitle,
+ SingleLine,
+} from '../src/components/generic/Styled';
+import { useAccount } from '../src/context/AccountContext';
+import { useQuery } from '@apollo/react-hooks';
+import { GET_CHANNELS } from '../src/graphql/query';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../src/utils/error';
+import { LoadingCard } from '../src/components/loading/LoadingCard';
+import { getPercent } from '../src/utils/Helpers';
+import { Input } from '../src/components/input/Input';
+import sortBy from 'lodash.sortby';
+import { BalanceCard } from '../src/views/balance/BalanceCard';
+import { BalanceRoute } from '../src/views/balance/BalanceRoute';
+import { Price } from '../src/components/price/Price';
+import { useStatusState } from '../src/context/StatusContext';
+import { Text } from '../src/components/typography/Styled';
+
+const BalanceView = () => {
+ const { minorVersion } = useStatusState();
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const [outgoing, setOutgoing] = useState<{ id: string } | null>();
+ const [incoming, setIncoming] = useState();
+ const [amount, setAmount] = useState();
+
+ const [maxFee, setMaxFee] = useState();
+
+ const [blocked, setBlocked] = useState(false);
+
+ const { loading, data } = useQuery(GET_CHANNELS, {
+ variables: { auth, active: true },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ if (minorVersion < 9) {
+ return (
+
+
+ Channel Balancing
+
+
+
+ Channel balancing is only available for nodes with LND versions
+ 0.9.0-beta and up.
+
+ If you want to use this feature please update your node.
+
+
+ );
+ }
+
+ if (loading || !data || !data.getChannels) {
+ return ;
+ }
+
+ const handleReset = (type: string) => {
+ switch (type) {
+ case 'outgoing':
+ setOutgoing(undefined);
+ setIncoming(undefined);
+ break;
+ case 'incoming':
+ setIncoming(undefined);
+ break;
+ case 'all':
+ setMaxFee(undefined);
+ setAmount(undefined);
+ setOutgoing(undefined);
+ setIncoming(undefined);
+ setBlocked(false);
+ break;
+ default:
+ break;
+ }
+ };
+
+ const renderIncoming = () => {
+ if (!outgoing) return null;
+
+ return (
+ <>
+ Incoming Channel
+ {incoming ? (
+ handleReset('incoming'),
+ }}
+ />
+ ) : (
+ renderChannels()
+ )}
+ >
+ );
+ };
+
+ const renderOutgoing = () => {
+ return (
+ <>
+ Outgoing Channel
+ {outgoing ? (
+ handleReset('outgoing'),
+ }}
+ />
+ ) : (
+ renderChannels(true)
+ )}
+ >
+ );
+ };
+
+ const renderChannels = (isOutgoing?: boolean) => {
+ const channels = sortBy(data.getChannels, [
+ (channel: any) =>
+ getPercent(channel.remote_balance, channel.local_balance),
+ ]);
+
+ const finalChannels = isOutgoing ? channels : channels.reverse();
+
+ return finalChannels.map((channel: any, index: number) => {
+ if (!isOutgoing && outgoing && outgoing.id === channel.id) {
+ return null;
+ }
+
+ const callback = isOutgoing
+ ? !outgoing && { callback: () => setOutgoing(channel) }
+ : outgoing && !incoming && { callback: () => setIncoming(channel) };
+
+ return (
+
+ );
+ });
+ };
+
+ return (
+
+
+ Channel Balancing
+
+
+ {renderOutgoing()}
+ {renderIncoming()}
+
+ Amount
+
+
+
+
+
+
+ {!blocked && (
+ {
+ setAmount(Number(e.target.value));
+ }}
+ withMargin={'0 0 8px'}
+ />
+ )}
+
+ Max Fee
+
+
+
+
+
+
+ {!blocked && (
+ {
+ setMaxFee(Number(e.target.value));
+ }}
+ withMargin={'0 0 24px'}
+ />
+ )}
+ {incoming && outgoing && amount && (
+ setBlocked(true),
+ callback: () => handleReset('all'),
+ }}
+ />
+ )}
+
+
+ );
+};
+
+export default BalanceView;
diff --git a/pages/chain.tsx b/pages/chain.tsx
new file mode 100644
index 00000000..286f7507
--- /dev/null
+++ b/pages/chain.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+
+import { ChainTransactions } from '../src/views/chain/transactions/ChainTransactions';
+import { ChainUtxos } from '../src/views/chain/utxos/ChainUtxos';
+
+const ChainView = () => {
+ return (
+ <>
+
+
+ >
+ );
+};
+
+export default ChainView;
diff --git a/pages/channels.tsx b/pages/channels.tsx
new file mode 100644
index 00000000..8f1b0cc1
--- /dev/null
+++ b/pages/channels.tsx
@@ -0,0 +1,107 @@
+import React, { useState, useEffect } from 'react';
+import { Channels } from '../src/views/channels/channels/Channels';
+import { PendingChannels } from '../src/views/channels/pendingChannels/PendingChannels';
+import { ClosedChannels } from '../src/views/channels/closedChannels/ClosedChannels';
+import {
+ CardWithTitle,
+ SubTitle,
+ CardTitle,
+ SingleLine,
+ ColorButton,
+} from '../src/components/generic/Styled';
+import { useQuery } from '@apollo/react-hooks';
+import { useAccount } from '../src/context/AccountContext';
+import { GET_CHANNEL_AMOUNT_INFO } from '../src/graphql/query';
+import { useSettings } from '../src/context/SettingsContext';
+import { textColorMap } from '../src/styles/Themes';
+
+const ChannelView = () => {
+ const [view, setView] = useState(1);
+ const [amounts, setAmounts] = useState({
+ active: 0,
+ pending: 0,
+ closed: 0,
+ });
+
+ const { theme } = useSettings();
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { data } = useQuery(GET_CHANNEL_AMOUNT_INFO, {
+ variables: { auth },
+ });
+
+ useEffect(() => {
+ if (data && data.getNodeInfo) {
+ const {
+ active_channels_count,
+ closed_channels_count,
+ pending_channels_count,
+ } = data.getNodeInfo;
+
+ setAmounts({
+ active: active_channels_count,
+ pending: pending_channels_count,
+ closed: closed_channels_count,
+ });
+ }
+ }, [data]);
+
+ const showActive = amounts.pending > 0 || amounts.closed > 0;
+ const showPending = amounts.active > 0 || amounts.closed > 0;
+ const showClosed = amounts.pending > 0 || amounts.active > 0;
+
+ const getView = () => {
+ switch (view) {
+ case 2:
+ return ;
+ case 3:
+ return ;
+ default:
+ return ;
+ }
+ };
+
+ const getTitle = () => {
+ switch (view) {
+ case 2:
+ return 'Pending Channels';
+ case 3:
+ return 'Closed Channels';
+ default:
+ return 'Open Channels';
+ }
+ };
+
+ return (
+
+
+ {getTitle()}
+
+ {showActive && amounts.active > 0 && (
+ setView(1)}>
+ {`Open (${amounts.active})`}
+
+ )}
+ {showPending && amounts.pending > 0 && (
+ setView(2)}>
+ {`Pending (${amounts.pending})`}
+
+ )}
+ {showClosed && amounts.closed > 0 && (
+ setView(3)}>
+ {`Closed (${amounts.closed})`}
+
+ )}
+
+
+ {getView()}
+
+ );
+};
+
+export default ChannelView;
diff --git a/pages/faq.tsx b/pages/faq.tsx
new file mode 100644
index 00000000..41c7eb2a
--- /dev/null
+++ b/pages/faq.tsx
@@ -0,0 +1,132 @@
+import React from 'react';
+import { Section } from '../src/components/section/Section';
+import { themeColors } from '../src/styles/Themes';
+import {
+ Title,
+ Center,
+ Subtitle,
+ Question,
+ Text,
+} from '../src/components/typography/Styled';
+import { ContactSection } from '../src/views/homepage/Sections/ContactSection';
+import styled from 'styled-components';
+
+const FaqTitle = styled(Title)`
+ margin-bottom: 0px;
+`;
+
+const FaqView = () => {
+ return (
+ <>
+
+ FAQ: Answers to Common Questions
+
+
+ Learn about ThunderHub by reading these frequently asked questions.
+
+
+
+
+ What is ThunderHub?
+
+ ThunderHub is a LND node manager that you can open in any
+ browser and on any device.
+
+
+
+ How much does it cost?
+
+ No cost , ThunderHub is open-source so no need to spend any
+ precious sats here.
+
+
+
+ What is the value of ThunderHub?
+
+ ThunderHub brings a full lightning node manager
+ directly to your device without the need of installing plugins,
+ extensions or apps, having specific browsers or operating systems and
+ is completely open-source.
+
+
+ ThunderHub provides a simple and easy to use manager without
+ needing to give us any private information. Everything is stored
+ directly in your browser and sensitive information (like your admin
+ macaroon) are AES-256 encrypted with a password only you know.
+
+
+ The code is public and available for anyone to audit.
+
+
+
+ Is ThunderHub safe to use?
+
+ ThunderHub is open-source and available for anyone to audit.
+
+ This still doesn't mean it's completely bullet proof against
+ attackers.
+
+
+
+ If you connect using your admin macaroon, it is
+ AES-256 encrypted, password protected and
+ stored only in your browser.
+ The password is only known by you and you need to unlock your account
+ everytime you want to perform an admin only change such as managing
+ channels or sending and receiving bitcoin or lightning payments.
+
+
+ The ThunderHub server uses your credentials to connect to your node
+ but they are never stored outside of your browser. Still, this
+ involves a certain degree of trust you must be aware of.
+
+
+ If you want a more secure alternative, you can connect using a
+ view-only macaroon and use ThunderHub only for monitoring your node.
+
+
+
+ What happens if I forget my password?
+
+ The password is only known by you and is used to unlock an encrypted
+ macaroon stored only on your browser making it impossible for us to
+ help you with this situation.
+
+
+ The fix is simple. Delete that account on ThunderHub
+ (Don't worry, this doesn't delete anything or affect in any way your
+ node) and connect again with your desired macaroons.
+
+
+
+ Am I being tracked in anyway?
+
+ We do not track anything from our users and
+ store no information on our servers.
+ Should it be needed in the future, we will notify users and ask for
+ explicit consent before hand.
+
+
+
+
+ Can I use ThunderHub without having my own Lightning Node?
+
+
+ ThunderHub provides full lightning node management which is only
+ possible when you are the owner of the lightning node to which it is
+ connecting. So in short,
+ no you cannot use ThunderHub without having your own node.
+
+
+ Nowadays with the posibility of using pruned bitcoin nodes (Bitcoin
+ nodes which only have a section of the Bitcoin blockchain), you can
+ get a lightning node up and running in the cloud{' '}
+ for under €15/month.
+
+
+
+ >
+ );
+};
+
+export default FaqView;
diff --git a/pages/fees.tsx b/pages/fees.tsx
new file mode 100644
index 00000000..8c389fd2
--- /dev/null
+++ b/pages/fees.tsx
@@ -0,0 +1,134 @@
+import React, { useState } from 'react';
+import { useQuery, useMutation } from '@apollo/react-hooks';
+import { CHANNEL_FEES } from '../src/graphql/query';
+import {
+ Card,
+ CardWithTitle,
+ SubTitle,
+ SingleLine,
+ Sub4Title,
+ Separation,
+ DarkSubTitle,
+ RightAlign,
+ ResponsiveLine,
+ NoWrapTitle,
+} from '../src/components/generic/Styled';
+import { useAccount } from '../src/context/AccountContext';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../src/utils/error';
+import { LoadingCard } from '../src/components/loading/LoadingCard';
+import { FeeCard } from '../src/views/fees/FeeCard';
+import { UPDATE_FEES } from '../src/graphql/mutation';
+import { XSvg, ChevronRight } from '../src/components/generic/Icons';
+import { SecureButton } from '../src/components/buttons/secureButton/SecureButton';
+import { AdminSwitch } from '../src/components/adminSwitch/AdminSwitch';
+import { ColorButton } from '../src/components/buttons/colorButton/ColorButton';
+import { Input } from '../src/components/input/Input';
+
+const FeesView = () => {
+ const [indexOpen, setIndexOpen] = useState(0);
+ const [isEdit, setIsEdit] = useState(false);
+ const [baseFee, setBaseFee] = useState(0);
+ const [feeRate, setFeeRate] = useState(0);
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data } = useQuery(CHANNEL_FEES, {
+ variables: { auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ const [updateFees] = useMutation(UPDATE_FEES, {
+ onError: error => toast.error(getErrorContent(error)),
+ onCompleted: data => {
+ setIsEdit(false);
+ data.updateFees
+ ? toast.success('Fees Updated')
+ : toast.error('Error updating fees');
+ },
+ refetchQueries: ['GetChannelFees'],
+ });
+
+ if (loading || !data || !data.getChannelFees) {
+ return ;
+ }
+
+ return (
+ <>
+
+
+ Update Channel Fees
+
+
+ Channel Fees
+ setIsEdit(prev => !prev)}>
+ {isEdit ? : 'Update'}
+
+
+ {isEdit && (
+ <>
+
+
+
+ {'Base Fee:'}
+
+ setBaseFee(Number(e.target.value))}
+ />
+
+
+
+ {'Fee Rate:'}
+
+ setFeeRate(Number(e.target.value))}
+ />
+
+
+
+ Update Fees
+
+
+
+ >
+ )}
+
+
+
+
+ Channel Fees
+
+ {data.getChannelFees.map((channel: any, index: number) => (
+
+ ))}
+
+
+ >
+ );
+};
+
+export default FeesView;
diff --git a/pages/forwards.tsx b/pages/forwards.tsx
new file mode 100644
index 00000000..3d699317
--- /dev/null
+++ b/pages/forwards.tsx
@@ -0,0 +1,93 @@
+import React, { useState } from 'react';
+import {
+ SubTitle,
+ Card,
+ CardWithTitle,
+ CardTitle,
+ ColorButton,
+ SingleLine,
+} from '../src/components/generic/Styled';
+import { useAccount } from '../src/context/AccountContext';
+import { GET_FORWARDS } from '../src/graphql/query';
+import { useQuery } from '@apollo/react-hooks';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../src/utils/error';
+import { LoadingCard } from '../src/components/loading/LoadingCard';
+import { ForwardCard } from '../src/views/forwards/ForwardsCard';
+import { textColorMap } from '../src/styles/Themes';
+import { useSettings } from '../src/context/SettingsContext';
+import { ForwardBox } from '../src/views/home/reports/forwardReport';
+
+const timeMap: { [key: string]: string } = {
+ day: 'today',
+ week: 'this week',
+ month: 'this month',
+ threeMonths: 'these past 3 months',
+};
+
+const ForwardsView = () => {
+ const [time, setTime] = useState('week');
+ const [indexOpen, setIndexOpen] = useState(0);
+
+ const { theme } = useSettings();
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data } = useQuery(GET_FORWARDS, {
+ variables: { auth, time },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ if (loading || !data || !data.getForwards) {
+ return ;
+ }
+
+ const renderButton = (selectedTime: string, title: string) => (
+ setTime(selectedTime)}
+ selected={time === selectedTime}
+ >
+ {title}
+
+ );
+
+ const renderNoForwards = () => (
+ {`Your node has not forwarded any payments ${timeMap[time]}.`}
+ );
+
+ return (
+ <>
+
+
+
+ Forwards
+
+ {renderButton('day', 'D')}
+ {renderButton('week', '1W')}
+ {renderButton('month', '1M')}
+ {renderButton('threeMonths', '3M')}
+
+
+
+ {data.getForwards.forwards.length <= 0 && renderNoForwards()}
+ {data.getForwards.forwards.map((forward: any, index: number) => (
+
+ ))}
+
+
+ >
+ );
+};
+
+export default ForwardsView;
diff --git a/pages/home.tsx b/pages/home.tsx
new file mode 100644
index 00000000..c81acbf2
--- /dev/null
+++ b/pages/home.tsx
@@ -0,0 +1,26 @@
+import React from 'react';
+import { NetworkInfo } from '../src/views/home/networkInfo/NetworkInfo';
+import { AccountInfo } from '../src/views/home/account/AccountInfo';
+import { QuickActions } from '../src/views/home/quickActions/QuickActions';
+import { FlowBox } from '../src/views/home/reports/flow';
+import { ForwardBox } from '../src/views/home/reports/forwardReport';
+import { LiquidReport } from '../src/views/home/reports/liquidReport/LiquidReport';
+import { ConnectCard } from '../src/views/home/connect/Connect';
+import { NodeBar } from '../src/components/nodeInfo/NodeBar';
+
+const HomeView = () => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export default HomeView;
diff --git a/pages/index.tsx b/pages/index.tsx
new file mode 100644
index 00000000..1d2e32dc
--- /dev/null
+++ b/pages/index.tsx
@@ -0,0 +1,21 @@
+// import App from 'next/app';
+import React from 'react';
+import { useAccount } from '../src/context/AccountContext';
+import { SessionLogin } from '../src/views/login/SessionLogin';
+import { useRouter } from 'next/router';
+import { HomePageView } from '../src/views/homepage/HomePage';
+
+const ContextApp: React.FC = () => {
+ const { push } = useRouter();
+ const { loggedIn, admin, viewOnly, sessionAdmin } = useAccount();
+
+ if (loggedIn) {
+ if (admin === '' || viewOnly !== '' || sessionAdmin !== '') {
+ push('/home');
+ }
+ }
+
+ return !loggedIn && admin === '' ? : ;
+};
+
+export default ContextApp;
diff --git a/pages/login.tsx b/pages/login.tsx
new file mode 100644
index 00000000..e7cc75c0
--- /dev/null
+++ b/pages/login.tsx
@@ -0,0 +1,112 @@
+import React, { useState } from 'react';
+import { Card, Separation } from '../src/components/generic/Styled';
+import styled from 'styled-components';
+import { Section } from '../src/components/section/Section';
+import {
+ MultiButton,
+ SingleButton,
+} from '../src/components/buttons/multiButton/MultiButton';
+import { Text } from '../src/components/typography/Styled';
+import { Link } from '../src/components/link/Link';
+import { Auth } from '../src/components/auth';
+
+const ConnectTitle = styled.h1`
+ width: 100%;
+ text-align: center;
+`;
+
+const LoginView = () => {
+ const [isType, setIsType] = useState('login');
+ const [status, setStatus] = useState('none');
+
+ const renderButtons = () => (
+ <>
+
+ setIsType('login')}
+ >
+ Details
+
+ setIsType('connect')}
+ >
+ LndConnect
+
+ setIsType('btcpay')}
+ >
+ BTCPayServer
+
+ setIsType('qrcode')}
+ >
+ QR Code
+
+
+ >
+ );
+
+ const renderText = () => {
+ switch (isType) {
+ case 'btcpay':
+ return (
+ <>
+
+
+ To connect with your BTCPayServer instance you need the connection
+ JSON that they provide.
+
+ To access this JSON in your BPS instance, go to:
+
+ Server Settings > Services > gRPC server > Show QR Code > QR Code
+ Information > Open Config file
+
+ Then copy the complete JSON and paste it below.
+
+ >
+ );
+ case 'connect':
+ return (
+ <>
+
+
+ To connect via LNDConnect paste the LNDConnectUrl down below.
+ {' Find the url format specification '}
+
+ here.
+
+
+
+ >
+ );
+ default:
+ return null;
+ }
+ };
+
+ return (
+
+ {'How do you want to connect?'}
+
+ {status === 'none' && renderButtons()}
+ {status === 'none' && renderText()}
+ setStatus('none')}
+ />
+
+
+ );
+};
+
+export default LoginView;
diff --git a/pages/peers.tsx b/pages/peers.tsx
new file mode 100644
index 00000000..13d065f8
--- /dev/null
+++ b/pages/peers.tsx
@@ -0,0 +1,52 @@
+import React, { useState } from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import { useAccount } from '../src/context/AccountContext';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+} from '../src/components/generic/Styled';
+import { PeersCard } from '../src/views/peers/PeersCard';
+import { LoadingCard } from '../src/components/loading/LoadingCard';
+import { AddPeer } from '../src/views/peers/AddPeer';
+import { GET_PEERS } from '../src/graphql/query';
+
+const PeersView = () => {
+ const [indexOpen, setIndexOpen] = useState(0);
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data } = useQuery(GET_PEERS, {
+ variables: { auth },
+ });
+
+ if (loading || !data || !data.getPeers) {
+ return ;
+ }
+
+ return (
+ <>
+
+
+ Peers
+
+ {data.getPeers.map((peer: any, index: number) => (
+
+ ))}
+
+
+ >
+ );
+};
+
+export default PeersView;
diff --git a/pages/privacy.tsx b/pages/privacy.tsx
new file mode 100644
index 00000000..d4c86332
--- /dev/null
+++ b/pages/privacy.tsx
@@ -0,0 +1,171 @@
+import React from 'react';
+import { Section } from '../src/components/section/Section';
+import { themeColors, fontColors } from '../src/styles/Themes';
+import {
+ Title,
+ Question,
+ Text,
+ BulletPoint,
+} from '../src/components/typography/Styled';
+import { ContactSection } from '../src/views/homepage/Sections/ContactSection';
+
+import { Link } from '../src/components/link/Link';
+
+const PrivacyView = () => {
+ const props = { color: fontColors.blue2, underline: fontColors.blue2 };
+
+ const renderLinks = (terms: string, privacy: string) => (
+ <>
+
+ Privacy Policy
+ {' '}
+ and{' '}
+
+ Terms of Service
+
+ >
+ );
+
+ return (
+ <>
+
+
+ Last Updated: February 12, 2020
+
+
+
+ ThunderHub takes your privacy very seriously, and as a general rule,
+ will never collect unnecessary data from you without your explicit
+ consent. However, through using it, you will end up providing us with
+ some sensitive information, so we want to be explicit about that.
+
+
+ This Privacy Policy describes our policies and procedures regarding
+ our collection and use of your information in connection with your
+ access and use of{' '}
+
+ https://thunderhub.io
+ {' '}
+ (the "Site"). By using this service, you acknowledge and agree to this
+ Privacy Policy.
+
+
+ The terms "us," "we," or "our" refer to ThunderHub. The terms "you",
+ "your", or "user" refer to those accessing our site.
+
+
+
+ Collection, Storage, and Use of Information
+
+ ThunderHub's site is designed to collect as little information as
+ possible. The following outlines what is (and is not) collected, and
+ how it's handled. What we do collect from users is stored either
+ locally on the user's device, or using browser storage APIs that keep
+ inaccessible to us without user action. Sensitive information such as
+ authentication credentials are AES-256 encrypted and stored using a
+ password known only to the user.
+
+
+ Node Credentials - In order to communicate with your Lightning
+ node, we ask for sensitive information to do so. This information is
+ stored using your browser's own storage APIs, and is encrypted using a
+ password only known to the user. This information is used by the
+ server to connect to your node but is never recorded outside of the
+ user's browser storage.
+
+
+ Error Reporting / Usage Statistics - No information is
+ recorded. If information must be recorded further on, it will be with
+ explicit user consent from the user and efforts will be taken to keep
+ the information anonymous and private.
+
+
+ Personal information - Information such as your name, IP
+ address, email address, or browsing activity are never collected
+ without explicit consent. While there is no plan to ever ask for
+ permission to passively collect it, some interactions such as support
+ requests or bug reports may optionally ask for it.
+
+
+
+ Third Parties
+
+ The following is a list of third parties who may obtain user
+ information through use of the Site and App, as well as links to their
+ respective privacy policies. While we aim to only leverage third
+ parties that we find to be privacy-friendly, and try to keep them as
+ opt-in as possible, we are not liable for any privacy violations as a
+ result of the user's interaction with third party services. Any
+ services found to be exploiting our user's information will be removed
+ as quickly as possible.
+
+
+ Hosting - The following services are used for the hosting and
+ distrubtion of our site and application. Your information is subject
+ to their policies when interacting with them.
+
+
+ Github - Github's{' '}
+ {renderLinks(
+ 'https://help.github.com/en/articles/github-privacy-statement',
+ 'https://help.github.com/en/articles/github-terms-of-service'
+ )}
+
+
+ AWS - AWS's{' '}
+ {renderLinks(
+ 'https://aws.amazon.com/privacy/',
+ 'https://aws.amazon.com/service-terms/'
+ )}
+
+
+ APIs - For information that your node can't get alone, we link
+ to or use APIs in our application that leverage the following
+ services. Your information is subject to their policies when
+ interacting with them.
+
+
+ Earn.com's Bitcoin Fee API - Earn.com's{' '}
+ {renderLinks(
+ 'https://earn.com/privacy/',
+ 'https://earn.com/terms-of-use/'
+ )}
+
+
+ Blockchain Explorer and Price API - Blockchain's{' '}
+ {renderLinks(
+ 'https://www.blockchain.com/legal/privacy',
+ 'https://www.blockchain.com/legal/terms'
+ )}
+
+
+
+ Law Enforcement Purposes
+
+ If required by a subpoena or court order, we will share information to
+ law enforcement agencies in order to comply with legal requirements.
+ We will make reasonable efforts to notify any subjects of such
+ informational disclosure as is permitted by law.
+
+
+
+ Amendments
+
+ We may alter this Privacy Policy at its discretion at any time for any
+ or no reason. Any changes will include a corresponding “Last updated”
+ date shown at the top of this page and such changes will go in effect
+ immediately. Prominent notice of any changes may be posted on our
+ site, in our application, or on social media. Such notice is not
+ guaranteed and you should check for updates regularly. The latest
+ version of the Privacy Policy will be considered as superseding any
+ previous version unless otherwise noted.
+
+
+
+ >
+ );
+};
+
+export default PrivacyView;
diff --git a/pages/settings.tsx b/pages/settings.tsx
new file mode 100644
index 00000000..41011ab5
--- /dev/null
+++ b/pages/settings.tsx
@@ -0,0 +1,40 @@
+import React from 'react';
+import { SingleLine, SimpleButton } from '../src/components/generic/Styled';
+import styled from 'styled-components';
+import { InterfaceSettings } from '../src/views/settings/Interface';
+import { textColor } from '../src/styles/Themes';
+import { AccountSettings } from '../src/views/settings/Account';
+import { DangerView } from '../src/views/settings/Danger';
+import { CurrentSettings } from '../src/views/settings/Current';
+import { SyncSettings } from '../src/views/settings/Sync';
+
+export const ButtonRow = styled.div`
+ width: auto;
+ display: flex;
+`;
+
+export const SettingsLine = styled(SingleLine)`
+ margin: 8px 0;
+`;
+
+export const SettingsButton = styled(SimpleButton)`
+ padding: 8px;
+
+ &:hover {
+ border: 1px solid ${textColor};
+ }
+`;
+
+const SettingsView = () => {
+ return (
+ <>
+
+
+
+
+
+ >
+ );
+};
+
+export default SettingsView;
diff --git a/pages/terms.tsx b/pages/terms.tsx
new file mode 100644
index 00000000..9c916108
--- /dev/null
+++ b/pages/terms.tsx
@@ -0,0 +1,92 @@
+import React from 'react';
+import { Section } from '../src/components/section/Section';
+import { themeColors, fontColors } from '../src/styles/Themes';
+import { Title, Question, Text } from '../src/components/typography/Styled';
+import { ContactSection } from '../src/views/homepage/Sections/ContactSection';
+import { Link } from '../src/components/link/Link';
+
+const TermsView = () => {
+ const props = { color: fontColors.blue2, underline: fontColors.blue2 };
+
+ return (
+ <>
+
+
+ Last Updated: January 28, 2020
+
+
+ 1. Terms
+
+ ThunderHub ("us", "we", or "our") provides the website{' '}
+
+ https://thunderhub.io
+ {' '}
+ (the "Site"). Your use of or access to the site is subject to the
+ following Terms of Service (the "Agreement").
+
+
+
+ 2. Disclaimer
+
+ We are not responsible for any loss. LND, the ThunderHub website, and
+ some of the underlying Javascript libraries we use are under active
+ development. While every release is tested, there is always the
+ possibility something unexpected happens that causes your funds to be
+ lost. Please do not invest more than you are willing to lose. Please
+ be careful.
+
+
+
+ 3. Limitations
+
+ In no event shall ThunderHub be liable for any damages (including,
+ without limitation, damages for loss of data or profit, or due to
+ business interruption) arising out of the use or inability to use the
+ materials on our website, even if we or an authorized representative
+ of ours has been notified orally or in writing of the possibility of
+ such damage. Because some jurisdictions do not allow limitations on
+ implied warranties, or limitations of liability for consequential or
+ incidental damages, these limitations may not apply to you.
+
+
+
+ 4. Accuracy of Materials
+
+ The materials appearing on our website could include technical,
+ typographical, or photographic errors. We do not warrant that any of
+ the material on the website is accurate, complete or current. We may
+ make changes to the material contained on the website at any time
+ without notice. However we do not make any commitment to update the
+ material.
+
+
+
+ 5. Modifications
+
+ We may revise these terms of service for the website at any time
+ without notice. By using this website you are agreeing to be bound by
+ the then current version of these terms of service.
+
+
+
+ 6. Privacy Policy
+
+ Our Privacy Policy describes the way we do and do not collect, use,
+ store, and disclose your personal information, and is hereby
+ incorporated by this reference into these Terms. You agree to the
+ collection, use, storage, and disclosure of your data in accordance
+ with our{' '}
+
+ Privacy Policy
+
+ .
+
+
+
+ >
+ );
+};
+
+export default TermsView;
diff --git a/pages/tools.tsx b/pages/tools.tsx
new file mode 100644
index 00000000..ca4b55df
--- /dev/null
+++ b/pages/tools.tsx
@@ -0,0 +1,12 @@
+import React from 'react';
+import { BackupsView } from '../src/views/tools/backups/Backups';
+import { MessagesView } from '../src/views/tools/messages/Messages';
+
+const ToolsView = () => (
+ <>
+
+
+ >
+);
+
+export default ToolsView;
diff --git a/pages/trading.tsx b/pages/trading.tsx
new file mode 100644
index 00000000..f113e63f
--- /dev/null
+++ b/pages/trading.tsx
@@ -0,0 +1,149 @@
+import React, { useState } from 'react';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+ DarkSubTitle,
+ ResponsiveLine,
+} from '../src/components/generic/Styled';
+import { useQuery } from '@apollo/react-hooks';
+import { GET_HODL_OFFERS } from '../src/graphql/hodlhodl/query';
+import { LoadingCard } from '../src/components/loading/LoadingCard';
+import { OfferCard } from '../src/views/trading/OfferCard';
+import { OfferFilters } from '../src/views/trading/OfferFilters';
+import { toast } from 'react-toastify';
+import { Link } from '../src/components/link/Link';
+import { ColorButton } from '../src/components/buttons/colorButton/ColorButton';
+import { useRouter } from 'next/router';
+import { decode } from '../src/utils/Helpers';
+
+export interface QueryProps {
+ pagination: {
+ limit: number;
+ offset: number;
+ };
+ filters: {};
+ sort: {
+ by: string;
+ direction: string;
+ };
+}
+
+const defaultQuery: QueryProps = {
+ pagination: {
+ limit: 25,
+ offset: 0,
+ },
+ filters: {},
+ sort: {
+ by: '',
+ direction: '',
+ },
+};
+
+const TradingView = () => {
+ const { query } = useRouter();
+
+ let decoded: QueryProps = defaultQuery;
+ if (query?.filter) {
+ const { filter } = query;
+ try {
+ if (typeof filter === 'string') {
+ decoded = JSON.parse(decode(filter));
+ } else {
+ decoded = JSON.parse(decode(filter[0]));
+ }
+ } catch (error) {
+ toast.error('Incorrect url.');
+ }
+ }
+
+ const queryObject = {
+ ...defaultQuery,
+ ...decoded,
+ };
+
+ const [indexOpen, setIndexOpen] = useState(0);
+ const [page, setPage] = useState(1);
+ const [fetching, setFetching] = useState(false);
+
+ const { data, loading, fetchMore, error } = useQuery(GET_HODL_OFFERS, {
+ variables: { filter: JSON.stringify(queryObject) },
+ onError: () => {},
+ });
+
+ if (error) {
+ return (
+
+ P2P Trading
+ Failed to connect with HodlHodl.
+
+ );
+ }
+
+ if (loading || !data || !data.getOffers) {
+ return ;
+ }
+
+ const amountOfOffers = data.getOffers.length;
+ const {
+ pagination: { limit },
+ } = queryObject;
+
+ return (
+
+
+ P2P Trading
+
+ Powered by HodlHodl
+
+
+
+
+
+
+ {amountOfOffers <= 0 && No Offers Found }
+ {data.getOffers.map((offer: any, index: number) => (
+
+ ))}
+
+ {amountOfOffers > 0 && amountOfOffers === limit * page && (
+ {
+ setFetching(true);
+
+ fetchMore({
+ variables: {
+ filter: JSON.stringify({
+ ...queryObject,
+ pagination: { limit, offset: limit * page },
+ }),
+ },
+ updateQuery: (prev, { fetchMoreResult: result }) => {
+ if (!result) return prev;
+
+ setFetching(false);
+ setPage(prev => prev + 1);
+ return {
+ getOffers: [...prev.getOffers, ...result.getOffers],
+ };
+ },
+ });
+ }}
+ >
+ Show More
+
+ )}
+
+ );
+};
+
+export default TradingView;
diff --git a/pages/transactions.tsx b/pages/transactions.tsx
new file mode 100644
index 00000000..c1c2b48d
--- /dev/null
+++ b/pages/transactions.tsx
@@ -0,0 +1,114 @@
+import React, { useState, useEffect } from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import { GET_RESUME } from '../src/graphql/query';
+import {
+ Card,
+ CardWithTitle,
+ SubTitle,
+} from '../src/components/generic/Styled';
+import { InvoiceCard } from '../src/views/transactions/InvoiceCard';
+import { useAccount } from '../src/context/AccountContext';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../src/utils/error';
+import { PaymentsCard } from '../src/views/transactions/PaymentsCards';
+import { LoadingCard } from '../src/components/loading/LoadingCard';
+import { ColorButton } from '../src/components/buttons/colorButton/ColorButton';
+import { FlowBox } from '../src/views/home/reports/flow';
+
+const TransactionsView = () => {
+ const [indexOpen, setIndexOpen] = useState(0);
+ const [token, setToken] = useState('');
+ const [fetching, setFetching] = useState(false);
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data, fetchMore } = useQuery(GET_RESUME, {
+ variables: { auth, token: '' },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ useEffect(() => {
+ if (!loading && data && data.getResume && data.getResume.token) {
+ setToken(data.getResume.token);
+ }
+ }, [data, loading]);
+
+ if (loading || !data || !data.getResume) {
+ return ;
+ }
+
+ const resumeList = JSON.parse(data.getResume.resume);
+
+ return (
+ <>
+
+
+ Transactions
+
+ {resumeList.map((entry: any, index: number) => {
+ if (entry.type === 'invoice') {
+ return (
+
+ );
+ }
+ return (
+
+ );
+ })}
+ {
+ setFetching(true);
+ fetchMore({
+ variables: { auth, token },
+ updateQuery: (prev, { fetchMoreResult: result }) => {
+ if (!result) return prev;
+ const newToken = result.getResume.token || '';
+ const prevEntries = JSON.parse(prev.getResume.resume);
+ const newEntries = JSON.parse(result.getResume.resume);
+
+ const allTransactions = newToken
+ ? [...prevEntries, ...newEntries]
+ : prevEntries;
+
+ setFetching(false);
+ return {
+ getResume: {
+ token: newToken,
+ resume: JSON.stringify(allTransactions),
+ __typename: 'getResumeType',
+ },
+ };
+ },
+ });
+ }}
+ >
+ Show More
+
+
+
+ >
+ );
+};
+
+export default TransactionsView;
diff --git a/client/public/favicon.ico b/public/favicon.ico
similarity index 100%
rename from client/public/favicon.ico
rename to public/favicon.ico
diff --git a/client/src/assets/fonts/Manrope/otf/Manrope-Bold.otf b/public/fonts/Manrope-Bold.otf
similarity index 100%
rename from client/src/assets/fonts/Manrope/otf/Manrope-Bold.otf
rename to public/fonts/Manrope-Bold.otf
diff --git a/client/src/assets/fonts/Manrope/otf/Manrope-ExtraBold.otf b/public/fonts/Manrope-ExtraBold.otf
similarity index 100%
rename from client/src/assets/fonts/Manrope/otf/Manrope-ExtraBold.otf
rename to public/fonts/Manrope-ExtraBold.otf
diff --git a/client/src/assets/fonts/Manrope/otf/Manrope-ExtraLight.otf b/public/fonts/Manrope-ExtraLight.otf
similarity index 100%
rename from client/src/assets/fonts/Manrope/otf/Manrope-ExtraLight.otf
rename to public/fonts/Manrope-ExtraLight.otf
diff --git a/client/src/assets/fonts/Manrope/otf/Manrope-Light.otf b/public/fonts/Manrope-Light.otf
similarity index 100%
rename from client/src/assets/fonts/Manrope/otf/Manrope-Light.otf
rename to public/fonts/Manrope-Light.otf
diff --git a/client/src/assets/fonts/Manrope/otf/Manrope-Medium.otf b/public/fonts/Manrope-Medium.otf
similarity index 100%
rename from client/src/assets/fonts/Manrope/otf/Manrope-Medium.otf
rename to public/fonts/Manrope-Medium.otf
diff --git a/client/src/assets/fonts/Manrope/otf/Manrope-Regular.otf b/public/fonts/Manrope-Regular.otf
similarity index 100%
rename from client/src/assets/fonts/Manrope/otf/Manrope-Regular.otf
rename to public/fonts/Manrope-Regular.otf
diff --git a/client/src/assets/fonts/Manrope/otf/Manrope-SemiBold.otf b/public/fonts/Manrope-SemiBold.otf
similarity index 100%
rename from client/src/assets/fonts/Manrope/otf/Manrope-SemiBold.otf
rename to public/fonts/Manrope-SemiBold.otf
diff --git a/client/src/assets/images/Channels.png b/public/static/images/Channels.png
similarity index 100%
rename from client/src/assets/images/Channels.png
rename to public/static/images/Channels.png
diff --git a/client/src/assets/images/Forwards.png b/public/static/images/Forwards.png
similarity index 100%
rename from client/src/assets/images/Forwards.png
rename to public/static/images/Forwards.png
diff --git a/client/src/assets/images/MoshingDoodle.svg b/public/static/images/MoshingDoodle.svg
similarity index 100%
rename from client/src/assets/images/MoshingDoodle.svg
rename to public/static/images/MoshingDoodle.svg
diff --git a/client/src/assets/images/NightLight.png b/public/static/images/NightLight.png
similarity index 100%
rename from client/src/assets/images/NightLight.png
rename to public/static/images/NightLight.png
diff --git a/client/src/assets/images/Reports.png b/public/static/images/Reports.png
similarity index 100%
rename from client/src/assets/images/Reports.png
rename to public/static/images/Reports.png
diff --git a/client/src/assets/images/ThunderHub.svg b/public/static/images/ThunderHub.svg
similarity index 100%
rename from client/src/assets/images/ThunderHub.svg
rename to public/static/images/ThunderHub.svg
diff --git a/client/src/assets/images/Transactions.png b/public/static/images/Transactions.png
similarity index 100%
rename from client/src/assets/images/Transactions.png
rename to public/static/images/Transactions.png
diff --git a/server/.dockerignore b/server/.dockerignore
deleted file mode 100644
index 88249539..00000000
--- a/server/.dockerignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules
-.git
-.gitignore
\ No newline at end of file
diff --git a/server/.ebignore b/server/.ebignore
deleted file mode 100644
index 7af7f047..00000000
--- a/server/.ebignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/node_modules
-.env
\ No newline at end of file
diff --git a/server/.gitignore b/server/.gitignore
deleted file mode 100644
index f703402c..00000000
--- a/server/.gitignore
+++ /dev/null
@@ -1,29 +0,0 @@
-# dependencies
-/node_modules
-/.pnp
-.pnp.js
-
-# testing
-/coverage
-
-# production
-/build
-
-#webpack
-/dist
-
-# misc
-.DS_Store
-.env
-.env.local
-.env.development.local
-.env.test.local
-.env.production.local
-
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-# Elastic Beanstalk Files
-.elasticbeanstalk/*
-!.elasticbeanstalk/*.cfg.yml
-!.elasticbeanstalk/*.global.yml
diff --git a/server/.npmrc b/server/.npmrc
deleted file mode 100644
index f3808450..00000000
--- a/server/.npmrc
+++ /dev/null
@@ -1,2 +0,0 @@
-# Force npm to run node-gyp also as root, preventing permission denied errors in AWS with npm@5
-unsafe-perm=true
\ No newline at end of file
diff --git a/server/.prettierrc b/server/.prettierrc
deleted file mode 100644
index 17c75dc8..00000000
--- a/server/.prettierrc
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "printWidth": 80,
- "trailingComma": "all",
- "tabWidth": 4,
- "semi": true,
- "singleQuote": true
-}
diff --git a/server/CHANGELOG.md b/server/CHANGELOG.md
deleted file mode 100644
index ff4876e1..00000000
--- a/server/CHANGELOG.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [0.2.2](https://github.com/apotdevin/thunderhub/compare/v0.2.1...v0.2.2) (2020-04-09)
-
-### Bug Fixes
-
-- allow insecure headers for hodlhodl ([ad91160](https://github.com/apotdevin/thunderhub/commit/ad911602568ea438037cb0afa619304838947183))
diff --git a/server/Dockerfile b/server/Dockerfile
deleted file mode 100644
index 11d98526..00000000
--- a/server/Dockerfile
+++ /dev/null
@@ -1,20 +0,0 @@
-FROM node:11-alpine
-
-WORKDIR /usr/src/server
-
-RUN apk update && apk upgrade \
- && apk --no-cache add --virtual builds-deps build-base python \
- && yarn add node-gyp node-pre-gyp
-
-COPY package.json /usr/src/client
-COPY yarn.lock /usr/src/client
-RUN yarn install --production=true
-
-COPY . /usr/src/server
-RUN yarn install --production=true
-RUN yarn global add webpack
-RUN yarn build
-
-EXPOSE 3001
-
-CMD ["npm", "start"]
\ No newline at end of file
diff --git a/server/nodemon.json b/server/nodemon.json
deleted file mode 100644
index c67afbbc..00000000
--- a/server/nodemon.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "ignore": ["src"],
- "watch": ["dist/"]
-}
diff --git a/server/package.json b/server/package.json
deleted file mode 100644
index 50757b52..00000000
--- a/server/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "name": "@thunderhub/server",
- "version": "0.2.2",
- "description": "",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "build": "webpack --config webpack.production.js",
- "build:dev": "webpack --config webpack.development.js",
- "start": "node --insecure-http-parser dist/server",
- "dev": "nodemon --insecure-http-parser dist/server",
- "deploy": "yarn build && eb deploy",
- "precommit": "pretty-quick --staged"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/apotdevin/thunderhub.git"
- },
- "keywords": [],
- "author": "apotdevin",
- "license": "MIT",
- "dependencies": {
- "@types/graphql-depth-limit": "^1.1.2",
- "@types/graphql-iso-date": "^3.3.3",
- "@types/node-fetch": "^2.5.5",
- "@types/underscore": "^1.9.4",
- "apollo-server": "^2.11.0",
- "date-fns": "^2.0.0-beta.5",
- "dotenv": "^8.2.0",
- "graphql-depth-limit": "^1.1.0",
- "graphql-iso-date": "^3.6.1",
- "graphql-rate-limit": "^2.0.1",
- "ln-service": "^47.16.0",
- "underscore": "^1.10.2",
- "winston": "^3.2.1"
- },
- "devDependencies": {
- "@types/webpack-env": "^1.15.1",
- "clean-webpack-plugin": "^3.0.0",
- "ts-loader": "^6.2.2",
- "typescript": "^3.8.3",
- "webpack": "^4.42.1",
- "webpack-cli": "^3.3.11",
- "webpack-merge": "^4.2.2",
- "webpack-node-externals": "^1.7.2",
- "webpack-shell-plugin": "^0.5.0"
- }
-}
diff --git a/server/src/helpers/helpers.ts b/server/src/helpers/helpers.ts
deleted file mode 100644
index fd0516bf..00000000
--- a/server/src/helpers/helpers.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { authenticatedLndGrpc } from 'ln-service';
-import { envConfig } from '../utils/envConfig';
-
-export const getIp = (req: any) => {
- if (!req || !req.headers) {
- return '';
- }
- const forwarded = req.headers['x-forwarded-for'];
- const before = forwarded
- ? forwarded.split(/, /)[0]
- : req.connection.remoteAddress;
- const ip = envConfig.env === 'development' ? '1.2.3.4' : before;
- return ip;
-};
-
-export const getAuthLnd = (auth: {
- cert: string;
- macaroon: string;
- host: string;
-}) => {
- const encodedCert = auth.cert || '';
- const encodedMacaroon = auth.macaroon || '';
- const socket = auth.host || '';
-
- const cert = encodedCert;
- const macaroon = encodedMacaroon;
-
- const params =
- encodedCert !== ''
- ? {
- cert,
- macaroon,
- socket,
- }
- : { macaroon, socket };
-
- const { lnd } = authenticatedLndGrpc(params);
-
- return lnd;
-};
-
-export const getErrorDetails = (error: any[]): string => {
- let details = '';
- if (error.length > 2) {
- if (error[2].err) {
- details = error[2].err.details;
- } else if (error[2].details) {
- details = error[2].details;
- }
- }
-
- return details;
-};
-
-export const getErrorMsg = (error: any[]): string => {
- const code = error[0];
- const msg = error[1];
-
- let details = getErrorDetails(error);
-
- return JSON.stringify({ code, msg, details });
-};
diff --git a/server/src/helpers/hodlHelpers.ts b/server/src/helpers/hodlHelpers.ts
deleted file mode 100644
index a655d402..00000000
--- a/server/src/helpers/hodlHelpers.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-export const getHodlParams = (params: any): string => {
- let paramString = '?';
-
- for (const key in params) {
- if (params.hasOwnProperty(key)) {
- const element = params[key];
-
- for (const subKey in element) {
- if (element.hasOwnProperty(subKey)) {
- const subElement = element[subKey];
- paramString = `${paramString}&${key}[${subKey}]=${subElement}`;
- }
- }
- }
- }
-
- return paramString;
-};
diff --git a/server/src/helpers/logger.ts b/server/src/helpers/logger.ts
deleted file mode 100644
index 6f0015ac..00000000
--- a/server/src/helpers/logger.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { createLogger, format, transports } from 'winston';
-import path from 'path';
-import { envConfig } from '../utils/envConfig';
-
-const combinedFormat =
- envConfig.env === 'development'
- ? format.combine(
- format.label({
- label: path.basename(
- process && process.mainModule
- ? process.mainModule.filename
- : '',
- ),
- }),
- format.splat(),
- format.colorize(),
- format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
- format.printf(
- (info: any) =>
- `${info.timestamp} ${info.level} [${info.label}]: ${info.message}`,
- ),
- )
- : format.combine(
- format.label({
- label: path.basename(
- process && process.mainModule
- ? process.mainModule.filename
- : '',
- ),
- }),
- format.splat(),
- format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
- format.printf(
- (info: any) =>
- `${info.timestamp} ${info.level} [${info.label}]: ${info.message}`,
- ),
- );
-
-export const logger = createLogger({
- level: envConfig.logLevel,
- format: combinedFormat,
- transports: [new transports.Console()],
-});
diff --git a/server/src/helpers/rateLimiter.ts b/server/src/helpers/rateLimiter.ts
deleted file mode 100644
index e8d060ac..00000000
--- a/server/src/helpers/rateLimiter.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { getGraphQLRateLimiter } from 'graphql-rate-limit';
-import { RateConfig } from '../utils/rateLimitConfig';
-
-const rateLimiter = getGraphQLRateLimiter({
- identifyContext: (ctx: string) => ctx,
- formatError: () => 'Rate Limit Reached',
-});
-
-export const requestLimiter = async (rate: string, field: string) => {
- if (!RateConfig[field]) throw new Error('Invalid Rate Field');
- const { max, window } = RateConfig[field];
- const errorMessage = await rateLimiter(
- {
- parent: rate,
- args: {},
- context: rate,
- info: { fieldName: field } as any,
- },
- { max, window },
- );
- if (errorMessage) throw new Error(errorMessage);
-};
diff --git a/server/src/main.ts b/server/src/main.ts
deleted file mode 100644
index d9cf2163..00000000
--- a/server/src/main.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { ApolloServer } from 'apollo-server';
-import { thunderHubSchema } from './schemas';
-import { logger } from './helpers/logger';
-import { getIp } from './helpers/helpers';
-import depthLimit from 'graphql-depth-limit';
-import { envConfig } from './utils/envConfig';
-
-const server = new ApolloServer({
- schema: thunderHubSchema,
- context: async ({ req }: any) => {
- const ip = getIp(req);
- return { ip };
- },
- validationRules: [
- depthLimit(2, { ignore: [/_trusted$/, 'idontcare', 'whatever'] }),
- ],
-});
-
-server.listen({ port: envConfig.port }).then(({ url }: any) => {
- logger.info(`Server ready at ${url}`);
-});
-
-if (module.hot) {
- module.hot.accept();
- module.hot.dispose(() => server.stop());
-}
diff --git a/server/src/schemas/mutations/channels/closeChannel.ts b/server/src/schemas/mutations/channels/closeChannel.ts
deleted file mode 100644
index 0bc52bbc..00000000
--- a/server/src/schemas/mutations/channels/closeChannel.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { closeChannel as lnCloseChannel } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import {
- GraphQLBoolean,
- GraphQLString,
- GraphQLInt,
- GraphQLNonNull,
-} from 'graphql';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { CloseChannelType } from '../../types/MutationType';
-
-interface CloseChannelProps {
- transaction_id: string;
- transaction_vout: string;
-}
-
-export const closeChannel = {
- type: CloseChannelType,
- args: {
- ...defaultParams,
- id: { type: new GraphQLNonNull(GraphQLString) },
- forceClose: { type: GraphQLBoolean },
- targetConfirmations: { type: GraphQLInt },
- tokensPerVByte: { type: GraphQLInt },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'closeChannel');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const info: CloseChannelProps = await lnCloseChannel({
- lnd,
- id: params.id,
- target_confirmations: params.targetConfirmations,
- tokens_per_vbyte: params.tokensPerVByte,
- });
- return {
- transactionId: info.transaction_id,
- transactionOutputIndex: info.transaction_vout,
- };
- } catch (error) {
- params.logger && logger.error('Error closing channel: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/mutations/channels/openChannel.ts b/server/src/schemas/mutations/channels/openChannel.ts
deleted file mode 100644
index e112f567..00000000
--- a/server/src/schemas/mutations/channels/openChannel.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { openChannel as lnOpenChannel } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import {
- GraphQLBoolean,
- GraphQLString,
- GraphQLInt,
- GraphQLNonNull,
-} from 'graphql';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { OpenChannelType } from '../../types/MutationType';
-
-interface OpenChannelProps {
- transaction_id: string;
- transaction_vout: string;
-}
-
-export const openChannel = {
- type: OpenChannelType,
- args: {
- ...defaultParams,
- amount: { type: new GraphQLNonNull(GraphQLInt) },
- partnerPublicKey: { type: new GraphQLNonNull(GraphQLString) },
- tokensPerVByte: { type: GraphQLInt },
- isPrivate: { type: GraphQLBoolean },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'openChannel');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const info: OpenChannelProps = await lnOpenChannel({
- lnd,
- is_private: params.isPrivate,
- local_tokens: params.amount,
- partner_public_key: params.partnerPublicKey,
- chain_fee_tokens_per_vbyte: params.tokensPerVByte,
- });
- return {
- transactionId: info.transaction_id,
- transactionOutputIndex: info.transaction_vout,
- };
- } catch (error) {
- params.logger && logger.error('Error opening channel: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/mutations/channels/updateFees.ts b/server/src/schemas/mutations/channels/updateFees.ts
deleted file mode 100644
index 6077fa30..00000000
--- a/server/src/schemas/mutations/channels/updateFees.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { updateRoutingFees } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLBoolean, GraphQLString, GraphQLInt } from 'graphql';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-export const updateFees = {
- type: GraphQLBoolean,
- args: {
- ...defaultParams,
- transactionId: { type: GraphQLString },
- transactionVout: { type: GraphQLInt },
- baseFee: { type: GraphQLInt },
- feeRate: { type: GraphQLInt },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'updateFees');
-
- const {
- auth,
- transactionId,
- transactionVout,
- baseFee,
- feeRate,
- } = params;
-
- const lnd = getAuthLnd(auth);
-
- if (!baseFee && !feeRate) {
- throw new Error('No Base Fee or Fee Rate to update channels');
- }
-
- const props = {
- lnd,
- transaction_id: transactionId,
- transaction_vout: transactionVout,
- ...(params.baseFee && { base_fee_tokens: params.baseFee }),
- ...(params.feeRate && { fee_rate: params.feeRate }),
- };
-
- try {
- await updateRoutingFees(props);
- return true;
- } catch (error) {
- params.logger &&
- logger.error('Error updating routing fees: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/mutations/invoices/createInvoice.ts b/server/src/schemas/mutations/invoices/createInvoice.ts
deleted file mode 100644
index 7bd60651..00000000
--- a/server/src/schemas/mutations/invoices/createInvoice.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { createInvoice as createInvoiceRequest } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLNonNull, GraphQLInt } from 'graphql';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { InvoiceType } from '../../types/MutationType';
-
-interface InvoiceProps {
- chain_address: string;
- created_at: string;
- description: string;
- id: string;
- request: string;
- secret: string;
- tokens: number;
-}
-
-export const createInvoice = {
- type: InvoiceType,
- args: {
- ...defaultParams,
- amount: { type: new GraphQLNonNull(GraphQLInt) },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'createInvoice');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const invoice: InvoiceProps = await createInvoiceRequest({
- lnd,
- tokens: params.amount,
- });
-
- return {
- chainAddress: invoice.chain_address,
- createdAt: invoice.created_at,
- description: invoice.description,
- id: invoice.id,
- request: invoice.request,
- secret: invoice.secret,
- tokens: invoice.tokens,
- };
- } catch (error) {
- params.logger && logger.error('Error creating invoice: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/mutations/invoices/decode.ts b/server/src/schemas/mutations/invoices/decode.ts
deleted file mode 100644
index 503dbf5d..00000000
--- a/server/src/schemas/mutations/invoices/decode.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import { decodePaymentRequest } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLString, GraphQLNonNull } from 'graphql';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { DecodeType } from '../../types/MutationType';
-
-interface RouteProps {
- base_fee_mtokens: string;
- channel: string;
- cltv_delta: number;
- fee_rate: number;
- public_key: string;
-}
-
-interface DecodeProps {
- chain_address: string;
- cltv_delta: number;
- description: string;
- description_hash: string;
- destination: string;
- expires_at: string;
- id: string;
- routes: RouteProps[][];
- tokens: number;
-}
-
-export const decodeRequest = {
- type: DecodeType,
- args: {
- ...defaultParams,
- request: { type: new GraphQLNonNull(GraphQLString) },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'decode');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const decode: DecodeProps = await decodePaymentRequest({
- lnd,
- request: params.request,
- });
-
- const routes = decode.routes.map((route) => {
- route.map((nodeChannel) => {
- const {
- base_fee_mtokens,
- channel,
- cltv_delta,
- fee_rate,
- public_key,
- } = nodeChannel;
- return {
- baseFeeTokens: base_fee_mtokens,
- channel,
- cltvDelta: cltv_delta,
- feeRate: fee_rate,
- publicKey: public_key,
- };
- });
- });
-
- const {
- chain_address,
- cltv_delta,
- description,
- description_hash,
- destination,
- expires_at,
- id,
- tokens,
- } = decode;
-
- return {
- chainAddress: chain_address,
- cltvDelta: cltv_delta,
- description,
- descriptionHash: description_hash,
- destination,
- expiresAt: expires_at,
- id,
- routes,
- tokens,
- };
- } catch (error) {
- params.logger && logger.error('Error paying request: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/mutations/invoices/parsePayment.ts b/server/src/schemas/mutations/invoices/parsePayment.ts
deleted file mode 100644
index d54eb436..00000000
--- a/server/src/schemas/mutations/invoices/parsePayment.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import { parsePaymentRequest } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLString, GraphQLNonNull } from 'graphql';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { ParsePaymentType } from '../../types/MutationType';
-
-interface RouteProps {
- base_fee_mtokens: string;
- channel: string;
- cltv_delta: number;
- fee_rate: number;
- public_key: string;
-}
-
-interface RequestProps {
- chain_addresses: string[];
- cltv_delta: number;
- created_at: string;
- description: string;
- description_hash: string;
- destination: string;
- expires_at: string;
- id: string;
- is_expired: string;
- mtokens: string;
- network: string;
- routes: RouteProps[];
- tokens: number;
-}
-
-export const parsePayment = {
- type: ParsePaymentType,
- args: {
- ...defaultParams,
- request: { type: new GraphQLNonNull(GraphQLString) },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'parsePayment');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const request: RequestProps = await parsePaymentRequest({
- lnd,
- request: params.request,
- });
-
- const routes = request.routes.map((route) => {
- return {
- mTokenFee: route.base_fee_mtokens,
- channel: route.channel,
- cltvDelta: route.cltv_delta,
- feeRate: route.fee_rate,
- publicKey: route.public_key,
- };
- });
-
- return {
- chainAddresses: request.chain_addresses,
- cltvDelta: request.cltv_delta,
- createdAt: request.created_at,
- description: request.description,
- descriptionHash: request.description_hash,
- destination: request.destination,
- expiresAt: request.expires_at,
- id: request.id,
- isExpired: request.is_expired,
- mTokens: request.mtokens,
- network: request.network,
- routes: routes,
- tokens: request.tokens,
- };
- } catch (error) {
- params.logger && logger.error('Error decoding request: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/mutations/invoices/pay.ts b/server/src/schemas/mutations/invoices/pay.ts
deleted file mode 100644
index dc89e2b8..00000000
--- a/server/src/schemas/mutations/invoices/pay.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import { pay as payRequest } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLString, GraphQLNonNull } from 'graphql';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { PayType } from '../../types/MutationType';
-
-interface HopProps {
- channel: string;
- channel_capacity: number;
- fee_mtokens: string;
- forward_mtokens: string;
- timeout: number;
-}
-
-interface RequestProps {
- fee: number;
- fee_mtokens: string;
- hops: HopProps[];
- id: string;
- is_confirmed: boolean;
- is_outgoing: boolean;
- mtokens: string;
- secret: string;
- tokens: number;
-}
-
-// TODO: Allow path payments as well
-export const pay = {
- type: PayType,
- args: {
- ...defaultParams,
- request: { type: new GraphQLNonNull(GraphQLString) },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'pay');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const payment: RequestProps = await payRequest({
- lnd,
- request: params.request,
- });
-
- const hops = payment.hops.map((hop) => {
- return {
- channel: hop.channel,
- channelCapacity: hop.channel_capacity,
- mTokenFee: hop.fee_mtokens,
- forwardMTokens: hop.forward_mtokens,
- timeout: hop.timeout,
- };
- });
-
- return {
- fee: payment.fee,
- feeMTokens: payment.fee_mtokens,
- hops: hops,
- id: payment.id,
- isConfirmed: payment.is_confirmed,
- isOutgoing: payment.is_outgoing,
- mtokens: payment.mtokens,
- secret: payment.secret,
- tokens: payment.tokens,
- };
- } catch (error) {
- params.logger && logger.error('Error paying request: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/mutations/invoices/payViaRoute.ts b/server/src/schemas/mutations/invoices/payViaRoute.ts
deleted file mode 100644
index 911de8fc..00000000
--- a/server/src/schemas/mutations/invoices/payViaRoute.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { GraphQLNonNull, GraphQLBoolean, GraphQLString } from 'graphql';
-import { payViaRoutes, createInvoice } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-export const payViaRoute = {
- type: GraphQLBoolean,
- args: {
- ...defaultParams,
- route: { type: new GraphQLNonNull(GraphQLString) },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'payViaRoute');
-
- const lnd = getAuthLnd(params.auth);
-
- let route;
- try {
- route = JSON.parse(params.route);
- } catch (error) {
- params.logger && logger.error('Corrupt route json: %o', error);
- throw new Error('Corrupt Route JSON');
- }
-
- const { id } = await createInvoice({
- lnd,
- tokens: params.tokens,
- description: 'Balancing Channel',
- }).catch((error: any) => {
- params.logger && logger.error('Error getting invoice: %o', error);
- throw new Error(getErrorMsg(error));
- });
-
- await payViaRoutes({ lnd, routes: [route], id }).catch((error: any) => {
- params.logger && logger.error('Error making payment: %o', error);
- throw new Error(getErrorMsg(error));
- });
-
- return true;
- },
-};
diff --git a/server/src/schemas/mutations/onchain/getAddress.ts b/server/src/schemas/mutations/onchain/getAddress.ts
deleted file mode 100644
index 91e7b933..00000000
--- a/server/src/schemas/mutations/onchain/getAddress.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { createChainAddress } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLString, GraphQLBoolean } from 'graphql';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-interface AddressProps {
- address: string;
-}
-
-export const createAddress = {
- type: GraphQLString,
- args: {
- ...defaultParams,
- nested: { type: GraphQLBoolean },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'getAddress');
-
- const lnd = getAuthLnd(params.auth);
-
- const format = params.nested ? 'np2wpkh' : 'p2wpkh';
-
- try {
- const address: AddressProps = await createChainAddress({
- lnd,
- is_unused: true,
- format,
- });
-
- return address.address;
- } catch (error) {
- params.logger && logger.error('Error creating address: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/mutations/onchain/sendToAddress.ts b/server/src/schemas/mutations/onchain/sendToAddress.ts
deleted file mode 100644
index 2e5f902b..00000000
--- a/server/src/schemas/mutations/onchain/sendToAddress.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import { sendToChainAddress } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import {
- GraphQLNonNull,
- GraphQLString,
- GraphQLBoolean,
- GraphQLInt,
-} from 'graphql';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { SendToType } from '../../types/MutationType';
-
-interface SendProps {
- confirmation_count: number;
- id: string;
- is_confirmed: boolean;
- is_outgoing: boolean;
- tokens: number;
-}
-
-export const sendToAddress = {
- type: SendToType,
- args: {
- ...defaultParams,
- address: { type: new GraphQLNonNull(GraphQLString) },
- tokens: { type: GraphQLInt },
- fee: { type: GraphQLInt },
- target: { type: GraphQLInt },
- sendAll: { type: GraphQLBoolean },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'sendToAddress');
-
- const lnd = getAuthLnd(params.auth);
-
- const props = params.fee
- ? { fee_tokens_per_vbyte: params.fee }
- : params.target
- ? { target_confirmations: params.target }
- : {};
-
- const sendAll = params.sendAll ? { is_send_all: true } : {};
-
- try {
- const send: SendProps = await sendToChainAddress({
- lnd,
- address: params.address,
- tokens: params.tokens,
- ...props,
- ...sendAll,
- });
-
- return {
- confirmationCount: send.confirmation_count,
- id: send.id,
- isConfirmed: send.is_confirmed,
- isOutgoing: send.is_outgoing,
- tokens: send.tokens,
- };
- } catch (error) {
- params.logger && logger.error('Error creating address: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/mutations/peers/addPeer.ts b/server/src/schemas/mutations/peers/addPeer.ts
deleted file mode 100644
index 9f5b97d9..00000000
--- a/server/src/schemas/mutations/peers/addPeer.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { addPeer as addLnPeer } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLBoolean, GraphQLString, GraphQLNonNull } from 'graphql';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-export const addPeer = {
- type: GraphQLBoolean,
- args: {
- ...defaultParams,
- publicKey: { type: new GraphQLNonNull(GraphQLString) },
- socket: { type: new GraphQLNonNull(GraphQLString) },
- isTemporary: { type: GraphQLBoolean },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'addPeer');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const success: boolean = await addLnPeer({
- lnd,
- public_key: params.publicKey,
- socket: params.socket,
- is_temporary: params.isTemporary,
- });
- return success;
- } catch (error) {
- params.logger && logger.error('Error adding peer: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/mutations/peers/removePeer.ts b/server/src/schemas/mutations/peers/removePeer.ts
deleted file mode 100644
index 8d566c44..00000000
--- a/server/src/schemas/mutations/peers/removePeer.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { removePeer as removeLnPeer } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLBoolean, GraphQLString, GraphQLNonNull } from 'graphql';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-export const removePeer = {
- type: GraphQLBoolean,
- args: {
- ...defaultParams,
- publicKey: { type: new GraphQLNonNull(GraphQLString) },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'removePeer');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const success: boolean = await removeLnPeer({
- lnd,
- public_key: params.publicKey,
- });
- return success;
- } catch (error) {
- params.logger && logger.error('Error removing peer: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/backup/getBackups.ts b/server/src/schemas/query/backup/getBackups.ts
deleted file mode 100644
index 20de141a..00000000
--- a/server/src/schemas/query/backup/getBackups.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { getBackups as getLnBackups } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLString } from 'graphql';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-export const getBackups = {
- type: GraphQLString,
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'getBackups');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const backups = await getLnBackups({
- lnd,
- });
- return JSON.stringify(backups);
- } catch (error) {
- params.logger && logger.error('Error getting backups: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/backup/recoverFunds.ts b/server/src/schemas/query/backup/recoverFunds.ts
deleted file mode 100644
index f2cbae47..00000000
--- a/server/src/schemas/query/backup/recoverFunds.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { recoverFundsFromChannels } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLNonNull, GraphQLString, GraphQLBoolean } from 'graphql';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-interface BackupProps {
- backup: string;
-}
-
-export const recoverFunds = {
- type: GraphQLBoolean,
- args: {
- ...defaultParams,
- backup: { type: new GraphQLNonNull(GraphQLString) },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'recoverFunds');
-
- const lnd = getAuthLnd(params.auth);
-
- let backupObj: BackupProps = { backup: '' };
- try {
- backupObj = JSON.parse(params.backup);
- } catch (error) {
- params.logger && logger.error('Corrupt backup file: %o', error);
- throw new Error('Corrupt backup file');
- }
-
- const { backup } = backupObj;
-
- try {
- await recoverFundsFromChannels({
- lnd,
- backup,
- });
- return true;
- } catch (error) {
- params.logger &&
- logger.error('Error recovering funds from channels: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/backup/verifyBackups.ts b/server/src/schemas/query/backup/verifyBackups.ts
deleted file mode 100644
index b473e9da..00000000
--- a/server/src/schemas/query/backup/verifyBackups.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { verifyBackups as verifyLnBackups } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLNonNull, GraphQLString, GraphQLBoolean } from 'graphql';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-interface BackupProps {
- backup: string;
- channels: {}[];
-}
-
-export const verifyBackups = {
- type: GraphQLBoolean,
- args: {
- ...defaultParams,
- backup: { type: new GraphQLNonNull(GraphQLString) },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'verifyBackups');
-
- const lnd = getAuthLnd(params.auth);
-
- let backupObj: BackupProps = { backup: '', channels: [] };
- try {
- backupObj = JSON.parse(params.backup);
- } catch (error) {
- params.logger && logger.error('Corrupt backup file: %o', error);
- throw new Error('Corrupt backup file');
- }
-
- const { backup, channels } = backupObj;
-
- try {
- const { is_valid } = await verifyLnBackups({
- lnd,
- backup,
- channels,
- });
- return is_valid;
- } catch (error) {
- params.logger && logger.error('Error verifying backups: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/chain/chainBalance.ts b/server/src/schemas/query/chain/chainBalance.ts
deleted file mode 100644
index b1597acd..00000000
--- a/server/src/schemas/query/chain/chainBalance.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import {
- getChainBalance as getBalance,
- getPendingChainBalance as getPending,
-} from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLInt } from 'graphql';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-interface ChainBalanceProps {
- chain_balance: number;
-}
-
-interface PendingChainBalanceProps {
- pending_chain_balance: number;
-}
-
-export const getChainBalance = {
- type: GraphQLInt,
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'chainBalance');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const value: ChainBalanceProps = await getBalance({
- lnd,
- });
- return value.chain_balance;
- } catch (error) {
- params.logger &&
- logger.error('Error getting chain balance: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
-
-export const getPendingChainBalance = {
- type: GraphQLInt,
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'pendingChainBalance');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const pendingValue: PendingChainBalanceProps = await getPending({
- lnd,
- });
- return pendingValue.pending_chain_balance;
- } catch (error) {
- params.logger &&
- logger.error('Error getting pending chain balance: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/chain/chainTransactions.ts b/server/src/schemas/query/chain/chainTransactions.ts
deleted file mode 100644
index 4420f505..00000000
--- a/server/src/schemas/query/chain/chainTransactions.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { GraphQLList } from 'graphql';
-import { getChainTransactions as getLnChainTransactions } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { sortBy } from 'underscore';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { GetChainTransactionsType } from '../../types/QueryType';
-
-interface TransactionProps {
- block_id: string;
- confirmation_count: number;
- confirmation_height: number;
- created_at: string;
- fee: number;
- id: string;
- output_addresses: string[];
- tokens: number;
-}
-
-interface TransactionsProps {
- transactions: TransactionProps[];
-}
-
-export const getChainTransactions = {
- type: new GraphQLList(GetChainTransactionsType),
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'chainTransactions');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const transactionList: TransactionsProps = await getLnChainTransactions(
- {
- lnd,
- },
- );
-
- const transactions = sortBy(
- transactionList.transactions,
- 'created_at',
- ).reverse();
- return transactions;
- } catch (error) {
- params.logger &&
- logger.error('Error getting chain transactions: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/chain/getUtxos.ts b/server/src/schemas/query/chain/getUtxos.ts
deleted file mode 100644
index d23cb175..00000000
--- a/server/src/schemas/query/chain/getUtxos.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { getUtxos as getLnUtxos } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import {
- GraphQLInt,
- GraphQLObjectType,
- GraphQLString,
- GraphQLList,
-} from 'graphql';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-const GetUtxosType = new GraphQLObjectType({
- name: 'getUtxosType',
- fields: () => ({
- address: { type: GraphQLString },
- address_format: { type: GraphQLString },
- confirmation_count: { type: GraphQLInt },
- output_script: { type: GraphQLString },
- tokens: { type: GraphQLInt },
- transaction_id: { type: GraphQLString },
- transaction_vout: { type: GraphQLInt },
- }),
-});
-
-export const getUtxos = {
- type: new GraphQLList(GetUtxosType),
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'getUtxos');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const { utxos } = await getLnUtxos({ lnd });
-
- return utxos;
- } catch (error) {
- params.logger && logger.error('Error getting utxos: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/channels/channelBalance.ts b/server/src/schemas/query/channels/channelBalance.ts
deleted file mode 100644
index ef76c254..00000000
--- a/server/src/schemas/query/channels/channelBalance.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { getChannelBalance as getLnChannelBalance } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { ChannelBalanceType } from '../../types/QueryType';
-
-interface ChannelBalanceProps {
- channel_balance: number;
- pending_balance: number;
-}
-
-export const getChannelBalance = {
- type: ChannelBalanceType,
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'channelBalance');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const channelBalance: ChannelBalanceProps = await getLnChannelBalance(
- {
- lnd,
- },
- );
- return {
- confirmedBalance: channelBalance.channel_balance,
- pendingBalance: channelBalance.pending_balance,
- };
- } catch (error) {
- params.logger &&
- logger.error('Error getting channel balance: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/channels/channelFees.ts b/server/src/schemas/query/channels/channelFees.ts
deleted file mode 100644
index 0b9b1298..00000000
--- a/server/src/schemas/query/channels/channelFees.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { getFeeRates, getChannels, getNode } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLList } from 'graphql';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { ChannelFeeType } from '../../types/QueryType';
-
-interface GetChannelsProps {
- channels: ChannelsProps[];
-}
-
-interface GetFeeRatesProps {
- channels: ChannelFeesProps[];
-}
-
-interface ChannelsProps {
- partner_public_key: number;
- transaction_id: string;
-}
-
-interface ChannelFeesProps {
- base_fee: number;
- fee_rate: number;
- transaction_id: string;
- transaction_vout: number;
-}
-
-interface NodeProps {
- alias: string;
- color: string;
-}
-
-export const getChannelFees = {
- type: new GraphQLList(ChannelFeeType),
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'channelFees');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const channels: GetChannelsProps = await getChannels({ lnd });
-
- const channelFees: GetFeeRatesProps = await getFeeRates({ lnd });
-
- const getConsolidated = () =>
- Promise.all(
- channels.channels.map(async (channel) => {
- const nodeInfo: NodeProps = await getNode({
- lnd,
- is_omitting_channels: true,
- public_key: channel.partner_public_key,
- });
-
- const fees = channelFees.channels.find(
- (channelFee) =>
- channelFee.transaction_id ===
- channel.transaction_id,
- );
- if (!fees) return;
- const {
- base_fee,
- fee_rate,
- transaction_id,
- transaction_vout,
- } = fees;
-
- return {
- alias: nodeInfo.alias,
- color: nodeInfo.color,
- baseFee: base_fee,
- feeRate: fee_rate,
- transactionId: transaction_id,
- transactionVout: transaction_vout,
- };
- }),
- );
-
- const consolidated = await getConsolidated();
-
- return consolidated;
- } catch (error) {
- params.logger &&
- logger.error('Error getting channel fees: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/channels/channelReport.ts b/server/src/schemas/query/channels/channelReport.ts
deleted file mode 100644
index e4de9989..00000000
--- a/server/src/schemas/query/channels/channelReport.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { getChannels } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { ChannelReportType } from '../../types/QueryType';
-
-interface GetChannelsProps {
- channels: ChannelsProps[];
-}
-
-interface ChannelsProps {
- remote_balance: number;
- local_balance: number;
-}
-
-export const getChannelReport = {
- type: ChannelReportType,
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'channelReport');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const channels: GetChannelsProps = await getChannels({ lnd });
-
- if (channels.channels.length <= 0) {
- return;
- }
-
- const maxOutgoing = Math.max.apply(
- Math,
- channels.channels.map((o) => {
- return o.local_balance;
- }),
- );
-
- const maxIncoming = Math.max.apply(
- Math,
- channels.channels.map((o) => {
- return o.remote_balance;
- }),
- );
-
- const consolidated = channels.channels.reduce((p, c) => {
- return {
- remote_balance: p.remote_balance + c.remote_balance,
- local_balance: p.local_balance + c.local_balance,
- };
- });
-
- return {
- local: consolidated.local_balance,
- remote: consolidated.remote_balance,
- maxIn: maxIncoming,
- maxOut: maxOutgoing,
- };
- } catch (error) {
- params.logger &&
- logger.error('Error getting channel report: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/channels/channels.ts b/server/src/schemas/query/channels/channels.ts
deleted file mode 100644
index ee76ad8a..00000000
--- a/server/src/schemas/query/channels/channels.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { GraphQLList, GraphQLBoolean } from 'graphql';
-import { getChannels as getLnChannels, getNode } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { ChannelType } from '../../types/QueryType';
-
-interface ChannelListProps {
- channels: ChannelProps[];
-}
-
-interface ChannelProps {
- capacity: number;
- commit_transaction_fee: number;
- commit_transaction_weight: number;
- id: string;
- is_active: boolean;
- is_closing: boolean;
- is_opening: boolean;
- is_partner_initiated: boolean;
- is_private: boolean;
- is_static_remote_key: boolean;
- local_balance: number;
- local_reserve: number;
- partner_public_key: string;
- pending_payments: [];
- received: number;
- remote_balance: number;
- remote_reserve: number;
- sent: number;
- time_offline: number;
- time_online: number;
- transaction_id: string;
- transaction_vout: number;
- unsettled_balance: number;
-}
-
-export const getChannels = {
- type: new GraphQLList(ChannelType),
- args: {
- ...defaultParams,
- active: { type: GraphQLBoolean },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'channels');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const channelList: ChannelListProps = await getLnChannels({
- lnd,
- is_active: params.active,
- });
-
- const getChannelList = () =>
- Promise.all(
- channelList.channels.map(async (channel) => {
- const nodeInfo = await getNode({
- lnd,
- is_omitting_channels: true,
- public_key: channel.partner_public_key,
- });
-
- return {
- ...channel,
- partner_node_info: {
- ...nodeInfo,
- },
- };
- }),
- );
-
- const channels = await getChannelList();
- return channels;
- } catch (error) {
- params.logger && logger.error('Error getting channels: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/channels/closedChannels.ts b/server/src/schemas/query/channels/closedChannels.ts
deleted file mode 100644
index 0c9495bf..00000000
--- a/server/src/schemas/query/channels/closedChannels.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { GraphQLList, GraphQLString } from 'graphql';
-import { getClosedChannels as getLnClosedChannels, getNode } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-
-import { defaultParams } from '../../../helpers/defaultProps';
-import { ClosedChannelType } from '../../types/QueryType';
-
-interface ChannelListProps {
- channels: ChannelProps[];
-}
-
-interface ChannelProps {
- capacity: number;
- close_confirm_height: number;
- close_transaction_id: string;
- final_local_balance: number;
- final_time_locked_balance: number;
- id: string;
- is_breach_close: boolean;
- is_cooperative_close: boolean;
- is_funding_cancel: boolean;
- is_local_force_close: boolean;
- is_remote_force_close: boolean;
- partner_public_key: string;
- transaction_id: string;
- transaction_vout: number;
-}
-
-export const getClosedChannels = {
- type: new GraphQLList(ClosedChannelType),
- args: {
- ...defaultParams,
- type: { type: GraphQLString },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'closedChannels');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const closedChannels: ChannelListProps = await getLnClosedChannels({
- lnd,
- });
- const channels = closedChannels.channels.map(async (channel) => {
- const nodeInfo = await getNode({
- lnd,
- is_omitting_channels: true,
- public_key: channel.partner_public_key,
- });
-
- return {
- ...channel,
- partner_node_info: {
- ...nodeInfo,
- },
- };
- });
- return channels;
- } catch (error) {
- params.logger &&
- logger.error('Error getting closed channels: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/channels/pendingChannels.ts b/server/src/schemas/query/channels/pendingChannels.ts
deleted file mode 100644
index e57f3deb..00000000
--- a/server/src/schemas/query/channels/pendingChannels.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import {
- getPendingChannels as getLnPendingChannels,
- getNode,
-} from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { GraphQLList } from 'graphql';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { PendingChannelType } from '../../types/QueryType';
-
-interface PendingChannelListProps {
- pending_channels: PendingChannelProps[];
-}
-
-interface PendingChannelProps {
- close_transaction_id: string;
- is_active: boolean;
- is_closing: boolean;
- is_opening: boolean;
- local_balance: number;
- local_reserve: number;
- partner_public_key: string;
- received: number;
- remote_balance: number;
- remote_reserve: number;
- sent: number;
- transaction_fee: number;
- transaction_id: string;
- transaction_vout: number;
-}
-
-export const getPendingChannels = {
- type: new GraphQLList(PendingChannelType),
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'pendingChannels');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const pendingChannels: PendingChannelListProps = await getLnPendingChannels(
- {
- lnd,
- },
- );
-
- const channels = pendingChannels.pending_channels.map(
- async (channel) => {
- const nodeInfo = await getNode({
- lnd,
- is_omitting_channels: true,
- public_key: channel.partner_public_key,
- });
-
- return {
- ...channel,
- partner_node_info: {
- ...nodeInfo,
- },
- };
- },
- );
- return channels;
- } catch (error) {
- params.logger &&
- logger.error('Error getting pending channels: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/data/bitcoinFee.ts b/server/src/schemas/query/data/bitcoinFee.ts
deleted file mode 100644
index dbd6ae6f..00000000
--- a/server/src/schemas/query/data/bitcoinFee.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLBoolean } from 'graphql';
-import fetch from 'node-fetch';
-import { BitcoinFeeType } from '../../types/QueryType';
-import { appUrls } from '../../../utils/appUrls';
-
-export const getBitcoinFees = {
- type: BitcoinFeeType,
- args: {
- logger: { type: GraphQLBoolean },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'bitcoinFee');
-
- try {
- const response = await fetch(appUrls.fees);
- const json = await response.json();
-
- if (json) {
- const { fastestFee, halfHourFee, hourFee } = json;
- return {
- fast: fastestFee,
- halfHour: halfHourFee,
- hour: hourFee,
- };
- } else {
- throw new Error('Problem getting Bitcoin fees.');
- }
- } catch (error) {
- params.logger &&
- logger.error('Error getting bitcoin fees: %o', error);
- throw new Error('Problem getting Bitcoin fees.');
- }
- },
-};
diff --git a/server/src/schemas/query/data/bitcoinPrice.ts b/server/src/schemas/query/data/bitcoinPrice.ts
deleted file mode 100644
index 12224d23..00000000
--- a/server/src/schemas/query/data/bitcoinPrice.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLString, GraphQLBoolean } from 'graphql';
-import fetch from 'node-fetch';
-import { appUrls } from '../../../utils/appUrls';
-
-export const getBitcoinPrice = {
- type: GraphQLString,
- args: {
- logger: { type: GraphQLBoolean },
- currency: {
- type: GraphQLString,
- },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'bitcoinPrice');
-
- try {
- const response = await fetch(appUrls.ticker);
- const json = await response.json();
-
- return JSON.stringify(json);
- } catch (error) {
- params.logger &&
- logger.error('Error getting bitcoin price: %o', error);
- throw new Error('Problem getting Bitcoin price.');
- }
- },
-};
diff --git a/server/src/schemas/query/flow/getInOut.interface.ts b/server/src/schemas/query/flow/getInOut.interface.ts
deleted file mode 100644
index 2f1a3045..00000000
--- a/server/src/schemas/query/flow/getInOut.interface.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-export interface InOutProps {
- tokens: number;
-}
-
-export interface InOutListProps {
- [key: string]: InOutProps[];
-}
-
-export interface PaymentProps {
- created_at: string;
- is_confirmed: boolean;
- tokens: number;
-}
-
-export interface PaymentsProps {
- payments: PaymentProps[];
-}
-
-export interface InvoiceProps {
- created_at: string;
- is_confirmed: boolean;
- received: number;
-}
-
-export interface InvoicesProps {
- invoices: InvoiceProps[];
- next: string;
-}
diff --git a/server/src/schemas/query/flow/getInOut.ts b/server/src/schemas/query/flow/getInOut.ts
deleted file mode 100644
index 15ec7e4f..00000000
--- a/server/src/schemas/query/flow/getInOut.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import { GraphQLString } from 'graphql';
-import {
- getInvoices as getLnInvoices,
- getPayments as getLnPayments,
-} from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { differenceInHours, differenceInCalendarDays } from 'date-fns';
-import { groupBy } from 'underscore';
-import { reduceInOutArray } from '../report/Helpers';
-import { InvoicesProps, PaymentsProps } from './getInOut.interface';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { InOutType } from '../../types/QueryType';
-
-export const getInOut = {
- type: InOutType,
- args: {
- ...defaultParams,
- time: { type: GraphQLString },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'getInOut');
-
- const lnd = getAuthLnd(params.auth);
-
- const endDate = new Date();
- let periods = 7;
- let differenceFn = differenceInCalendarDays;
-
- if (params.time === 'month') {
- periods = 30;
- } else if (params.time === 'day') {
- periods = 24;
- differenceFn = differenceInHours;
- }
-
- let invoiceList: InvoicesProps;
- let paymentList: PaymentsProps;
-
- try {
- invoiceList = await getLnInvoices({
- lnd,
- });
- paymentList = await getLnPayments({
- lnd,
- });
- } catch (error) {
- params.logger && logger.error('Error getting invoices: %o', error);
- throw new Error(getErrorMsg(error));
- }
-
- const invoices = invoiceList.invoices.map((invoice) => ({
- createdAt: invoice.created_at,
- isConfirmed: invoice.is_confirmed,
- tokens: invoice.received,
- }));
-
- const payments = paymentList.payments.map((payment) => ({
- createdAt: payment.created_at,
- isConfirmed: payment.is_confirmed,
- tokens: payment.tokens,
- }));
-
- const confirmedInvoices = invoices.filter((invoice) => {
- const dif = differenceFn(endDate, new Date(invoice.createdAt));
- return invoice.isConfirmed && dif < periods;
- });
- const confirmedPayments = payments.filter((payment) => {
- const dif = differenceFn(endDate, new Date(payment.createdAt));
- return payment.isConfirmed && dif < periods;
- });
-
- const allInvoices = invoices.filter((invoice) => {
- const dif = differenceFn(endDate, new Date(invoice.createdAt));
- return dif < periods;
- });
-
- const totalConfirmed = confirmedInvoices.length;
- const totalUnConfirmed = allInvoices.length - totalConfirmed;
-
- const orderedInvoices = groupBy(confirmedInvoices, (invoice) => {
- return periods - differenceFn(endDate, new Date(invoice.createdAt));
- });
- const orderedPayments = groupBy(confirmedPayments, (payment) => {
- return periods - differenceFn(endDate, new Date(payment.createdAt));
- });
-
- const reducedInvoices = reduceInOutArray(orderedInvoices);
- const reducedPayments = reduceInOutArray(orderedPayments);
-
- return {
- invoices: JSON.stringify(reducedInvoices),
- payments: JSON.stringify(reducedPayments),
- confirmedInvoices: totalConfirmed,
- unConfirmedInvoices: totalUnConfirmed,
- };
- },
-};
diff --git a/server/src/schemas/query/general/adminCheck.ts b/server/src/schemas/query/general/adminCheck.ts
deleted file mode 100644
index d3c85435..00000000
--- a/server/src/schemas/query/general/adminCheck.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { pay as payRequest } from 'ln-service';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { GraphQLBoolean } from 'graphql';
-import { getAuthLnd, getErrorDetails } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-export const adminCheck = {
- type: GraphQLBoolean,
- args: {
- ...defaultParams,
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'adminCheck');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- await payRequest({
- lnd,
- request: 'admin check',
- });
- } catch (error) {
- const details = getErrorDetails(error);
- if (details.includes('invalid character in string')) return true;
-
- throw new Error();
- }
- },
-};
diff --git a/server/src/schemas/query/general/networkInfo.ts b/server/src/schemas/query/general/networkInfo.ts
deleted file mode 100644
index e94fce19..00000000
--- a/server/src/schemas/query/general/networkInfo.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { getNetworkInfo as getLnNetworkInfo } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-
-import { defaultParams } from '../../../helpers/defaultProps';
-import { NetworkInfoType } from '../../types/QueryType';
-
-interface NetworkInfoProps {
- average_channel_size: number;
- channel_count: number;
- max_channel_size: number;
- median_channel_size: number;
- min_channel_size: number;
- node_count: number;
- not_recently_updated_policy_count: number;
- total_capacity: number;
-}
-
-export const getNetworkInfo = {
- type: NetworkInfoType,
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'networkInfo');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const info: NetworkInfoProps = await getLnNetworkInfo({ lnd });
-
- return {
- averageChannelSize: info.average_channel_size,
- channelCount: info.channel_count,
- maxChannelSize: info.max_channel_size,
- medianChannelSize: info.median_channel_size,
- minChannelSize: info.min_channel_size,
- nodeCount: info.node_count,
- notRecentlyUpdatedPolicyCount:
- info.not_recently_updated_policy_count,
- totalCapacity: info.total_capacity,
- };
- } catch (error) {
- params.logger &&
- logger.error('Error getting network info: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/general/nodeInfo.ts b/server/src/schemas/query/general/nodeInfo.ts
deleted file mode 100644
index 87f3c96a..00000000
--- a/server/src/schemas/query/general/nodeInfo.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { getWalletInfo, getClosedChannels } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { NodeInfoType } from '../../types/QueryType';
-
-interface NodeInfoProps {
- chains: string[];
- color: string;
- active_channels_count: number;
- alias: string;
- current_block_hash: string;
- current_block_height: number;
- is_synced_to_chain: boolean;
- is_synced_to_graph: boolean;
- latest_block_at: string;
- peers_count: number;
- pending_channels_count: number;
- public_key: string;
- uris: string[];
- version: string;
-}
-
-export const getNodeInfo = {
- type: NodeInfoType,
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'nodeInfo');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const info: NodeInfoProps = await getWalletInfo({
- lnd,
- });
- const closedChannels: { channels: [] } = await getClosedChannels({
- lnd,
- });
- return {
- ...info,
- closed_channels_count: closedChannels.channels.length,
- };
- } catch (error) {
- params.logger && logger.error('Error getting node info: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/hodlhodl/getCountries.ts b/server/src/schemas/query/hodlhodl/getCountries.ts
deleted file mode 100644
index 226f32ed..00000000
--- a/server/src/schemas/query/hodlhodl/getCountries.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import fetch from 'node-fetch';
-import { GraphQLList } from 'graphql';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { logger } from '../../../helpers/logger';
-import { appUrls } from '../../../utils/appUrls';
-import { HodlCountryType } from '../../types/HodlType';
-import { envConfig } from '../../../utils/envConfig';
-
-export const getCountries = {
- type: new GraphQLList(HodlCountryType),
- args: {},
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'getCountries');
-
- const headers = {
- Authorization: `Bearer ${envConfig.hodlKey}`,
- };
-
- try {
- const response = await fetch(`${appUrls.hodlhodl}/v1/countries`, {
- headers,
- });
- const json = await response.json();
-
- if (json) {
- const { countries } = json;
- return countries;
- } else {
- throw new Error('Problem getting HodlHodl countries.');
- }
- } catch (error) {
- params.logger &&
- logger.error('Error getting HodlHodl countries: %o', error);
- throw new Error('Problem getting HodlHodl countries.');
- }
- },
-};
diff --git a/server/src/schemas/query/hodlhodl/getCurrencies.ts b/server/src/schemas/query/hodlhodl/getCurrencies.ts
deleted file mode 100644
index b77a053f..00000000
--- a/server/src/schemas/query/hodlhodl/getCurrencies.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import fetch from 'node-fetch';
-import { GraphQLList } from 'graphql';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { logger } from '../../../helpers/logger';
-import { appUrls } from '../../../utils/appUrls';
-import { HodlCurrencyType } from '../../types/HodlType';
-import { envConfig } from '../../../utils/envConfig';
-
-export const getCurrencies = {
- type: new GraphQLList(HodlCurrencyType),
- args: {},
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'getCurrencies');
-
- const headers = {
- Authorization: `Bearer ${envConfig.hodlKey}`,
- };
-
- try {
- const response = await fetch(`${appUrls.hodlhodl}/v1/currencies`, {
- headers,
- });
- const json = await response.json();
-
- if (json) {
- const { currencies } = json;
- return currencies;
- } else {
- throw new Error('Problem getting HodlHodl currencies.');
- }
- } catch (error) {
- params.logger &&
- logger.error('Error getting HodlHodl currencies: %o', error);
- throw new Error('Problem getting HodlHodl currencies.');
- }
- },
-};
diff --git a/server/src/schemas/query/hodlhodl/getOffers.ts b/server/src/schemas/query/hodlhodl/getOffers.ts
deleted file mode 100644
index 5b46f9d5..00000000
--- a/server/src/schemas/query/hodlhodl/getOffers.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import fetch from 'node-fetch';
-import { GraphQLList, GraphQLString } from 'graphql';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { logger } from '../../../helpers/logger';
-import { appUrls } from '../../../utils/appUrls';
-import { HodlOfferType } from '../../types/HodlType';
-import { getHodlParams } from '../../../helpers/hodlHelpers';
-
-const defaultQuery = {
- filters: {},
- sort: {
- by: '',
- direction: '',
- },
-};
-
-export const getOffers = {
- type: new GraphQLList(HodlOfferType),
- args: {
- filter: { type: GraphQLString },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'getOffers');
-
- let queryParams = defaultQuery;
-
- if (params.filter) {
- try {
- queryParams = JSON.parse(params.filter);
- } catch (error) {}
- }
-
- try {
- const fullParams = {
- ...queryParams,
- };
-
- const paramString = getHodlParams(fullParams);
-
- const response = await fetch(
- `${appUrls.hodlhodl}/v1/offers${paramString}`,
- );
- const json = await response.json();
-
- if (json) {
- const { offers } = json;
- return offers;
- } else {
- throw new Error('Problem getting HodlHodl offers.');
- }
- } catch (error) {
- params.logger &&
- logger.error('Error getting HodlHodl offers: %o', error);
- throw new Error('Problem getting HodlHodl offers.');
- }
- },
-};
diff --git a/server/src/schemas/query/message/signMessage.ts b/server/src/schemas/query/message/signMessage.ts
deleted file mode 100644
index 4e0f299c..00000000
--- a/server/src/schemas/query/message/signMessage.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { signMessage as signLnMessage } from 'ln-service';
-import { GraphQLString, GraphQLNonNull } from 'graphql';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { logger } from '../../../helpers/logger';
-
-export const signMessage = {
- type: GraphQLString,
- args: {
- ...defaultParams,
- message: { type: new GraphQLNonNull(GraphQLString) },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'signMessage');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const message: { signature: string } = await signLnMessage({
- lnd,
- message: params.message,
- });
-
- return message.signature;
- } catch (error) {
- params.logger && logger.error('Error signing message: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/message/verifyMessage.ts b/server/src/schemas/query/message/verifyMessage.ts
deleted file mode 100644
index be1ef8e4..00000000
--- a/server/src/schemas/query/message/verifyMessage.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { verifyMessage as verifyLnMessage } from 'ln-service';
-import { GraphQLString, GraphQLNonNull } from 'graphql';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { logger } from '../../../helpers/logger';
-
-export const verifyMessage = {
- type: GraphQLString,
- args: {
- ...defaultParams,
- message: { type: new GraphQLNonNull(GraphQLString) },
- signature: { type: new GraphQLNonNull(GraphQLString) },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'verifyMessage');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const message: { signed_by: string } = await verifyLnMessage({
- lnd,
- message: params.message,
- signature: params.signature,
- });
-
- return message.signed_by;
- } catch (error) {
- params.logger && logger.error('Error verifying message: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/peer/getPeers.ts b/server/src/schemas/query/peer/getPeers.ts
deleted file mode 100644
index f82e91b4..00000000
--- a/server/src/schemas/query/peer/getPeers.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { GraphQLList } from 'graphql';
-import { getPeers as getLnPeers, getNode } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-
-import { defaultParams } from '../../../helpers/defaultProps';
-import { PeerType } from '../../types/QueryType';
-
-interface PeerProps {
- bytes_received: number;
- bytes_sent: number;
- is_inbound: boolean;
- is_sync_peer: boolean;
- ping_time: number;
- public_key: string;
- socket: string;
- tokens_received: number;
- tokens_sent: number;
-}
-
-export const getPeers = {
- type: new GraphQLList(PeerType),
- args: defaultParams,
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'getPeers');
-
- const lnd = getAuthLnd(params.auth);
-
- try {
- const { peers }: { peers: PeerProps[] } = await getLnPeers({
- lnd,
- });
-
- const getPeerList = () =>
- Promise.all(
- peers.map(async (peer) => {
- try {
- const nodeInfo = await getNode({
- lnd,
- is_omitting_channels: true,
- public_key: peer.public_key,
- });
-
- return {
- ...peer,
- partner_node_info: {
- ...nodeInfo,
- },
- };
- } catch (error) {
- return { ...peer, partner_node_info: {} };
- }
- }),
- );
-
- const peerList = await getPeerList();
- return peerList;
- } catch (error) {
- params.logger && logger.error('Error getting peers: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/report/ForwardChannels.ts b/server/src/schemas/query/report/ForwardChannels.ts
deleted file mode 100644
index 2d058e27..00000000
--- a/server/src/schemas/query/report/ForwardChannels.ts
+++ /dev/null
@@ -1,167 +0,0 @@
-import { GraphQLString } from 'graphql';
-import {
- getForwards as getLnForwards,
- getNode,
- getChannel,
- getWalletInfo,
-} from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { subHours, subDays } from 'date-fns';
-import { countArray, countRoutes } from './Helpers';
-import { ForwardCompleteProps } from './ForwardReport.interface';
-import { sortBy } from 'underscore';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-interface NodeProps {
- alias: string;
- color: string;
-}
-
-interface ChannelsProps {
- policies: { public_key: string }[];
-}
-
-export const getForwardChannelsReport = {
- type: GraphQLString,
- args: {
- ...defaultParams,
- time: { type: GraphQLString },
- order: { type: GraphQLString },
- type: { type: GraphQLString },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'forwardChannels');
-
- const lnd = getAuthLnd(params.auth);
-
- let startDate = new Date();
- const endDate = new Date();
-
- if (params.time === 'month') {
- startDate = subDays(endDate, 30);
- } else if (params.time === 'week') {
- startDate = subDays(endDate, 7);
- } else {
- startDate = subHours(endDate, 24);
- }
-
- const getNodeAlias = async (id: string, publicKey: string) => {
- const channelInfo: ChannelsProps = await getChannel({
- lnd,
- id,
- });
-
- const partnerPublicKey =
- channelInfo.policies[0].public_key !== publicKey
- ? channelInfo.policies[0].public_key
- : channelInfo.policies[1].public_key;
-
- const nodeInfo: NodeProps = await getNode({
- lnd,
- is_omitting_channels: true,
- public_key: partnerPublicKey,
- });
-
- return {
- alias: nodeInfo.alias,
- color: nodeInfo.color,
- };
- };
-
- const getRouteAlias = (array: any[], publicKey: string) =>
- Promise.all(
- array.map(async (channel) => {
- const nodeAliasIn = await getNodeAlias(
- channel.in,
- publicKey,
- );
- const nodeAliasOut = await getNodeAlias(
- channel.out,
- publicKey,
- );
-
- return {
- aliasIn: nodeAliasIn.alias,
- colorIn: nodeAliasIn.color,
- aliasOut: nodeAliasOut.alias,
- colorOut: nodeAliasOut.color,
- ...channel,
- };
- }),
- );
-
- const getAlias = (array: any[], publicKey: string) =>
- Promise.all(
- array.map(async (channel) => {
- const nodeAlias = await getNodeAlias(
- channel.name,
- publicKey,
- );
- return {
- alias: nodeAlias.alias,
- color: nodeAlias.color,
- ...channel,
- };
- }),
- );
-
- try {
- const forwardsList: ForwardCompleteProps = await getLnForwards({
- lnd,
- after: startDate,
- before: endDate,
- limit: 10000,
- });
-
- const walletInfo: { public_key: string } = await getWalletInfo({
- lnd,
- });
-
- if (params.type === 'route') {
- const mapped = forwardsList.forwards.map((forward) => {
- return {
- route: `${forward.incoming_channel} - ${forward.outgoing_channel}`,
- ...forward,
- };
- });
- const grouped = countRoutes(mapped);
-
- const routeAlias = await getRouteAlias(
- grouped,
- walletInfo.public_key,
- );
-
- const sortedRoute = sortBy(routeAlias, params.order)
- .reverse()
- .slice(0, 10);
- return JSON.stringify(sortedRoute);
- } else if (params.type === 'incoming') {
- const incomingCount = countArray(forwardsList.forwards, true);
- const incomingAlias = await getAlias(
- incomingCount,
- walletInfo.public_key,
- );
- const sortedInCount = sortBy(incomingAlias, params.order)
- .reverse()
- .slice(0, 10);
- return JSON.stringify(sortedInCount);
- } else {
- const outgoingCount = countArray(forwardsList.forwards, false);
- const outgoingAlias = await getAlias(
- outgoingCount,
- walletInfo.public_key,
- );
- const sortedOutCount = sortBy(outgoingAlias, params.order)
- .reverse()
- .slice(0, 10);
- return JSON.stringify(sortedOutCount);
- }
- } catch (error) {
- params.logger &&
- logger.error('Error getting forward channel report: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/report/ForwardReport.interface.ts b/server/src/schemas/query/report/ForwardReport.interface.ts
deleted file mode 100644
index f1dab52d..00000000
--- a/server/src/schemas/query/report/ForwardReport.interface.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-export interface ForwardProps {
- created_at: string;
- fee: number;
- fee_mtokens: string;
- incoming_channel: string;
- mtokens: string;
- outgoing_channel: string;
- tokens: number;
-}
-
-export interface ForwardCompleteProps {
- forwards: ForwardProps[];
- next: string;
-}
-
-export interface ListProps {
- [key: string]: ForwardProps[];
-}
-
-export interface ReduceObjectProps {
- fee: number;
- tokens: number;
-}
-
-export interface FinalProps {
- fee: number;
- tokens: number;
- amount: number;
-}
-
-export interface FinalList {
- [key: string]: FinalProps;
-}
-
-export interface CountProps {
- [key: string]: number;
-}
-
-export interface ChannelCounts {
- name: string;
- count: number;
-}
diff --git a/server/src/schemas/query/report/ForwardReport.ts b/server/src/schemas/query/report/ForwardReport.ts
deleted file mode 100644
index dbe161e9..00000000
--- a/server/src/schemas/query/report/ForwardReport.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import { GraphQLString } from 'graphql';
-import { getForwards as getLnForwards } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { groupBy } from 'underscore';
-import {
- subHours,
- subDays,
- differenceInHours,
- differenceInCalendarDays,
-} from 'date-fns';
-import { reduceForwardArray } from './Helpers';
-import { ForwardCompleteProps } from './ForwardReport.interface';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-export const getForwardReport = {
- type: GraphQLString,
- args: {
- ...defaultParams,
- time: { type: GraphQLString },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'forwardReport');
-
- const lnd = getAuthLnd(params.auth);
-
- let startDate = new Date();
- const endDate = new Date();
- let days = 7;
-
- if (params.time === 'month') {
- startDate = subDays(endDate, 30);
- days = 30;
- } else if (params.time === 'week') {
- startDate = subDays(endDate, 7);
- } else {
- startDate = subHours(endDate, 24);
- }
-
- try {
- const forwardsList: ForwardCompleteProps = await getLnForwards({
- lnd,
- after: startDate,
- before: endDate,
- });
-
- if (params.time === 'month' || params.time === 'week') {
- const orderedDay = groupBy(forwardsList.forwards, (item) => {
- return (
- days -
- differenceInCalendarDays(
- endDate,
- new Date(item.created_at),
- )
- );
- });
-
- const reducedOrderedDay = reduceForwardArray(orderedDay);
-
- return JSON.stringify(reducedOrderedDay);
- } else {
- const orderedHour = groupBy(forwardsList.forwards, (item) => {
- return (
- 24 -
- differenceInHours(endDate, new Date(item.created_at))
- );
- });
-
- const reducedOrderedHour = reduceForwardArray(orderedHour);
-
- return JSON.stringify(reducedOrderedHour);
- }
- } catch (error) {
- params.logger &&
- logger.error('Error getting forward report: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/report/Helpers.ts b/server/src/schemas/query/report/Helpers.ts
deleted file mode 100644
index d4abee13..00000000
--- a/server/src/schemas/query/report/Helpers.ts
+++ /dev/null
@@ -1,106 +0,0 @@
-import { reduce, groupBy } from 'underscore';
-import {
- ForwardProps,
- ReduceObjectProps,
- ListProps,
-} from './ForwardReport.interface';
-import { InOutListProps, InOutProps } from '../flow/getInOut.interface';
-
-export const reduceForwardArray = (list: ListProps) => {
- const reducedOrder = [];
- for (const key in list) {
- if (list.hasOwnProperty(key)) {
- const element: ForwardProps[] = list[key];
- const reducedArray: ReduceObjectProps = reduce(element, (a, b) => {
- return {
- fee: a.fee + b.fee,
- tokens: a.tokens + b.tokens,
- };
- });
- reducedOrder.push({
- period: parseInt(key),
- amount: element.length,
- ...reducedArray,
- });
- }
- }
-
- return reducedOrder;
-};
-
-export const reduceInOutArray = (list: InOutListProps) => {
- const reducedOrder = [];
- for (const key in list) {
- if (list.hasOwnProperty(key)) {
- const element: InOutProps[] = list[key];
- const reducedArray: InOutProps = reduce(element, (a, b) => ({
- tokens: a.tokens + b.tokens,
- }));
- reducedOrder.push({
- period: parseInt(key),
- amount: element.length,
- tokens: reducedArray.tokens,
- });
- }
- }
- return reducedOrder;
-};
-
-export const countArray = (list: ForwardProps[], type: boolean) => {
- const inOrOut = type ? 'incoming_channel' : 'outgoing_channel';
- const grouped = groupBy(list, inOrOut);
-
- const channelInfo = [];
- for (const key in grouped) {
- if (grouped.hasOwnProperty(key)) {
- const element = grouped[key];
-
- const fee = element
- .map((forward) => forward.fee)
- .reduce((p, c) => p + c);
-
- const tokens = element
- .map((forward) => forward.tokens)
- .reduce((p, c) => p + c);
-
- channelInfo.push({
- name: key,
- amount: element.length,
- fee: fee,
- tokens: tokens,
- });
- }
- }
-
- return channelInfo;
-};
-
-export const countRoutes = (list: ForwardProps[]) => {
- const grouped = groupBy(list, 'route');
-
- const channelInfo = [];
- for (const key in grouped) {
- if (grouped.hasOwnProperty(key)) {
- const element = grouped[key];
-
- const fee = element
- .map((forward) => forward.fee)
- .reduce((p, c) => p + c);
-
- const tokens = element
- .map((forward) => forward.tokens)
- .reduce((p, c) => p + c);
-
- channelInfo.push({
- route: key,
- in: element[0].incoming_channel,
- out: element[0].outgoing_channel,
- amount: element.length,
- fee: fee,
- tokens: tokens,
- });
- }
- }
-
- return channelInfo;
-};
diff --git a/server/src/schemas/query/route/getRoutes.ts b/server/src/schemas/query/route/getRoutes.ts
deleted file mode 100644
index 95451cca..00000000
--- a/server/src/schemas/query/route/getRoutes.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { GraphQLNonNull, GraphQLString, GraphQLInt } from 'graphql';
-import { getRouteToDestination, getWalletInfo } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { defaultParams } from '../../../helpers/defaultProps';
-
-export const getRoutes = {
- type: GraphQLString,
- args: {
- ...defaultParams,
- outgoing: { type: new GraphQLNonNull(GraphQLString) },
- incoming: { type: new GraphQLNonNull(GraphQLString) },
- tokens: { type: new GraphQLNonNull(GraphQLInt) },
- maxFee: { type: GraphQLInt },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'getRoutes');
-
- const lnd = getAuthLnd(params.auth);
-
- const { public_key } = await getWalletInfo({ lnd });
-
- const { route } = await getRouteToDestination({
- lnd,
- outgoing_channel: params.outgoing,
- incoming_peer: params.incoming,
- destination: public_key,
- tokens: params.tokens,
- ...(params.maxFee && { max_fee: params.maxFee }),
- }).catch((error: any) => {
- params.logger && logger.error('Error getting routes: %o', error);
- throw new Error(getErrorMsg(error));
- });
-
- if (!route) {
- throw new Error('No route found.');
- }
-
- return JSON.stringify(route);
- },
-};
diff --git a/server/src/schemas/query/transactions/forwards.ts b/server/src/schemas/query/transactions/forwards.ts
deleted file mode 100644
index 3faff833..00000000
--- a/server/src/schemas/query/transactions/forwards.ts
+++ /dev/null
@@ -1,124 +0,0 @@
-import { GraphQLString } from 'graphql';
-import {
- getForwards as getLnForwards,
- getChannel,
- getNode,
- getWalletInfo,
-} from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
-import { sortBy } from 'underscore';
-import { ForwardCompleteProps } from '../report/ForwardReport.interface';
-import { subHours, subDays, subMonths, subYears } from 'date-fns';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { GetForwardType } from '../../types/QueryType';
-
-interface NodeProps {
- alias: string;
- color: string;
-}
-
-interface ChannelsProps {
- policies: { public_key: string }[];
-}
-
-export const getForwards = {
- type: GetForwardType,
- args: {
- ...defaultParams,
- time: { type: GraphQLString },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'forwards');
-
- const lnd = getAuthLnd(params.auth);
-
- let startDate = new Date();
- const endDate = new Date();
-
- if (params.time === 'oneYear') {
- startDate = subYears(endDate, 1);
- } else if (params.time === 'sixMonths') {
- startDate = subMonths(endDate, 6);
- } else if (params.time === 'threeMonths') {
- startDate = subMonths(endDate, 3);
- } else if (params.time === 'month') {
- startDate = subMonths(endDate, 1);
- } else if (params.time === 'week') {
- startDate = subDays(endDate, 7);
- } else {
- startDate = subHours(endDate, 24);
- }
-
- const walletInfo: { public_key: string } = await getWalletInfo({
- lnd,
- });
-
- const getNodeAlias = async (id: string, publicKey: string) => {
- const channelInfo: ChannelsProps = await getChannel({
- lnd,
- id,
- });
-
- const partnerPublicKey =
- channelInfo.policies[0].public_key !== publicKey
- ? channelInfo.policies[0].public_key
- : channelInfo.policies[1].public_key;
-
- const nodeInfo: NodeProps = await getNode({
- lnd,
- is_omitting_channels: true,
- public_key: partnerPublicKey,
- });
-
- return {
- alias: nodeInfo.alias,
- color: nodeInfo.color,
- };
- };
-
- const getAlias = (array: any[], publicKey: string) =>
- Promise.all(
- array.map(async (forward) => {
- const inNodeAlias = await getNodeAlias(
- forward.incoming_channel,
- publicKey,
- );
- const outNodeAlias = await getNodeAlias(
- forward.outgoing_channel,
- publicKey,
- );
- return {
- incoming_alias: inNodeAlias.alias,
- incoming_color: inNodeAlias.color,
- outgoing_alias: outNodeAlias.alias,
- outgoing_color: outNodeAlias.color,
- ...forward,
- };
- }),
- );
-
- try {
- const forwardsList: ForwardCompleteProps = await getLnForwards({
- lnd,
- after: startDate,
- before: endDate,
- });
-
- const list = await getAlias(
- forwardsList.forwards,
- walletInfo.public_key,
- );
-
- const forwards = sortBy(list, 'created_at').reverse();
- return {
- token: forwardsList.next,
- forwards,
- };
- } catch (error) {
- params.logger && logger.error('Error getting forwards: %o', error);
- throw new Error(getErrorMsg(error));
- }
- },
-};
diff --git a/server/src/schemas/query/transactions/resume.interface.ts b/server/src/schemas/query/transactions/resume.interface.ts
deleted file mode 100644
index bf2e1de2..00000000
--- a/server/src/schemas/query/transactions/resume.interface.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-export interface PaymentProps {
- created_at: string;
- destination: string;
- fee: number;
- fee_mtokens: string;
- hops: string[];
- id: string;
- is_confirmed: boolean;
- is_outgoing: boolean;
- mtokens: string;
- request: string;
- secret: string;
- tokens: number;
-}
-
-export interface PaymentsProps {
- payments: PaymentProps[];
-}
-
-export interface InvoicePaymentProps {
- confirmed_at: string;
- created_at: string;
- created_height: number;
- in_channel: string;
- is_canceled: boolean;
- is_confirmed: boolean;
- is_held: boolean;
- mtokens: string;
- pending_index: number;
- tokens: number;
-}
-
-export interface InvoiceProps {
- chain_address: string;
- confirmed_at: string;
- created_at: string;
- description: string;
- description_hash: string;
- expires_at: string;
- id: string;
- is_canceled: boolean;
- is_confirmed: boolean;
- is_held: boolean;
- is_outgoing: boolean;
- is_private: boolean;
- payments: InvoicePaymentProps[];
- received: number;
- received_mtokens: string;
- request: string;
- secret: string;
- tokens: number;
-}
-
-export interface InvoicesProps {
- invoices: InvoiceProps[];
- next: string;
-}
-
-export interface NodeProps {
- alias: string;
-}
diff --git a/server/src/schemas/query/transactions/resume.ts b/server/src/schemas/query/transactions/resume.ts
deleted file mode 100644
index aff90488..00000000
--- a/server/src/schemas/query/transactions/resume.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-import { GraphQLString } from 'graphql';
-import { getPayments, getInvoices, getNode } from 'ln-service';
-import { logger } from '../../../helpers/logger';
-import { requestLimiter } from '../../../helpers/rateLimiter';
-import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
-import { PaymentsProps, InvoicesProps, NodeProps } from './resume.interface';
-import { compareDesc } from 'date-fns';
-import { sortBy } from 'underscore';
-import { defaultParams } from '../../../helpers/defaultProps';
-import { GetResumeType } from '../../types/QueryType';
-
-export const getResume = {
- type: GetResumeType,
- args: {
- ...defaultParams,
- token: { type: GraphQLString },
- },
- resolve: async (root: any, params: any, context: any) => {
- await requestLimiter(context.ip, 'payments');
-
- const lnd = getAuthLnd(params.auth);
-
- let payments;
- let invoices;
-
- try {
- const paymentList: PaymentsProps = await getPayments({
- lnd,
- });
-
- const getMappedPayments = () =>
- Promise.all(
- paymentList.payments.map(async (payment) => {
- let nodeInfo: NodeProps;
- try {
- nodeInfo = await getNode({
- lnd,
- is_omitting_channels: true,
- public_key: payment.destination,
- });
- } catch (error) {
- nodeInfo = { alias: 'unknown' };
- }
- return {
- type: 'payment',
- alias: nodeInfo.alias,
- date: payment.created_at,
- ...payment,
- };
- }),
- );
- payments = await getMappedPayments();
- } catch (error) {
- params.logger && logger.error('Error getting payments: %o', error);
- throw new Error(getErrorMsg(error));
- }
-
- const invoiceProps = params.token
- ? { token: params.token }
- : { limit: 25 };
-
- let lastInvoiceDate = '';
- let firstInvoiceDate = '';
- let token = '';
- let withInvoices = true;
-
- try {
- const invoiceList: InvoicesProps = await getInvoices({
- lnd,
- ...invoiceProps,
- });
-
- invoices = invoiceList.invoices.map((invoice) => {
- return {
- type: 'invoice',
- date: invoice.confirmed_at || invoice.created_at,
- ...invoice,
- };
- });
-
- if (invoices.length <= 0) {
- withInvoices = false;
- } else {
- const { date } = invoices[invoices.length - 1];
- firstInvoiceDate = invoices[0].date;
- lastInvoiceDate = date;
- token = invoiceList.next;
- }
- } catch (error) {
- params.logger && logger.error('Error getting invoices: %o', error);
- throw new Error(getErrorMsg(error));
- }
-
- const filteredPayments = withInvoices
- ? payments.filter((payment) => {
- const last =
- compareDesc(
- new Date(lastInvoiceDate),
- new Date(payment.date),
- ) === 1;
- const first = params.token
- ? compareDesc(
- new Date(payment.date),
- new Date(firstInvoiceDate),
- ) === 1
- : true;
- return last && first;
- })
- : payments;
-
- const resumeArray = sortBy(
- [...invoices, ...filteredPayments],
- 'date',
- ).reverse();
-
- return {
- token,
- resume: JSON.stringify(resumeArray),
- };
- },
-};
diff --git a/server/src/schemas/types/GeneralType.ts b/server/src/schemas/types/GeneralType.ts
deleted file mode 100644
index 960c7d9e..00000000
--- a/server/src/schemas/types/GeneralType.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { GraphQLInputObjectType, GraphQLString } from 'graphql';
-
-export const AuthType = new GraphQLInputObjectType({
- name: 'authType',
- fields: () => {
- return {
- host: {
- type: GraphQLString,
- },
- macaroon: {
- type: GraphQLString,
- },
- cert: {
- type: GraphQLString,
- },
- };
- },
-});
diff --git a/server/src/schemas/types/HodlType.ts b/server/src/schemas/types/HodlType.ts
deleted file mode 100644
index fa1ab255..00000000
--- a/server/src/schemas/types/HodlType.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-import {
- GraphQLObjectType,
- GraphQLString,
- GraphQLInt,
- GraphQLBoolean,
- GraphQLList,
-} from 'graphql';
-
-export const HodlOfferFeeType = new GraphQLObjectType({
- name: 'hodlOfferFeeType',
- fields: () => {
- return {
- author_fee_rate: { type: GraphQLString },
- };
- },
-});
-
-export const HodlOfferPaymentType = new GraphQLObjectType({
- name: 'hodlOfferPaymentType',
- fields: () => {
- return {
- id: { type: GraphQLString },
- version: { type: GraphQLString },
- payment_method_id: { type: GraphQLString },
- payment_method_type: { type: GraphQLString },
- payment_method_name: { type: GraphQLString },
- };
- },
-});
-
-export const HodlOfferTraderType = new GraphQLObjectType({
- name: 'hodlOfferTraderType',
- fields: () => {
- return {
- login: { type: GraphQLString },
- online_status: { type: GraphQLString },
- rating: { type: GraphQLString },
- trades_count: { type: GraphQLInt },
- url: { type: GraphQLString },
- verified: { type: GraphQLBoolean },
- verified_by: { type: GraphQLString },
- strong_hodler: { type: GraphQLBoolean },
- country: { type: GraphQLString },
- country_code: { type: GraphQLString },
- average_payment_time_minutes: { type: GraphQLInt },
- average_release_time_minutes: { type: GraphQLInt },
- days_since_last_trade: { type: GraphQLInt },
- };
- },
-});
-
-export const HodlOfferType = new GraphQLObjectType({
- name: 'hodlOfferType',
- fields: () => {
- return {
- id: { type: GraphQLString },
- version: { type: GraphQLString },
- asset_code: { type: GraphQLString },
- searchable: { type: GraphQLBoolean },
- country: { type: GraphQLString },
- country_code: { type: GraphQLString },
- working_now: { type: GraphQLBoolean },
- side: { type: GraphQLString },
- title: { type: GraphQLString },
- description: { type: GraphQLString },
- currency_code: { type: GraphQLString },
- price: { type: GraphQLString },
- min_amount: { type: GraphQLString },
- max_amount: { type: GraphQLString },
- first_trade_limit: { type: GraphQLString },
- fee: { type: HodlOfferFeeType },
- balance: { type: GraphQLString },
- payment_window_minutes: { type: GraphQLInt },
- confirmations: { type: GraphQLInt },
- payment_method_instructions: {
- type: new GraphQLList(HodlOfferPaymentType),
- },
- trader: { type: HodlOfferTraderType },
- };
- },
-});
-
-export const HodlCountryType = new GraphQLObjectType({
- name: 'hodlCountryType',
- fields: () => {
- return {
- code: { type: GraphQLString },
- name: { type: GraphQLString },
- native_name: { type: GraphQLString },
- currency_code: { type: GraphQLString },
- currency_name: { type: GraphQLString },
- };
- },
-});
-
-export const HodlCurrencyType = new GraphQLObjectType({
- name: 'hodlCurrencyType',
- fields: () => {
- return {
- code: { type: GraphQLString },
- name: { type: GraphQLString },
- type: { type: GraphQLString },
- };
- },
-});
diff --git a/server/src/schemas/types/MutationType.ts b/server/src/schemas/types/MutationType.ts
deleted file mode 100644
index 4fb3e696..00000000
--- a/server/src/schemas/types/MutationType.ts
+++ /dev/null
@@ -1,144 +0,0 @@
-import {
- GraphQLObjectType,
- GraphQLString,
- GraphQLInt,
- GraphQLList,
- GraphQLBoolean,
-} from 'graphql';
-import { GraphQLDateTime } from 'graphql-iso-date';
-
-export const CloseChannelType = new GraphQLObjectType({
- name: 'closeChannelType',
- fields: () => {
- return {
- transactionId: { type: GraphQLString },
- transactionOutputIndex: { type: GraphQLString },
- };
- },
-});
-
-export const OpenChannelType = new GraphQLObjectType({
- name: 'openChannelType',
- fields: () => {
- return {
- transactionId: { type: GraphQLString },
- transactionOutputIndex: { type: GraphQLString },
- };
- },
-});
-
-export const InvoiceType = new GraphQLObjectType({
- name: 'invoiceType',
- fields: () => {
- return {
- chainAddress: { type: GraphQLString },
- createdAt: { type: GraphQLDateTime },
- description: { type: GraphQLString },
- id: { type: GraphQLString },
- request: { type: GraphQLString },
- secret: { type: GraphQLString },
- tokens: { type: GraphQLInt },
- };
- },
-});
-
-const RoutesType = new GraphQLObjectType({
- name: 'routeType',
- fields: () => ({
- baseFeeMTokens: { type: GraphQLString },
- channel: { type: GraphQLString },
- cltvDelta: { type: GraphQLInt },
- feeRate: { type: GraphQLInt },
- publicKey: { type: GraphQLString },
- }),
-});
-
-export const DecodeType = new GraphQLObjectType({
- name: 'decodeType',
- fields: () => {
- return {
- chainAddress: { type: GraphQLString },
- cltvDelta: { type: GraphQLInt },
- description: { type: GraphQLString },
- descriptionHash: { type: GraphQLString },
- destination: { type: GraphQLString },
- expiresAt: { type: GraphQLString },
- id: { type: GraphQLString },
- routes: { type: new GraphQLList(RoutesType) },
- tokens: { type: GraphQLInt },
- };
- },
-});
-
-const RouteType = new GraphQLObjectType({
- name: 'RouteType',
- fields: () => ({
- mTokenFee: { type: GraphQLString },
- channel: { type: GraphQLString },
- cltvDelta: { type: GraphQLInt },
- feeRate: { type: GraphQLInt },
- publicKey: { type: GraphQLString },
- }),
-});
-
-export const ParsePaymentType = new GraphQLObjectType({
- name: 'parsePaymentType',
- fields: () => {
- return {
- chainAddresses: { type: new GraphQLList(GraphQLString) },
- cltvDelta: { type: GraphQLInt },
- createdAt: { type: GraphQLDateTime },
- description: { type: GraphQLString },
- descriptionHash: { type: GraphQLString },
- destination: { type: GraphQLString },
- expiresAt: { type: GraphQLDateTime },
- id: { type: GraphQLString },
- isExpired: { type: GraphQLBoolean },
- mTokens: { type: GraphQLString },
- network: { type: GraphQLString },
- routes: { type: new GraphQLList(RouteType) },
- tokens: { type: GraphQLInt },
- };
- },
-});
-
-const HopsType = new GraphQLObjectType({
- name: 'hopsType',
- fields: () => ({
- channel: { type: GraphQLString },
- channelCapacity: { type: GraphQLInt },
- mTokenFee: { type: GraphQLString },
- forwardMTokens: { type: GraphQLString },
- timeout: { type: GraphQLInt },
- }),
-});
-
-export const PayType = new GraphQLObjectType({
- name: 'payType',
- fields: () => {
- return {
- fee: { type: GraphQLInt },
- feeMTokens: { type: GraphQLString },
- hops: { type: new GraphQLList(HopsType) },
- id: { type: GraphQLString },
- isConfirmed: { type: GraphQLBoolean },
- isOutgoing: { type: GraphQLBoolean },
- mtokens: { type: GraphQLString },
- secret: { type: GraphQLString },
- tokens: { type: GraphQLInt },
- };
- },
-});
-
-export const SendToType = new GraphQLObjectType({
- name: 'sendToType',
- fields: () => {
- return {
- confirmationCount: { type: GraphQLString },
- id: { type: GraphQLString },
- isConfirmed: { type: GraphQLBoolean },
- isOutgoing: { type: GraphQLBoolean },
- tokens: { type: GraphQLInt },
- };
- },
-});
diff --git a/server/src/schemas/types/QueryType.ts b/server/src/schemas/types/QueryType.ts
deleted file mode 100644
index 4f989dbb..00000000
--- a/server/src/schemas/types/QueryType.ts
+++ /dev/null
@@ -1,260 +0,0 @@
-import {
- GraphQLObjectType,
- GraphQLString,
- GraphQLInt,
- GraphQLBoolean,
- GraphQLList,
-} from 'graphql';
-
-export const ChannelBalanceType = new GraphQLObjectType({
- name: 'channelBalanceType',
- fields: () => {
- return {
- confirmedBalance: { type: GraphQLInt },
- pendingBalance: { type: GraphQLInt },
- };
- },
-});
-
-export const ChannelFeeType = new GraphQLObjectType({
- name: 'channelFeeType',
- fields: () => {
- return {
- alias: { type: GraphQLString },
- color: { type: GraphQLString },
- baseFee: { type: GraphQLInt },
- feeRate: { type: GraphQLInt },
- transactionId: { type: GraphQLString },
- transactionVout: { type: GraphQLInt },
- };
- },
-});
-
-export const ChannelReportType = new GraphQLObjectType({
- name: 'channelReportType',
- fields: () => {
- return {
- local: { type: GraphQLInt },
- remote: { type: GraphQLInt },
- maxIn: { type: GraphQLInt },
- maxOut: { type: GraphQLInt },
- };
- },
-});
-
-export const PartnerNodeType = new GraphQLObjectType({
- name: 'partnerNodeType',
- fields: () => {
- return {
- alias: { type: GraphQLString },
- capacity: { type: GraphQLString },
- channel_count: { type: GraphQLInt },
- color: { type: GraphQLString },
- updated_at: { type: GraphQLString },
- };
- },
-});
-
-export const ChannelType = new GraphQLObjectType({
- name: 'channelType',
- fields: () => {
- return {
- capacity: { type: GraphQLInt },
- commit_transaction_fee: { type: GraphQLInt },
- commit_transaction_weight: { type: GraphQLInt },
- id: { type: GraphQLString },
- is_active: { type: GraphQLBoolean },
- is_closing: { type: GraphQLBoolean },
- is_opening: { type: GraphQLBoolean },
- is_partner_initiated: { type: GraphQLBoolean },
- is_private: { type: GraphQLBoolean },
- is_static_remote_key: { type: GraphQLBoolean },
- local_balance: { type: GraphQLInt },
- local_reserve: { type: GraphQLInt },
- partner_public_key: { type: GraphQLString },
- received: { type: GraphQLInt },
- remote_balance: { type: GraphQLInt },
- remote_reserve: { type: GraphQLInt },
- sent: { type: GraphQLInt },
- time_offline: { type: GraphQLInt },
- time_online: { type: GraphQLInt },
- transaction_id: { type: GraphQLString },
- transaction_vout: { type: GraphQLInt },
- unsettled_balance: { type: GraphQLInt },
- partner_node_info: { type: PartnerNodeType },
- };
- },
-});
-
-export const ClosedChannelType = new GraphQLObjectType({
- name: 'closedChannelType',
- fields: () => {
- return {
- capacity: { type: GraphQLInt },
- close_confirm_height: { type: GraphQLInt },
- close_transaction_id: { type: GraphQLString },
- final_local_balance: { type: GraphQLInt },
- final_time_locked_balance: { type: GraphQLInt },
- id: { type: GraphQLString },
- is_breach_close: { type: GraphQLBoolean },
- is_cooperative_close: { type: GraphQLBoolean },
- is_funding_cancel: { type: GraphQLBoolean },
- is_local_force_close: { type: GraphQLBoolean },
- is_remote_force_close: { type: GraphQLBoolean },
- partner_public_key: { type: GraphQLString },
- transaction_id: { type: GraphQLString },
- transaction_vout: { type: GraphQLInt },
- partner_node_info: { type: PartnerNodeType },
- };
- },
-});
-
-export const PendingChannelType = new GraphQLObjectType({
- name: 'pendingChannelType',
- fields: () => {
- return {
- close_transaction_id: { type: GraphQLString },
- is_active: { type: GraphQLBoolean },
- is_closing: { type: GraphQLBoolean },
- is_opening: { type: GraphQLBoolean },
- local_balance: { type: GraphQLInt },
- local_reserve: { type: GraphQLInt },
- partner_public_key: { type: GraphQLString },
- received: { type: GraphQLInt },
- remote_balance: { type: GraphQLInt },
- remote_reserve: { type: GraphQLInt },
- sent: { type: GraphQLInt },
- transaction_fee: { type: GraphQLInt },
- transaction_id: { type: GraphQLString },
- transaction_vout: { type: GraphQLInt },
- partner_node_info: { type: PartnerNodeType },
- };
- },
-});
-
-export const PeerType = new GraphQLObjectType({
- name: 'peerType',
- fields: () => {
- return {
- bytes_received: { type: GraphQLInt },
- bytes_sent: { type: GraphQLInt },
- is_inbound: { type: GraphQLBoolean },
- is_sync_peer: { type: GraphQLBoolean },
- ping_time: { type: GraphQLInt },
- public_key: { type: GraphQLString },
- socket: { type: GraphQLString },
- tokens_received: { type: GraphQLInt },
- tokens_sent: { type: GraphQLInt },
- partner_node_info: { type: PartnerNodeType },
- };
- },
-});
-
-export const BitcoinFeeType = new GraphQLObjectType({
- name: 'bitcoinFeeType',
- fields: () => {
- return {
- fast: { type: GraphQLInt },
- halfHour: { type: GraphQLInt },
- hour: { type: GraphQLInt },
- };
- },
-});
-
-export const InOutType = new GraphQLObjectType({
- name: 'InOutType',
- fields: () => {
- return {
- invoices: { type: GraphQLString },
- payments: { type: GraphQLString },
- confirmedInvoices: { type: GraphQLInt },
- unConfirmedInvoices: { type: GraphQLInt },
- };
- },
-});
-
-export const NetworkInfoType = new GraphQLObjectType({
- name: 'networkInfoType',
- fields: () => {
- return {
- averageChannelSize: { type: GraphQLString },
- channelCount: { type: GraphQLInt },
- maxChannelSize: { type: GraphQLString },
- medianChannelSize: { type: GraphQLString },
- minChannelSize: { type: GraphQLInt },
- nodeCount: { type: GraphQLInt },
- notRecentlyUpdatedPolicyCount: { type: GraphQLInt },
- totalCapacity: { type: GraphQLString },
- };
- },
-});
-
-export const NodeInfoType = new GraphQLObjectType({
- name: 'nodeInfoType',
- fields: () => {
- return {
- chains: { type: new GraphQLList(GraphQLString) },
- color: { type: GraphQLString },
- active_channels_count: { type: GraphQLInt },
- closed_channels_count: { type: GraphQLInt },
- alias: { type: GraphQLString },
- current_block_hash: { type: GraphQLString },
- current_block_height: { type: GraphQLBoolean },
- is_synced_to_chain: { type: GraphQLBoolean },
- is_synced_to_graph: { type: GraphQLBoolean },
- latest_block_at: { type: GraphQLString },
- peers_count: { type: GraphQLInt },
- pending_channels_count: { type: GraphQLInt },
- public_key: { type: GraphQLString },
- uris: { type: new GraphQLList(GraphQLString) },
- version: { type: GraphQLString },
- };
- },
-});
-
-export const GetChainTransactionsType = new GraphQLObjectType({
- name: 'getTransactionsType',
- fields: () => ({
- block_id: { type: GraphQLString },
- confirmation_count: { type: GraphQLInt },
- confirmation_height: { type: GraphQLInt },
- created_at: { type: GraphQLString },
- fee: { type: GraphQLInt },
- id: { type: GraphQLString },
- output_addresses: { type: new GraphQLList(GraphQLString) },
- tokens: { type: GraphQLInt },
- }),
-});
-
-export const ForwardType = new GraphQLObjectType({
- name: 'forwardType',
- fields: () => ({
- created_at: { type: GraphQLString },
- fee: { type: GraphQLInt },
- fee_mtokens: { type: GraphQLString },
- incoming_channel: { type: GraphQLString },
- incoming_alias: { type: GraphQLString },
- incoming_color: { type: GraphQLString },
- mtokens: { type: GraphQLString },
- outgoing_channel: { type: GraphQLString },
- outgoing_alias: { type: GraphQLString },
- outgoing_color: { type: GraphQLString },
- tokens: { type: GraphQLInt },
- }),
-});
-
-export const GetForwardType = new GraphQLObjectType({
- name: 'getForwardType',
- fields: () => ({
- token: { type: GraphQLString },
- forwards: { type: new GraphQLList(ForwardType) },
- }),
-});
-
-export const GetResumeType = new GraphQLObjectType({
- name: 'getResumeType',
- fields: () => ({
- token: { type: GraphQLString },
- resume: { type: GraphQLString },
- }),
-});
diff --git a/server/src/utils/appUrls.ts b/server/src/utils/appUrls.ts
deleted file mode 100644
index cbe67e42..00000000
--- a/server/src/utils/appUrls.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export const appUrls = {
- fees: 'https://bitcoinfees.earn.com/api/v1/fees/recommended',
- ticker: 'https://blockchain.info/ticker',
- hodlhodl: 'https://hodlhodl.com/api',
-};
diff --git a/server/src/utils/envConfig.ts b/server/src/utils/envConfig.ts
deleted file mode 100644
index e03a70b3..00000000
--- a/server/src/utils/envConfig.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-require('dotenv').config();
-
-export const envConfig = {
- port: process.env.PORT || 3001,
- env: process.env.NODE_ENV || 'development',
- logLevel: process.env.LOG_LEVEL || 'silly',
- hodlKey: process.env.HODL_KEY,
-};
diff --git a/server/src/utils/rateLimitConfig.ts b/server/src/utils/rateLimitConfig.ts
deleted file mode 100644
index 3a3bd73b..00000000
--- a/server/src/utils/rateLimitConfig.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-interface RateConfigProps {
- [key: string]: {
- max: number;
- window: string;
- };
-}
-
-export const RateConfig: RateConfigProps = {
- channelBalance: { max: 10, window: '1s' },
- channelFees: { max: 10, window: '1s' },
- channels: { max: 10, window: '1s' },
- channelReport: { max: 10, window: '1s' },
- closedChannels: { max: 10, window: '1s' },
- pendingChannels: { max: 10, window: '1s' },
- bitcoinFee: { max: 10, window: '1s' },
- bitcoinPrice: { max: 10, window: '1s' },
- getInOut: { max: 10, window: '1s' },
- chainBalance: { max: 10, window: '1s' },
- pendingChainBalance: { max: 10, window: '1s' },
- networkInfo: { max: 10, window: '1s' },
- nodeInfo: { max: 10, window: '1s' },
- forwards: { max: 10, window: '1s' },
- invoices: { max: 10, window: '1s' },
- payments: { max: 10, window: '1s' },
- forwardChannels: { max: 10, window: '1s' },
- forwardReport: { max: 10, window: '1s' },
- getRoute: { max: 10, window: '1s' },
- closeChannel: { max: 10, window: '1s' },
- openChannel: { max: 10, window: '1s' },
- createInvoice: { max: 10, window: '1s' },
- decode: { max: 10, window: '1s' },
- parsePayment: { max: 10, window: '1s' },
- pay: { max: 10, window: '1s' },
- getAddress: { max: 10, window: '1s' },
- sendToAddress: { max: 10, window: '1s' },
- getBackups: { max: 10, window: '1s' },
- verifyBackups: { max: 10, window: '1s' },
- recoverFunds: { max: 10, window: '1s' },
- updateFees: { max: 10, window: '1s' },
- chainTransactions: { max: 10, window: '1s' },
- getRoutes: { max: 10, window: '1s' },
- payViaRoute: { max: 10, window: '1s' },
- adminCheck: { max: 10, window: '1s' },
- getPeers: { max: 10, window: '1s' },
- addPeer: { max: 10, window: '1s' },
- removePeer: { max: 10, window: '1s' },
- signMessage: { max: 10, window: '1s' },
- verifyMessage: { max: 10, window: '1s' },
- getUtxos: { max: 10, window: '1s' },
- getOffers: { max: 10, window: '1s' },
- getCountries: { max: 10, window: '1s' },
- getCurrencies: { max: 10, window: '1s' },
-};
diff --git a/server/tsconfig.json b/server/tsconfig.json
deleted file mode 100644
index abff9c3e..00000000
--- a/server/tsconfig.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "compilerOptions": {
- /* Basic Options */
- // "incremental": true, /* Enable incremental compilation */
- "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */,
- "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
- "lib": [
- "dom",
- "es6"
- ] /* Specify library files to be included in the compilation. */,
- // "allowJs": true, /* Allow javascript files to be compiled. */
- // "checkJs": true, /* Report errors in .js files. */
- // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
- // "declaration": true, /* Generates corresponding '.d.ts' file. */
- // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
- // "sourceMap": true, /* Generates corresponding '.map' file. */
- // "outFile": "./", /* Concatenate and emit output to single file. */
- "outDir": "dist" /* Redirect output structure to the directory. */,
- "rootDir": "src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */,
- // "composite": true, /* Enable project compilation */
- // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
- "removeComments": true /* Do not emit comments to output. */,
- // "noEmit": true, /* Do not emit outputs. */
- // "importHelpers": true, /* Import emit helpers from 'tslib'. */
- // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
- // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
-
- /* Strict Type-Checking Options */
- "strict": true /* Enable all strict type-checking options. */,
- // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
- // "strictNullChecks": true, /* Enable strict null checks. */
- // "strictFunctionTypes": true, /* Enable strict checking of function types. */
- // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
- // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
- // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
- // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
-
- /* Additional Checks */
- // "noUnusedLocals": true, /* Report errors on unused locals. */
- // "noUnusedParameters": true, /* Report errors on unused parameters. */
- // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
- // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
-
- /* Module Resolution Options */
- // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
- // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
- // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
- // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
- // "typeRoots": [], /* List of folders to include type definitions from. */
- // "types": [], /* Type declaration files to be included in compilation. */
- // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
- "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
- // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
- // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
-
- /* Source Map Options */
- // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
- // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
- // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
- // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
-
- /* Experimental Options */
- // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
- // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
- }
-}
diff --git a/server/types/ln-service.d.ts b/server/types/ln-service.d.ts
deleted file mode 100644
index bdc2bbaa..00000000
--- a/server/types/ln-service.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-declare module 'ln-service';
diff --git a/server/webpack.common.js b/server/webpack.common.js
deleted file mode 100644
index 0ec2f9cf..00000000
--- a/server/webpack.common.js
+++ /dev/null
@@ -1,21 +0,0 @@
-const path = require('path');
-
-module.exports = {
- module: {
- rules: [
- {
- exclude: [path.resolve(__dirname, 'node_modules')],
- test: /\.ts$/,
- use: 'ts-loader',
- },
- ],
- },
- output: {
- filename: 'server.js',
- path: path.resolve(__dirname, 'dist'),
- },
- resolve: {
- extensions: ['.ts', '.js'],
- },
- target: 'node',
-};
diff --git a/server/webpack.development.js b/server/webpack.development.js
deleted file mode 100644
index 2b25cdb2..00000000
--- a/server/webpack.development.js
+++ /dev/null
@@ -1,31 +0,0 @@
-const { CleanWebpackPlugin } = require('clean-webpack-plugin');
-const merge = require('webpack-merge');
-const nodeExternals = require('webpack-node-externals');
-const path = require('path');
-const webpack = require('webpack');
-const WebpackShellPlugin = require('webpack-shell-plugin');
-
-const common = require('./webpack.common.js');
-
-module.exports = merge.smart(common, {
- devtool: 'inline-source-map',
- entry: ['webpack/hot/poll?1000', path.join(__dirname, 'src/main.ts')],
- externals: [
- nodeExternals({
- modulesDir: path.resolve(__dirname, '../node_modules'),
- whitelist: ['webpack/hot/poll?1000'],
- }),
- nodeExternals({
- whitelist: ['webpack/hot/poll?1000'],
- }),
- ],
- mode: 'development',
- plugins: [
- new CleanWebpackPlugin(),
- new webpack.HotModuleReplacementPlugin(),
- new WebpackShellPlugin({
- onBuildEnd: ['yarn dev'],
- }),
- ],
- watch: true,
-});
diff --git a/server/webpack.production.js b/server/webpack.production.js
deleted file mode 100644
index c2943370..00000000
--- a/server/webpack.production.js
+++ /dev/null
@@ -1,19 +0,0 @@
-const { CleanWebpackPlugin } = require('clean-webpack-plugin');
-const merge = require('webpack-merge');
-const nodeExternals = require('webpack-node-externals');
-const path = require('path');
-
-const common = require('./webpack.common.js');
-
-module.exports = merge(common, {
- devtool: 'source-map',
- entry: [path.join(__dirname, 'src/main.ts')],
- externals: [
- nodeExternals({
- modulesDir: path.resolve(__dirname, '../node_modules'),
- }),
- nodeExternals({}),
- ],
- mode: 'production',
- plugins: [new CleanWebpackPlugin()],
-});
diff --git a/server/src/helpers/defaultProps.ts b/src/api/helpers/defaultProps.ts
similarity index 63%
rename from server/src/helpers/defaultProps.ts
rename to src/api/helpers/defaultProps.ts
index e8b6a142..cdc1cc71 100644
--- a/server/src/helpers/defaultProps.ts
+++ b/src/api/helpers/defaultProps.ts
@@ -2,6 +2,6 @@ import { GraphQLNonNull, GraphQLBoolean } from 'graphql';
import { AuthType } from '../schemas/types/GeneralType';
export const defaultParams = {
- auth: { type: new GraphQLNonNull(AuthType) },
- logger: { type: GraphQLBoolean },
+ auth: { type: new GraphQLNonNull(AuthType) },
+ logger: { type: GraphQLBoolean },
};
diff --git a/src/api/helpers/helpers.ts b/src/api/helpers/helpers.ts
new file mode 100644
index 00000000..6ad26a18
--- /dev/null
+++ b/src/api/helpers/helpers.ts
@@ -0,0 +1,59 @@
+import { authenticatedLndGrpc } from 'ln-service';
+import { envConfig } from '../utils/envConfig';
+
+export const getIp = (req: any) => {
+ if (!req || !req.headers) {
+ return '';
+ }
+ const forwarded = req.headers['x-forwarded-for'];
+ const before = forwarded
+ ? forwarded.split(/, /)[0]
+ : req.connection.remoteAddress;
+ const ip = envConfig.env === 'development' ? '1.2.3.4' : before;
+ return ip;
+};
+
+export const getAuthLnd = (auth: {
+ cert: string;
+ macaroon: string;
+ host: string;
+}) => {
+ const encodedCert = auth.cert || '';
+ const encodedMacaroon = auth.macaroon || '';
+ const socket = auth.host || '';
+
+ const cert = encodedCert;
+ const macaroon = encodedMacaroon;
+
+ const params = {
+ macaroon,
+ socket,
+ ...(encodedCert !== '' ? { cert } : {}),
+ };
+
+ const { lnd } = authenticatedLndGrpc(params);
+
+ return lnd;
+};
+
+export const getErrorDetails = (error: any[]): string => {
+ let details = '';
+ if (error.length > 2) {
+ if (error[2].err) {
+ details = error[2].err.details;
+ } else if (error[2].details) {
+ details = error[2].details;
+ }
+ }
+
+ return details;
+};
+
+export const getErrorMsg = (error: any[]): string => {
+ const code = error[0];
+ const msg = error[1];
+
+ const details = getErrorDetails(error);
+
+ return JSON.stringify({ code, msg, details });
+};
diff --git a/src/api/helpers/hodlHelpers.ts b/src/api/helpers/hodlHelpers.ts
new file mode 100644
index 00000000..45edbd0b
--- /dev/null
+++ b/src/api/helpers/hodlHelpers.ts
@@ -0,0 +1,18 @@
+export const getHodlParams = (params: any): string => {
+ let paramString = '?';
+
+ for (const key in params) {
+ if (params.hasOwnProperty(key)) {
+ const element = params[key];
+
+ for (const subKey in element) {
+ if (element.hasOwnProperty(subKey)) {
+ const subElement = element[subKey];
+ paramString = `${paramString}&${key}[${subKey}]=${subElement}`;
+ }
+ }
+ }
+ }
+
+ return paramString;
+};
diff --git a/src/api/helpers/logger.ts b/src/api/helpers/logger.ts
new file mode 100644
index 00000000..e61b1716
--- /dev/null
+++ b/src/api/helpers/logger.ts
@@ -0,0 +1,39 @@
+import { createLogger, format, transports } from 'winston';
+import path from 'path';
+import { envConfig } from '../utils/envConfig';
+
+const combinedFormat =
+ envConfig.env === 'development'
+ ? format.combine(
+ format.label({
+ label: path.basename(
+ process && process.mainModule ? process.mainModule.filename : ''
+ ),
+ }),
+ format.splat(),
+ format.colorize(),
+ format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
+ format.printf(
+ (info: any) =>
+ `${info.timestamp} ${info.level} [${info.label}]: ${info.message}`
+ )
+ )
+ : format.combine(
+ format.label({
+ label: path.basename(
+ process && process.mainModule ? process.mainModule.filename : ''
+ ),
+ }),
+ format.splat(),
+ format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
+ format.printf(
+ (info: any) =>
+ `${info.timestamp} ${info.level} [${info.label}]: ${info.message}`
+ )
+ );
+
+export const logger = createLogger({
+ level: envConfig.logLevel,
+ format: combinedFormat,
+ transports: [new transports.Console()],
+});
diff --git a/src/api/helpers/rateLimiter.ts b/src/api/helpers/rateLimiter.ts
new file mode 100644
index 00000000..fb9dc483
--- /dev/null
+++ b/src/api/helpers/rateLimiter.ts
@@ -0,0 +1,22 @@
+import { getGraphQLRateLimiter } from 'graphql-rate-limit';
+import { RateConfig } from '../utils/rateLimitConfig';
+
+const rateLimiter = getGraphQLRateLimiter({
+ identifyContext: (ctx: string) => ctx,
+ formatError: () => 'Rate Limit Reached',
+});
+
+export const requestLimiter = async (rate: string, field: string) => {
+ if (!RateConfig[field]) throw new Error('Invalid Rate Field');
+ const { max, window } = RateConfig[field];
+ const errorMessage = await rateLimiter(
+ {
+ parent: rate,
+ args: {},
+ context: rate,
+ info: { fieldName: field } as any,
+ },
+ { max, window }
+ );
+ if (errorMessage) throw new Error(errorMessage);
+};
diff --git a/server/src/schemas/index.ts b/src/api/schemas/index.ts
similarity index 50%
rename from server/src/schemas/index.ts
rename to src/api/schemas/index.ts
index 9afc55e6..0214fa8c 100644
--- a/server/src/schemas/index.ts
+++ b/src/api/schemas/index.ts
@@ -3,12 +3,12 @@ import { query } from './query';
import { mutation } from './mutations';
export const thunderHubSchema = new GraphQLSchema({
- query: new GraphQLObjectType({
- name: 'Query',
- fields: query,
- }),
- mutation: new GraphQLObjectType({
- name: 'Mutation',
- fields: mutation,
- }),
+ query: new GraphQLObjectType({
+ name: 'Query',
+ fields: query,
+ }),
+ mutation: new GraphQLObjectType({
+ name: 'Mutation',
+ fields: mutation,
+ }),
});
diff --git a/src/api/schemas/mutations/channels/closeChannel.ts b/src/api/schemas/mutations/channels/closeChannel.ts
new file mode 100644
index 00000000..7287f33d
--- /dev/null
+++ b/src/api/schemas/mutations/channels/closeChannel.ts
@@ -0,0 +1,49 @@
+import { closeChannel as lnCloseChannel } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import {
+ GraphQLBoolean,
+ GraphQLString,
+ GraphQLInt,
+ GraphQLNonNull,
+} from 'graphql';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { CloseChannelType } from '../../types/MutationType';
+
+interface CloseChannelProps {
+ transaction_id: string;
+ transaction_vout: string;
+}
+
+export const closeChannel = {
+ type: CloseChannelType,
+ args: {
+ ...defaultParams,
+ id: { type: new GraphQLNonNull(GraphQLString) },
+ forceClose: { type: GraphQLBoolean },
+ targetConfirmations: { type: GraphQLInt },
+ tokensPerVByte: { type: GraphQLInt },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'closeChannel');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const info: CloseChannelProps = await lnCloseChannel({
+ lnd,
+ id: params.id,
+ target_confirmations: params.targetConfirmations,
+ tokens_per_vbyte: params.tokensPerVByte,
+ });
+ return {
+ transactionId: info.transaction_id,
+ transactionOutputIndex: info.transaction_vout,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error closing channel: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/server/src/schemas/mutations/channels/index.ts b/src/api/schemas/mutations/channels/index.ts
similarity index 76%
rename from server/src/schemas/mutations/channels/index.ts
rename to src/api/schemas/mutations/channels/index.ts
index b2c6a268..71fc1ed1 100644
--- a/server/src/schemas/mutations/channels/index.ts
+++ b/src/api/schemas/mutations/channels/index.ts
@@ -3,7 +3,7 @@ import { openChannel } from './openChannel';
import { updateFees } from './updateFees';
export const channels = {
- closeChannel,
- openChannel,
- updateFees,
+ closeChannel,
+ openChannel,
+ updateFees,
};
diff --git a/src/api/schemas/mutations/channels/openChannel.ts b/src/api/schemas/mutations/channels/openChannel.ts
new file mode 100644
index 00000000..82e40d59
--- /dev/null
+++ b/src/api/schemas/mutations/channels/openChannel.ts
@@ -0,0 +1,50 @@
+import { openChannel as lnOpenChannel } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import {
+ GraphQLBoolean,
+ GraphQLString,
+ GraphQLInt,
+ GraphQLNonNull,
+} from 'graphql';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { OpenChannelType } from '../../types/MutationType';
+
+interface OpenChannelProps {
+ transaction_id: string;
+ transaction_vout: string;
+}
+
+export const openChannel = {
+ type: OpenChannelType,
+ args: {
+ ...defaultParams,
+ amount: { type: new GraphQLNonNull(GraphQLInt) },
+ partnerPublicKey: { type: new GraphQLNonNull(GraphQLString) },
+ tokensPerVByte: { type: GraphQLInt },
+ isPrivate: { type: GraphQLBoolean },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'openChannel');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const info: OpenChannelProps = await lnOpenChannel({
+ lnd,
+ is_private: params.isPrivate,
+ local_tokens: params.amount,
+ partner_public_key: params.partnerPublicKey,
+ chain_fee_tokens_per_vbyte: params.tokensPerVByte,
+ });
+ return {
+ transactionId: info.transaction_id,
+ transactionOutputIndex: info.transaction_vout,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error opening channel: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/mutations/channels/updateFees.ts b/src/api/schemas/mutations/channels/updateFees.ts
new file mode 100644
index 00000000..6c0dd8ba
--- /dev/null
+++ b/src/api/schemas/mutations/channels/updateFees.ts
@@ -0,0 +1,44 @@
+import { updateRoutingFees } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLBoolean, GraphQLString, GraphQLInt } from 'graphql';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+export const updateFees = {
+ type: GraphQLBoolean,
+ args: {
+ ...defaultParams,
+ transactionId: { type: GraphQLString },
+ transactionVout: { type: GraphQLInt },
+ baseFee: { type: GraphQLInt },
+ feeRate: { type: GraphQLInt },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'updateFees');
+
+ const { auth, transactionId, transactionVout, baseFee, feeRate } = params;
+
+ const lnd = getAuthLnd(auth);
+
+ if (!baseFee && !feeRate) {
+ throw new Error('No Base Fee or Fee Rate to update channels');
+ }
+
+ const props = {
+ lnd,
+ transaction_id: transactionId,
+ transaction_vout: transactionVout,
+ ...(params.baseFee && { base_fee_tokens: params.baseFee }),
+ ...(params.feeRate && { fee_rate: params.feeRate }),
+ };
+
+ try {
+ await updateRoutingFees(props);
+ return true;
+ } catch (error) {
+ params.logger && logger.error('Error updating routing fees: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/server/src/schemas/mutations/index.ts b/src/api/schemas/mutations/index.ts
similarity index 73%
rename from server/src/schemas/mutations/index.ts
rename to src/api/schemas/mutations/index.ts
index d4a95541..270860eb 100644
--- a/server/src/schemas/mutations/index.ts
+++ b/src/api/schemas/mutations/index.ts
@@ -4,8 +4,8 @@ import { onChain } from './onchain';
import { peers } from './peers';
export const mutation = {
- ...channels,
- ...invoices,
- ...onChain,
- ...peers,
+ ...channels,
+ ...invoices,
+ ...onChain,
+ ...peers,
};
diff --git a/src/api/schemas/mutations/invoices/createInvoice.ts b/src/api/schemas/mutations/invoices/createInvoice.ts
new file mode 100644
index 00000000..f205d493
--- /dev/null
+++ b/src/api/schemas/mutations/invoices/createInvoice.ts
@@ -0,0 +1,50 @@
+import { createInvoice as createInvoiceRequest } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLNonNull, GraphQLInt } from 'graphql';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { InvoiceType } from '../../types/MutationType';
+
+interface InvoiceProps {
+ chain_address: string;
+ created_at: string;
+ description: string;
+ id: string;
+ request: string;
+ secret: string;
+ tokens: number;
+}
+
+export const createInvoice = {
+ type: InvoiceType,
+ args: {
+ ...defaultParams,
+ amount: { type: new GraphQLNonNull(GraphQLInt) },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'createInvoice');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const invoice: InvoiceProps = await createInvoiceRequest({
+ lnd,
+ tokens: params.amount,
+ });
+
+ return {
+ chainAddress: invoice.chain_address,
+ createdAt: invoice.created_at,
+ description: invoice.description,
+ id: invoice.id,
+ request: invoice.request,
+ secret: invoice.secret,
+ tokens: invoice.tokens,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error creating invoice: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/mutations/invoices/decode.ts b/src/api/schemas/mutations/invoices/decode.ts
new file mode 100644
index 00000000..ce3762bd
--- /dev/null
+++ b/src/api/schemas/mutations/invoices/decode.ts
@@ -0,0 +1,92 @@
+import { decodePaymentRequest } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLString, GraphQLNonNull } from 'graphql';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { DecodeType } from '../../types/MutationType';
+
+interface RouteProps {
+ base_fee_mtokens: string;
+ channel: string;
+ cltv_delta: number;
+ fee_rate: number;
+ public_key: string;
+}
+
+interface DecodeProps {
+ chain_address: string;
+ cltv_delta: number;
+ description: string;
+ description_hash: string;
+ destination: string;
+ expires_at: string;
+ id: string;
+ routes: RouteProps[][];
+ tokens: number;
+}
+
+export const decodeRequest = {
+ type: DecodeType,
+ args: {
+ ...defaultParams,
+ request: { type: new GraphQLNonNull(GraphQLString) },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'decode');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const decode: DecodeProps = await decodePaymentRequest({
+ lnd,
+ request: params.request,
+ });
+
+ const routes = decode.routes.map(route => {
+ route.map(nodeChannel => {
+ const {
+ base_fee_mtokens,
+ channel,
+ cltv_delta,
+ fee_rate,
+ public_key,
+ } = nodeChannel;
+ return {
+ baseFeeTokens: base_fee_mtokens,
+ channel,
+ cltvDelta: cltv_delta,
+ feeRate: fee_rate,
+ publicKey: public_key,
+ };
+ });
+ });
+
+ const {
+ chain_address,
+ cltv_delta,
+ description,
+ description_hash,
+ destination,
+ expires_at,
+ id,
+ tokens,
+ } = decode;
+
+ return {
+ chainAddress: chain_address,
+ cltvDelta: cltv_delta,
+ description,
+ descriptionHash: description_hash,
+ destination,
+ expiresAt: expires_at,
+ id,
+ routes,
+ tokens,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error paying request: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/server/src/schemas/mutations/invoices/index.ts b/src/api/schemas/mutations/invoices/index.ts
similarity index 74%
rename from server/src/schemas/mutations/invoices/index.ts
rename to src/api/schemas/mutations/invoices/index.ts
index e07fd804..d287c9e7 100644
--- a/server/src/schemas/mutations/invoices/index.ts
+++ b/src/api/schemas/mutations/invoices/index.ts
@@ -5,9 +5,9 @@ import { decodeRequest } from './decode';
import { payViaRoute } from './payViaRoute';
export const invoices = {
- parsePayment,
- pay,
- createInvoice,
- decodeRequest,
- payViaRoute,
+ parsePayment,
+ pay,
+ createInvoice,
+ decodeRequest,
+ payViaRoute,
};
diff --git a/src/api/schemas/mutations/invoices/parsePayment.ts b/src/api/schemas/mutations/invoices/parsePayment.ts
new file mode 100644
index 00000000..b9adbf40
--- /dev/null
+++ b/src/api/schemas/mutations/invoices/parsePayment.ts
@@ -0,0 +1,80 @@
+import { parsePaymentRequest } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLString, GraphQLNonNull } from 'graphql';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { ParsePaymentType } from '../../types/MutationType';
+
+interface RouteProps {
+ base_fee_mtokens: string;
+ channel: string;
+ cltv_delta: number;
+ fee_rate: number;
+ public_key: string;
+}
+
+interface RequestProps {
+ chain_addresses: string[];
+ cltv_delta: number;
+ created_at: string;
+ description: string;
+ description_hash: string;
+ destination: string;
+ expires_at: string;
+ id: string;
+ is_expired: string;
+ mtokens: string;
+ network: string;
+ routes: RouteProps[];
+ tokens: number;
+}
+
+export const parsePayment = {
+ type: ParsePaymentType,
+ args: {
+ ...defaultParams,
+ request: { type: new GraphQLNonNull(GraphQLString) },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'parsePayment');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const request: RequestProps = await parsePaymentRequest({
+ lnd,
+ request: params.request,
+ });
+
+ const routes = request.routes.map(route => {
+ return {
+ mTokenFee: route.base_fee_mtokens,
+ channel: route.channel,
+ cltvDelta: route.cltv_delta,
+ feeRate: route.fee_rate,
+ publicKey: route.public_key,
+ };
+ });
+
+ return {
+ chainAddresses: request.chain_addresses,
+ cltvDelta: request.cltv_delta,
+ createdAt: request.created_at,
+ description: request.description,
+ descriptionHash: request.description_hash,
+ destination: request.destination,
+ expiresAt: request.expires_at,
+ id: request.id,
+ isExpired: request.is_expired,
+ mTokens: request.mtokens,
+ network: request.network,
+ routes,
+ tokens: request.tokens,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error decoding request: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/mutations/invoices/pay.ts b/src/api/schemas/mutations/invoices/pay.ts
new file mode 100644
index 00000000..f41ec6ef
--- /dev/null
+++ b/src/api/schemas/mutations/invoices/pay.ts
@@ -0,0 +1,73 @@
+import { pay as payRequest } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLString, GraphQLNonNull } from 'graphql';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { PayType } from '../../types/MutationType';
+
+interface HopProps {
+ channel: string;
+ channel_capacity: number;
+ fee_mtokens: string;
+ forward_mtokens: string;
+ timeout: number;
+}
+
+interface RequestProps {
+ fee: number;
+ fee_mtokens: string;
+ hops: HopProps[];
+ id: string;
+ is_confirmed: boolean;
+ is_outgoing: boolean;
+ mtokens: string;
+ secret: string;
+ tokens: number;
+}
+
+// TODO: Allow path payments as well
+export const pay = {
+ type: PayType,
+ args: {
+ ...defaultParams,
+ request: { type: new GraphQLNonNull(GraphQLString) },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'pay');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const payment: RequestProps = await payRequest({
+ lnd,
+ request: params.request,
+ });
+
+ const hops = payment.hops.map(hop => {
+ return {
+ channel: hop.channel,
+ channelCapacity: hop.channel_capacity,
+ mTokenFee: hop.fee_mtokens,
+ forwardMTokens: hop.forward_mtokens,
+ timeout: hop.timeout,
+ };
+ });
+
+ return {
+ fee: payment.fee,
+ feeMTokens: payment.fee_mtokens,
+ hops,
+ id: payment.id,
+ isConfirmed: payment.is_confirmed,
+ isOutgoing: payment.is_outgoing,
+ mtokens: payment.mtokens,
+ secret: payment.secret,
+ tokens: payment.tokens,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error paying request: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/mutations/invoices/payViaRoute.ts b/src/api/schemas/mutations/invoices/payViaRoute.ts
new file mode 100644
index 00000000..644b8009
--- /dev/null
+++ b/src/api/schemas/mutations/invoices/payViaRoute.ts
@@ -0,0 +1,43 @@
+import { GraphQLNonNull, GraphQLBoolean, GraphQLString } from 'graphql';
+import { payViaRoutes, createInvoice } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+export const payViaRoute = {
+ type: GraphQLBoolean,
+ args: {
+ ...defaultParams,
+ route: { type: new GraphQLNonNull(GraphQLString) },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'payViaRoute');
+
+ const lnd = getAuthLnd(params.auth);
+
+ let route;
+ try {
+ route = JSON.parse(params.route);
+ } catch (error) {
+ params.logger && logger.error('Corrupt route json: %o', error);
+ throw new Error('Corrupt Route JSON');
+ }
+
+ const { id } = await createInvoice({
+ lnd,
+ tokens: params.tokens,
+ description: 'Balancing Channel',
+ }).catch((error: any) => {
+ params.logger && logger.error('Error getting invoice: %o', error);
+ throw new Error(getErrorMsg(error));
+ });
+
+ await payViaRoutes({ lnd, routes: [route], id }).catch((error: any) => {
+ params.logger && logger.error('Error making payment: %o', error);
+ throw new Error(getErrorMsg(error));
+ });
+
+ return true;
+ },
+};
diff --git a/src/api/schemas/mutations/onchain/getAddress.ts b/src/api/schemas/mutations/onchain/getAddress.ts
new file mode 100644
index 00000000..bfd9f2f6
--- /dev/null
+++ b/src/api/schemas/mutations/onchain/getAddress.ts
@@ -0,0 +1,38 @@
+import { createChainAddress } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLString, GraphQLBoolean } from 'graphql';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+interface AddressProps {
+ address: string;
+}
+
+export const createAddress = {
+ type: GraphQLString,
+ args: {
+ ...defaultParams,
+ nested: { type: GraphQLBoolean },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'getAddress');
+
+ const lnd = getAuthLnd(params.auth);
+
+ const format = params.nested ? 'np2wpkh' : 'p2wpkh';
+
+ try {
+ const address: AddressProps = await createChainAddress({
+ lnd,
+ is_unused: true,
+ format,
+ });
+
+ return address.address;
+ } catch (error) {
+ params.logger && logger.error('Error creating address: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/server/src/schemas/mutations/onchain/index.ts b/src/api/schemas/mutations/onchain/index.ts
similarity index 76%
rename from server/src/schemas/mutations/onchain/index.ts
rename to src/api/schemas/mutations/onchain/index.ts
index 76712376..4b755846 100644
--- a/server/src/schemas/mutations/onchain/index.ts
+++ b/src/api/schemas/mutations/onchain/index.ts
@@ -2,6 +2,6 @@ import { createAddress } from './getAddress';
import { sendToAddress } from './sendToAddress';
export const onChain = {
- createAddress,
- sendToAddress,
+ createAddress,
+ sendToAddress,
};
diff --git a/src/api/schemas/mutations/onchain/sendToAddress.ts b/src/api/schemas/mutations/onchain/sendToAddress.ts
new file mode 100644
index 00000000..2ae16dd7
--- /dev/null
+++ b/src/api/schemas/mutations/onchain/sendToAddress.ts
@@ -0,0 +1,66 @@
+import { sendToChainAddress } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import {
+ GraphQLNonNull,
+ GraphQLString,
+ GraphQLBoolean,
+ GraphQLInt,
+} from 'graphql';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { SendToType } from '../../types/MutationType';
+
+interface SendProps {
+ confirmation_count: number;
+ id: string;
+ is_confirmed: boolean;
+ is_outgoing: boolean;
+ tokens: number;
+}
+
+export const sendToAddress = {
+ type: SendToType,
+ args: {
+ ...defaultParams,
+ address: { type: new GraphQLNonNull(GraphQLString) },
+ tokens: { type: GraphQLInt },
+ fee: { type: GraphQLInt },
+ target: { type: GraphQLInt },
+ sendAll: { type: GraphQLBoolean },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'sendToAddress');
+
+ const lnd = getAuthLnd(params.auth);
+
+ const props = params.fee
+ ? { fee_tokens_per_vbyte: params.fee }
+ : params.target
+ ? { target_confirmations: params.target }
+ : {};
+
+ const sendAll = params.sendAll ? { is_send_all: true } : {};
+
+ try {
+ const send: SendProps = await sendToChainAddress({
+ lnd,
+ address: params.address,
+ tokens: params.tokens,
+ ...props,
+ ...sendAll,
+ });
+
+ return {
+ confirmationCount: send.confirmation_count,
+ id: send.id,
+ isConfirmed: send.is_confirmed,
+ isOutgoing: send.is_outgoing,
+ tokens: send.tokens,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error creating address: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/mutations/peers/addPeer.ts b/src/api/schemas/mutations/peers/addPeer.ts
new file mode 100644
index 00000000..92c73538
--- /dev/null
+++ b/src/api/schemas/mutations/peers/addPeer.ts
@@ -0,0 +1,34 @@
+import { addPeer as addLnPeer } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLBoolean, GraphQLString, GraphQLNonNull } from 'graphql';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+export const addPeer = {
+ type: GraphQLBoolean,
+ args: {
+ ...defaultParams,
+ publicKey: { type: new GraphQLNonNull(GraphQLString) },
+ socket: { type: new GraphQLNonNull(GraphQLString) },
+ isTemporary: { type: GraphQLBoolean },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'addPeer');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const success: boolean = await addLnPeer({
+ lnd,
+ public_key: params.publicKey,
+ socket: params.socket,
+ is_temporary: params.isTemporary,
+ });
+ return success;
+ } catch (error) {
+ params.logger && logger.error('Error adding peer: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/server/src/schemas/mutations/peers/index.ts b/src/api/schemas/mutations/peers/index.ts
similarity index 78%
rename from server/src/schemas/mutations/peers/index.ts
rename to src/api/schemas/mutations/peers/index.ts
index 2e094373..baac6231 100644
--- a/server/src/schemas/mutations/peers/index.ts
+++ b/src/api/schemas/mutations/peers/index.ts
@@ -2,6 +2,6 @@ import { addPeer } from './addPeer';
import { removePeer } from './removePeer';
export const peers = {
- addPeer,
- removePeer,
+ addPeer,
+ removePeer,
};
diff --git a/src/api/schemas/mutations/peers/removePeer.ts b/src/api/schemas/mutations/peers/removePeer.ts
new file mode 100644
index 00000000..35dac8ab
--- /dev/null
+++ b/src/api/schemas/mutations/peers/removePeer.ts
@@ -0,0 +1,30 @@
+import { removePeer as removeLnPeer } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLBoolean, GraphQLString, GraphQLNonNull } from 'graphql';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+export const removePeer = {
+ type: GraphQLBoolean,
+ args: {
+ ...defaultParams,
+ publicKey: { type: new GraphQLNonNull(GraphQLString) },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'removePeer');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const success: boolean = await removeLnPeer({
+ lnd,
+ public_key: params.publicKey,
+ });
+ return success;
+ } catch (error) {
+ params.logger && logger.error('Error removing peer: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/backup/getBackups.ts b/src/api/schemas/query/backup/getBackups.ts
new file mode 100644
index 00000000..c4695fbd
--- /dev/null
+++ b/src/api/schemas/query/backup/getBackups.ts
@@ -0,0 +1,26 @@
+import { getBackups as getLnBackups } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLString } from 'graphql';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+export const getBackups = {
+ type: GraphQLString,
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'getBackups');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const backups = await getLnBackups({
+ lnd,
+ });
+ return JSON.stringify(backups);
+ } catch (error) {
+ params.logger && logger.error('Error getting backups: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/server/src/schemas/query/backup/index.ts b/src/api/schemas/query/backup/index.ts
similarity index 76%
rename from server/src/schemas/query/backup/index.ts
rename to src/api/schemas/query/backup/index.ts
index d1bb26e6..5ad47239 100644
--- a/server/src/schemas/query/backup/index.ts
+++ b/src/api/schemas/query/backup/index.ts
@@ -3,7 +3,7 @@ import { verifyBackups } from './verifyBackups';
import { recoverFunds } from './recoverFunds';
export const backupQueries = {
- getBackups,
- verifyBackups,
- recoverFunds,
+ getBackups,
+ verifyBackups,
+ recoverFunds,
};
diff --git a/src/api/schemas/query/backup/recoverFunds.ts b/src/api/schemas/query/backup/recoverFunds.ts
new file mode 100644
index 00000000..c794af61
--- /dev/null
+++ b/src/api/schemas/query/backup/recoverFunds.ts
@@ -0,0 +1,45 @@
+import { recoverFundsFromChannels } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLNonNull, GraphQLString, GraphQLBoolean } from 'graphql';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+interface BackupProps {
+ backup: string;
+}
+
+export const recoverFunds = {
+ type: GraphQLBoolean,
+ args: {
+ ...defaultParams,
+ backup: { type: new GraphQLNonNull(GraphQLString) },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'recoverFunds');
+
+ const lnd = getAuthLnd(params.auth);
+
+ let backupObj: BackupProps = { backup: '' };
+ try {
+ backupObj = JSON.parse(params.backup);
+ } catch (error) {
+ params.logger && logger.error('Corrupt backup file: %o', error);
+ throw new Error('Corrupt backup file');
+ }
+
+ const { backup } = backupObj;
+
+ try {
+ await recoverFundsFromChannels({
+ lnd,
+ backup,
+ });
+ return true;
+ } catch (error) {
+ params.logger &&
+ logger.error('Error recovering funds from channels: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/backup/verifyBackups.ts b/src/api/schemas/query/backup/verifyBackups.ts
new file mode 100644
index 00000000..d34fd248
--- /dev/null
+++ b/src/api/schemas/query/backup/verifyBackups.ts
@@ -0,0 +1,46 @@
+import { verifyBackups as verifyLnBackups } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLNonNull, GraphQLString, GraphQLBoolean } from 'graphql';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+interface BackupProps {
+ backup: string;
+ channels: {}[];
+}
+
+export const verifyBackups = {
+ type: GraphQLBoolean,
+ args: {
+ ...defaultParams,
+ backup: { type: new GraphQLNonNull(GraphQLString) },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'verifyBackups');
+
+ const lnd = getAuthLnd(params.auth);
+
+ let backupObj: BackupProps = { backup: '', channels: [] };
+ try {
+ backupObj = JSON.parse(params.backup);
+ } catch (error) {
+ params.logger && logger.error('Corrupt backup file: %o', error);
+ throw new Error('Corrupt backup file');
+ }
+
+ const { backup, channels } = backupObj;
+
+ try {
+ const { is_valid } = await verifyLnBackups({
+ lnd,
+ backup,
+ channels,
+ });
+ return is_valid;
+ } catch (error) {
+ params.logger && logger.error('Error verifying backups: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/chain/chainBalance.ts b/src/api/schemas/query/chain/chainBalance.ts
new file mode 100644
index 00000000..c9be02ae
--- /dev/null
+++ b/src/api/schemas/query/chain/chainBalance.ts
@@ -0,0 +1,58 @@
+import {
+ getChainBalance as getBalance,
+ getPendingChainBalance as getPending,
+} from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLInt } from 'graphql';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+interface ChainBalanceProps {
+ chain_balance: number;
+}
+
+interface PendingChainBalanceProps {
+ pending_chain_balance: number;
+}
+
+export const getChainBalance = {
+ type: GraphQLInt,
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'chainBalance');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const value: ChainBalanceProps = await getBalance({
+ lnd,
+ });
+ return value.chain_balance;
+ } catch (error) {
+ params.logger && logger.error('Error getting chain balance: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
+
+export const getPendingChainBalance = {
+ type: GraphQLInt,
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'pendingChainBalance');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const pendingValue: PendingChainBalanceProps = await getPending({
+ lnd,
+ });
+ return pendingValue.pending_chain_balance;
+ } catch (error) {
+ params.logger &&
+ logger.error('Error getting pending chain balance: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/chain/chainTransactions.ts b/src/api/schemas/query/chain/chainTransactions.ts
new file mode 100644
index 00000000..4a66f06e
--- /dev/null
+++ b/src/api/schemas/query/chain/chainTransactions.ts
@@ -0,0 +1,49 @@
+import { GraphQLList } from 'graphql';
+import { getChainTransactions as getLnChainTransactions } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { sortBy } from 'underscore';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { GetChainTransactionsType } from '../../types/QueryType';
+
+interface TransactionProps {
+ block_id: string;
+ confirmation_count: number;
+ confirmation_height: number;
+ created_at: string;
+ fee: number;
+ id: string;
+ output_addresses: string[];
+ tokens: number;
+}
+
+interface TransactionsProps {
+ transactions: TransactionProps[];
+}
+
+export const getChainTransactions = {
+ type: new GraphQLList(GetChainTransactionsType),
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'chainTransactions');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const transactionList: TransactionsProps = await getLnChainTransactions({
+ lnd,
+ });
+
+ const transactions = sortBy(
+ transactionList.transactions,
+ 'created_at'
+ ).reverse();
+ return transactions;
+ } catch (error) {
+ params.logger &&
+ logger.error('Error getting chain transactions: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/chain/getUtxos.ts b/src/api/schemas/query/chain/getUtxos.ts
new file mode 100644
index 00000000..3ee632ee
--- /dev/null
+++ b/src/api/schemas/query/chain/getUtxos.ts
@@ -0,0 +1,43 @@
+import { getUtxos as getLnUtxos } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import {
+ GraphQLInt,
+ GraphQLObjectType,
+ GraphQLString,
+ GraphQLList,
+} from 'graphql';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+const GetUtxosType = new GraphQLObjectType({
+ name: 'getUtxosType',
+ fields: () => ({
+ address: { type: GraphQLString },
+ address_format: { type: GraphQLString },
+ confirmation_count: { type: GraphQLInt },
+ output_script: { type: GraphQLString },
+ tokens: { type: GraphQLInt },
+ transaction_id: { type: GraphQLString },
+ transaction_vout: { type: GraphQLInt },
+ }),
+});
+
+export const getUtxos = {
+ type: new GraphQLList(GetUtxosType),
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'getUtxos');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const { utxos } = await getLnUtxos({ lnd });
+
+ return utxos;
+ } catch (error) {
+ params.logger && logger.error('Error getting utxos: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/server/src/schemas/query/chain/index.ts b/src/api/schemas/query/chain/index.ts
similarity index 69%
rename from server/src/schemas/query/chain/index.ts
rename to src/api/schemas/query/chain/index.ts
index 310c91b2..e69e2661 100644
--- a/server/src/schemas/query/chain/index.ts
+++ b/src/api/schemas/query/chain/index.ts
@@ -3,8 +3,8 @@ import { getChainTransactions } from './chainTransactions';
import { getUtxos } from './getUtxos';
export const chainQueries = {
- getChainBalance,
- getPendingChainBalance,
- getChainTransactions,
- getUtxos,
+ getChainBalance,
+ getPendingChainBalance,
+ getChainTransactions,
+ getUtxos,
};
diff --git a/src/api/schemas/query/channels/channelBalance.ts b/src/api/schemas/query/channels/channelBalance.ts
new file mode 100644
index 00000000..87de30bf
--- /dev/null
+++ b/src/api/schemas/query/channels/channelBalance.ts
@@ -0,0 +1,34 @@
+import { getChannelBalance as getLnChannelBalance } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { ChannelBalanceType } from '../../types/QueryType';
+
+interface ChannelBalanceProps {
+ channel_balance: number;
+ pending_balance: number;
+}
+
+export const getChannelBalance = {
+ type: ChannelBalanceType,
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'channelBalance');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const channelBalance: ChannelBalanceProps = await getLnChannelBalance({
+ lnd,
+ });
+ return {
+ confirmedBalance: channelBalance.channel_balance,
+ pendingBalance: channelBalance.pending_balance,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error getting channel balance: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/channels/channelFees.ts b/src/api/schemas/query/channels/channelFees.ts
new file mode 100644
index 00000000..ae8fd14f
--- /dev/null
+++ b/src/api/schemas/query/channels/channelFees.ts
@@ -0,0 +1,86 @@
+import { getFeeRates, getChannels, getNode } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLList } from 'graphql';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { ChannelFeeType } from '../../types/QueryType';
+
+interface GetChannelsProps {
+ channels: ChannelsProps[];
+}
+
+interface GetFeeRatesProps {
+ channels: ChannelFeesProps[];
+}
+
+interface ChannelsProps {
+ partner_public_key: number;
+ transaction_id: string;
+}
+
+interface ChannelFeesProps {
+ base_fee: number;
+ fee_rate: number;
+ transaction_id: string;
+ transaction_vout: number;
+}
+
+interface NodeProps {
+ alias: string;
+ color: string;
+}
+
+export const getChannelFees = {
+ type: new GraphQLList(ChannelFeeType),
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'channelFees');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const channels: GetChannelsProps = await getChannels({ lnd });
+
+ const channelFees: GetFeeRatesProps = await getFeeRates({ lnd });
+
+ const getConsolidated = () =>
+ Promise.all(
+ channels.channels.map(async channel => {
+ const nodeInfo: NodeProps = await getNode({
+ lnd,
+ is_omitting_channels: true,
+ public_key: channel.partner_public_key,
+ });
+
+ const fees = channelFees.channels.find(
+ channelFee => channelFee.transaction_id === channel.transaction_id
+ );
+ if (!fees) return;
+ const {
+ base_fee,
+ fee_rate,
+ transaction_id,
+ transaction_vout,
+ } = fees;
+
+ return {
+ alias: nodeInfo.alias,
+ color: nodeInfo.color,
+ baseFee: base_fee,
+ feeRate: fee_rate,
+ transactionId: transaction_id,
+ transactionVout: transaction_vout,
+ };
+ })
+ );
+
+ const consolidated = await getConsolidated();
+
+ return consolidated;
+ } catch (error) {
+ params.logger && logger.error('Error getting channel fees: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/channels/channelReport.ts b/src/api/schemas/query/channels/channelReport.ts
new file mode 100644
index 00000000..c46da5a1
--- /dev/null
+++ b/src/api/schemas/query/channels/channelReport.ts
@@ -0,0 +1,64 @@
+import { getChannels } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { ChannelReportType } from '../../types/QueryType';
+
+interface GetChannelsProps {
+ channels: ChannelsProps[];
+}
+
+interface ChannelsProps {
+ remote_balance: number;
+ local_balance: number;
+}
+
+export const getChannelReport = {
+ type: ChannelReportType,
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'channelReport');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const channels: GetChannelsProps = await getChannels({ lnd });
+
+ if (channels.channels.length <= 0) {
+ return;
+ }
+
+ const maxOutgoing = Math.max.apply(
+ Math,
+ channels.channels.map(o => {
+ return o.local_balance;
+ })
+ );
+
+ const maxIncoming = Math.max.apply(
+ Math,
+ channels.channels.map(o => {
+ return o.remote_balance;
+ })
+ );
+
+ const consolidated = channels.channels.reduce((p, c) => {
+ return {
+ remote_balance: p.remote_balance + c.remote_balance,
+ local_balance: p.local_balance + c.local_balance,
+ };
+ });
+
+ return {
+ local: consolidated.local_balance,
+ remote: consolidated.remote_balance,
+ maxIn: maxIncoming,
+ maxOut: maxOutgoing,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error getting channel report: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/channels/channels.ts b/src/api/schemas/query/channels/channels.ts
new file mode 100644
index 00000000..62a48ff2
--- /dev/null
+++ b/src/api/schemas/query/channels/channels.ts
@@ -0,0 +1,81 @@
+import { GraphQLList, GraphQLBoolean } from 'graphql';
+import { getChannels as getLnChannels, getNode } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { ChannelType } from '../../types/QueryType';
+
+interface ChannelListProps {
+ channels: ChannelProps[];
+}
+
+interface ChannelProps {
+ capacity: number;
+ commit_transaction_fee: number;
+ commit_transaction_weight: number;
+ id: string;
+ is_active: boolean;
+ is_closing: boolean;
+ is_opening: boolean;
+ is_partner_initiated: boolean;
+ is_private: boolean;
+ is_static_remote_key: boolean;
+ local_balance: number;
+ local_reserve: number;
+ partner_public_key: string;
+ pending_payments: [];
+ received: number;
+ remote_balance: number;
+ remote_reserve: number;
+ sent: number;
+ time_offline: number;
+ time_online: number;
+ transaction_id: string;
+ transaction_vout: number;
+ unsettled_balance: number;
+}
+
+export const getChannels = {
+ type: new GraphQLList(ChannelType),
+ args: {
+ ...defaultParams,
+ active: { type: GraphQLBoolean },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'channels');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const channelList: ChannelListProps = await getLnChannels({
+ lnd,
+ is_active: params.active,
+ });
+
+ const getChannelList = () =>
+ Promise.all(
+ channelList.channels.map(async channel => {
+ const nodeInfo = await getNode({
+ lnd,
+ is_omitting_channels: true,
+ public_key: channel.partner_public_key,
+ });
+
+ return {
+ ...channel,
+ partner_node_info: {
+ ...nodeInfo,
+ },
+ };
+ })
+ );
+
+ const channels = await getChannelList();
+ return channels;
+ } catch (error) {
+ params.logger && logger.error('Error getting channels: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/channels/closedChannels.ts b/src/api/schemas/query/channels/closedChannels.ts
new file mode 100644
index 00000000..d414ccf0
--- /dev/null
+++ b/src/api/schemas/query/channels/closedChannels.ts
@@ -0,0 +1,66 @@
+import { GraphQLList, GraphQLString } from 'graphql';
+import { getClosedChannels as getLnClosedChannels, getNode } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+
+import { defaultParams } from '../../../helpers/defaultProps';
+import { ClosedChannelType } from '../../types/QueryType';
+
+interface ChannelListProps {
+ channels: ChannelProps[];
+}
+
+interface ChannelProps {
+ capacity: number;
+ close_confirm_height: number;
+ close_transaction_id: string;
+ final_local_balance: number;
+ final_time_locked_balance: number;
+ id: string;
+ is_breach_close: boolean;
+ is_cooperative_close: boolean;
+ is_funding_cancel: boolean;
+ is_local_force_close: boolean;
+ is_remote_force_close: boolean;
+ partner_public_key: string;
+ transaction_id: string;
+ transaction_vout: number;
+}
+
+export const getClosedChannels = {
+ type: new GraphQLList(ClosedChannelType),
+ args: {
+ ...defaultParams,
+ type: { type: GraphQLString },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'closedChannels');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const closedChannels: ChannelListProps = await getLnClosedChannels({
+ lnd,
+ });
+ const channels = closedChannels.channels.map(async channel => {
+ const nodeInfo = await getNode({
+ lnd,
+ is_omitting_channels: true,
+ public_key: channel.partner_public_key,
+ });
+
+ return {
+ ...channel,
+ partner_node_info: {
+ ...nodeInfo,
+ },
+ };
+ });
+ return channels;
+ } catch (error) {
+ params.logger && logger.error('Error getting closed channels: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/server/src/schemas/query/channels/index.ts b/src/api/schemas/query/channels/index.ts
similarity index 72%
rename from server/src/schemas/query/channels/index.ts
rename to src/api/schemas/query/channels/index.ts
index a6935baa..b904ac5d 100644
--- a/server/src/schemas/query/channels/index.ts
+++ b/src/api/schemas/query/channels/index.ts
@@ -6,10 +6,10 @@ import { getChannelFees } from './channelFees';
import { getChannelReport } from './channelReport';
export const channelQueries = {
- getChannelBalance,
- getChannels,
- getClosedChannels,
- getPendingChannels,
- getChannelFees,
- getChannelReport,
+ getChannelBalance,
+ getChannels,
+ getClosedChannels,
+ getPendingChannels,
+ getChannelFees,
+ getChannelReport,
};
diff --git a/src/api/schemas/query/channels/pendingChannels.ts b/src/api/schemas/query/channels/pendingChannels.ts
new file mode 100644
index 00000000..2d8d9983
--- /dev/null
+++ b/src/api/schemas/query/channels/pendingChannels.ts
@@ -0,0 +1,69 @@
+import {
+ getPendingChannels as getLnPendingChannels,
+ getNode,
+} from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { GraphQLList } from 'graphql';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { PendingChannelType } from '../../types/QueryType';
+
+interface PendingChannelListProps {
+ pending_channels: PendingChannelProps[];
+}
+
+interface PendingChannelProps {
+ close_transaction_id: string;
+ is_active: boolean;
+ is_closing: boolean;
+ is_opening: boolean;
+ local_balance: number;
+ local_reserve: number;
+ partner_public_key: string;
+ received: number;
+ remote_balance: number;
+ remote_reserve: number;
+ sent: number;
+ transaction_fee: number;
+ transaction_id: string;
+ transaction_vout: number;
+}
+
+export const getPendingChannels = {
+ type: new GraphQLList(PendingChannelType),
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'pendingChannels');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const pendingChannels: PendingChannelListProps = await getLnPendingChannels(
+ {
+ lnd,
+ }
+ );
+
+ const channels = pendingChannels.pending_channels.map(async channel => {
+ const nodeInfo = await getNode({
+ lnd,
+ is_omitting_channels: true,
+ public_key: channel.partner_public_key,
+ });
+
+ return {
+ ...channel,
+ partner_node_info: {
+ ...nodeInfo,
+ },
+ };
+ });
+ return channels;
+ } catch (error) {
+ params.logger &&
+ logger.error('Error getting pending channels: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/data/bitcoinFee.ts b/src/api/schemas/query/data/bitcoinFee.ts
new file mode 100644
index 00000000..8777eb54
--- /dev/null
+++ b/src/api/schemas/query/data/bitcoinFee.ts
@@ -0,0 +1,34 @@
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLBoolean } from 'graphql';
+import fetch from 'node-fetch';
+import { BitcoinFeeType } from '../../types/QueryType';
+import { appUrls } from '../../../utils/appUrls';
+
+export const getBitcoinFees = {
+ type: BitcoinFeeType,
+ args: {
+ logger: { type: GraphQLBoolean },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'bitcoinFee');
+
+ try {
+ const response = await fetch(appUrls.fees);
+ const json = await response.json();
+
+ if (json) {
+ const { fastestFee, halfHourFee, hourFee } = json;
+ return {
+ fast: fastestFee,
+ halfHour: halfHourFee,
+ hour: hourFee,
+ };
+ }
+ throw new Error('Problem getting Bitcoin fees.');
+ } catch (error) {
+ params.logger && logger.error('Error getting bitcoin fees: %o', error);
+ throw new Error('Problem getting Bitcoin fees.');
+ }
+ },
+};
diff --git a/src/api/schemas/query/data/bitcoinPrice.ts b/src/api/schemas/query/data/bitcoinPrice.ts
new file mode 100644
index 00000000..2a36e59c
--- /dev/null
+++ b/src/api/schemas/query/data/bitcoinPrice.ts
@@ -0,0 +1,28 @@
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLString, GraphQLBoolean } from 'graphql';
+import fetch from 'node-fetch';
+import { appUrls } from '../../../utils/appUrls';
+
+export const getBitcoinPrice = {
+ type: GraphQLString,
+ args: {
+ logger: { type: GraphQLBoolean },
+ currency: {
+ type: GraphQLString,
+ },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'bitcoinPrice');
+
+ try {
+ const response = await fetch(appUrls.ticker);
+ const json = await response.json();
+
+ return JSON.stringify(json);
+ } catch (error) {
+ params.logger && logger.error('Error getting bitcoin price: %o', error);
+ throw new Error('Problem getting Bitcoin price.');
+ }
+ },
+};
diff --git a/server/src/schemas/query/data/index.ts b/src/api/schemas/query/data/index.ts
similarity index 76%
rename from server/src/schemas/query/data/index.ts
rename to src/api/schemas/query/data/index.ts
index 3b3c85a9..4ee9bd17 100644
--- a/server/src/schemas/query/data/index.ts
+++ b/src/api/schemas/query/data/index.ts
@@ -2,6 +2,6 @@ import { getBitcoinPrice } from './bitcoinPrice';
import { getBitcoinFees } from './bitcoinFee';
export const dataQueries = {
- getBitcoinPrice,
- getBitcoinFees,
+ getBitcoinPrice,
+ getBitcoinFees,
};
diff --git a/src/api/schemas/query/flow/getInOut.interface.ts b/src/api/schemas/query/flow/getInOut.interface.ts
new file mode 100644
index 00000000..3b7bdf04
--- /dev/null
+++ b/src/api/schemas/query/flow/getInOut.interface.ts
@@ -0,0 +1,28 @@
+export interface InOutProps {
+ tokens: number;
+}
+
+export interface InOutListProps {
+ [key: string]: InOutProps[];
+}
+
+export interface PaymentProps {
+ created_at: string;
+ is_confirmed: boolean;
+ tokens: number;
+}
+
+export interface PaymentsProps {
+ payments: PaymentProps[];
+}
+
+export interface InvoiceProps {
+ created_at: string;
+ is_confirmed: boolean;
+ received: number;
+}
+
+export interface InvoicesProps {
+ invoices: InvoiceProps[];
+ next: string;
+}
diff --git a/src/api/schemas/query/flow/getInOut.ts b/src/api/schemas/query/flow/getInOut.ts
new file mode 100644
index 00000000..26835c6c
--- /dev/null
+++ b/src/api/schemas/query/flow/getInOut.ts
@@ -0,0 +1,99 @@
+import { GraphQLString } from 'graphql';
+import {
+ getInvoices as getLnInvoices,
+ getPayments as getLnPayments,
+} from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { differenceInHours, differenceInCalendarDays } from 'date-fns';
+import { groupBy } from 'underscore';
+import { reduceInOutArray } from '../report/Helpers';
+import { InvoicesProps, PaymentsProps } from './getInOut.interface';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { InOutType } from '../../types/QueryType';
+
+export const getInOut = {
+ type: InOutType,
+ args: {
+ ...defaultParams,
+ time: { type: GraphQLString },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'getInOut');
+
+ const lnd = getAuthLnd(params.auth);
+
+ const endDate = new Date();
+ let periods = 7;
+ let differenceFn = differenceInCalendarDays;
+
+ if (params.time === 'month') {
+ periods = 30;
+ } else if (params.time === 'day') {
+ periods = 24;
+ differenceFn = differenceInHours;
+ }
+
+ let invoiceList: InvoicesProps;
+ let paymentList: PaymentsProps;
+
+ try {
+ invoiceList = await getLnInvoices({
+ lnd,
+ });
+ paymentList = await getLnPayments({
+ lnd,
+ });
+ } catch (error) {
+ params.logger && logger.error('Error getting invoices: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+
+ const invoices = invoiceList.invoices.map(invoice => ({
+ createdAt: invoice.created_at,
+ isConfirmed: invoice.is_confirmed,
+ tokens: invoice.received,
+ }));
+
+ const payments = paymentList.payments.map(payment => ({
+ createdAt: payment.created_at,
+ isConfirmed: payment.is_confirmed,
+ tokens: payment.tokens,
+ }));
+
+ const confirmedInvoices = invoices.filter(invoice => {
+ const dif = differenceFn(endDate, new Date(invoice.createdAt));
+ return invoice.isConfirmed && dif < periods;
+ });
+ const confirmedPayments = payments.filter(payment => {
+ const dif = differenceFn(endDate, new Date(payment.createdAt));
+ return payment.isConfirmed && dif < periods;
+ });
+
+ const allInvoices = invoices.filter(invoice => {
+ const dif = differenceFn(endDate, new Date(invoice.createdAt));
+ return dif < periods;
+ });
+
+ const totalConfirmed = confirmedInvoices.length;
+ const totalUnConfirmed = allInvoices.length - totalConfirmed;
+
+ const orderedInvoices = groupBy(confirmedInvoices, invoice => {
+ return periods - differenceFn(endDate, new Date(invoice.createdAt));
+ });
+ const orderedPayments = groupBy(confirmedPayments, payment => {
+ return periods - differenceFn(endDate, new Date(payment.createdAt));
+ });
+
+ const reducedInvoices = reduceInOutArray(orderedInvoices);
+ const reducedPayments = reduceInOutArray(orderedPayments);
+
+ return {
+ invoices: JSON.stringify(reducedInvoices),
+ payments: JSON.stringify(reducedPayments),
+ confirmedInvoices: totalConfirmed,
+ unConfirmedInvoices: totalUnConfirmed,
+ };
+ },
+};
diff --git a/server/src/schemas/query/flow/index.ts b/src/api/schemas/query/flow/index.ts
similarity index 83%
rename from server/src/schemas/query/flow/index.ts
rename to src/api/schemas/query/flow/index.ts
index 705bada9..d6c7c2f9 100644
--- a/server/src/schemas/query/flow/index.ts
+++ b/src/api/schemas/query/flow/index.ts
@@ -1,5 +1,5 @@
import { getInOut } from './getInOut';
export const flowQueries = {
- getInOut,
+ getInOut,
};
diff --git a/src/api/schemas/query/general/adminCheck.ts b/src/api/schemas/query/general/adminCheck.ts
new file mode 100644
index 00000000..5639047b
--- /dev/null
+++ b/src/api/schemas/query/general/adminCheck.ts
@@ -0,0 +1,29 @@
+import { pay as payRequest } from 'ln-service';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { GraphQLBoolean } from 'graphql';
+import { getAuthLnd, getErrorDetails } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+export const adminCheck = {
+ type: GraphQLBoolean,
+ args: {
+ ...defaultParams,
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'adminCheck');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ await payRequest({
+ lnd,
+ request: 'admin check',
+ });
+ } catch (error) {
+ const details = getErrorDetails(error);
+ if (details.includes('invalid character in string')) return true;
+
+ throw new Error();
+ }
+ },
+};
diff --git a/server/src/schemas/query/general/index.ts b/src/api/schemas/query/general/index.ts
similarity index 76%
rename from server/src/schemas/query/general/index.ts
rename to src/api/schemas/query/general/index.ts
index 48f31ff5..d6787aaa 100644
--- a/server/src/schemas/query/general/index.ts
+++ b/src/api/schemas/query/general/index.ts
@@ -3,7 +3,7 @@ import { getNodeInfo } from './nodeInfo';
import { adminCheck } from './adminCheck';
export const generalQueries = {
- getNetworkInfo,
- getNodeInfo,
- adminCheck,
+ getNetworkInfo,
+ getNodeInfo,
+ adminCheck,
};
diff --git a/src/api/schemas/query/general/networkInfo.ts b/src/api/schemas/query/general/networkInfo.ts
new file mode 100644
index 00000000..26b30886
--- /dev/null
+++ b/src/api/schemas/query/general/networkInfo.ts
@@ -0,0 +1,46 @@
+import { getNetworkInfo as getLnNetworkInfo } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+
+import { defaultParams } from '../../../helpers/defaultProps';
+import { NetworkInfoType } from '../../types/QueryType';
+
+interface NetworkInfoProps {
+ average_channel_size: number;
+ channel_count: number;
+ max_channel_size: number;
+ median_channel_size: number;
+ min_channel_size: number;
+ node_count: number;
+ not_recently_updated_policy_count: number;
+ total_capacity: number;
+}
+
+export const getNetworkInfo = {
+ type: NetworkInfoType,
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'networkInfo');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const info: NetworkInfoProps = await getLnNetworkInfo({ lnd });
+
+ return {
+ averageChannelSize: info.average_channel_size,
+ channelCount: info.channel_count,
+ maxChannelSize: info.max_channel_size,
+ medianChannelSize: info.median_channel_size,
+ minChannelSize: info.min_channel_size,
+ nodeCount: info.node_count,
+ notRecentlyUpdatedPolicyCount: info.not_recently_updated_policy_count,
+ totalCapacity: info.total_capacity,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error getting network info: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/general/nodeInfo.ts b/src/api/schemas/query/general/nodeInfo.ts
new file mode 100644
index 00000000..22be3923
--- /dev/null
+++ b/src/api/schemas/query/general/nodeInfo.ts
@@ -0,0 +1,49 @@
+import { getWalletInfo, getClosedChannels } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { NodeInfoType } from '../../types/QueryType';
+
+interface NodeInfoProps {
+ chains: string[];
+ color: string;
+ active_channels_count: number;
+ alias: string;
+ current_block_hash: string;
+ current_block_height: number;
+ is_synced_to_chain: boolean;
+ is_synced_to_graph: boolean;
+ latest_block_at: string;
+ peers_count: number;
+ pending_channels_count: number;
+ public_key: string;
+ uris: string[];
+ version: string;
+}
+
+export const getNodeInfo = {
+ type: NodeInfoType,
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'nodeInfo');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const info: NodeInfoProps = await getWalletInfo({
+ lnd,
+ });
+ const closedChannels: { channels: [] } = await getClosedChannels({
+ lnd,
+ });
+ return {
+ ...info,
+ closed_channels_count: closedChannels.channels.length,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error getting node info: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/hodlhodl/getCountries.ts b/src/api/schemas/query/hodlhodl/getCountries.ts
new file mode 100644
index 00000000..9ab1c52d
--- /dev/null
+++ b/src/api/schemas/query/hodlhodl/getCountries.ts
@@ -0,0 +1,36 @@
+import fetch from 'node-fetch';
+import { GraphQLList } from 'graphql';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { logger } from '../../../helpers/logger';
+import { appUrls } from '../../../utils/appUrls';
+import { HodlCountryType } from '../../types/HodlType';
+import { envConfig } from '../../../utils/envConfig';
+
+export const getCountries = {
+ type: new GraphQLList(HodlCountryType),
+ args: {},
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'getCountries');
+
+ const headers = {
+ Authorization: `Bearer ${envConfig.hodlKey}`,
+ };
+
+ try {
+ const response = await fetch(`${appUrls.hodlhodl}/v1/countries`, {
+ headers,
+ });
+ const json = await response.json();
+
+ if (json) {
+ const { countries } = json;
+ return countries;
+ }
+ throw new Error('Problem getting HodlHodl countries.');
+ } catch (error) {
+ params.logger &&
+ logger.error('Error getting HodlHodl countries: %o', error);
+ throw new Error('Problem getting HodlHodl countries.');
+ }
+ },
+};
diff --git a/src/api/schemas/query/hodlhodl/getCurrencies.ts b/src/api/schemas/query/hodlhodl/getCurrencies.ts
new file mode 100644
index 00000000..e5794dca
--- /dev/null
+++ b/src/api/schemas/query/hodlhodl/getCurrencies.ts
@@ -0,0 +1,36 @@
+import fetch from 'node-fetch';
+import { GraphQLList } from 'graphql';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { logger } from '../../../helpers/logger';
+import { appUrls } from '../../../utils/appUrls';
+import { HodlCurrencyType } from '../../types/HodlType';
+import { envConfig } from '../../../utils/envConfig';
+
+export const getCurrencies = {
+ type: new GraphQLList(HodlCurrencyType),
+ args: {},
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'getCurrencies');
+
+ const headers = {
+ Authorization: `Bearer ${envConfig.hodlKey}`,
+ };
+
+ try {
+ const response = await fetch(`${appUrls.hodlhodl}/v1/currencies`, {
+ headers,
+ });
+ const json = await response.json();
+
+ if (json) {
+ const { currencies } = json;
+ return currencies;
+ }
+ throw new Error('Problem getting HodlHodl currencies.');
+ } catch (error) {
+ params.logger &&
+ logger.error('Error getting HodlHodl currencies: %o', error);
+ throw new Error('Problem getting HodlHodl currencies.');
+ }
+ },
+};
diff --git a/src/api/schemas/query/hodlhodl/getOffers.ts b/src/api/schemas/query/hodlhodl/getOffers.ts
new file mode 100644
index 00000000..1856bc2c
--- /dev/null
+++ b/src/api/schemas/query/hodlhodl/getOffers.ts
@@ -0,0 +1,55 @@
+import fetch from 'isomorphic-unfetch';
+import { GraphQLList, GraphQLString } from 'graphql';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { logger } from '../../../helpers/logger';
+import { appUrls } from '../../../utils/appUrls';
+import { HodlOfferType } from '../../types/HodlType';
+import { getHodlParams } from '../../../helpers/hodlHelpers';
+
+const defaultQuery = {
+ filters: {},
+ sort: {
+ by: '',
+ direction: '',
+ },
+};
+
+export const getOffers = {
+ type: new GraphQLList(HodlOfferType),
+ args: {
+ filter: { type: GraphQLString },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'getOffers');
+
+ let queryParams = defaultQuery;
+
+ if (params.filter) {
+ try {
+ queryParams = JSON.parse(params.filter);
+ } catch (error) {}
+ }
+
+ try {
+ const fullParams = {
+ ...queryParams,
+ };
+
+ const paramString = getHodlParams(fullParams);
+
+ const response = await fetch(
+ `${appUrls.hodlhodl}/v1/offers${paramString}`
+ );
+ const json = await response.json();
+
+ if (json) {
+ const { offers } = json;
+ return offers;
+ }
+ throw new Error('Problem getting HodlHodl offers.');
+ } catch (error) {
+ params.logger && logger.error('Error getting HodlHodl offers: %o', error);
+ throw new Error('Problem getting HodlHodl offers.');
+ }
+ },
+};
diff --git a/server/src/schemas/query/hodlhodl/index.ts b/src/api/schemas/query/hodlhodl/index.ts
similarity index 76%
rename from server/src/schemas/query/hodlhodl/index.ts
rename to src/api/schemas/query/hodlhodl/index.ts
index 03675988..a912e542 100644
--- a/server/src/schemas/query/hodlhodl/index.ts
+++ b/src/api/schemas/query/hodlhodl/index.ts
@@ -3,7 +3,7 @@ import { getCountries } from './getCountries';
import { getCurrencies } from './getCurrencies';
export const hodlQueries = {
- getOffers,
- getCountries,
- getCurrencies,
+ getOffers,
+ getCountries,
+ getCurrencies,
};
diff --git a/server/src/schemas/query/index.ts b/src/api/schemas/query/index.ts
similarity index 67%
rename from server/src/schemas/query/index.ts
rename to src/api/schemas/query/index.ts
index c2890748..a3312ff2 100644
--- a/server/src/schemas/query/index.ts
+++ b/src/api/schemas/query/index.ts
@@ -12,16 +12,16 @@ import { chainQueries } from './chain';
import { hodlQueries } from './hodlhodl';
export const query = {
- ...channelQueries,
- ...generalQueries,
- ...invoiceQueries,
- ...dataQueries,
- ...reportQueries,
- ...flowQueries,
- ...backupQueries,
- ...routeQueries,
- ...peerQueries,
- ...messageQueries,
- ...chainQueries,
- ...hodlQueries,
+ ...channelQueries,
+ ...generalQueries,
+ ...invoiceQueries,
+ ...dataQueries,
+ ...reportQueries,
+ ...flowQueries,
+ ...backupQueries,
+ ...routeQueries,
+ ...peerQueries,
+ ...messageQueries,
+ ...chainQueries,
+ ...hodlQueries,
};
diff --git a/server/src/schemas/query/message/index.ts b/src/api/schemas/query/message/index.ts
similarity index 78%
rename from server/src/schemas/query/message/index.ts
rename to src/api/schemas/query/message/index.ts
index 8723593e..fb394039 100644
--- a/server/src/schemas/query/message/index.ts
+++ b/src/api/schemas/query/message/index.ts
@@ -2,6 +2,6 @@ import { signMessage } from './signMessage';
import { verifyMessage } from './verifyMessage';
export const messageQueries = {
- signMessage,
- verifyMessage,
+ signMessage,
+ verifyMessage,
};
diff --git a/src/api/schemas/query/message/signMessage.ts b/src/api/schemas/query/message/signMessage.ts
new file mode 100644
index 00000000..7d952759
--- /dev/null
+++ b/src/api/schemas/query/message/signMessage.ts
@@ -0,0 +1,31 @@
+import { signMessage as signLnMessage } from 'ln-service';
+import { GraphQLString, GraphQLNonNull } from 'graphql';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { logger } from '../../../helpers/logger';
+
+export const signMessage = {
+ type: GraphQLString,
+ args: {
+ ...defaultParams,
+ message: { type: new GraphQLNonNull(GraphQLString) },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'signMessage');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const message: { signature: string } = await signLnMessage({
+ lnd,
+ message: params.message,
+ });
+
+ return message.signature;
+ } catch (error) {
+ params.logger && logger.error('Error signing message: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/message/verifyMessage.ts b/src/api/schemas/query/message/verifyMessage.ts
new file mode 100644
index 00000000..1292dd17
--- /dev/null
+++ b/src/api/schemas/query/message/verifyMessage.ts
@@ -0,0 +1,33 @@
+import { verifyMessage as verifyLnMessage } from 'ln-service';
+import { GraphQLString, GraphQLNonNull } from 'graphql';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { logger } from '../../../helpers/logger';
+
+export const verifyMessage = {
+ type: GraphQLString,
+ args: {
+ ...defaultParams,
+ message: { type: new GraphQLNonNull(GraphQLString) },
+ signature: { type: new GraphQLNonNull(GraphQLString) },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'verifyMessage');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const message: { signed_by: string } = await verifyLnMessage({
+ lnd,
+ message: params.message,
+ signature: params.signature,
+ });
+
+ return message.signed_by;
+ } catch (error) {
+ params.logger && logger.error('Error verifying message: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/peer/getPeers.ts b/src/api/schemas/query/peer/getPeers.ts
new file mode 100644
index 00000000..2348da62
--- /dev/null
+++ b/src/api/schemas/query/peer/getPeers.ts
@@ -0,0 +1,64 @@
+import { GraphQLList } from 'graphql';
+import { getPeers as getLnPeers, getNode } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+
+import { defaultParams } from '../../../helpers/defaultProps';
+import { PeerType } from '../../types/QueryType';
+
+interface PeerProps {
+ bytes_received: number;
+ bytes_sent: number;
+ is_inbound: boolean;
+ is_sync_peer: boolean;
+ ping_time: number;
+ public_key: string;
+ socket: string;
+ tokens_received: number;
+ tokens_sent: number;
+}
+
+export const getPeers = {
+ type: new GraphQLList(PeerType),
+ args: defaultParams,
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'getPeers');
+
+ const lnd = getAuthLnd(params.auth);
+
+ try {
+ const { peers }: { peers: PeerProps[] } = await getLnPeers({
+ lnd,
+ });
+
+ const getPeerList = () =>
+ Promise.all(
+ peers.map(async peer => {
+ try {
+ const nodeInfo = await getNode({
+ lnd,
+ is_omitting_channels: true,
+ public_key: peer.public_key,
+ });
+
+ return {
+ ...peer,
+ partner_node_info: {
+ ...nodeInfo,
+ },
+ };
+ } catch (error) {
+ return { ...peer, partner_node_info: {} };
+ }
+ })
+ );
+
+ const peerList = await getPeerList();
+ return peerList;
+ } catch (error) {
+ params.logger && logger.error('Error getting peers: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/server/src/schemas/query/peer/index.ts b/src/api/schemas/query/peer/index.ts
similarity index 83%
rename from server/src/schemas/query/peer/index.ts
rename to src/api/schemas/query/peer/index.ts
index 53869030..56294caa 100644
--- a/server/src/schemas/query/peer/index.ts
+++ b/src/api/schemas/query/peer/index.ts
@@ -1,5 +1,5 @@
import { getPeers } from './getPeers';
export const peerQueries = {
- getPeers,
+ getPeers,
};
diff --git a/src/api/schemas/query/report/ForwardChannels.ts b/src/api/schemas/query/report/ForwardChannels.ts
new file mode 100644
index 00000000..7021a6c1
--- /dev/null
+++ b/src/api/schemas/query/report/ForwardChannels.ts
@@ -0,0 +1,155 @@
+import { GraphQLString } from 'graphql';
+import {
+ getForwards as getLnForwards,
+ getNode,
+ getChannel,
+ getWalletInfo,
+} from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { subHours, subDays } from 'date-fns';
+import { countArray, countRoutes } from './Helpers';
+import { ForwardCompleteProps } from './ForwardReport.interface';
+import { sortBy } from 'underscore';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+interface NodeProps {
+ alias: string;
+ color: string;
+}
+
+interface ChannelsProps {
+ policies: { public_key: string }[];
+}
+
+export const getForwardChannelsReport = {
+ type: GraphQLString,
+ args: {
+ ...defaultParams,
+ time: { type: GraphQLString },
+ order: { type: GraphQLString },
+ type: { type: GraphQLString },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'forwardChannels');
+
+ const lnd = getAuthLnd(params.auth);
+
+ let startDate = new Date();
+ const endDate = new Date();
+
+ if (params.time === 'month') {
+ startDate = subDays(endDate, 30);
+ } else if (params.time === 'week') {
+ startDate = subDays(endDate, 7);
+ } else {
+ startDate = subHours(endDate, 24);
+ }
+
+ const getNodeAlias = async (id: string, publicKey: string) => {
+ const channelInfo: ChannelsProps = await getChannel({
+ lnd,
+ id,
+ });
+
+ const partnerPublicKey =
+ channelInfo.policies[0].public_key !== publicKey
+ ? channelInfo.policies[0].public_key
+ : channelInfo.policies[1].public_key;
+
+ const nodeInfo: NodeProps = await getNode({
+ lnd,
+ is_omitting_channels: true,
+ public_key: partnerPublicKey,
+ });
+
+ return {
+ alias: nodeInfo.alias,
+ color: nodeInfo.color,
+ };
+ };
+
+ const getRouteAlias = (array: any[], publicKey: string) =>
+ Promise.all(
+ array.map(async channel => {
+ const nodeAliasIn = await getNodeAlias(channel.in, publicKey);
+ const nodeAliasOut = await getNodeAlias(channel.out, publicKey);
+
+ return {
+ aliasIn: nodeAliasIn.alias,
+ colorIn: nodeAliasIn.color,
+ aliasOut: nodeAliasOut.alias,
+ colorOut: nodeAliasOut.color,
+ ...channel,
+ };
+ })
+ );
+
+ const getAlias = (array: any[], publicKey: string) =>
+ Promise.all(
+ array.map(async channel => {
+ const nodeAlias = await getNodeAlias(channel.name, publicKey);
+ return {
+ alias: nodeAlias.alias,
+ color: nodeAlias.color,
+ ...channel,
+ };
+ })
+ );
+
+ try {
+ const forwardsList: ForwardCompleteProps = await getLnForwards({
+ lnd,
+ after: startDate,
+ before: endDate,
+ limit: 10000,
+ });
+
+ const walletInfo: { public_key: string } = await getWalletInfo({
+ lnd,
+ });
+
+ if (params.type === 'route') {
+ const mapped = forwardsList.forwards.map(forward => {
+ return {
+ route: `${forward.incoming_channel} - ${forward.outgoing_channel}`,
+ ...forward,
+ };
+ });
+ const grouped = countRoutes(mapped);
+
+ const routeAlias = await getRouteAlias(grouped, walletInfo.public_key);
+
+ const sortedRoute = sortBy(routeAlias, params.order)
+ .reverse()
+ .slice(0, 10);
+ return JSON.stringify(sortedRoute);
+ }
+ if (params.type === 'incoming') {
+ const incomingCount = countArray(forwardsList.forwards, true);
+ const incomingAlias = await getAlias(
+ incomingCount,
+ walletInfo.public_key
+ );
+ const sortedInCount = sortBy(incomingAlias, params.order)
+ .reverse()
+ .slice(0, 10);
+ return JSON.stringify(sortedInCount);
+ }
+ const outgoingCount = countArray(forwardsList.forwards, false);
+ const outgoingAlias = await getAlias(
+ outgoingCount,
+ walletInfo.public_key
+ );
+ const sortedOutCount = sortBy(outgoingAlias, params.order)
+ .reverse()
+ .slice(0, 10);
+ return JSON.stringify(sortedOutCount);
+ } catch (error) {
+ params.logger &&
+ logger.error('Error getting forward channel report: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/report/ForwardReport.interface.ts b/src/api/schemas/query/report/ForwardReport.interface.ts
new file mode 100644
index 00000000..4df4098e
--- /dev/null
+++ b/src/api/schemas/query/report/ForwardReport.interface.ts
@@ -0,0 +1,42 @@
+export interface ForwardProps {
+ created_at: string;
+ fee: number;
+ fee_mtokens: string;
+ incoming_channel: string;
+ mtokens: string;
+ outgoing_channel: string;
+ tokens: number;
+}
+
+export interface ForwardCompleteProps {
+ forwards: ForwardProps[];
+ next: string;
+}
+
+export interface ListProps {
+ [key: string]: ForwardProps[];
+}
+
+export interface ReduceObjectProps {
+ fee: number;
+ tokens: number;
+}
+
+export interface FinalProps {
+ fee: number;
+ tokens: number;
+ amount: number;
+}
+
+export interface FinalList {
+ [key: string]: FinalProps;
+}
+
+export interface CountProps {
+ [key: string]: number;
+}
+
+export interface ChannelCounts {
+ name: string;
+ count: number;
+}
diff --git a/src/api/schemas/query/report/ForwardReport.ts b/src/api/schemas/query/report/ForwardReport.ts
new file mode 100644
index 00000000..e45c5b2a
--- /dev/null
+++ b/src/api/schemas/query/report/ForwardReport.ts
@@ -0,0 +1,71 @@
+import { GraphQLString } from 'graphql';
+import { getForwards as getLnForwards } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { groupBy } from 'underscore';
+import {
+ subHours,
+ subDays,
+ differenceInHours,
+ differenceInCalendarDays,
+} from 'date-fns';
+import { reduceForwardArray } from './Helpers';
+import { ForwardCompleteProps } from './ForwardReport.interface';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+export const getForwardReport = {
+ type: GraphQLString,
+ args: {
+ ...defaultParams,
+ time: { type: GraphQLString },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'forwardReport');
+
+ const lnd = getAuthLnd(params.auth);
+
+ let startDate = new Date();
+ const endDate = new Date();
+ let days = 7;
+
+ if (params.time === 'month') {
+ startDate = subDays(endDate, 30);
+ days = 30;
+ } else if (params.time === 'week') {
+ startDate = subDays(endDate, 7);
+ } else {
+ startDate = subHours(endDate, 24);
+ }
+
+ try {
+ const forwardsList: ForwardCompleteProps = await getLnForwards({
+ lnd,
+ after: startDate,
+ before: endDate,
+ });
+
+ if (params.time === 'month' || params.time === 'week') {
+ const orderedDay = groupBy(forwardsList.forwards, item => {
+ return (
+ days - differenceInCalendarDays(endDate, new Date(item.created_at))
+ );
+ });
+
+ const reducedOrderedDay = reduceForwardArray(orderedDay);
+
+ return JSON.stringify(reducedOrderedDay);
+ }
+ const orderedHour = groupBy(forwardsList.forwards, item => {
+ return 24 - differenceInHours(endDate, new Date(item.created_at));
+ });
+
+ const reducedOrderedHour = reduceForwardArray(orderedHour);
+
+ return JSON.stringify(reducedOrderedHour);
+ } catch (error) {
+ params.logger && logger.error('Error getting forward report: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/src/api/schemas/query/report/Helpers.ts b/src/api/schemas/query/report/Helpers.ts
new file mode 100644
index 00000000..c9263f6f
--- /dev/null
+++ b/src/api/schemas/query/report/Helpers.ts
@@ -0,0 +1,112 @@
+import { reduce, groupBy } from 'underscore';
+import {
+ ForwardProps,
+ ReduceObjectProps,
+ ListProps,
+} from './ForwardReport.interface';
+import { InOutListProps, InOutProps } from '../flow/getInOut.interface';
+
+export const reduceForwardArray = (list: ListProps) => {
+ const reducedOrder = [];
+ for (const key in list) {
+ if (list.hasOwnProperty(key)) {
+ const element: ForwardProps[] = list[key];
+ const reducedArray: ReduceObjectProps = reduce(
+ element,
+ (a: ReduceObjectProps, b: ReduceObjectProps) => {
+ return {
+ fee: a.fee + b.fee,
+ tokens: a.tokens + b.tokens,
+ };
+ }
+ );
+ reducedOrder.push({
+ period: Number(key),
+ amount: element.length,
+ ...reducedArray,
+ });
+ }
+ }
+
+ return reducedOrder;
+};
+
+export const reduceInOutArray = (list: InOutListProps) => {
+ const reducedOrder = [];
+ for (const key in list) {
+ if (list.hasOwnProperty(key)) {
+ const element: InOutProps[] = list[key];
+ const reducedArray: InOutProps = reduce(
+ element,
+ (a: ReduceObjectProps, b: ReduceObjectProps) => ({
+ tokens: a.tokens + b.tokens,
+ })
+ );
+ reducedOrder.push({
+ period: Number(key),
+ amount: element.length,
+ tokens: reducedArray.tokens,
+ });
+ }
+ }
+ return reducedOrder;
+};
+
+export const countArray = (list: ForwardProps[], type: boolean) => {
+ const inOrOut = type ? 'incoming_channel' : 'outgoing_channel';
+ const grouped = groupBy(list, inOrOut);
+
+ const channelInfo = [];
+ for (const key in grouped) {
+ if (grouped.hasOwnProperty(key)) {
+ const element = grouped[key];
+
+ const fee = element
+ .map(forward => forward.fee)
+ .reduce((p: number, c: number) => p + c);
+
+ const tokens = element
+ .map(forward => forward.tokens)
+ .reduce((p: number, c: number) => p + c);
+
+ channelInfo.push({
+ name: key,
+ amount: element.length,
+ fee,
+ tokens,
+ });
+ }
+ }
+
+ return channelInfo;
+};
+
+export const countRoutes = (list: ForwardProps[]) => {
+ const grouped = groupBy(list, 'route');
+
+ const channelInfo = [];
+ for (const key in grouped) {
+ if (grouped.hasOwnProperty(key)) {
+ const element = grouped[key];
+
+ const fee = element
+ .map(forward => forward.fee)
+ .reduce((p: number, c: number) => p + c);
+
+ const tokens = element
+ .map(forward => forward.tokens)
+ .reduce((p: number, c: number) => p + c);
+
+ channelInfo.push({
+ route: key,
+ in: element[0].incoming_channel,
+ out: element[0].outgoing_channel,
+ amount: element.length,
+ fee,
+ tokens,
+ });
+ }
+ }
+
+ return channelInfo;
+};
diff --git a/server/src/schemas/query/report/index.ts b/src/api/schemas/query/report/index.ts
similarity index 74%
rename from server/src/schemas/query/report/index.ts
rename to src/api/schemas/query/report/index.ts
index 44b23a22..372f9e96 100644
--- a/server/src/schemas/query/report/index.ts
+++ b/src/api/schemas/query/report/index.ts
@@ -2,6 +2,6 @@ import { getForwardReport } from './ForwardReport';
import { getForwardChannelsReport } from './ForwardChannels';
export const reportQueries = {
- getForwardReport,
- getForwardChannelsReport,
+ getForwardReport,
+ getForwardChannelsReport,
};
diff --git a/src/api/schemas/query/route/getRoutes.ts b/src/api/schemas/query/route/getRoutes.ts
new file mode 100644
index 00000000..74b06346
--- /dev/null
+++ b/src/api/schemas/query/route/getRoutes.ts
@@ -0,0 +1,42 @@
+import { GraphQLNonNull, GraphQLString, GraphQLInt } from 'graphql';
+import { getRouteToDestination, getWalletInfo } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { defaultParams } from '../../../helpers/defaultProps';
+
+export const getRoutes = {
+ type: GraphQLString,
+ args: {
+ ...defaultParams,
+ outgoing: { type: new GraphQLNonNull(GraphQLString) },
+ incoming: { type: new GraphQLNonNull(GraphQLString) },
+ tokens: { type: new GraphQLNonNull(GraphQLInt) },
+ maxFee: { type: GraphQLInt },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'getRoutes');
+
+ const lnd = getAuthLnd(params.auth);
+
+ const { public_key } = await getWalletInfo({ lnd });
+
+ const { route } = await getRouteToDestination({
+ lnd,
+ outgoing_channel: params.outgoing,
+ incoming_peer: params.incoming,
+ destination: public_key,
+ tokens: params.tokens,
+ ...(params.maxFee && { max_fee: params.maxFee }),
+ }).catch((error: any) => {
+ params.logger && logger.error('Error getting routes: %o', error);
+ throw new Error(getErrorMsg(error));
+ });
+
+ if (!route) {
+ throw new Error('No route found.');
+ }
+
+ return JSON.stringify(route);
+ },
+};
diff --git a/server/src/schemas/query/route/index.ts b/src/api/schemas/query/route/index.ts
similarity index 83%
rename from server/src/schemas/query/route/index.ts
rename to src/api/schemas/query/route/index.ts
index 23e8e292..854123cb 100644
--- a/server/src/schemas/query/route/index.ts
+++ b/src/api/schemas/query/route/index.ts
@@ -1,5 +1,5 @@
import { getRoutes } from './getRoutes';
export const routeQueries = {
- getRoutes,
+ getRoutes,
};
diff --git a/src/api/schemas/query/transactions/forwards.ts b/src/api/schemas/query/transactions/forwards.ts
new file mode 100644
index 00000000..fc946a48
--- /dev/null
+++ b/src/api/schemas/query/transactions/forwards.ts
@@ -0,0 +1,121 @@
+import { GraphQLString } from 'graphql';
+import {
+ getForwards as getLnForwards,
+ getChannel,
+ getNode,
+ getWalletInfo,
+} from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getErrorMsg, getAuthLnd } from '../../../helpers/helpers';
+import { sortBy } from 'underscore';
+import { ForwardCompleteProps } from '../report/ForwardReport.interface';
+import { subHours, subDays, subMonths, subYears } from 'date-fns';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { GetForwardType } from '../../types/QueryType';
+
+interface NodeProps {
+ alias: string;
+ color: string;
+}
+
+interface ChannelsProps {
+ policies: { public_key: string }[];
+}
+
+export const getForwards = {
+ type: GetForwardType,
+ args: {
+ ...defaultParams,
+ time: { type: GraphQLString },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'forwards');
+
+ const lnd = getAuthLnd(params.auth);
+
+ let startDate = new Date();
+ const endDate = new Date();
+
+ if (params.time === 'oneYear') {
+ startDate = subYears(endDate, 1);
+ } else if (params.time === 'sixMonths') {
+ startDate = subMonths(endDate, 6);
+ } else if (params.time === 'threeMonths') {
+ startDate = subMonths(endDate, 3);
+ } else if (params.time === 'month') {
+ startDate = subMonths(endDate, 1);
+ } else if (params.time === 'week') {
+ startDate = subDays(endDate, 7);
+ } else {
+ startDate = subHours(endDate, 24);
+ }
+
+ const walletInfo: { public_key: string } = await getWalletInfo({
+ lnd,
+ });
+
+ const getNodeAlias = async (id: string, publicKey: string) => {
+ const channelInfo: ChannelsProps = await getChannel({
+ lnd,
+ id,
+ });
+
+ const partnerPublicKey =
+ channelInfo.policies[0].public_key !== publicKey
+ ? channelInfo.policies[0].public_key
+ : channelInfo.policies[1].public_key;
+
+ const nodeInfo: NodeProps = await getNode({
+ lnd,
+ is_omitting_channels: true,
+ public_key: partnerPublicKey,
+ });
+
+ return {
+ alias: nodeInfo.alias,
+ color: nodeInfo.color,
+ };
+ };
+
+ const getAlias = (array: any[], publicKey: string) =>
+ Promise.all(
+ array.map(async forward => {
+ const inNodeAlias = await getNodeAlias(
+ forward.incoming_channel,
+ publicKey
+ );
+ const outNodeAlias = await getNodeAlias(
+ forward.outgoing_channel,
+ publicKey
+ );
+ return {
+ incoming_alias: inNodeAlias.alias,
+ incoming_color: inNodeAlias.color,
+ outgoing_alias: outNodeAlias.alias,
+ outgoing_color: outNodeAlias.color,
+ ...forward,
+ };
+ })
+ );
+
+ try {
+ const forwardsList: ForwardCompleteProps = await getLnForwards({
+ lnd,
+ after: startDate,
+ before: endDate,
+ });
+
+ const list = await getAlias(forwardsList.forwards, walletInfo.public_key);
+
+ const forwards = sortBy(list, 'created_at').reverse();
+ return {
+ token: forwardsList.next,
+ forwards,
+ };
+ } catch (error) {
+ params.logger && logger.error('Error getting forwards: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+ },
+};
diff --git a/server/src/schemas/query/transactions/index.ts b/src/api/schemas/query/transactions/index.ts
similarity index 78%
rename from server/src/schemas/query/transactions/index.ts
rename to src/api/schemas/query/transactions/index.ts
index 04513eec..596333a3 100644
--- a/server/src/schemas/query/transactions/index.ts
+++ b/src/api/schemas/query/transactions/index.ts
@@ -2,6 +2,6 @@ import { getForwards } from './forwards';
import { getResume } from './resume';
export const invoiceQueries = {
- getResume,
- getForwards,
+ getResume,
+ getForwards,
};
diff --git a/src/api/schemas/query/transactions/resume.interface.ts b/src/api/schemas/query/transactions/resume.interface.ts
new file mode 100644
index 00000000..0df4520d
--- /dev/null
+++ b/src/api/schemas/query/transactions/resume.interface.ts
@@ -0,0 +1,61 @@
+export interface PaymentProps {
+ created_at: string;
+ destination: string;
+ fee: number;
+ fee_mtokens: string;
+ hops: string[];
+ id: string;
+ is_confirmed: boolean;
+ is_outgoing: boolean;
+ mtokens: string;
+ request: string;
+ secret: string;
+ tokens: number;
+}
+
+export interface PaymentsProps {
+ payments: PaymentProps[];
+}
+
+export interface InvoicePaymentProps {
+ confirmed_at: string;
+ created_at: string;
+ created_height: number;
+ in_channel: string;
+ is_canceled: boolean;
+ is_confirmed: boolean;
+ is_held: boolean;
+ mtokens: string;
+ pending_index: number;
+ tokens: number;
+}
+
+export interface InvoiceProps {
+ chain_address: string;
+ confirmed_at: string;
+ created_at: string;
+ description: string;
+ description_hash: string;
+ expires_at: string;
+ id: string;
+ is_canceled: boolean;
+ is_confirmed: boolean;
+ is_held: boolean;
+ is_outgoing: boolean;
+ is_private: boolean;
+ payments: InvoicePaymentProps[];
+ received: number;
+ received_mtokens: string;
+ request: string;
+ secret: string;
+ tokens: number;
+}
+
+export interface InvoicesProps {
+ invoices: InvoiceProps[];
+ next: string;
+}
+
+export interface NodeProps {
+ alias: string;
+}
diff --git a/src/api/schemas/query/transactions/resume.ts b/src/api/schemas/query/transactions/resume.ts
new file mode 100644
index 00000000..d3f5f258
--- /dev/null
+++ b/src/api/schemas/query/transactions/resume.ts
@@ -0,0 +1,115 @@
+import { GraphQLString } from 'graphql';
+import { getPayments, getInvoices, getNode } from 'ln-service';
+import { logger } from '../../../helpers/logger';
+import { requestLimiter } from '../../../helpers/rateLimiter';
+import { getAuthLnd, getErrorMsg } from '../../../helpers/helpers';
+import { PaymentsProps, InvoicesProps, NodeProps } from './resume.interface';
+import { compareDesc } from 'date-fns';
+import { sortBy } from 'underscore';
+import { defaultParams } from '../../../helpers/defaultProps';
+import { GetResumeType } from '../../types/QueryType';
+
+export const getResume = {
+ type: GetResumeType,
+ args: {
+ ...defaultParams,
+ token: { type: GraphQLString },
+ },
+ resolve: async (root: any, params: any, context: any) => {
+ await requestLimiter(context.ip, 'payments');
+
+ const lnd = getAuthLnd(params.auth);
+
+ let payments;
+ let invoices;
+
+ try {
+ const paymentList: PaymentsProps = await getPayments({
+ lnd,
+ });
+
+ const getMappedPayments = () =>
+ Promise.all(
+ paymentList.payments.map(async payment => {
+ let nodeInfo: NodeProps;
+ try {
+ nodeInfo = await getNode({
+ lnd,
+ is_omitting_channels: true,
+ public_key: payment.destination,
+ });
+ } catch (error) {
+ nodeInfo = { alias: 'unknown' };
+ }
+ return {
+ type: 'payment',
+ alias: nodeInfo.alias,
+ date: payment.created_at,
+ ...payment,
+ };
+ })
+ );
+ payments = await getMappedPayments();
+ } catch (error) {
+ params.logger && logger.error('Error getting payments: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+
+ const invoiceProps = params.token ? { token: params.token } : { limit: 25 };
+
+ let lastInvoiceDate = '';
+ let firstInvoiceDate = '';
+ let token = '';
+ let withInvoices = true;
+
+ try {
+ const invoiceList: InvoicesProps = await getInvoices({
+ lnd,
+ ...invoiceProps,
+ });
+
+ invoices = invoiceList.invoices.map(invoice => {
+ return {
+ type: 'invoice',
+ date: invoice.confirmed_at || invoice.created_at,
+ ...invoice,
+ };
+ });
+
+ if (invoices.length <= 0) {
+ withInvoices = false;
+ } else {
+ const { date } = invoices[invoices.length - 1];
+ firstInvoiceDate = invoices[0].date;
+ lastInvoiceDate = date;
+ token = invoiceList.next;
+ }
+ } catch (error) {
+ params.logger && logger.error('Error getting invoices: %o', error);
+ throw new Error(getErrorMsg(error));
+ }
+
+ const filterArray = payment => {
+ const last =
+ compareDesc(new Date(lastInvoiceDate), new Date(payment.date)) === 1;
+ const first = params.token
+ ? compareDesc(new Date(payment.date), new Date(firstInvoiceDate)) === 1
+ : true;
+ return last && first;
+ };
+
+ const filteredPayments = withInvoices
+ ? payments.filter(filterArray)
+ : payments;
+
+ const resumeArray = sortBy(
+ [...invoices, ...filteredPayments],
+ 'date'
+ ).reverse();
+
+ return {
+ token,
+ resume: JSON.stringify(resumeArray),
+ };
+ },
+};
diff --git a/src/api/schemas/types/GeneralType.ts b/src/api/schemas/types/GeneralType.ts
new file mode 100644
index 00000000..57128892
--- /dev/null
+++ b/src/api/schemas/types/GeneralType.ts
@@ -0,0 +1,18 @@
+import { GraphQLInputObjectType, GraphQLString } from 'graphql';
+
+export const AuthType = new GraphQLInputObjectType({
+ name: 'authType',
+ fields: () => {
+ return {
+ host: {
+ type: GraphQLString,
+ },
+ macaroon: {
+ type: GraphQLString,
+ },
+ cert: {
+ type: GraphQLString,
+ },
+ };
+ },
+});
diff --git a/src/api/schemas/types/HodlType.ts b/src/api/schemas/types/HodlType.ts
new file mode 100644
index 00000000..e74dac51
--- /dev/null
+++ b/src/api/schemas/types/HodlType.ts
@@ -0,0 +1,105 @@
+import {
+ GraphQLObjectType,
+ GraphQLString,
+ GraphQLInt,
+ GraphQLBoolean,
+ GraphQLList,
+} from 'graphql';
+
+export const HodlOfferFeeType = new GraphQLObjectType({
+ name: 'hodlOfferFeeType',
+ fields: () => {
+ return {
+ author_fee_rate: { type: GraphQLString },
+ };
+ },
+});
+
+export const HodlOfferPaymentType = new GraphQLObjectType({
+ name: 'hodlOfferPaymentType',
+ fields: () => {
+ return {
+ id: { type: GraphQLString },
+ version: { type: GraphQLString },
+ payment_method_id: { type: GraphQLString },
+ payment_method_type: { type: GraphQLString },
+ payment_method_name: { type: GraphQLString },
+ };
+ },
+});
+
+export const HodlOfferTraderType = new GraphQLObjectType({
+ name: 'hodlOfferTraderType',
+ fields: () => {
+ return {
+ login: { type: GraphQLString },
+ online_status: { type: GraphQLString },
+ rating: { type: GraphQLString },
+ trades_count: { type: GraphQLInt },
+ url: { type: GraphQLString },
+ verified: { type: GraphQLBoolean },
+ verified_by: { type: GraphQLString },
+ strong_hodler: { type: GraphQLBoolean },
+ country: { type: GraphQLString },
+ country_code: { type: GraphQLString },
+ average_payment_time_minutes: { type: GraphQLInt },
+ average_release_time_minutes: { type: GraphQLInt },
+ days_since_last_trade: { type: GraphQLInt },
+ };
+ },
+});
+
+export const HodlOfferType = new GraphQLObjectType({
+ name: 'hodlOfferType',
+ fields: () => {
+ return {
+ id: { type: GraphQLString },
+ version: { type: GraphQLString },
+ asset_code: { type: GraphQLString },
+ searchable: { type: GraphQLBoolean },
+ country: { type: GraphQLString },
+ country_code: { type: GraphQLString },
+ working_now: { type: GraphQLBoolean },
+ side: { type: GraphQLString },
+ title: { type: GraphQLString },
+ description: { type: GraphQLString },
+ currency_code: { type: GraphQLString },
+ price: { type: GraphQLString },
+ min_amount: { type: GraphQLString },
+ max_amount: { type: GraphQLString },
+ first_trade_limit: { type: GraphQLString },
+ fee: { type: HodlOfferFeeType },
+ balance: { type: GraphQLString },
+ payment_window_minutes: { type: GraphQLInt },
+ confirmations: { type: GraphQLInt },
+ payment_method_instructions: {
+ type: new GraphQLList(HodlOfferPaymentType),
+ },
+ trader: { type: HodlOfferTraderType },
+ };
+ },
+});
+
+export const HodlCountryType = new GraphQLObjectType({
+ name: 'hodlCountryType',
+ fields: () => {
+ return {
+ code: { type: GraphQLString },
+ name: { type: GraphQLString },
+ native_name: { type: GraphQLString },
+ currency_code: { type: GraphQLString },
+ currency_name: { type: GraphQLString },
+ };
+ },
+});
+
+export const HodlCurrencyType = new GraphQLObjectType({
+ name: 'hodlCurrencyType',
+ fields: () => {
+ return {
+ code: { type: GraphQLString },
+ name: { type: GraphQLString },
+ type: { type: GraphQLString },
+ };
+ },
+});
diff --git a/src/api/schemas/types/MutationType.ts b/src/api/schemas/types/MutationType.ts
new file mode 100644
index 00000000..ba41340e
--- /dev/null
+++ b/src/api/schemas/types/MutationType.ts
@@ -0,0 +1,144 @@
+import {
+ GraphQLObjectType,
+ GraphQLString,
+ GraphQLInt,
+ GraphQLList,
+ GraphQLBoolean,
+} from 'graphql';
+import { GraphQLDateTime } from 'graphql-iso-date';
+
+export const CloseChannelType = new GraphQLObjectType({
+ name: 'closeChannelType',
+ fields: () => {
+ return {
+ transactionId: { type: GraphQLString },
+ transactionOutputIndex: { type: GraphQLString },
+ };
+ },
+});
+
+export const OpenChannelType = new GraphQLObjectType({
+ name: 'openChannelType',
+ fields: () => {
+ return {
+ transactionId: { type: GraphQLString },
+ transactionOutputIndex: { type: GraphQLString },
+ };
+ },
+});
+
+export const InvoiceType = new GraphQLObjectType({
+ name: 'invoiceType',
+ fields: () => {
+ return {
+ chainAddress: { type: GraphQLString },
+ createdAt: { type: GraphQLDateTime },
+ description: { type: GraphQLString },
+ id: { type: GraphQLString },
+ request: { type: GraphQLString },
+ secret: { type: GraphQLString },
+ tokens: { type: GraphQLInt },
+ };
+ },
+});
+
+const RoutesType = new GraphQLObjectType({
+ name: 'routeType',
+ fields: () => ({
+ baseFeeMTokens: { type: GraphQLString },
+ channel: { type: GraphQLString },
+ cltvDelta: { type: GraphQLInt },
+ feeRate: { type: GraphQLInt },
+ publicKey: { type: GraphQLString },
+ }),
+});
+
+export const DecodeType = new GraphQLObjectType({
+ name: 'decodeType',
+ fields: () => {
+ return {
+ chainAddress: { type: GraphQLString },
+ cltvDelta: { type: GraphQLInt },
+ description: { type: GraphQLString },
+ descriptionHash: { type: GraphQLString },
+ destination: { type: GraphQLString },
+ expiresAt: { type: GraphQLString },
+ id: { type: GraphQLString },
+ routes: { type: new GraphQLList(RoutesType) },
+ tokens: { type: GraphQLInt },
+ };
+ },
+});
+
+const RouteType = new GraphQLObjectType({
+ name: 'RouteType',
+ fields: () => ({
+ mTokenFee: { type: GraphQLString },
+ channel: { type: GraphQLString },
+ cltvDelta: { type: GraphQLInt },
+ feeRate: { type: GraphQLInt },
+ publicKey: { type: GraphQLString },
+ }),
+});
+
+export const ParsePaymentType = new GraphQLObjectType({
+ name: 'parsePaymentType',
+ fields: () => {
+ return {
+ chainAddresses: { type: new GraphQLList(GraphQLString) },
+ cltvDelta: { type: GraphQLInt },
+ createdAt: { type: GraphQLDateTime },
+ description: { type: GraphQLString },
+ descriptionHash: { type: GraphQLString },
+ destination: { type: GraphQLString },
+ expiresAt: { type: GraphQLDateTime },
+ id: { type: GraphQLString },
+ isExpired: { type: GraphQLBoolean },
+ mTokens: { type: GraphQLString },
+ network: { type: GraphQLString },
+ routes: { type: new GraphQLList(RouteType) },
+ tokens: { type: GraphQLInt },
+ };
+ },
+});
+
+const HopsType = new GraphQLObjectType({
+ name: 'hopsType',
+ fields: () => ({
+ channel: { type: GraphQLString },
+ channelCapacity: { type: GraphQLInt },
+ mTokenFee: { type: GraphQLString },
+ forwardMTokens: { type: GraphQLString },
+ timeout: { type: GraphQLInt },
+ }),
+});
+
+export const PayType = new GraphQLObjectType({
+ name: 'payType',
+ fields: () => {
+ return {
+ fee: { type: GraphQLInt },
+ feeMTokens: { type: GraphQLString },
+ hops: { type: new GraphQLList(HopsType) },
+ id: { type: GraphQLString },
+ isConfirmed: { type: GraphQLBoolean },
+ isOutgoing: { type: GraphQLBoolean },
+ mtokens: { type: GraphQLString },
+ secret: { type: GraphQLString },
+ tokens: { type: GraphQLInt },
+ };
+ },
+});
+
+export const SendToType = new GraphQLObjectType({
+ name: 'sendToType',
+ fields: () => {
+ return {
+ confirmationCount: { type: GraphQLString },
+ id: { type: GraphQLString },
+ isConfirmed: { type: GraphQLBoolean },
+ isOutgoing: { type: GraphQLBoolean },
+ tokens: { type: GraphQLInt },
+ };
+ },
+});
diff --git a/src/api/schemas/types/QueryType.ts b/src/api/schemas/types/QueryType.ts
new file mode 100644
index 00000000..e91e087d
--- /dev/null
+++ b/src/api/schemas/types/QueryType.ts
@@ -0,0 +1,260 @@
+import {
+ GraphQLObjectType,
+ GraphQLString,
+ GraphQLInt,
+ GraphQLBoolean,
+ GraphQLList,
+} from 'graphql';
+
+export const ChannelBalanceType = new GraphQLObjectType({
+ name: 'channelBalanceType',
+ fields: () => {
+ return {
+ confirmedBalance: { type: GraphQLInt },
+ pendingBalance: { type: GraphQLInt },
+ };
+ },
+});
+
+export const ChannelFeeType = new GraphQLObjectType({
+ name: 'channelFeeType',
+ fields: () => {
+ return {
+ alias: { type: GraphQLString },
+ color: { type: GraphQLString },
+ baseFee: { type: GraphQLInt },
+ feeRate: { type: GraphQLInt },
+ transactionId: { type: GraphQLString },
+ transactionVout: { type: GraphQLInt },
+ };
+ },
+});
+
+export const ChannelReportType = new GraphQLObjectType({
+ name: 'channelReportType',
+ fields: () => {
+ return {
+ local: { type: GraphQLInt },
+ remote: { type: GraphQLInt },
+ maxIn: { type: GraphQLInt },
+ maxOut: { type: GraphQLInt },
+ };
+ },
+});
+
+export const PartnerNodeType = new GraphQLObjectType({
+ name: 'partnerNodeType',
+ fields: () => {
+ return {
+ alias: { type: GraphQLString },
+ capacity: { type: GraphQLString },
+ channel_count: { type: GraphQLInt },
+ color: { type: GraphQLString },
+ updated_at: { type: GraphQLString },
+ };
+ },
+});
+
+export const ChannelType = new GraphQLObjectType({
+ name: 'channelType',
+ fields: () => {
+ return {
+ capacity: { type: GraphQLInt },
+ commit_transaction_fee: { type: GraphQLInt },
+ commit_transaction_weight: { type: GraphQLInt },
+ id: { type: GraphQLString },
+ is_active: { type: GraphQLBoolean },
+ is_closing: { type: GraphQLBoolean },
+ is_opening: { type: GraphQLBoolean },
+ is_partner_initiated: { type: GraphQLBoolean },
+ is_private: { type: GraphQLBoolean },
+ is_static_remote_key: { type: GraphQLBoolean },
+ local_balance: { type: GraphQLInt },
+ local_reserve: { type: GraphQLInt },
+ partner_public_key: { type: GraphQLString },
+ received: { type: GraphQLInt },
+ remote_balance: { type: GraphQLInt },
+ remote_reserve: { type: GraphQLInt },
+ sent: { type: GraphQLInt },
+ time_offline: { type: GraphQLInt },
+ time_online: { type: GraphQLInt },
+ transaction_id: { type: GraphQLString },
+ transaction_vout: { type: GraphQLInt },
+ unsettled_balance: { type: GraphQLInt },
+ partner_node_info: { type: PartnerNodeType },
+ };
+ },
+});
+
+export const ClosedChannelType = new GraphQLObjectType({
+ name: 'closedChannelType',
+ fields: () => {
+ return {
+ capacity: { type: GraphQLInt },
+ close_confirm_height: { type: GraphQLInt },
+ close_transaction_id: { type: GraphQLString },
+ final_local_balance: { type: GraphQLInt },
+ final_time_locked_balance: { type: GraphQLInt },
+ id: { type: GraphQLString },
+ is_breach_close: { type: GraphQLBoolean },
+ is_cooperative_close: { type: GraphQLBoolean },
+ is_funding_cancel: { type: GraphQLBoolean },
+ is_local_force_close: { type: GraphQLBoolean },
+ is_remote_force_close: { type: GraphQLBoolean },
+ partner_public_key: { type: GraphQLString },
+ transaction_id: { type: GraphQLString },
+ transaction_vout: { type: GraphQLInt },
+ partner_node_info: { type: PartnerNodeType },
+ };
+ },
+});
+
+export const PendingChannelType = new GraphQLObjectType({
+ name: 'pendingChannelType',
+ fields: () => {
+ return {
+ close_transaction_id: { type: GraphQLString },
+ is_active: { type: GraphQLBoolean },
+ is_closing: { type: GraphQLBoolean },
+ is_opening: { type: GraphQLBoolean },
+ local_balance: { type: GraphQLInt },
+ local_reserve: { type: GraphQLInt },
+ partner_public_key: { type: GraphQLString },
+ received: { type: GraphQLInt },
+ remote_balance: { type: GraphQLInt },
+ remote_reserve: { type: GraphQLInt },
+ sent: { type: GraphQLInt },
+ transaction_fee: { type: GraphQLInt },
+ transaction_id: { type: GraphQLString },
+ transaction_vout: { type: GraphQLInt },
+ partner_node_info: { type: PartnerNodeType },
+ };
+ },
+});
+
+export const PeerType = new GraphQLObjectType({
+ name: 'peerType',
+ fields: () => {
+ return {
+ bytes_received: { type: GraphQLInt },
+ bytes_sent: { type: GraphQLInt },
+ is_inbound: { type: GraphQLBoolean },
+ is_sync_peer: { type: GraphQLBoolean },
+ ping_time: { type: GraphQLInt },
+ public_key: { type: GraphQLString },
+ socket: { type: GraphQLString },
+ tokens_received: { type: GraphQLInt },
+ tokens_sent: { type: GraphQLInt },
+ partner_node_info: { type: PartnerNodeType },
+ };
+ },
+});
+
+export const BitcoinFeeType = new GraphQLObjectType({
+ name: 'bitcoinFeeType',
+ fields: () => {
+ return {
+ fast: { type: GraphQLInt },
+ halfHour: { type: GraphQLInt },
+ hour: { type: GraphQLInt },
+ };
+ },
+});
+
+export const InOutType = new GraphQLObjectType({
+ name: 'InOutType',
+ fields: () => {
+ return {
+ invoices: { type: GraphQLString },
+ payments: { type: GraphQLString },
+ confirmedInvoices: { type: GraphQLInt },
+ unConfirmedInvoices: { type: GraphQLInt },
+ };
+ },
+});
+
+export const NetworkInfoType = new GraphQLObjectType({
+ name: 'networkInfoType',
+ fields: () => {
+ return {
+ averageChannelSize: { type: GraphQLString },
+ channelCount: { type: GraphQLInt },
+ maxChannelSize: { type: GraphQLString },
+ medianChannelSize: { type: GraphQLString },
+ minChannelSize: { type: GraphQLInt },
+ nodeCount: { type: GraphQLInt },
+ notRecentlyUpdatedPolicyCount: { type: GraphQLInt },
+ totalCapacity: { type: GraphQLString },
+ };
+ },
+});
+
+export const NodeInfoType = new GraphQLObjectType({
+ name: 'nodeInfoType',
+ fields: () => {
+ return {
+ chains: { type: new GraphQLList(GraphQLString) },
+ color: { type: GraphQLString },
+ active_channels_count: { type: GraphQLInt },
+ closed_channels_count: { type: GraphQLInt },
+ alias: { type: GraphQLString },
+ current_block_hash: { type: GraphQLString },
+ current_block_height: { type: GraphQLBoolean },
+ is_synced_to_chain: { type: GraphQLBoolean },
+ is_synced_to_graph: { type: GraphQLBoolean },
+ latest_block_at: { type: GraphQLString },
+ peers_count: { type: GraphQLInt },
+ pending_channels_count: { type: GraphQLInt },
+ public_key: { type: GraphQLString },
+ uris: { type: new GraphQLList(GraphQLString) },
+ version: { type: GraphQLString },
+ };
+ },
+});
+
+export const GetChainTransactionsType = new GraphQLObjectType({
+ name: 'getTransactionsType',
+ fields: () => ({
+ block_id: { type: GraphQLString },
+ confirmation_count: { type: GraphQLInt },
+ confirmation_height: { type: GraphQLInt },
+ created_at: { type: GraphQLString },
+ fee: { type: GraphQLInt },
+ id: { type: GraphQLString },
+ output_addresses: { type: new GraphQLList(GraphQLString) },
+ tokens: { type: GraphQLInt },
+ }),
+});
+
+export const ForwardType = new GraphQLObjectType({
+ name: 'forwardType',
+ fields: () => ({
+ created_at: { type: GraphQLString },
+ fee: { type: GraphQLInt },
+ fee_mtokens: { type: GraphQLString },
+ incoming_channel: { type: GraphQLString },
+ incoming_alias: { type: GraphQLString },
+ incoming_color: { type: GraphQLString },
+ mtokens: { type: GraphQLString },
+ outgoing_channel: { type: GraphQLString },
+ outgoing_alias: { type: GraphQLString },
+ outgoing_color: { type: GraphQLString },
+ tokens: { type: GraphQLInt },
+ }),
+});
+
+export const GetForwardType = new GraphQLObjectType({
+ name: 'getForwardType',
+ fields: () => ({
+ token: { type: GraphQLString },
+ forwards: { type: new GraphQLList(ForwardType) },
+ }),
+});
+
+export const GetResumeType = new GraphQLObjectType({
+ name: 'getResumeType',
+ fields: () => ({
+ token: { type: GraphQLString },
+ resume: { type: GraphQLString },
+ }),
+});
diff --git a/src/api/utils/appUrls.ts b/src/api/utils/appUrls.ts
new file mode 100644
index 00000000..f01f3fdb
--- /dev/null
+++ b/src/api/utils/appUrls.ts
@@ -0,0 +1,5 @@
+export const appUrls = {
+ fees: 'https://bitcoinfees.earn.com/api/v1/fees/recommended',
+ ticker: 'https://blockchain.info/ticker',
+ hodlhodl: 'https://hodlhodl.com/api',
+};
diff --git a/src/api/utils/envConfig.ts b/src/api/utils/envConfig.ts
new file mode 100644
index 00000000..07fcb42e
--- /dev/null
+++ b/src/api/utils/envConfig.ts
@@ -0,0 +1,5 @@
+export const envConfig = {
+ env: process.env.NODE_ENV || 'development',
+ logLevel: process.env.LOG_LEVEL || 'silly',
+ hodlKey: process.env.HODL_KEY,
+};
diff --git a/src/api/utils/rateLimitConfig.ts b/src/api/utils/rateLimitConfig.ts
new file mode 100644
index 00000000..965df41f
--- /dev/null
+++ b/src/api/utils/rateLimitConfig.ts
@@ -0,0 +1,53 @@
+interface RateConfigProps {
+ [key: string]: {
+ max: number;
+ window: string;
+ };
+}
+
+export const RateConfig: RateConfigProps = {
+ channelBalance: { max: 10, window: '1s' },
+ channelFees: { max: 10, window: '1s' },
+ channels: { max: 10, window: '1s' },
+ channelReport: { max: 10, window: '1s' },
+ closedChannels: { max: 10, window: '1s' },
+ pendingChannels: { max: 10, window: '1s' },
+ bitcoinFee: { max: 10, window: '1s' },
+ bitcoinPrice: { max: 10, window: '1s' },
+ getInOut: { max: 10, window: '1s' },
+ chainBalance: { max: 10, window: '1s' },
+ pendingChainBalance: { max: 10, window: '1s' },
+ networkInfo: { max: 10, window: '1s' },
+ nodeInfo: { max: 10, window: '1s' },
+ forwards: { max: 10, window: '1s' },
+ invoices: { max: 10, window: '1s' },
+ payments: { max: 10, window: '1s' },
+ forwardChannels: { max: 10, window: '1s' },
+ forwardReport: { max: 10, window: '1s' },
+ getRoute: { max: 10, window: '1s' },
+ closeChannel: { max: 10, window: '1s' },
+ openChannel: { max: 10, window: '1s' },
+ createInvoice: { max: 10, window: '1s' },
+ decode: { max: 10, window: '1s' },
+ parsePayment: { max: 10, window: '1s' },
+ pay: { max: 10, window: '1s' },
+ getAddress: { max: 10, window: '1s' },
+ sendToAddress: { max: 10, window: '1s' },
+ getBackups: { max: 10, window: '1s' },
+ verifyBackups: { max: 10, window: '1s' },
+ recoverFunds: { max: 10, window: '1s' },
+ updateFees: { max: 10, window: '1s' },
+ chainTransactions: { max: 10, window: '1s' },
+ getRoutes: { max: 10, window: '1s' },
+ payViaRoute: { max: 10, window: '1s' },
+ adminCheck: { max: 10, window: '1s' },
+ getPeers: { max: 10, window: '1s' },
+ addPeer: { max: 10, window: '1s' },
+ removePeer: { max: 10, window: '1s' },
+ signMessage: { max: 10, window: '1s' },
+ verifyMessage: { max: 10, window: '1s' },
+ getUtxos: { max: 10, window: '1s' },
+ getOffers: { max: 10, window: '1s' },
+ getCountries: { max: 10, window: '1s' },
+ getCurrencies: { max: 10, window: '1s' },
+};
diff --git a/client/src/assets/icons/alert-circle.svg b/src/assets/icons/alert-circle.svg
similarity index 100%
rename from client/src/assets/icons/alert-circle.svg
rename to src/assets/icons/alert-circle.svg
diff --git a/client/src/assets/icons/alert-triangle.svg b/src/assets/icons/alert-triangle.svg
similarity index 100%
rename from client/src/assets/icons/alert-triangle.svg
rename to src/assets/icons/alert-triangle.svg
diff --git a/client/src/assets/icons/anchor.svg b/src/assets/icons/anchor.svg
similarity index 100%
rename from client/src/assets/icons/anchor.svg
rename to src/assets/icons/anchor.svg
diff --git a/client/src/assets/icons/arrow-down.svg b/src/assets/icons/arrow-down.svg
similarity index 100%
rename from client/src/assets/icons/arrow-down.svg
rename to src/assets/icons/arrow-down.svg
diff --git a/client/src/assets/icons/arrow-up.svg b/src/assets/icons/arrow-up.svg
similarity index 100%
rename from client/src/assets/icons/arrow-up.svg
rename to src/assets/icons/arrow-up.svg
diff --git a/client/src/assets/icons/check.svg b/src/assets/icons/check.svg
similarity index 100%
rename from client/src/assets/icons/check.svg
rename to src/assets/icons/check.svg
diff --git a/client/src/assets/icons/chevron-down.svg b/src/assets/icons/chevron-down.svg
similarity index 100%
rename from client/src/assets/icons/chevron-down.svg
rename to src/assets/icons/chevron-down.svg
diff --git a/client/src/assets/icons/chevron-left.svg b/src/assets/icons/chevron-left.svg
similarity index 100%
rename from client/src/assets/icons/chevron-left.svg
rename to src/assets/icons/chevron-left.svg
diff --git a/client/src/assets/icons/chevron-right.svg b/src/assets/icons/chevron-right.svg
similarity index 100%
rename from client/src/assets/icons/chevron-right.svg
rename to src/assets/icons/chevron-right.svg
diff --git a/client/src/assets/icons/chevron-up.svg b/src/assets/icons/chevron-up.svg
similarity index 100%
rename from client/src/assets/icons/chevron-up.svg
rename to src/assets/icons/chevron-up.svg
diff --git a/client/src/assets/icons/chevrons-down.svg b/src/assets/icons/chevrons-down.svg
similarity index 100%
rename from client/src/assets/icons/chevrons-down.svg
rename to src/assets/icons/chevrons-down.svg
diff --git a/client/src/assets/icons/chevrons-up.svg b/src/assets/icons/chevrons-up.svg
similarity index 100%
rename from client/src/assets/icons/chevrons-up.svg
rename to src/assets/icons/chevrons-up.svg
diff --git a/client/src/assets/icons/circle.svg b/src/assets/icons/circle.svg
similarity index 100%
rename from client/src/assets/icons/circle.svg
rename to src/assets/icons/circle.svg
diff --git a/client/src/assets/icons/copy.svg b/src/assets/icons/copy.svg
similarity index 100%
rename from client/src/assets/icons/copy.svg
rename to src/assets/icons/copy.svg
diff --git a/client/src/assets/icons/cpu.svg b/src/assets/icons/cpu.svg
similarity index 100%
rename from client/src/assets/icons/cpu.svg
rename to src/assets/icons/cpu.svg
diff --git a/client/src/assets/icons/credit-card.svg b/src/assets/icons/credit-card.svg
similarity index 100%
rename from client/src/assets/icons/credit-card.svg
rename to src/assets/icons/credit-card.svg
diff --git a/client/src/assets/icons/crosshair.svg b/src/assets/icons/crosshair.svg
similarity index 100%
rename from client/src/assets/icons/crosshair.svg
rename to src/assets/icons/crosshair.svg
diff --git a/client/src/assets/icons/edit.svg b/src/assets/icons/edit.svg
similarity index 100%
rename from client/src/assets/icons/edit.svg
rename to src/assets/icons/edit.svg
diff --git a/client/src/assets/icons/eye-off.svg b/src/assets/icons/eye-off.svg
similarity index 100%
rename from client/src/assets/icons/eye-off.svg
rename to src/assets/icons/eye-off.svg
diff --git a/client/src/assets/icons/eye.svg b/src/assets/icons/eye.svg
similarity index 100%
rename from client/src/assets/icons/eye.svg
rename to src/assets/icons/eye.svg
diff --git a/client/src/assets/icons/git-branch.svg b/src/assets/icons/git-branch.svg
similarity index 100%
rename from client/src/assets/icons/git-branch.svg
rename to src/assets/icons/git-branch.svg
diff --git a/client/src/assets/icons/git-commit.svg b/src/assets/icons/git-commit.svg
similarity index 100%
rename from client/src/assets/icons/git-commit.svg
rename to src/assets/icons/git-commit.svg
diff --git a/client/src/assets/icons/git-pull-request.svg b/src/assets/icons/git-pull-request.svg
similarity index 100%
rename from client/src/assets/icons/git-pull-request.svg
rename to src/assets/icons/git-pull-request.svg
diff --git a/client/src/assets/icons/github.svg b/src/assets/icons/github.svg
similarity index 100%
rename from client/src/assets/icons/github.svg
rename to src/assets/icons/github.svg
diff --git a/client/src/assets/icons/globe.svg b/src/assets/icons/globe.svg
similarity index 100%
rename from client/src/assets/icons/globe.svg
rename to src/assets/icons/globe.svg
diff --git a/client/src/assets/icons/half-star.svg b/src/assets/icons/half-star.svg
similarity index 100%
rename from client/src/assets/icons/half-star.svg
rename to src/assets/icons/half-star.svg
diff --git a/client/src/assets/icons/help-circle.svg b/src/assets/icons/help-circle.svg
similarity index 100%
rename from client/src/assets/icons/help-circle.svg
rename to src/assets/icons/help-circle.svg
diff --git a/client/src/assets/icons/home.svg b/src/assets/icons/home.svg
similarity index 100%
rename from client/src/assets/icons/home.svg
rename to src/assets/icons/home.svg
diff --git a/client/src/assets/icons/key.svg b/src/assets/icons/key.svg
similarity index 100%
rename from client/src/assets/icons/key.svg
rename to src/assets/icons/key.svg
diff --git a/client/src/assets/icons/layers.svg b/src/assets/icons/layers.svg
similarity index 100%
rename from client/src/assets/icons/layers.svg
rename to src/assets/icons/layers.svg
diff --git a/client/src/assets/icons/link.svg b/src/assets/icons/link.svg
similarity index 100%
rename from client/src/assets/icons/link.svg
rename to src/assets/icons/link.svg
diff --git a/client/src/assets/icons/loader.svg b/src/assets/icons/loader.svg
similarity index 100%
rename from client/src/assets/icons/loader.svg
rename to src/assets/icons/loader.svg
diff --git a/client/src/assets/icons/mail.svg b/src/assets/icons/mail.svg
similarity index 100%
rename from client/src/assets/icons/mail.svg
rename to src/assets/icons/mail.svg
diff --git a/client/src/assets/icons/menu.svg b/src/assets/icons/menu.svg
similarity index 100%
rename from client/src/assets/icons/menu.svg
rename to src/assets/icons/menu.svg
diff --git a/client/src/assets/icons/moon.svg b/src/assets/icons/moon.svg
similarity index 100%
rename from client/src/assets/icons/moon.svg
rename to src/assets/icons/moon.svg
diff --git a/client/src/assets/icons/more-vertical.svg b/src/assets/icons/more-vertical.svg
similarity index 100%
rename from client/src/assets/icons/more-vertical.svg
rename to src/assets/icons/more-vertical.svg
diff --git a/client/src/assets/icons/pocket.svg b/src/assets/icons/pocket.svg
similarity index 100%
rename from client/src/assets/icons/pocket.svg
rename to src/assets/icons/pocket.svg
diff --git a/client/src/assets/icons/radio.svg b/src/assets/icons/radio.svg
similarity index 100%
rename from client/src/assets/icons/radio.svg
rename to src/assets/icons/radio.svg
diff --git a/client/src/assets/icons/repeat.svg b/src/assets/icons/repeat.svg
similarity index 100%
rename from client/src/assets/icons/repeat.svg
rename to src/assets/icons/repeat.svg
diff --git a/client/src/assets/icons/send.svg b/src/assets/icons/send.svg
similarity index 100%
rename from client/src/assets/icons/send.svg
rename to src/assets/icons/send.svg
diff --git a/client/src/assets/icons/server.svg b/src/assets/icons/server.svg
similarity index 100%
rename from client/src/assets/icons/server.svg
rename to src/assets/icons/server.svg
diff --git a/client/src/assets/icons/settings.svg b/src/assets/icons/settings.svg
similarity index 100%
rename from client/src/assets/icons/settings.svg
rename to src/assets/icons/settings.svg
diff --git a/client/src/assets/icons/shield.svg b/src/assets/icons/shield.svg
similarity index 100%
rename from client/src/assets/icons/shield.svg
rename to src/assets/icons/shield.svg
diff --git a/client/src/assets/icons/sliders.svg b/src/assets/icons/sliders.svg
similarity index 100%
rename from client/src/assets/icons/sliders.svg
rename to src/assets/icons/sliders.svg
diff --git a/client/src/assets/icons/star.svg b/src/assets/icons/star.svg
similarity index 100%
rename from client/src/assets/icons/star.svg
rename to src/assets/icons/star.svg
diff --git a/client/src/assets/icons/sun.svg b/src/assets/icons/sun.svg
similarity index 100%
rename from client/src/assets/icons/sun.svg
rename to src/assets/icons/sun.svg
diff --git a/client/src/assets/icons/users.svg b/src/assets/icons/users.svg
similarity index 100%
rename from client/src/assets/icons/users.svg
rename to src/assets/icons/users.svg
diff --git a/client/src/assets/icons/x.svg b/src/assets/icons/x.svg
similarity index 100%
rename from client/src/assets/icons/x.svg
rename to src/assets/icons/x.svg
diff --git a/client/src/assets/icons/zap-off.svg b/src/assets/icons/zap-off.svg
similarity index 100%
rename from client/src/assets/icons/zap-off.svg
rename to src/assets/icons/zap-off.svg
diff --git a/client/src/assets/icons/zap.svg b/src/assets/icons/zap.svg
similarity index 100%
rename from client/src/assets/icons/zap.svg
rename to src/assets/icons/zap.svg
diff --git a/client/src/components/adminSwitch/AdminSwitch.tsx b/src/components/adminSwitch/AdminSwitch.tsx
similarity index 51%
rename from client/src/components/adminSwitch/AdminSwitch.tsx
rename to src/components/adminSwitch/AdminSwitch.tsx
index 446c3dd8..16870f9f 100644
--- a/client/src/components/adminSwitch/AdminSwitch.tsx
+++ b/src/components/adminSwitch/AdminSwitch.tsx
@@ -1,15 +1,15 @@
import { useAccount } from '../../context/AccountContext';
interface AdminSwitchProps {
- children: any;
+ children: any;
}
export const AdminSwitch = ({ children }: AdminSwitchProps) => {
- const { admin, sessionAdmin } = useAccount();
+ const { admin, sessionAdmin } = useAccount();
- if (!admin && !sessionAdmin) {
- return null;
- }
+ if (!admin && !sessionAdmin) {
+ return null;
+ }
- return children;
+ return children;
};
diff --git a/client/src/components/animated/AnimatedNumber.stories.tsx b/src/components/animated/AnimatedNumber.stories.tsx
similarity index 64%
rename from client/src/components/animated/AnimatedNumber.stories.tsx
rename to src/components/animated/AnimatedNumber.stories.tsx
index f9b3f601..0816acec 100644
--- a/client/src/components/animated/AnimatedNumber.stories.tsx
+++ b/src/components/animated/AnimatedNumber.stories.tsx
@@ -2,9 +2,9 @@ import React from 'react';
import { AnimatedNumber } from './AnimatedNumber';
export default {
- title: 'Animated/Number',
+ title: 'Animated/Number',
};
export const Default = () => {
- return ;
+ return ;
};
diff --git a/src/components/animated/AnimatedNumber.tsx b/src/components/animated/AnimatedNumber.tsx
new file mode 100644
index 00000000..eb177857
--- /dev/null
+++ b/src/components/animated/AnimatedNumber.tsx
@@ -0,0 +1,49 @@
+import React from 'react';
+import { useSpring, animated } from 'react-spring';
+import { getValue } from '../../utils/Helpers';
+import { useSettings } from '../../context/SettingsContext';
+import { usePriceState } from '../../context/PriceContext';
+
+type PriceProps = {
+ price: number;
+ symbol: string;
+ currency: string;
+};
+
+type AnimatedProps = {
+ amount: number;
+};
+
+export const AnimatedNumber = ({ amount }: AnimatedProps) => {
+ const { value } = useSpring({
+ from: { value: 0 },
+ value: amount,
+ });
+ const { currency } = useSettings();
+ const { prices } = usePriceState();
+
+ let priceProps: PriceProps = {
+ price: 0,
+ symbol: '',
+ currency: currency !== 'btc' && currency !== 'sat' ? 'sat' : currency,
+ };
+
+ if (prices) {
+ const current: { last: number; symbol: string } = prices[currency] ?? {
+ last: 0,
+ symbol: '',
+ };
+
+ priceProps = {
+ price: current.last,
+ symbol: current.symbol,
+ currency,
+ };
+ }
+
+ return (
+
+ {value.interpolate(amount => getValue({ amount, ...priceProps }))}
+
+ );
+};
diff --git a/src/components/auth/Auth.styled.tsx b/src/components/auth/Auth.styled.tsx
new file mode 100644
index 00000000..56d500e6
--- /dev/null
+++ b/src/components/auth/Auth.styled.tsx
@@ -0,0 +1,43 @@
+import styled from 'styled-components';
+import { Sub4Title } from '../generic/Styled';
+import { fontColors, textColor } from '../../styles/Themes';
+
+export const Line = styled.div`
+ margin: 16px 0;
+`;
+
+export const StyledTitle = styled(Sub4Title)`
+ text-align: left;
+ width: 100%;
+ margin-bottom: 0px;
+`;
+
+export const CheckboxText = styled.div`
+ font-size: 13px;
+ color: ${fontColors.grey7};
+ text-align: justify;
+`;
+
+export const StyledContainer = styled.div`
+ color: ${textColor};
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+ padding-right: 32px;
+ margin: 32px 0 8px;
+`;
+
+export const FixedWidth = styled.div`
+ height: 18px;
+ width: 18px;
+ margin: 0px;
+ margin-right: 8px;
+`;
+
+export const QRTextWrapper = styled.div`
+ display: flex;
+ margin: 16px 0;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+`;
diff --git a/src/components/auth/checks/AdminCheck.tsx b/src/components/auth/checks/AdminCheck.tsx
new file mode 100644
index 00000000..a34fa895
--- /dev/null
+++ b/src/components/auth/checks/AdminCheck.tsx
@@ -0,0 +1,44 @@
+import React from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import { SingleLine, Sub4Title } from '../../generic/Styled';
+import ScaleLoader from 'react-spinners/ScaleLoader';
+import { themeColors } from '../../../styles/Themes';
+import { XSvg, Check } from '../../generic/Icons';
+import { GET_CAN_ADMIN } from '../../../graphql/query';
+
+type AdminProps = {
+ host: string;
+ admin: string;
+ cert?: string;
+ setChecked: (state: boolean) => void;
+};
+
+export const AdminCheck = ({ host, admin, cert, setChecked }: AdminProps) => {
+ const { data, loading } = useQuery(GET_CAN_ADMIN, {
+ skip: !admin,
+ variables: { auth: { host, macaroon: admin, cert } },
+ onError: () => {
+ setChecked(false);
+ },
+ onCompleted: () => {
+ setChecked(true);
+ },
+ });
+
+ const content = () => {
+ if (loading) {
+ return ;
+ }
+ if (data?.adminCheck) {
+ return ;
+ }
+ return ;
+ };
+
+ return (
+
+ Admin Macaroon
+ {content()}
+
+ );
+};
diff --git a/src/components/auth/checks/ViewCheck.tsx b/src/components/auth/checks/ViewCheck.tsx
new file mode 100644
index 00000000..aa5d5124
--- /dev/null
+++ b/src/components/auth/checks/ViewCheck.tsx
@@ -0,0 +1,149 @@
+import React, { useState, useEffect } from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import { SingleLine, Sub4Title, Separation } from '../../generic/Styled';
+import ScaleLoader from 'react-spinners/ScaleLoader';
+import { themeColors } from '../../../styles/Themes';
+import { Check, XSvg } from '../../generic/Icons';
+import { ColorButton } from '../../buttons/colorButton/ColorButton';
+import { AdminCheck } from './AdminCheck';
+import { Text } from '../../typography/Styled';
+import { GET_CAN_CONNECT } from '../../../graphql/query';
+
+type ViewProps = {
+ host: string;
+ admin?: string;
+ viewOnly?: string;
+ cert?: string;
+ adminChecked: boolean;
+ callback: () => void;
+ setAdminChecked: (state: boolean) => void;
+ handleConnect: () => void;
+ setName: (name: string) => void;
+};
+
+export const ViewCheck = ({
+ host,
+ admin,
+ viewOnly,
+ cert,
+ adminChecked,
+ setAdminChecked,
+ handleConnect,
+ callback,
+ setName,
+}: ViewProps) => {
+ const [confirmed, setConfirmed] = useState(false);
+
+ const { data, loading } = useQuery(GET_CAN_CONNECT, {
+ variables: { auth: { host, macaroon: viewOnly ?? admin ?? '', cert } },
+ onCompleted: () => setConfirmed(true),
+ onError: () => setConfirmed(false),
+ });
+
+ useEffect(() => {
+ if (!loading && data && data.getNodeInfo) {
+ setName(data.getNodeInfo.alias);
+ }
+ }, [loading, data, setName]);
+
+ const content = () => {
+ if (loading) {
+ return ;
+ }
+ if (data?.getNodeInfo.alias && viewOnly) {
+ return ;
+ }
+ return ;
+ };
+
+ const renderInfo = () => {
+ if (!loading && data && data.getNodeInfo) {
+ return (
+ <>
+
+ Alias
+ {data.getNodeInfo.alias}
+
+
+ Synced To Chain
+
+ {data.getNodeInfo.is_synced_to_chain ? 'Yes' : 'No'}
+
+
+
+ Version
+ {data.getNodeInfo.version.split(' ')[0]}
+
+
+ Active Channels
+ {data.getNodeInfo.active_channels_count}
+
+
+ Pending Channels
+ {data.getNodeInfo.pending_channels_count}
+
+
+ Closed Channels
+ {data.getNodeInfo.closed_channels_count}
+
+
+ >
+ );
+ }
+ return null;
+ };
+
+ const renderTitle = () => {
+ if (!confirmed) {
+ return 'Go Back';
+ }
+ if (adminChecked && !viewOnly && admin) {
+ return 'Connect (Admin-Only)';
+ }
+ if (!adminChecked && viewOnly) {
+ return 'Connect (View-Only)';
+ }
+ return 'Connect';
+ };
+
+ const renderText = () => (
+
+ Failed to connect to node. Please verify the information provided.
+
+ );
+
+ return (
+ <>
+ {renderInfo()}
+ {!confirmed && !loading && renderText()}
+
+ View-Only Macaroon
+ {content()}
+
+ {admin && (
+
+ )}
+ {
+ if (confirmed) {
+ handleConnect();
+ } else {
+ callback();
+ }
+ }}
+ >
+ {renderTitle()}
+
+ >
+ );
+};
diff --git a/src/components/auth/index.tsx b/src/components/auth/index.tsx
new file mode 100644
index 00000000..2844c83c
--- /dev/null
+++ b/src/components/auth/index.tsx
@@ -0,0 +1,197 @@
+import React, { useState } from 'react';
+import dynamic from 'next/dynamic';
+import { LoginForm } from './views/NormalLogin';
+import { ConnectLoginForm } from './views/ConnectLogin';
+import { BTCLoginForm } from './views/BTCLogin';
+import { ViewCheck } from './checks/ViewCheck';
+import CryptoJS from 'crypto-js';
+import { useAccount } from '../../context/AccountContext';
+import { saveUserAuth, getAccountId } from '../../utils/auth';
+import { useConnectionDispatch } from '../../context/ConnectionContext';
+import { useStatusDispatch } from '../../context/StatusContext';
+import { useRouter } from 'next/router';
+import { toast } from 'react-toastify';
+import { LoadingCard } from '../loading/LoadingCard';
+
+const PasswordInput = dynamic(() => import('./views/Password'), {
+ ssr: false,
+ loading: () => ,
+});
+
+const QRLogin = dynamic(() => import('./views/QRLogin'), {
+ ssr: false,
+ loading: () => ,
+});
+
+type AuthProps = {
+ type: string;
+ status: string;
+ callback: () => void;
+ setStatus: (state: string) => void;
+};
+
+export const Auth = ({ type, status, callback, setStatus }: AuthProps) => {
+ const { changeAccount, accounts } = useAccount();
+ const { push } = useRouter();
+
+ const dispatch = useConnectionDispatch();
+ const dispatchState = useStatusDispatch();
+
+ const [name, setName] = useState();
+ const [host, setHost] = useState();
+ const [admin, setAdmin] = useState();
+ const [viewOnly, setViewOnly] = useState();
+ const [cert, setCert] = useState();
+ const [password, setPassword] = useState();
+
+ const [adminChecked, setAdminChecked] = useState(false);
+
+ const handleSet = ({
+ host,
+ admin,
+ viewOnly,
+ cert,
+ skipCheck,
+ }: {
+ host?: string;
+ admin?: string;
+ viewOnly?: string;
+ cert?: string;
+ skipCheck?: boolean;
+ }) => {
+ const id = getAccountId(
+ host ?? '',
+ viewOnly ?? '',
+ admin ?? '',
+ cert ?? ''
+ );
+
+ const accountExists = accounts.findIndex(account => account.id === id) > -1;
+
+ if (accountExists) {
+ toast.error('Account already exists.');
+ } else if (!host) {
+ toast.error('A host url is needed to connect.');
+ } else if (!admin && !viewOnly) {
+ toast.error('View-Only or Admin macaroon are needed to connect.');
+ } else if (skipCheck) {
+ quickSave({ name, cert, admin, viewOnly, host });
+ } else {
+ host && setHost(host);
+ admin && setAdmin(admin);
+ viewOnly && setViewOnly(viewOnly);
+ cert && setCert(cert);
+
+ setStatus('confirmNode');
+ }
+ };
+
+ const quickSave = ({
+ name = 'Unknown',
+ host,
+ admin,
+ viewOnly,
+ cert,
+ }: {
+ name?: string;
+ host?: string;
+ admin?: string;
+ viewOnly?: string;
+ cert?: string;
+ }) => {
+ saveUserAuth({
+ name,
+ host: host || '',
+ admin,
+ viewOnly,
+ cert,
+ accounts,
+ });
+
+ const id = getAccountId(host, viewOnly, admin, cert);
+
+ dispatch({ type: 'disconnected' });
+ dispatchState({ type: 'disconnected' });
+ changeAccount(id);
+
+ push('/');
+ };
+
+ const handleSave = () => {
+ if (!host) {
+ toast.error('A host url is needed to connect.');
+ } else if (!admin && !viewOnly) {
+ toast.error('View-Only or Admin macaroon are needed to connect.');
+ } else {
+ const encryptedAdmin =
+ admin && password
+ ? CryptoJS.AES.encrypt(admin, password).toString()
+ : undefined;
+
+ saveUserAuth({
+ name,
+ host,
+ admin: encryptedAdmin,
+ viewOnly,
+ cert,
+ accounts,
+ });
+
+ const id = getAccountId(host, viewOnly, admin, cert);
+
+ dispatch({ type: 'disconnected' });
+ dispatchState({ type: 'disconnected' });
+ changeAccount(id);
+
+ push('/');
+ }
+ };
+
+ const handleConnect = () => {
+ if (adminChecked) {
+ setStatus('password');
+ } else {
+ handleSave();
+ }
+ };
+
+ const renderView = () => {
+ switch (type) {
+ case 'login':
+ return ;
+ case 'qrcode':
+ return ;
+ case 'connect':
+ return ;
+ default:
+ return ;
+ }
+ };
+
+ return (
+ <>
+ {status === 'none' && renderView()}
+ {status === 'confirmNode' && host && (
+
+ )}
+ {status === 'password' && (
+
+ )}
+ >
+ );
+};
diff --git a/src/components/auth/views/BTCLogin.tsx b/src/components/auth/views/BTCLogin.tsx
new file mode 100644
index 00000000..0c121f39
--- /dev/null
+++ b/src/components/auth/views/BTCLogin.tsx
@@ -0,0 +1,51 @@
+import React, { useState } from 'react';
+import { getConfigLnd } from '../../../utils/auth';
+import { toast } from 'react-toastify';
+import { Input } from '../../input/Input';
+import { Line, StyledTitle } from '../Auth.styled';
+import { RiskCheckboxAndConfirm } from './Checkboxes';
+
+interface AuthProps {
+ handleSet: ({
+ host,
+ admin,
+ viewOnly,
+ cert,
+ }: {
+ host?: string;
+ admin?: string;
+ viewOnly?: string;
+ cert?: string;
+ }) => void;
+}
+
+export const BTCLoginForm = ({ handleSet }: AuthProps) => {
+ const [json, setJson] = useState('');
+ const [checked, setChecked] = useState(false);
+
+ const handleClick = () => {
+ try {
+ JSON.parse(json);
+ const { cert, admin, viewOnly, host } = getConfigLnd(json);
+ handleSet({ host, admin, viewOnly, cert });
+ } catch (error) {
+ toast.error('Invalid JSON');
+ }
+ };
+
+ const canConnect = json !== '' && checked;
+ return (
+ <>
+
+ BTCPayServer Connect JSON:
+ setJson(e.target.value)} />
+
+
+ >
+ );
+};
diff --git a/src/components/auth/views/Checkboxes.tsx b/src/components/auth/views/Checkboxes.tsx
new file mode 100644
index 00000000..14779650
--- /dev/null
+++ b/src/components/auth/views/Checkboxes.tsx
@@ -0,0 +1,55 @@
+import React from 'react';
+import { Checkbox } from '../../checkbox/Checkbox';
+import { CheckboxText, StyledContainer, FixedWidth } from '../Auth.styled';
+import { AlertCircle } from '../../generic/Icons';
+import { fontColors } from '../../../styles/Themes';
+import { ColorButton } from '../../buttons/colorButton/ColorButton';
+
+type CheckboxProps = {
+ handleClick: () => void;
+ disabled: boolean;
+ checked: boolean;
+ onChange: (state: boolean) => void;
+};
+
+export const RiskCheckboxAndConfirm = ({
+ handleClick,
+ disabled,
+ checked,
+ onChange,
+}: CheckboxProps) => (
+ <>
+
+
+ I'm feeling reckless - I understand that Lightning, LND and ThunderHub
+ are under constant development and that there is always a risk of losing
+ funds.
+
+
+
+ Connect
+
+
+ >
+);
+
+export const WarningBox = () => {
+ return (
+
+
+
+
+
+ Macaroons are handled by the ThunderHub server to connect to your LND
+ node but are never stored. Still, this involves a certain degree of
+ trust you must be aware of.
+
+
+ );
+};
diff --git a/src/components/auth/views/ConnectLogin.tsx b/src/components/auth/views/ConnectLogin.tsx
new file mode 100644
index 00000000..5d701149
--- /dev/null
+++ b/src/components/auth/views/ConnectLogin.tsx
@@ -0,0 +1,52 @@
+import React, { useState } from 'react';
+import { getAuthLnd, getBase64CertfromDerFormat } from '../../../utils/auth';
+import { Input } from '../../input/Input';
+import { Line, StyledTitle } from '../Auth.styled';
+import { RiskCheckboxAndConfirm } from './Checkboxes';
+
+interface AuthProps {
+ handleSet: ({
+ host,
+ admin,
+ viewOnly,
+ cert,
+ }: {
+ host?: string;
+ admin?: string;
+ viewOnly?: string;
+ cert?: string;
+ }) => void;
+}
+
+export const ConnectLoginForm = ({ handleSet }: AuthProps) => {
+ const [url, setUrl] = useState('');
+ const [checked, setChecked] = useState(false);
+
+ const handleClick = () => {
+ const { cert, macaroon, socket } = getAuthLnd(url);
+ const base64Cert = getBase64CertfromDerFormat(cert) || '';
+
+ handleSet({
+ host: socket,
+ admin: macaroon,
+ cert: base64Cert,
+ });
+ };
+
+ const canConnect = url !== '' && checked;
+
+ return (
+ <>
+
+ LND Connect Url:
+ setUrl(e.target.value)} />
+
+
+ >
+ );
+};
diff --git a/src/components/auth/views/NormalLogin.tsx b/src/components/auth/views/NormalLogin.tsx
new file mode 100644
index 00000000..a618c604
--- /dev/null
+++ b/src/components/auth/views/NormalLogin.tsx
@@ -0,0 +1,97 @@
+import React, { useState } from 'react';
+import { Input } from '../../input/Input';
+import { Line, StyledTitle } from '../Auth.styled';
+import { SingleLine, Sub4Title } from '../../generic/Styled';
+import {
+ MultiButton,
+ SingleButton,
+} from '../../buttons/multiButton/MultiButton';
+import { RiskCheckboxAndConfirm } from './Checkboxes';
+
+interface AuthProps {
+ handleSet: ({
+ host,
+ admin,
+ viewOnly,
+ cert,
+ }: {
+ host?: string;
+ admin?: string;
+ viewOnly?: string;
+ cert?: string;
+ }) => void;
+}
+
+export const LoginForm = ({ handleSet }: AuthProps) => {
+ const [isViewOnly, setIsViewOnly] = useState(true);
+ const [checked, setChecked] = useState(false);
+
+ const [host, setHost] = useState('');
+ const [admin, setAdmin] = useState('');
+ const [viewOnly, setRead] = useState('');
+ const [cert, setCert] = useState('');
+
+ const handleClick = () => {
+ handleSet({ host, admin, viewOnly, cert });
+ };
+
+ const canConnect =
+ host !== '' && (admin !== '' || viewOnly !== '') && checked;
+ return (
+ <>
+
+ Type of Account:
+
+ setIsViewOnly(true)}
+ >
+ ViewOnly
+
+ setIsViewOnly(false)}
+ >
+ Admin
+
+
+
+
+ Host:
+ setHost(e.target.value)}
+ />
+
+ {!isViewOnly && (
+
+ Admin:
+ setAdmin(e.target.value)}
+ />
+
+ )}
+
+ Readonly:
+ setRead(e.target.value)}
+ />
+
+
+ Certificate:
+ setCert(e.target.value)}
+ />
+
+
+ >
+ );
+};
diff --git a/src/components/auth/views/Password.tsx b/src/components/auth/views/Password.tsx
new file mode 100644
index 00000000..78765def
--- /dev/null
+++ b/src/components/auth/views/Password.tsx
@@ -0,0 +1,49 @@
+import React from 'react';
+import { Sub4Title, SubTitle } from '../../generic/Styled';
+import zxcvbn from 'zxcvbn';
+import { ColorButton } from '../../buttons/colorButton/ColorButton';
+import { Input } from '../../input/Input';
+import { Line } from '../Auth.styled';
+import { LoadingBar } from '../../loadingBar/LoadingBar';
+
+interface PasswordProps {
+ isPass?: string;
+ setPass: (pass: string) => void;
+ callback: () => void;
+ loading: boolean;
+}
+
+const PasswordInput = ({
+ isPass = '',
+ setPass,
+ callback,
+ loading = false,
+}: PasswordProps) => {
+ const strength = (100 * Math.min(zxcvbn(isPass).guesses_log10, 40)) / 40;
+ const needed = process.env.NODE_ENV === 'development' ? 1 : 20;
+ return (
+ <>
+ Please Input a Password
+
+ Password:
+ setPass(e.target.value)} />
+
+
+ Strength:
+
+
+
+ Connect
+
+ >
+ );
+};
+
+export default PasswordInput;
diff --git a/src/components/auth/views/QRLogin.tsx b/src/components/auth/views/QRLogin.tsx
new file mode 100644
index 00000000..dc6baa03
--- /dev/null
+++ b/src/components/auth/views/QRLogin.tsx
@@ -0,0 +1,154 @@
+import React, { useState, useEffect } from 'react';
+import QrReader from 'react-qr-reader';
+import Modal from '../../modal/ReactModal';
+import { toast } from 'react-toastify';
+import { getQRConfig } from '../../../utils/auth';
+import { Line, QRTextWrapper } from '../Auth.styled';
+import sortBy from 'lodash.sortby';
+import { LoadingBar } from '../../loadingBar/LoadingBar';
+import { SubTitle } from '../../generic/Styled';
+import { ColorButton } from '../../buttons/colorButton/ColorButton';
+
+type QRLoginProps = {
+ handleSet: ({
+ name,
+ host,
+ admin,
+ viewOnly,
+ cert,
+ skipCheck,
+ }: {
+ name?: string;
+ host?: string;
+ admin?: string;
+ viewOnly?: string;
+ cert?: string;
+ skipCheck?: boolean;
+ }) => void;
+};
+
+const QRLogin = ({ handleSet }: QRLoginProps) => {
+ const [qrData, setQrData] = useState([]);
+ const [modalOpen, setModalOpen] = useState(true);
+ const [modalClosed, setModalClosed] = useState('none');
+
+ const [total, setTotal] = useState(0);
+ const [missing, setMissing] = useState();
+
+ useEffect(() => {
+ if (qrData.length >= total && total !== 0) {
+ setModalOpen(false);
+
+ const sorted = sortBy(qrData, 'index');
+ const strings = sorted.map((code: { auth: string }) => code.auth);
+ const completeString = strings.join('');
+
+ try {
+ const { name, cert, admin, viewOnly, host } = getQRConfig(
+ completeString
+ );
+
+ handleSet({
+ name,
+ host,
+ admin,
+ viewOnly,
+ cert,
+ skipCheck: true,
+ });
+ } catch (error) {
+ toast.error('Error reading QR codes.');
+ }
+ }
+ }, [qrData, handleSet, total]);
+
+ const handleScan = (data: string | null) => {
+ if (data) {
+ try {
+ const parsed = JSON.parse(data);
+ !total && setTotal(parsed.total);
+ !missing && setMissing([...Array(parsed.total).keys()]);
+
+ if (missing && missing.length >= 0 && missing.includes(parsed.index)) {
+ const remaining = missing.filter((value: number) => {
+ const currentNumber = Number(parsed.index);
+ return value !== currentNumber;
+ });
+ const data = [...qrData, parsed];
+ setQrData(data);
+ setMissing(remaining);
+ }
+ } catch (error) {
+ setModalOpen(false);
+ toast.error('Error reading QR codes.');
+ }
+ }
+ };
+
+ const handleError = () => {
+ setModalOpen(false);
+ setModalClosed('error');
+ };
+
+ const handleClose = () => {
+ setModalClosed('forced');
+ setModalOpen(false);
+ setMissing(undefined);
+ setTotal(0);
+ setQrData([]);
+ };
+
+ const renderInfo = () => {
+ switch (modalClosed) {
+ case 'forced':
+ return (
+ <>
+
+ No information read from QR Codes.
+
+ {
+ setModalClosed('none');
+ setModalOpen(true);
+ }}
+ >
+ Try Again
+
+ >
+ );
+ case 'error':
+ return (
+
+
+ Make sure you have a camara available and that you have given
+ ThunderHub the correct permissions to use it.
+
+
+ );
+ default:
+ return null;
+ }
+ };
+
+ return (
+ <>
+ {renderInfo()}
+
+
+
+
+
+
+ >
+ );
+};
+
+export default QRLogin;
diff --git a/src/components/bitcoinInfo/BitcoinFees.ts b/src/components/bitcoinInfo/BitcoinFees.ts
new file mode 100644
index 00000000..a034d2ed
--- /dev/null
+++ b/src/components/bitcoinInfo/BitcoinFees.ts
@@ -0,0 +1,27 @@
+import { useEffect } from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import { GET_BITCOIN_FEES } from '../../graphql/query';
+import { useBitcoinDispatch } from '../../context/BitcoinContext';
+
+export const BitcoinFees = () => {
+ const setInfo = useBitcoinDispatch();
+ const { loading, data, stopPolling } = useQuery(GET_BITCOIN_FEES, {
+ onError: () => {
+ setInfo({ type: 'error' });
+ stopPolling();
+ },
+ pollInterval: 60000,
+ });
+
+ useEffect(() => {
+ if (!loading && data && data.getBitcoinFees) {
+ const { fast, halfHour, hour } = data.getBitcoinFees;
+ setInfo({
+ type: 'fetched',
+ state: { loading: false, error: false, fast, halfHour, hour },
+ });
+ }
+ }, [data, loading, setInfo]);
+
+ return null;
+};
diff --git a/src/components/bitcoinInfo/BitcoinPrice.ts b/src/components/bitcoinInfo/BitcoinPrice.ts
new file mode 100644
index 00000000..a1c4bba9
--- /dev/null
+++ b/src/components/bitcoinInfo/BitcoinPrice.ts
@@ -0,0 +1,29 @@
+import { useEffect } from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import { GET_BITCOIN_PRICE } from '../../graphql/query';
+import { usePriceDispatch } from '../../context/PriceContext';
+
+export const BitcoinPrice = () => {
+ const setPrices = usePriceDispatch();
+ const { loading, data, stopPolling } = useQuery(GET_BITCOIN_PRICE, {
+ onError: () => setPrices({ type: 'error' }),
+ pollInterval: 60000,
+ });
+
+ useEffect(() => {
+ if (!loading && data && data.getBitcoinPrice) {
+ try {
+ const prices = JSON.parse(data.getBitcoinPrice);
+ setPrices({
+ type: 'fetched',
+ state: { loading: false, error: false, prices },
+ });
+ } catch (error) {
+ stopPolling();
+ setPrices({ type: 'error' });
+ }
+ }
+ }, [data, loading, setPrices, stopPolling]);
+
+ return null;
+};
diff --git a/src/components/burgerMenu/BurgerMenu.tsx b/src/components/burgerMenu/BurgerMenu.tsx
new file mode 100644
index 00000000..68f6a90b
--- /dev/null
+++ b/src/components/burgerMenu/BurgerMenu.tsx
@@ -0,0 +1,32 @@
+import React from 'react';
+import styled, { css } from 'styled-components';
+import { burgerColor } from '../../styles/Themes';
+import { NodeInfo } from '../../layouts/navigation/nodeInfo/NodeInfo';
+import { SideSettings } from '../../layouts/navigation/sideSettings/SideSettings';
+import { Navigation } from '../../layouts/navigation/Navigation';
+
+const StyledBurger = styled.div`
+ padding: 16px 16px 0;
+ background-color: ${burgerColor};
+ box-shadow: 0 8px 16px -8px rgba(0, 0, 0, 0.1);
+ ${({ open }: { open: boolean }) =>
+ open &&
+ css`
+ margin-bottom: 16px;
+ `}
+`;
+
+interface BurgerProps {
+ open: boolean;
+ setOpen: (state: boolean) => void;
+}
+
+export const BurgerMenu = ({ open, setOpen }: BurgerProps) => {
+ return (
+
+
+
+
+
+ );
+};
diff --git a/src/components/buttons/colorButton/ColorButton.stories.tsx b/src/components/buttons/colorButton/ColorButton.stories.tsx
new file mode 100644
index 00000000..5aa67e59
--- /dev/null
+++ b/src/components/buttons/colorButton/ColorButton.stories.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import { action } from '@storybook/addon-actions';
+import { ColorButton } from './ColorButton';
+import { text, boolean, color } from '@storybook/addon-knobs';
+
+export default {
+ title: 'Color Button',
+};
+
+export const Default = () => {
+ const withColor = boolean('With Color', false);
+
+ const buttonColor = withColor ? { color: color('Color', 'yellow') } : {};
+
+ return (
+
+ {text('Text', 'Button')}
+
+ );
+};
diff --git a/src/components/buttons/colorButton/ColorButton.tsx b/src/components/buttons/colorButton/ColorButton.tsx
new file mode 100644
index 00000000..6de1d2aa
--- /dev/null
+++ b/src/components/buttons/colorButton/ColorButton.tsx
@@ -0,0 +1,157 @@
+import React from 'react';
+import styled, { css } from 'styled-components';
+import {
+ textColor,
+ colorButtonBackground,
+ disabledButtonBackground,
+ disabledButtonBorder,
+ disabledTextColor,
+ colorButtonBorder,
+ colorButtonBorderTwo,
+ hoverTextColor,
+ themeColors,
+} from '../../../styles/Themes';
+import { ChevronRight } from '../../generic/Icons';
+import ScaleLoader from 'react-spinners/ScaleLoader';
+
+interface GeneralProps {
+ fullWidth?: boolean;
+ buttonWidth?: string;
+ withMargin?: string;
+}
+
+const GeneralButton = styled.button`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+ outline: none;
+ padding: 8px 16px;
+ text-decoration: none;
+ border-radius: 4px;
+ white-space: nowrap;
+ font-size: 14px;
+ box-sizing: border-box;
+ margin: ${({ withMargin }) => (withMargin ? withMargin : '0')};
+ width: ${({ fullWidth, buttonWidth }: GeneralProps) =>
+ fullWidth ? '100%' : buttonWidth ? buttonWidth : 'auto'};
+`;
+
+const StyledArrow = styled.div`
+ margin: 0 -8px -5px 4px;
+`;
+
+interface BorderProps {
+ borderColor?: string;
+ selected?: boolean;
+ withBorder?: boolean;
+}
+
+const BorderButton = styled(GeneralButton)`
+ ${({ selected }) => selected && 'cursor: default'};
+ ${({ selected }) => selected && 'font-weight: 900'};
+ background-color: ${colorButtonBackground};
+ color: ${textColor};
+ border: 1px solid
+ ${({ borderColor, selected, withBorder }: BorderProps) =>
+ withBorder
+ ? borderColor
+ ? borderColor
+ : colorButtonBorder
+ : selected
+ ? colorButtonBorder
+ : colorButtonBorderTwo};
+
+ &:hover {
+ ${({ borderColor, selected }: BorderProps) =>
+ !selected
+ ? css`
+ border: 1px solid ${colorButtonBackground};
+ background-color: ${borderColor ? borderColor : colorButtonBorder};
+ color: ${hoverTextColor};
+ `
+ : ''};
+ }
+`;
+
+const DisabledButton = styled(GeneralButton)`
+ border: none;
+ background-color: ${disabledButtonBackground};
+ color: ${disabledTextColor};
+ border: 1px solid ${disabledButtonBorder};
+ cursor: default;
+`;
+
+const renderArrow = () => (
+
+
+
+);
+
+export interface ColorButtonProps {
+ loading?: boolean;
+ color?: string;
+ disabled?: boolean;
+ children?: any;
+ selected?: boolean;
+ arrow?: boolean;
+ onClick?: any;
+ withMargin?: string;
+ withBorder?: boolean;
+ fullWidth?: boolean;
+ width?: string;
+}
+
+export const ColorButton = ({
+ loading,
+ color,
+ disabled,
+ children,
+ selected,
+ arrow,
+ withMargin,
+ withBorder,
+ fullWidth,
+ width,
+ onClick,
+}: ColorButtonProps) => {
+ if (disabled && !loading) {
+ return (
+
+ {children}
+ {arrow && renderArrow()}
+
+ );
+ }
+
+ if (loading) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+ {children}
+ {arrow && renderArrow()}
+
+ );
+};
diff --git a/src/components/buttons/multiButton/MultiButton.stories.tsx b/src/components/buttons/multiButton/MultiButton.stories.tsx
new file mode 100644
index 00000000..93b0c9cc
--- /dev/null
+++ b/src/components/buttons/multiButton/MultiButton.stories.tsx
@@ -0,0 +1,51 @@
+import React, { useState } from 'react';
+import { boolean, color } from '@storybook/addon-knobs';
+import { MultiButton, SingleButton } from './MultiButton';
+import { action } from '@storybook/addon-actions';
+
+export default {
+ title: 'Multi Button',
+};
+
+export const Default = () => {
+ const withColor = boolean('With Color', false);
+
+ const buttonColor = withColor ? { color: color('Color', 'yellow') } : {};
+
+ const [selected, setSelected] = useState(0);
+
+ return (
+
+ {
+ action('Button 1 clicked')();
+ setSelected(0);
+ }}
+ >
+ Button 1
+
+ {
+ action('Button 2 clicked')();
+ setSelected(1);
+ }}
+ >
+ Button 2
+
+ {
+ action('Button 3 clicked')();
+ setSelected(2);
+ }}
+ >
+ Button 3
+
+
+ );
+};
diff --git a/src/components/buttons/multiButton/MultiButton.tsx b/src/components/buttons/multiButton/MultiButton.tsx
new file mode 100644
index 00000000..d33a2666
--- /dev/null
+++ b/src/components/buttons/multiButton/MultiButton.tsx
@@ -0,0 +1,83 @@
+import React from 'react';
+import styled, { css } from 'styled-components';
+import {
+ multiSelectColor,
+ colorButtonBorder,
+ multiButtonColor,
+} from '../../../styles/Themes';
+
+interface StyledSingleProps {
+ selected?: boolean;
+ buttonColor?: string;
+}
+
+const StyledSingleButton = styled.button`
+ border-radius: 4px;
+ cursor: pointer;
+ outline: none;
+ border: none;
+ text-decoration: none;
+ padding: 8px 16px;
+ background-color: transparent;
+ color: ${multiSelectColor};
+ flex-grow: 1;
+
+ ${({ selected, buttonColor }: StyledSingleProps) =>
+ selected
+ ? css`
+ color: white;
+ background-color: ${buttonColor ? buttonColor : colorButtonBorder};
+ `
+ : ''};
+`;
+
+interface SingleButtonProps {
+ children: any;
+ selected?: boolean;
+ color?: string;
+ onClick?: () => void;
+}
+
+export const SingleButton = ({
+ children,
+ selected,
+ color,
+ onClick,
+}: SingleButtonProps) => {
+ return (
+ {
+ onClick && onClick();
+ }}
+ >
+ {children}
+
+ );
+};
+
+interface MultiBackProps {
+ margin?: string;
+}
+
+const MultiBackground = styled.div`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-radius: 4px;
+ padding: 4px;
+ background: ${multiButtonColor};
+ flex-wrap: wrap;
+
+ ${({ margin }: MultiBackProps) => margin && `margin: ${margin}`}
+`;
+
+interface MultiButtonProps {
+ children: any;
+ margin?: string;
+}
+
+export const MultiButton = ({ children, margin }: MultiButtonProps) => {
+ return {children} ;
+};
diff --git a/src/components/buttons/secureButton/LoginModal.tsx b/src/components/buttons/secureButton/LoginModal.tsx
new file mode 100644
index 00000000..0fad6b3d
--- /dev/null
+++ b/src/components/buttons/secureButton/LoginModal.tsx
@@ -0,0 +1,111 @@
+import React, { useState } from 'react';
+import CryptoJS from 'crypto-js';
+import { toast } from 'react-toastify';
+import {
+ Sub4Title,
+ NoWrapTitle,
+ SubTitle,
+ ResponsiveLine,
+} from '../../generic/Styled';
+import { Circle, ChevronRight } from '../../generic/Icons';
+import styled from 'styled-components';
+import { useAccount } from '../../../context/AccountContext';
+import { saveSessionAuth } from '../../../utils/auth';
+import { useSettings } from '../../../context/SettingsContext';
+import { textColorMap, mediaDimensions } from '../../../styles/Themes';
+import { ColorButton } from '../colorButton/ColorButton';
+import { Input } from '../../input/Input';
+import { useSize } from '../../../hooks/UseSize';
+
+const RadioText = styled.div`
+ margin-left: 10px;
+`;
+
+const ButtonRow = styled.div`
+ width: auto;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+`;
+
+interface LoginProps {
+ macaroon: string;
+ color?: string;
+ callback: any;
+ variables: {};
+ setModalOpen: (value: boolean) => void;
+}
+
+export const LoginModal = ({
+ macaroon,
+ color,
+ setModalOpen,
+ callback,
+ variables,
+}: LoginProps) => {
+ const { width } = useSize();
+ const { theme } = useSettings();
+
+ const [pass, setPass] = useState('');
+ const [storeSession, setStoreSession] = useState(false);
+ const { host, cert, refreshAccount } = useAccount();
+
+ const handleClick = () => {
+ try {
+ const bytes = CryptoJS.AES.decrypt(macaroon, pass);
+ const decrypted = bytes.toString(CryptoJS.enc.Utf8);
+
+ if (storeSession) {
+ saveSessionAuth(decrypted);
+ refreshAccount();
+ }
+ const auth = { host, macaroon: decrypted, cert };
+ callback({ variables: { ...variables, auth } });
+ setModalOpen(false);
+ } catch (error) {
+ toast.error('Wrong Password');
+ }
+ };
+
+ const renderButton = (
+ onClick: () => void,
+ text: string,
+ selected: boolean
+ ) => (
+
+
+ {text}
+
+ );
+
+ return (
+ <>
+ Unlock your Account
+
+ Password:
+ setPass(e.target.value)}
+ />
+
+
+ Don't ask me again this session:
+
+ {renderButton(() => setStoreSession(true), 'Yes', storeSession)}
+ {renderButton(() => setStoreSession(false), 'No', !storeSession)}
+
+
+
+ Unlock
+
+
+ >
+ );
+};
diff --git a/src/components/buttons/secureButton/SecureButton.tsx b/src/components/buttons/secureButton/SecureButton.tsx
new file mode 100644
index 00000000..f5bc6558
--- /dev/null
+++ b/src/components/buttons/secureButton/SecureButton.tsx
@@ -0,0 +1,62 @@
+import React, { useState } from 'react';
+import Modal from '../../modal/ReactModal';
+import { LoginModal } from './LoginModal';
+import { useAccount } from '../../../context/AccountContext';
+import { ColorButton, ColorButtonProps } from '../colorButton/ColorButton';
+
+interface SecureButtonProps extends ColorButtonProps {
+ callback: any;
+ disabled: boolean;
+ children: any;
+ variables: {};
+ color?: string;
+ withMargin?: string;
+ arrow?: boolean;
+}
+
+export const SecureButton = ({
+ callback,
+ color,
+ disabled,
+ children,
+ variables,
+ ...props
+}: SecureButtonProps) => {
+ const [modalOpen, setModalOpen] = useState(false);
+
+ const { host, cert, admin, sessionAdmin } = useAccount();
+
+ if (!admin && !sessionAdmin) {
+ return null;
+ }
+
+ const auth = { host, macaroon: sessionAdmin, cert };
+
+ const handleClick = () => setModalOpen(true);
+
+ const onClick = sessionAdmin
+ ? () => callback({ variables: { ...variables, auth } })
+ : handleClick;
+
+ return (
+ <>
+
+ {children}
+
+ setModalOpen(false)}>
+
+
+ >
+ );
+};
diff --git a/src/components/checkbox/Checkbox.stories.tsx b/src/components/checkbox/Checkbox.stories.tsx
new file mode 100644
index 00000000..d2208a29
--- /dev/null
+++ b/src/components/checkbox/Checkbox.stories.tsx
@@ -0,0 +1,16 @@
+import React, { useState } from 'react';
+import { Checkbox } from './Checkbox';
+
+export default {
+ title: 'Checkbox',
+};
+
+export const Default = () => {
+ const [checked, set] = useState(false);
+
+ return (
+
+ This is a checkbox
+
+ );
+};
diff --git a/src/components/checkbox/Checkbox.tsx b/src/components/checkbox/Checkbox.tsx
new file mode 100644
index 00000000..73f5589f
--- /dev/null
+++ b/src/components/checkbox/Checkbox.tsx
@@ -0,0 +1,58 @@
+import React from 'react';
+import styled from 'styled-components';
+import {
+ colorButtonBackground,
+ buttonBorderColor,
+ themeColors,
+} from '../../styles/Themes';
+
+const StyledContainer = styled.div`
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+ padding-right: 32px;
+ cursor: pointer;
+`;
+
+const FixedWidth = styled.div`
+ height: 18px;
+ width: 18px;
+ margin: 0px;
+ margin-right: 8px;
+`;
+
+const StyledCheckbox = styled.div`
+ height: 16px;
+ width: 16px;
+ margin: 0;
+ border: 1px solid ${buttonBorderColor};
+ border-radius: 4px;
+ outline: none;
+ transition-duration: 0.3s;
+ background-color: ${colorButtonBackground};
+ box-sizing: border-box;
+ border-radius: 50%;
+
+ ${({ checked }: { checked: boolean }) =>
+ checked && `background-color: ${themeColors.blue2}`}
+`;
+
+type CheckboxProps = {
+ checked: boolean;
+ onChange: (state: boolean) => void;
+};
+
+export const Checkbox: React.FC = ({
+ children,
+ checked,
+ onChange,
+}) => {
+ return (
+ onChange(!checked)}>
+
+
+
+ {children}
+
+ );
+};
diff --git a/src/components/connectionCheck/ConnectionCheck.tsx b/src/components/connectionCheck/ConnectionCheck.tsx
new file mode 100644
index 00000000..c2503a50
--- /dev/null
+++ b/src/components/connectionCheck/ConnectionCheck.tsx
@@ -0,0 +1,42 @@
+import { useEffect } from 'react';
+import {
+ useConnectionState,
+ useConnectionDispatch,
+} from '../../context/ConnectionContext';
+import { useQuery } from '@apollo/react-hooks';
+import { useAccount } from '../../context/AccountContext';
+import { GET_CAN_CONNECT } from '../../graphql/query';
+import { useRouter } from 'next/router';
+
+export const ConnectionCheck = () => {
+ const { push } = useRouter();
+ const { connected } = useConnectionState();
+ const dispatch = useConnectionDispatch();
+
+ const { loggedIn, host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ // useEffect(() => {
+ // !loggedIn && push('/');
+ // }, [loggedIn]);
+
+ const { data, loading } = useQuery(GET_CAN_CONNECT, {
+ variables: { auth },
+ skip: connected || !loggedIn,
+ onError: () => {
+ dispatch({ type: 'error' });
+ },
+ });
+
+ useEffect(() => {
+ if (!loading && data && data.getNodeInfo) {
+ dispatch({ type: 'connected' });
+ }
+ }, [data, loading, dispatch]);
+
+ return null;
+};
diff --git a/src/components/emoji/Emoji.tsx b/src/components/emoji/Emoji.tsx
new file mode 100644
index 00000000..507cc465
--- /dev/null
+++ b/src/components/emoji/Emoji.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+
+interface EmojiProps {
+ symbol: string;
+ label?: string;
+}
+
+export const Emoji = ({ label, symbol }: EmojiProps) => (
+
+ {symbol}
+
+);
diff --git a/src/components/generic/CardGeneric.tsx b/src/components/generic/CardGeneric.tsx
new file mode 100644
index 00000000..7b90ba38
--- /dev/null
+++ b/src/components/generic/CardGeneric.tsx
@@ -0,0 +1,101 @@
+import styled from 'styled-components';
+import {
+ progressBackground,
+ progressFirst,
+ progressSecond,
+ mediaWidths,
+ cardColor,
+ cardBorderColor,
+} from '../../styles/Themes';
+
+export const Progress = styled.div`
+ margin: 5px;
+ background: ${progressBackground};
+`;
+
+interface ProgressBar {
+ percent: number;
+ order?: number;
+}
+
+export const ProgressBar = styled.div`
+ height: 10px;
+ background-image: linear-gradient(
+ to bottom,
+ rgba(255, 255, 255, 0.3),
+ rgba(0, 0, 0, 0.05)
+ );
+ background-color: ${({ order }: ProgressBar) =>
+ order === 2 ? progressFirst : progressSecond};
+ width: ${({ percent }: ProgressBar) => `${percent}%`};
+`;
+
+export const NodeTitle = styled.div`
+ font-size: 16px;
+ font-weight: bold;
+ width: 240px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+
+ @media (${mediaWidths.mobile}) {
+ width: unset;
+ margin-bottom: 8px;
+ }
+`;
+
+export const StatusLine = styled.div`
+ width: 100%;
+ position: relative;
+ right: -8px;
+ top: -8px;
+ display: flex;
+ justify-content: flex-end;
+ margin: 0 0 -8px 0;
+`;
+
+export const MainInfo = styled.div`
+ cursor: pointer;
+`;
+
+export const StatusDot = styled.div`
+ margin: 0 2px;
+ height: 8px;
+ width: 8px;
+ border-radius: 100%;
+ background-color: ${({ color }: { color: string }) => color};
+`;
+
+export const DetailLine = styled.div`
+ margin: 4px 0;
+ font-size: 14px;
+ word-wrap: break-word;
+ display: flex;
+ justify-content: space-between;
+
+ @media (${mediaWidths.mobile}) {
+ flex-wrap: wrap;
+ }
+`;
+
+export interface CardProps {
+ bottom?: string;
+ cardPadding?: string;
+}
+
+export const Card = styled.div`
+ padding: ${({ cardPadding }: CardProps) => cardPadding ?? '16px'};
+ background: ${cardColor};
+ box-shadow: 0 8px 16px -8px rgba(0, 0, 0, 0.1);
+ border-radius: 4px;
+ border: 1px solid ${cardBorderColor};
+ margin-bottom: ${({ bottom }: CardProps) => (bottom ? bottom : '25px')};
+ width: 100%;
+`;
+
+export const ColLine = styled.div`
+ display: flex;
+ flex-direction: column;
+ flex-basis: 30%;
+ width: 100%;
+`;
diff --git a/src/components/generic/Helpers.tsx b/src/components/generic/Helpers.tsx
new file mode 100644
index 00000000..ff10255a
--- /dev/null
+++ b/src/components/generic/Helpers.tsx
@@ -0,0 +1,71 @@
+import React from 'react';
+import { SmallLink, DarkSubTitle, OverflowText, SingleLine } from './Styled';
+import { StatusDot, DetailLine } from './CardGeneric';
+import { format, formatDistanceStrict } from 'date-fns';
+import { XSvg } from './Icons';
+
+export const getTransactionLink = (transaction: string) => {
+ const link = `https://www.blockchain.com/btc/tx/${transaction}`;
+ return (
+
+ {transaction}
+
+ );
+};
+
+export const getNodeLink = (publicKey: string) => {
+ const link = `https://1ml.com/node/${publicKey}`;
+ return (
+
+ {publicKey}
+
+ );
+};
+
+export const getDateDif = (date: string) => {
+ return formatDistanceStrict(new Date(date), new Date());
+};
+
+export const getFormatDate = (date: string) => {
+ return format(new Date(date), 'dd-MM-yyyy - HH:mm:ss');
+};
+
+export const getTooltipType = (theme: string) => {
+ return theme === 'dark' ? 'light' : undefined;
+};
+
+export const getStatusDot = (status: boolean, type: string) => {
+ if (type === 'active') {
+ return status ? (
+
+ ) : (
+
+ );
+ }
+ if (type === 'opening') {
+ return status ? : null;
+ }
+ return status ? : null;
+};
+
+export const renderLine = (
+ title: string,
+ content: any,
+ key?: string | number,
+ deleteCallback?: () => void
+) => {
+ if (!content) return null;
+ return (
+
+ {title}
+
+ {content}
+ {deleteCallback && (
+
+
+
+ )}
+
+
+ );
+};
diff --git a/src/components/generic/Icons.ts b/src/components/generic/Icons.ts
new file mode 100644
index 00000000..d0895aaa
--- /dev/null
+++ b/src/components/generic/Icons.ts
@@ -0,0 +1,124 @@
+import { FunctionComponent } from 'react';
+import styled, { css } from 'styled-components';
+import UpIcon from '../../assets/icons/arrow-up.svg';
+import DownIcon from '../../assets/icons/arrow-down.svg';
+import ZapIcon from '../../assets/icons/zap.svg';
+import ZapOffIcon from '../../assets/icons/zap-off.svg';
+import HelpIcon from '../../assets/icons/help-circle.svg';
+import SunIcon from '../../assets/icons/sun.svg';
+import MoonIcon from '../../assets/icons/moon.svg';
+import EyeIcon from '../../assets/icons/eye.svg';
+import EyeOffIcon from '../../assets/icons/eye-off.svg';
+import ChevronsUpIcon from '../../assets/icons/chevrons-up.svg';
+import ChevronsDownIcon from '../../assets/icons/chevrons-down.svg';
+import ChevronLeftIcon from '../../assets/icons/chevron-left.svg';
+import ChevronRightIcon from '../../assets/icons/chevron-right.svg';
+import ChevronUpIcon from '../../assets/icons/chevron-up.svg';
+import ChevronDownIcon from '../../assets/icons/chevron-down.svg';
+import HomeIcon from '../../assets/icons/home.svg';
+import CpuIcon from '../../assets/icons/cpu.svg';
+import SendIcon from '../../assets/icons/send.svg';
+import ServerIcon from '../../assets/icons/server.svg';
+import SettingsIcon from '../../assets/icons/settings.svg';
+import EditIcon from '../../assets/icons/edit.svg';
+import MoreVerticalIcon from '../../assets/icons/more-vertical.svg';
+import AnchorIcon from '../../assets/icons/anchor.svg';
+import PocketIcon from '../../assets/icons/pocket.svg';
+import GlobeIcon from '../../assets/icons/globe.svg';
+import XIcon from '../../assets/icons/x.svg';
+import LayersIcon from '../../assets/icons/layers.svg';
+import LoaderIcon from '../../assets/icons/loader.svg';
+import CircleIcon from '../../assets/icons/circle.svg';
+import AlertTriangleIcon from '../../assets/icons/alert-triangle.svg';
+import AlertCircleIcon from '../../assets/icons/alert-circle.svg';
+import GitCommitIcon from '../../assets/icons/git-commit.svg';
+import GitBranchIcon from '../../assets/icons/git-branch.svg';
+import RadioIcon from '../../assets/icons/radio.svg';
+import CopyIcon from '../../assets/icons/copy.svg';
+import ShieldIcon from '../../assets/icons/shield.svg';
+import CrosshairIcon from '../../assets/icons/crosshair.svg';
+import KeyIcon from '../../assets/icons/key.svg';
+import SlidersIcon from '../../assets/icons/sliders.svg';
+import UsersIcon from '../../assets/icons/users.svg';
+import GitPullRequestIcon from '../../assets/icons/git-pull-request.svg';
+import Link from '../../assets/icons/link.svg';
+import Menu from '../../assets/icons/menu.svg';
+import Mail from '../../assets/icons/mail.svg';
+import Github from '../../assets/icons/github.svg';
+import Repeat from '../../assets/icons/repeat.svg';
+import CheckIcon from '../../assets/icons/check.svg';
+import StarIcon from '../../assets/icons/star.svg';
+import HalfStarIcon from '../../assets/icons/half-star.svg';
+import CreditCardIcon from '../../assets/icons/credit-card.svg';
+
+export interface IconProps {
+ color?: string;
+ size?: string;
+ fillcolor?: string;
+ strokeWidth?: string;
+}
+
+const GenericStyles = css`
+ height: ${({ size }: IconProps) => (size ? size : '18px')};
+ width: ${({ size }: IconProps) => (size ? size : '18px')};
+ color: ${({ color }: IconProps) => (color ? color : '')};
+ fill: ${({ fillcolor }: IconProps) => (fillcolor ? fillcolor : '')};
+ stroke-width: ${({ strokeWidth }: IconProps) =>
+ strokeWidth ? strokeWidth : '2px'};
+`;
+
+const styleIcon = (icon: FunctionComponent) =>
+ styled(icon)`
+ ${GenericStyles}
+ `;
+
+export const QuestionIcon = styleIcon(HelpIcon);
+export const Zap = styleIcon(ZapIcon);
+export const ZapOff = styleIcon(ZapOffIcon);
+export const Anchor = styleIcon(AnchorIcon);
+export const Pocket = styleIcon(PocketIcon);
+export const Globe = styleIcon(GlobeIcon);
+export const UpArrow = styleIcon(UpIcon);
+export const DownArrow = styleIcon(DownIcon);
+export const Sun = styleIcon(SunIcon);
+export const Moon = styleIcon(MoonIcon);
+export const Eye = styleIcon(EyeIcon);
+export const EyeOff = styleIcon(EyeOffIcon);
+export const ChevronsDown = styleIcon(ChevronsDownIcon);
+export const ChevronsUp = styleIcon(ChevronsUpIcon);
+export const ChevronLeft = styleIcon(ChevronLeftIcon);
+export const ChevronRight = styleIcon(ChevronRightIcon);
+export const ChevronUp = styleIcon(ChevronUpIcon);
+export const ChevronDown = styleIcon(ChevronDownIcon);
+export const Home = styleIcon(HomeIcon);
+export const Cpu = styleIcon(CpuIcon);
+export const Send = styleIcon(SendIcon);
+export const Server = styleIcon(ServerIcon);
+export const Settings = styleIcon(SettingsIcon);
+export const Edit = styleIcon(EditIcon);
+export const MoreVertical = styleIcon(MoreVerticalIcon);
+export const XSvg = styleIcon(XIcon);
+export const Layers = styleIcon(LayersIcon);
+export const Loader = styleIcon(LoaderIcon);
+export const Circle = styleIcon(CircleIcon);
+export const AlertTriangle = styleIcon(AlertTriangleIcon);
+export const AlertCircle = styleIcon(AlertCircleIcon);
+export const GitCommit = styleIcon(GitCommitIcon);
+export const GitBranch = styleIcon(GitBranchIcon);
+export const Radio = styleIcon(RadioIcon);
+export const Copy = styleIcon(CopyIcon);
+export const Shield = styleIcon(ShieldIcon);
+export const Crosshair = styleIcon(CrosshairIcon);
+export const Key = styleIcon(KeyIcon);
+export const Sliders = styleIcon(SlidersIcon);
+export const Users = styleIcon(UsersIcon);
+export const GitPullRequest = styleIcon(GitPullRequestIcon);
+export const LinkIcon = styleIcon(Link);
+export const MenuIcon = styleIcon(Menu);
+export const MailIcon = styleIcon(Mail);
+export const GithubIcon = styleIcon(Github);
+export const RepeatIcon = styleIcon(Repeat);
+export const Check = styleIcon(CheckIcon);
+export const Star = styleIcon(StarIcon);
+export const HalfStar = styleIcon(HalfStarIcon);
+export const CreditCard = styleIcon(CreditCardIcon);
diff --git a/src/components/generic/Styled.tsx b/src/components/generic/Styled.tsx
new file mode 100644
index 00000000..11e5cb33
--- /dev/null
+++ b/src/components/generic/Styled.tsx
@@ -0,0 +1,225 @@
+import styled, { css } from 'styled-components';
+import {
+ cardColor,
+ cardBorderColor,
+ subCardColor,
+ smallLinkColor,
+ unSelectedNavButton,
+ textColor,
+ buttonBorderColor,
+ chartLinkColor,
+ inverseTextColor,
+ separationColor,
+ mediaWidths,
+} from '../../styles/Themes';
+import { ThemeSet } from 'styled-theming';
+
+export const CardWithTitle = styled.div`
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+`;
+
+export const CardTitle = styled.div`
+ display: flex;
+ justify-content: space-between;
+`;
+
+export interface CardProps {
+ bottom?: string;
+ cardPadding?: string;
+}
+
+export const Card = styled.div`
+ padding: ${({ cardPadding }: CardProps) => cardPadding ?? '16px'};
+ background: ${cardColor};
+ box-shadow: 0 8px 16px -8px rgba(0, 0, 0, 0.1);
+ border-radius: 4px;
+ border: 1px solid ${cardBorderColor};
+ margin-bottom: ${({ bottom }: CardProps) => (bottom ? bottom : '25px')};
+ width: 100%;
+`;
+
+interface SeparationProps {
+ height?: number;
+ lineColor?: string | ThemeSet;
+}
+
+export const Separation = styled.div`
+ height: ${({ height }: SeparationProps) => (height ? height : '1')}px;
+ background-color: ${({ lineColor }: SeparationProps) =>
+ lineColor ?? separationColor};
+ width: 100%;
+ margin: 16px 0;
+`;
+
+interface SubCardProps {
+ color?: string;
+ padding?: string;
+ withMargin?: string;
+}
+
+export const SubCard = styled.div`
+ margin: ${({ withMargin }) => (withMargin ? withMargin : '0 0 10px 0')};
+ padding: ${({ padding }) => (padding ? padding : '16px')};
+ background: ${subCardColor};
+ border: 1px solid ${cardBorderColor};
+ border-left: ${({ color }: SubCardProps) =>
+ color ? `2px solid ${color}` : ''};
+
+ &:hover {
+ box-shadow: 0 8px 16px -8px rgba(0, 0, 0, 0.1);
+ }
+`;
+
+export const SmallLink = styled.a`
+ text-decoration: none;
+ color: ${smallLinkColor};
+
+ &:hover {
+ text-decoration: underline;
+ }
+`;
+
+type SubTitleProps = {
+ subtitleColor?: string | ThemeSet;
+ fontWeight?: string;
+};
+
+export const SubTitle = styled.h4`
+ margin: 5px 0;
+ ${({ subtitleColor }: SubTitleProps) =>
+ subtitleColor &&
+ css`
+ color: ${subtitleColor};
+ `}
+ font-weight: ${({ fontWeight }: SubTitleProps) =>
+ fontWeight ? fontWeight : '500'};
+`;
+
+export const InverseSubtitle = styled(SubTitle)`
+ color: ${inverseTextColor};
+`;
+
+export const Sub4Title = styled.h5`
+ margin: 10px 0;
+ font-weight: 500;
+`;
+
+export const NoWrapTitle = styled(Sub4Title)`
+ white-space: nowrap;
+`;
+
+export const SingleLine = styled.div`
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+`;
+
+export const RightAlign = styled.div`
+ width: 100%;
+ display: flex;
+ justify-content: flex-end;
+ align-items: center;
+`;
+
+export const ColumnLine = styled.div`
+ display: flex;
+ flex-direction: column;
+
+ @media (${mediaWidths.mobile}) {
+ width: 100%;
+ }
+`;
+
+export const SimpleButton = styled.button`
+ cursor: pointer;
+ outline: none;
+ padding: 5px;
+ margin: 5px;
+ text-decoration: none;
+ background-color: transparent;
+ color: ${({ enabled = true }: { enabled?: boolean }) =>
+ enabled ? textColor : unSelectedNavButton};
+ border: 1px solid ${buttonBorderColor};
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 5px;
+ white-space: nowrap;
+`;
+
+export const SimpleInverseButton = styled(SimpleButton)`
+ color: ${({ enabled = true }: { enabled?: boolean }) =>
+ enabled ? inverseTextColor : unSelectedNavButton};
+`;
+
+interface DarkProps {
+ fontSize?: string;
+ bottom?: string;
+}
+
+export const DarkSubTitle = styled.div`
+ font-size: ${({ fontSize }: DarkProps) => (fontSize ? fontSize : '14px')};
+ color: ${unSelectedNavButton};
+ margin-bottom: ${({ bottom }: DarkProps) => (bottom ? bottom : '0px')};
+`;
+
+interface ColorProps {
+ color: string;
+ selected?: boolean;
+}
+export const ColorButton = styled(SimpleButton)`
+ color: ${({ selected }) => (selected ? textColor : chartLinkColor)};
+ border: ${({ selected, color }: ColorProps) =>
+ selected ? `1px solid ${color}` : ''};
+
+ &:hover {
+ border: 1px solid ${({ color }: ColorProps) => color};
+ color: ${textColor};
+ }
+`;
+
+export const OverflowText = styled.div`
+ margin-left: 16px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+ -ms-word-break: break-all;
+ word-break: break-all;
+
+ @media (${mediaWidths.mobile}) {
+ margin-left: 8px;
+ }
+`;
+
+export const ResponsiveLine = styled(SingleLine)`
+ width: 100%;
+ ${({ withWrap }: { withWrap?: boolean }) =>
+ withWrap &&
+ css`
+ flex-wrap: wrap;
+ `}
+
+ @media (${mediaWidths.mobile}) {
+ flex-direction: column;
+ }
+`;
+
+export const ResponsiveCol = styled.div`
+ flex-grow: 1;
+
+ @media (${mediaWidths.mobile}) {
+ width: 100%;
+ }
+`;
+
+export const ResponsiveSingle = styled(SingleLine)`
+ flex-grow: 1;
+ min-width: 200px;
+
+ @media (${mediaWidths.mobile}) {
+ width: 100%;
+ }
+`;
diff --git a/src/components/gridWrapper/GridWrapper.tsx b/src/components/gridWrapper/GridWrapper.tsx
new file mode 100644
index 00000000..262e4b96
--- /dev/null
+++ b/src/components/gridWrapper/GridWrapper.tsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import styled from 'styled-components';
+import { mediaWidths } from '../../styles/Themes';
+
+import { Section } from '../section/Section';
+import { Navigation } from '../../layouts/navigation/Navigation';
+import { ConnectionCheck } from '../connectionCheck/ConnectionCheck';
+import { StatusCheck } from '../statusCheck/StatusCheck';
+
+const Container = styled.div`
+ display: grid;
+ grid-template-areas: 'nav content content';
+ grid-template-columns: auto 1fr 200px;
+ gap: 16px;
+
+ @media (${mediaWidths.mobile}) {
+ display: flex;
+ flex-direction: column;
+ }
+`;
+
+const ContentStyle = styled.div`
+ grid-area: content;
+`;
+
+interface GridWrapperProps {
+ without?: boolean;
+}
+
+export const GridWrapper: React.FC = ({
+ children,
+ without = false,
+}) => {
+ if (without) {
+ return <>{children}>;
+ }
+
+ return (
+
+ );
+};
diff --git a/src/components/input/Input.stories.tsx b/src/components/input/Input.stories.tsx
new file mode 100644
index 00000000..e8ed6d9a
--- /dev/null
+++ b/src/components/input/Input.stories.tsx
@@ -0,0 +1,24 @@
+import React from 'react';
+import { action } from '@storybook/addon-actions';
+import { select, color, boolean, text } from '@storybook/addon-knobs';
+import { Input } from './Input';
+
+export default {
+ title: 'Input',
+};
+
+export const Default = () => {
+ const withColor = boolean('With Color', false);
+
+ const buttonColor = withColor ? { color: color('Color', 'yellow') } : {};
+
+ return (
+
+ );
+};
diff --git a/src/components/input/Input.tsx b/src/components/input/Input.tsx
new file mode 100644
index 00000000..ddb22fed
--- /dev/null
+++ b/src/components/input/Input.tsx
@@ -0,0 +1,85 @@
+import React from 'react';
+import styled, { css } from 'styled-components';
+import {
+ textColor,
+ colorButtonBorder,
+ inputBackgroundColor,
+ inputBorderColor,
+} from '../../styles/Themes';
+
+interface InputProps {
+ color?: string;
+ withMargin?: string;
+ fullWidth?: boolean;
+ inputWidth?: string;
+ maxWidth?: string;
+}
+
+export const StyledInput = styled.input`
+ padding: 5px;
+ height: 30px;
+ margin: 8px 0;
+ border: 1px solid ${inputBorderColor};
+ background: none;
+ border-radius: 5px;
+ color: ${textColor};
+ transition: all 0.5s ease;
+ background-color: ${inputBackgroundColor};
+ ${({ maxWidth }: InputProps) =>
+ maxWidth &&
+ css`
+ max-width: ${maxWidth};
+ `}
+ width: ${({ fullWidth, inputWidth }: InputProps) =>
+ fullWidth ? '100%' : inputWidth ? inputWidth : 'auto'};
+ margin: ${({ withMargin }) => (withMargin ? withMargin : '0')};
+
+ &:hover {
+ border: 1px solid
+ ${({ color }: InputProps) => (color ? color : colorButtonBorder)};
+ }
+
+ &:focus {
+ outline: none;
+ border: 1px solid
+ ${({ color }: InputProps) => (color ? color : colorButtonBorder)};
+ }
+`;
+
+interface InputCompProps {
+ type?: string;
+ value?: number | string;
+ placeholder?: string;
+ color?: string;
+ withMargin?: string;
+ fullWidth?: boolean;
+ width?: string;
+ maxWidth?: string;
+ onChange: (e: any) => void;
+}
+
+export const Input = ({
+ type,
+ value,
+ placeholder,
+ color,
+ withMargin,
+ fullWidth = true,
+ width,
+ maxWidth,
+ onChange,
+}: InputCompProps) => {
+ return (
+ onChange(e)}
+ fullWidth={fullWidth}
+ inputWidth={width}
+ maxWidth={maxWidth}
+ />
+ );
+};
diff --git a/src/components/link/Link.stories.tsx b/src/components/link/Link.stories.tsx
new file mode 100644
index 00000000..55754e73
--- /dev/null
+++ b/src/components/link/Link.stories.tsx
@@ -0,0 +1,18 @@
+import React from 'react';
+import { text } from '@storybook/addon-knobs';
+import { Link } from './Link';
+
+export default {
+ title: 'Link',
+};
+
+export const Default = () => {
+ const linkText = text('Link Text', 'This is a link');
+
+ return (
+ <>
+ {linkText}{' '}
+ {linkText}
+ >
+ );
+};
diff --git a/src/components/link/Link.tsx b/src/components/link/Link.tsx
new file mode 100644
index 00000000..5445c061
--- /dev/null
+++ b/src/components/link/Link.tsx
@@ -0,0 +1,74 @@
+import React from 'react';
+import styled, { css } from 'styled-components';
+import { textColor, linkHighlight } from '../../styles/Themes';
+import { ThemeSet } from 'styled-theming';
+import RouterLink from 'next/link';
+
+interface StyledProps {
+ fontColor?: string | ThemeSet;
+ underline?: string | ThemeSet;
+ inheritColor?: boolean;
+ fullWidth?: boolean;
+}
+
+const StyledALink = styled.a`
+ cursor: pointer;
+ color: ${({ fontColor, inheritColor }: StyledProps) =>
+ inheritColor ? 'inherit' : fontColor ?? textColor};
+ text-decoration: none;
+ ${({ fullWidth }: StyledProps) =>
+ fullWidth &&
+ css`
+ width: 100%;
+ `};
+
+ :hover {
+ background: linear-gradient(
+ to bottom,
+ ${({ underline }: StyledProps) => underline ?? linkHighlight} 0%,
+ ${({ underline }: StyledProps) => underline ?? linkHighlight} 100%
+ );
+ background-position: 0 100%;
+ background-size: 2px 2px;
+ background-repeat: repeat-x;
+ }
+`;
+
+interface LinkProps {
+ children: any;
+ href?: string;
+ to?: string;
+ color?: string | ThemeSet;
+ underline?: string | ThemeSet;
+ inheritColor?: boolean;
+ fullWidth?: boolean;
+}
+
+export const Link = ({
+ children,
+ href,
+ to,
+ color,
+ underline,
+ inheritColor,
+ fullWidth,
+}: LinkProps) => {
+ const props = { fontColor: color, underline, inheritColor, fullWidth };
+
+ if (!href && !to) return null;
+
+ if (href) {
+ return (
+
+ {children}
+
+ );
+ }
+
+ return (
+
+ {children}
+
+ );
+ // }
+};
diff --git a/src/components/loading/LoadingCard.tsx b/src/components/loading/LoadingCard.tsx
new file mode 100644
index 00000000..b7d910a0
--- /dev/null
+++ b/src/components/loading/LoadingCard.tsx
@@ -0,0 +1,63 @@
+import React from 'react';
+import { CardWithTitle, CardTitle, SubTitle, Card } from '../generic/Styled';
+import ScaleLoader from 'react-spinners/ScaleLoader';
+import styled from 'styled-components';
+import { themeColors } from '../../styles/Themes';
+
+const Loading = styled.div`
+ width: 100%;
+ height: ${({ loadingHeight }: { loadingHeight?: string }) =>
+ loadingHeight ? loadingHeight : 'auto'};
+ display: flex;
+ justify-content: center;
+ align-items: center;
+`;
+
+interface LoadingCardProps {
+ title?: string;
+ noCard?: boolean;
+ color?: string;
+ noTitle?: boolean;
+ loadingHeight?: string;
+}
+
+export const LoadingCard = ({
+ title = '',
+ color,
+ noCard = false,
+ noTitle = false,
+ loadingHeight,
+}: LoadingCardProps) => {
+ const loadingColor = color ? color : themeColors.blue3;
+
+ if (noCard) {
+ return (
+
+
+
+ );
+ }
+
+ if (noTitle) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/components/loadingBar/LoadingBar.tsx b/src/components/loadingBar/LoadingBar.tsx
new file mode 100644
index 00000000..d1ed40b6
--- /dev/null
+++ b/src/components/loadingBar/LoadingBar.tsx
@@ -0,0 +1,43 @@
+import React from 'react';
+import styled from 'styled-components';
+import { progressBackground } from '../../styles/Themes';
+
+const Progress = styled.div`
+ width: 100%;
+ background: ${progressBackground};
+`;
+
+interface ProgressBar {
+ percent: number;
+ barColor?: string;
+}
+
+const ProgressBar = styled.div`
+ height: 10px;
+ background-color: ${({ barColor }: ProgressBar) =>
+ barColor ? barColor : 'blue'};
+ width: ${({ percent }: ProgressBar) => `${percent}%`};
+`;
+
+const getColor = (percent: number) => {
+ switch (true) {
+ case percent < 20:
+ return '#ff4d4f';
+ case percent < 40:
+ return '#ff7a45';
+ case percent < 60:
+ return '#ffa940';
+ case percent < 80:
+ return '#bae637';
+ case percent <= 100:
+ return '#73d13d';
+ default:
+ return '';
+ }
+};
+
+export const LoadingBar = ({ percent }: { percent: number }) => (
+
+
+
+);
diff --git a/src/components/modal/ReactModal.tsx b/src/components/modal/ReactModal.tsx
new file mode 100644
index 00000000..d304c8fa
--- /dev/null
+++ b/src/components/modal/ReactModal.tsx
@@ -0,0 +1,61 @@
+import React, { ReactNode } from 'react';
+import { css } from 'styled-components';
+import { cardColor, mediaWidths, themeColors } from '../../styles/Themes';
+import ReactModal from 'styled-react-modal';
+
+interface ModalProps {
+ children: ReactNode;
+ isOpen: boolean;
+ noMinWidth?: boolean;
+ closeCallback: () => void;
+}
+
+const generalCSS = css`
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translateY(-50%) translateX(-50%);
+ background-color: ${cardColor};
+ padding: 20px;
+ border-radius: 5px;
+ outline: none;
+
+ @media (${mediaWidths.mobile}) {
+ top: 100%;
+ border-radius: 0px;
+ transform: translateY(-100%) translateX(-50%);
+ width: 100%;
+ min-width: 325px;
+ }
+`;
+
+const StyleModal = ReactModal.styled`
+ ${generalCSS}
+ min-width: 578px;
+ `;
+
+const StyleModalSmall = ReactModal.styled`
+ ${generalCSS}
+ background-color: ${themeColors.white};
+`;
+
+const Modal = ({
+ children,
+ isOpen,
+ noMinWidth = false,
+ closeCallback,
+}: ModalProps) => {
+ const Styled = noMinWidth ? StyleModalSmall : StyleModal;
+
+ return (
+
+ {children}
+
+ );
+};
+
+export default Modal;
diff --git a/src/components/modal/closeChannel/CloseChannel.tsx b/src/components/modal/closeChannel/CloseChannel.tsx
new file mode 100644
index 00000000..5220dc4f
--- /dev/null
+++ b/src/components/modal/closeChannel/CloseChannel.tsx
@@ -0,0 +1,208 @@
+import React, { useState, useEffect } from 'react';
+import { useMutation, useQuery } from '@apollo/react-hooks';
+import {
+ Separation,
+ SingleLine,
+ SubTitle,
+ Sub4Title,
+} from '../../generic/Styled';
+import { AlertTriangle } from '../../generic/Icons';
+import styled from 'styled-components';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { SecureButton } from '../../buttons/secureButton/SecureButton';
+import { ColorButton } from '../../buttons/colorButton/ColorButton';
+import {
+ MultiButton,
+ SingleButton,
+} from '../../buttons/multiButton/MultiButton';
+import { Input } from '../../input/Input';
+import { GET_BITCOIN_FEES } from '../../../graphql/query';
+import { CLOSE_CHANNEL } from '../../../graphql/mutation';
+
+interface CloseChannelProps {
+ setModalOpen: (status: boolean) => void;
+ channelId: string;
+ channelName: string;
+}
+
+const WarningCard = styled.div`
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+`;
+
+const CenterLine = styled(SingleLine)`
+ justify-content: center;
+`;
+
+export const CloseChannel = ({
+ setModalOpen,
+ channelId,
+ channelName,
+}: CloseChannelProps) => {
+ const [isForce, setIsForce] = useState(false);
+ const [isType, setIsType] = useState('none');
+ const [amount, setAmount] = useState(0);
+ const [isConfirmed, setIsConfirmed] = useState(false);
+
+ const [fast, setFast] = useState(0);
+ const [halfHour, setHalfHour] = useState(0);
+ const [hour, setHour] = useState(0);
+
+ const { data: feeData } = useQuery(GET_BITCOIN_FEES, {
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ useEffect(() => {
+ if (feeData && feeData.getBitcoinFees) {
+ const { fast, halfHour, hour } = feeData.getBitcoinFees;
+ setAmount(fast);
+ setFast(fast);
+ setHalfHour(halfHour);
+ setHour(hour);
+ }
+ }, [feeData]);
+
+ const [closeChannel] = useMutation(CLOSE_CHANNEL, {
+ onCompleted: data => {
+ if (data.closeChannel) {
+ toast.success('Channel Closed');
+ }
+ },
+ onError: error => toast.error(getErrorContent(error)),
+ refetchQueries: [
+ 'GetChannels',
+ 'GetPendingChannels',
+ 'GetClosedChannels',
+ 'GetChannelAmountInfo',
+ ],
+ });
+
+ const handleOnlyClose = () => setModalOpen(false);
+
+ const renderButton = (
+ onClick: () => void,
+ text: string,
+ selected: boolean
+ ) => (
+
+ {text}
+
+ );
+
+ const renderWarning = () => (
+
+
+ Are you sure you want to close the channel?
+
+ {`Close Channel [ ${channelName}/${channelId} ]`}
+
+
+ Cancel
+
+
+ );
+
+ const renderContent = () => (
+ <>
+
+ {'Close Channel'}
+ {`${channelName} [${channelId}]`}
+
+
+
+ Fee:
+
+
+ {renderButton(() => setIsType('none'), 'Auto', isType === 'none')}
+ {renderButton(() => setIsType('fee'), 'Fee', isType === 'fee')}
+ {renderButton(() => setIsType('target'), 'Target', isType === 'target')}
+
+ {isType === 'none' && (
+ <>
+
+ Fee Amount:
+
+
+ {renderButton(
+ () => setAmount(fast),
+ `Fastest (${fast} sats)`,
+ amount === fast
+ )}
+ {halfHour !== fast &&
+ renderButton(
+ () => setAmount(halfHour),
+ `Half Hour (${halfHour} sats)`,
+ amount === halfHour
+ )}
+ {renderButton(
+ () => setAmount(hour),
+ `Hour (${hour} sats)`,
+ amount === hour
+ )}
+
+ >
+ )}
+ {isType !== 'none' && (
+ <>
+
+
+ {isType === 'target' ? 'Target Blocks:' : 'Fee (Sats/Byte)'}
+
+
+
+ setAmount(Number(e.target.value))}
+ />
+
+ >
+ )}
+
+ Force Close Channel:
+
+
+ {renderButton(() => setIsForce(true), 'Yes', isForce)}
+ {renderButton(() => setIsForce(false), 'No', !isForce)}
+
+
+
+
+ Cancel
+
+ setIsConfirmed(true)}
+ >
+ Close Channel
+
+
+ >
+ );
+
+ return isConfirmed ? renderWarning() : renderContent();
+};
diff --git a/src/components/modal/removePeer/RemovePeer.tsx b/src/components/modal/removePeer/RemovePeer.tsx
new file mode 100644
index 00000000..d5419f8d
--- /dev/null
+++ b/src/components/modal/removePeer/RemovePeer.tsx
@@ -0,0 +1,62 @@
+import React from 'react';
+import { useMutation } from '@apollo/react-hooks';
+import { SubTitle } from '../../generic/Styled';
+import { AlertTriangle } from '../../generic/Icons';
+import styled from 'styled-components';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { SecureButton } from '../../buttons/secureButton/SecureButton';
+import { ColorButton } from '../../buttons/colorButton/ColorButton';
+import { REMOVE_PEER } from '../../../graphql/mutation';
+
+interface RemovePeerProps {
+ setModalOpen: (status: boolean) => void;
+ publicKey: string;
+ peerAlias: string;
+}
+
+const WarningCard = styled.div`
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+`;
+
+export const RemovePeerModal = ({
+ setModalOpen,
+ publicKey,
+ peerAlias,
+}: RemovePeerProps) => {
+ const [removePeer, { loading }] = useMutation(REMOVE_PEER, {
+ onCompleted: data => {
+ toast.success('Peer Removed');
+ },
+ onError: error => {
+ toast.error(getErrorContent(error));
+ },
+ refetchQueries: ['GetPeers'],
+ });
+
+ const handleOnlyClose = () => setModalOpen(false);
+
+ return (
+
+
+ Are you sure you want to remove this peer?
+
+ {`Remove Peer [${peerAlias ?? 'Unknown'}]`}
+
+
+ Cancel
+
+
+ );
+};
diff --git a/src/components/nodeInfo/NodeBar.tsx b/src/components/nodeInfo/NodeBar.tsx
new file mode 100644
index 00000000..f12a75d9
--- /dev/null
+++ b/src/components/nodeInfo/NodeBar.tsx
@@ -0,0 +1,86 @@
+import React, { useRef } from 'react';
+import { useAccount } from '../../context/AccountContext';
+import { NodeCard } from './NodeCard';
+import { CardWithTitle, SubTitle } from '../generic/Styled';
+import {
+ ArrowLeft,
+ ArrowRight,
+ StyledNodeBar,
+ NodeBarContainer,
+} from './NodeInfo.styled';
+import { QuestionIcon } from '../generic/Icons';
+import styled from 'styled-components';
+import ReactTooltip from 'react-tooltip';
+import { useSettings } from '../../context/SettingsContext';
+import { getTooltipType } from '../generic/Helpers';
+
+const StyledQuestion = styled(QuestionIcon)`
+ margin-left: 8px;
+`;
+
+export const NodeBar = () => {
+ const { accounts } = useAccount();
+ const { nodeInfo } = useSettings();
+ const slider = useRef(null);
+
+ const { theme } = useSettings();
+ const tooltipType = getTooltipType(theme);
+
+ const viewOnlyAccounts = accounts.filter(account => account.viewOnly !== '');
+
+ const handleScroll = (decrease?: boolean) => {
+ if (slider.current !== null) {
+ if (decrease) {
+ slider.current.scrollLeft -= 240;
+ } else {
+ slider.current.scrollLeft += 240;
+ }
+ }
+ };
+
+ if (viewOnlyAccounts.length <= 1 || !nodeInfo) {
+ return null;
+ }
+
+ return (
+
+
+ Your Nodes
+
+
+
+
+
+ {
+ handleScroll(true);
+ }}
+ >
+
+
+ {
+ handleScroll();
+ }}
+ >
+
+
+
+ {viewOnlyAccounts.map((account, index) => (
+
+
+
+ ))}
+
+
+
+ Only accounts with a view-only macaroon will appear here.
+
+
+ );
+};
diff --git a/src/components/nodeInfo/NodeCard.tsx b/src/components/nodeInfo/NodeCard.tsx
new file mode 100644
index 00000000..73217a11
--- /dev/null
+++ b/src/components/nodeInfo/NodeCard.tsx
@@ -0,0 +1,148 @@
+import React, { useState } from 'react';
+import { useInView } from 'react-intersection-observer';
+import 'intersection-observer'; // Polyfill
+import { useQuery } from '@apollo/react-hooks';
+import { SingleLine, DarkSubTitle, ResponsiveLine } from '../generic/Styled';
+import { themeColors } from '../../styles/Themes';
+import ScaleLoader from 'react-spinners/ScaleLoader';
+import { Price } from '../price/Price';
+import Modal from '../modal/ReactModal';
+import { StatusDot, StatusLine, QuickCard } from './NodeInfo.styled';
+import { NodeInfoModal } from './NodeInfoModal';
+import { GET_NODE_INFO } from '../../graphql/query';
+
+export const getStatusDot = (status: boolean) => {
+ return status ? : ;
+};
+
+interface NodeCardProps {
+ account: any;
+ accountId: string;
+}
+
+interface QueryData {
+ getNodeInfo: {
+ active_channels_count: number;
+ closed_channels_count: number;
+ alias: string;
+ pending_channels_count: number;
+ is_synced_to_chain: boolean;
+ };
+ getChannelBalance: {
+ confirmedBalance: number;
+ pendingBalance: number;
+ };
+ getChainBalance: number;
+ getPendingChainBalance: number;
+}
+
+export const NodeCard = ({ account, accountId }: NodeCardProps) => {
+ const [isOpen, setIsOpen] = useState(false);
+
+ const { host, viewOnly, cert } = account;
+ const [ref, inView] = useInView({
+ threshold: 0,
+ triggerOnce: true,
+ });
+
+ const auth = {
+ host,
+ macaroon: viewOnly,
+ cert,
+ };
+
+ const { data, loading, error } = useQuery(GET_NODE_INFO, {
+ variables: { auth },
+ skip: !inView,
+ pollInterval: 10000,
+ });
+
+ if (error) {
+ return null;
+ }
+
+ const renderContent = () => {
+ if (!inView) {
+ return (
+ <>
+ {getStatusDot(false)}
+ -
+
+ Lightning
+ -
+
+
+ Bitcoin
+ -
+
+
+ Channels
+ -
+
+ >
+ );
+ }
+ if (loading || !data || !data.getNodeInfo || !data.getChannelBalance) {
+ return ;
+ }
+
+ const {
+ active_channels_count: active,
+ closed_channels_count: closed,
+ alias,
+ pending_channels_count: pending,
+ is_synced_to_chain,
+ } = data.getNodeInfo;
+
+ const { confirmedBalance, pendingBalance } = data.getChannelBalance;
+
+ const chainBalance = data.getChainBalance;
+ const pendingChainBalance = data.getPendingChainBalance;
+
+ return (
+ <>
+ {getStatusDot(is_synced_to_chain)}
+ {alias}
+
+ Lightning
+
+
+
+ Bitcoin
+
+
+
+ Channels
+ {`${active} / ${pending} / ${closed}`}
+
+ >
+ );
+ };
+
+ return (
+ <>
+ {
+ setIsOpen(true);
+ }}
+ ref={ref}
+ key={account.id}
+ >
+ {renderContent()}
+
+ {
+ setIsOpen(false);
+ }}
+ >
+
+
+ >
+ );
+};
diff --git a/src/components/nodeInfo/NodeInfo.styled.tsx b/src/components/nodeInfo/NodeInfo.styled.tsx
new file mode 100644
index 00000000..887ee012
--- /dev/null
+++ b/src/components/nodeInfo/NodeInfo.styled.tsx
@@ -0,0 +1,105 @@
+import styled, { css } from 'styled-components';
+import { Card } from '../generic/Styled';
+import { ChevronLeft, ChevronRight } from '../generic/Icons';
+import {
+ inverseTextColor,
+ buttonBorderColor,
+ textColor,
+ mediaWidths,
+} from '../../styles/Themes';
+
+const arrowCSS = css`
+ background-color: ${inverseTextColor};
+ height: 32px;
+ width: 32px;
+ position: absolute;
+ z-index: 2;
+ top: 50%;
+ display: none;
+ border-radius: 4px;
+ box-shadow: 0 8px 16px -8px rgba(0, 0, 0, 0.1);
+ border: 1px solid ${buttonBorderColor};
+ cursor: pointer;
+
+ &:hover {
+ border: 1px solid ${textColor};
+ }
+`;
+
+export const ArrowLeft = styled(ChevronLeft)`
+ ${arrowCSS}
+ transform: translate(-30%, -50%);
+`;
+
+export const ArrowRight = styled(ChevronRight)`
+ ${arrowCSS}
+ transform: translate(30%, -50%);
+ right: 0;
+`;
+
+export const NodeBarContainer = styled.div`
+ position: relative;
+ margin-bottom: 24px;
+ &:hover {
+ ${ArrowLeft} {
+ display: inline-block;
+ }
+ ${ArrowRight} {
+ display: inline-block;
+ }
+ }
+`;
+
+export const StyledNodeBar = styled.div`
+ display: flex;
+ overflow-x: scroll;
+ -ms-overflow-style: none;
+ cursor: pointer;
+ ::-webkit-scrollbar {
+ display: none;
+ }
+`;
+
+const sectionColor = '#69c0ff';
+
+export const QuickCard = styled(Card)`
+ height: 120px;
+ width: 240px;
+ min-width: 240px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: stretch;
+ margin-bottom: 0px;
+ padding: 10px;
+ margin-right: 10px;
+ cursor: pointer;
+
+ @media (${mediaWidths.mobile}) {
+ height: unset;
+ width: 160px;
+ min-width: 160px;
+ }
+
+ &:hover {
+ border: 1px solid ${sectionColor};
+ }
+`;
+
+export const StatusLine = styled.div`
+ width: 100%;
+ position: relative;
+ right: -8px;
+ top: -8px;
+ display: flex;
+ justify-content: flex-end;
+ margin: 0 0 -8px 0;
+`;
+
+export const StatusDot = styled.div`
+ margin: 0 2px;
+ height: 8px;
+ width: 8px;
+ border-radius: 100%;
+ background-color: ${({ color }: { color: string }) => color};
+`;
diff --git a/src/components/nodeInfo/NodeInfoModal.tsx b/src/components/nodeInfo/NodeInfoModal.tsx
new file mode 100644
index 00000000..dd1c3c9e
--- /dev/null
+++ b/src/components/nodeInfo/NodeInfoModal.tsx
@@ -0,0 +1,102 @@
+import React from 'react';
+import {
+ SubTitle,
+ SingleLine,
+ DarkSubTitle,
+ Sub4Title,
+ Separation,
+} from '../generic/Styled';
+import { Price } from '../price/Price';
+import { ColorButton } from '../buttons/colorButton/ColorButton';
+import { useConnectionDispatch } from '../../context/ConnectionContext';
+import { useStatusDispatch } from '../../context/StatusContext';
+import { useAccount } from '../../context/AccountContext';
+
+interface NodeInfoModalProps {
+ account: any;
+ accountId: string;
+}
+
+export const NodeInfoModal = ({ account, accountId }: NodeInfoModalProps) => {
+ const dispatch = useConnectionDispatch();
+ const dispatchState = useStatusDispatch();
+
+ const { changeAccount } = useAccount();
+
+ const {
+ active_channels_count,
+ closed_channels_count,
+ alias,
+ pending_channels_count,
+ is_synced_to_chain,
+ peers_count,
+ version,
+ } = account.getNodeInfo;
+
+ const { confirmedBalance, pendingBalance } = account.getChannelBalance;
+
+ const chainBalance = account.getChainBalance;
+ const pendingChainBalance = account.getPendingChainBalance;
+
+ return (
+ <>
+ {alias}
+
+
+ Version:
+ {version.split(' ')[0]}
+
+
+ Is Synced:
+ {is_synced_to_chain ? 'True' : 'False'}
+
+
+ Peer Count:
+ {peers_count}
+
+
+ Active Channels:
+ {active_channels_count}
+
+
+ Pending Channels:
+ {pending_channels_count}
+
+
+ Closed Channels:
+ {closed_channels_count}
+
+ Lightning
+
+ Balance:
+
+
+
+ Pending:
+
+
+ Bitcoin
+
+ Balance:
+
+
+
+ Pending:
+
+
+ {
+ dispatch({ type: 'disconnected' });
+ dispatchState({
+ type: 'disconnected',
+ });
+ changeAccount(accountId);
+ }}
+ >
+ Change to this Account
+
+ >
+ );
+};
diff --git a/src/components/price/Price.tsx b/src/components/price/Price.tsx
new file mode 100644
index 00000000..f883d5d7
--- /dev/null
+++ b/src/components/price/Price.tsx
@@ -0,0 +1,86 @@
+import React from 'react';
+import { useSettings } from '../../context/SettingsContext';
+import { getValue } from '../../utils/Helpers';
+import { usePriceState } from '../../context/PriceContext';
+
+type PriceProps = {
+ price: number;
+ symbol: string;
+ currency: string;
+};
+
+export const Price = ({
+ amount,
+ breakNumber = false,
+}: {
+ amount: number;
+ breakNumber?: boolean;
+}) => {
+ const { currency } = useSettings();
+ const { prices, loading, error } = usePriceState();
+
+ let priceProps: PriceProps = {
+ price: 0,
+ symbol: '',
+ currency: currency !== 'btc' && currency !== 'sat' ? 'sat' : currency,
+ };
+
+ if (prices && !loading && !error) {
+ const current: { last: number; symbol: string } = prices[currency] ?? {
+ last: 0,
+ symbol: '',
+ };
+
+ priceProps = {
+ price: current.last,
+ symbol: current.symbol,
+ currency,
+ };
+ }
+
+ const getFormat = (amount: number) =>
+ getValue({ amount, ...priceProps, breakNumber });
+
+ return <>{getFormat(amount)}>;
+};
+
+export const getPrice = (
+ currency: string,
+ priceContext: {
+ error: boolean;
+ loading: boolean;
+ prices?: { [key: string]: { last: number; symbol: string } };
+ }
+) => ({
+ amount,
+ breakNumber = false,
+}: {
+ amount: number;
+ breakNumber?: boolean;
+}) => {
+ const { prices, loading, error } = priceContext;
+
+ let priceProps: PriceProps = {
+ price: 0,
+ symbol: '',
+ currency: currency !== 'btc' && currency !== 'sat' ? 'sat' : currency,
+ };
+
+ if (prices && !loading && !error) {
+ const current: { last: number; symbol: string } = prices[currency] ?? {
+ last: 0,
+ symbol: '',
+ };
+
+ priceProps = {
+ price: current.last,
+ symbol: current.symbol,
+ currency,
+ };
+ }
+
+ const getFormat = (amount: number) =>
+ getValue({ amount, ...priceProps, breakNumber });
+
+ return getFormat(amount);
+};
diff --git a/src/components/rating/Rating.stories.tsx b/src/components/rating/Rating.stories.tsx
new file mode 100644
index 00000000..d4720136
--- /dev/null
+++ b/src/components/rating/Rating.stories.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import { number } from '@storybook/addon-knobs';
+import { Rating } from './Rating';
+
+export default {
+ title: 'Ratings',
+};
+
+export const Default = () => {
+ const options = {
+ range: true,
+ min: 0,
+ max: 10,
+ step: 1,
+ };
+
+ const rating = number('Rating', 5, options);
+
+ return ;
+};
diff --git a/src/components/rating/Rating.tsx b/src/components/rating/Rating.tsx
new file mode 100644
index 00000000..79642181
--- /dev/null
+++ b/src/components/rating/Rating.tsx
@@ -0,0 +1,58 @@
+import React from 'react';
+import { Star, HalfStar } from '../../components/generic/Icons';
+import { themeColors } from '../../styles/Themes';
+import styled from 'styled-components';
+
+const StyledStar = styled(Star)`
+ margin-bottom: -1px;
+`;
+
+const StyledHalfStar = styled(HalfStar)`
+ margin-bottom: -1px;
+`;
+
+const StyledRatings = styled.div`
+ display: flex;
+`;
+
+interface RatingProps {
+ rating: number | null;
+ size?: string;
+ color?: string;
+}
+
+export const Rating = ({
+ rating,
+ size = '14px',
+ color = themeColors.blue3,
+}: RatingProps) => {
+ if (!rating) {
+ return null;
+ }
+
+ const correctRating = Math.min(Math.max(Math.round(rating * 10), 0), 10);
+
+ const amount = (correctRating - (correctRating % 2)) / 2;
+ const hasHalf = correctRating % 2 > 0 ? true : false;
+
+ const stars = [];
+
+ const starConfig = {
+ size,
+ color,
+ };
+
+ for (let i = 0; i < 5; i += 1) {
+ if (i < amount) {
+ stars.push(
+
+ );
+ } else if (hasHalf && i === amount) {
+ stars.push( );
+ } else {
+ stars.push( );
+ }
+ }
+
+ return {stars.map(star => star)} ;
+};
diff --git a/src/components/section/Section.tsx b/src/components/section/Section.tsx
new file mode 100644
index 00000000..97c5c158
--- /dev/null
+++ b/src/components/section/Section.tsx
@@ -0,0 +1,69 @@
+import React, { ReactNode } from 'react';
+import styled, { css } from 'styled-components';
+import { ThemeSet } from 'styled-theming';
+import { backgroundColor, mediaWidths } from '../../styles/Themes';
+
+interface FullWidthProps {
+ padding?: string;
+ withColor?: boolean;
+ sectionColor?: string | ThemeSet;
+ textColor?: string | ThemeSet;
+}
+
+const FullWidth = styled.div`
+ width: 100%;
+ ${({ padding }: FullWidthProps) =>
+ padding &&
+ css`
+ padding: ${padding};
+ `}
+ ${({ textColor }: FullWidthProps) =>
+ textColor &&
+ css`
+ color: ${textColor};
+ `}
+ background-color: ${({ withColor, sectionColor }: FullWidthProps) =>
+ withColor && (sectionColor ? sectionColor : backgroundColor)};
+
+ @media (${mediaWidths.mobile}) {
+ padding: 16px 0;
+ }
+`;
+
+const FixedWidth = styled.div`
+ max-width: 1000px;
+ margin: 0 auto 0 auto;
+
+ @media (max-width: 1035px) {
+ padding: 0 16px;
+ }
+`;
+
+export const Section = ({
+ fixedWidth = true,
+ withColor = true,
+ children,
+ color,
+ textColor,
+ padding,
+}: {
+ fixedWidth?: boolean;
+ withColor?: boolean;
+ color?: any;
+ textColor?: any;
+ padding?: string;
+ children: ReactNode;
+}) => {
+ const Fixed = fixedWidth ? FixedWidth : React.Fragment;
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/src/components/stateViews/StateCards.tsx b/src/components/stateViews/StateCards.tsx
new file mode 100644
index 00000000..ad70c80e
--- /dev/null
+++ b/src/components/stateViews/StateCards.tsx
@@ -0,0 +1,65 @@
+import React from 'react';
+import ScaleLoader from 'react-spinners/ScaleLoader';
+import styled from 'styled-components';
+import { SubTitle, Card, SingleLine } from '../generic/Styled';
+import { themeColors, mediaWidths, fontColors } from '../../styles/Themes';
+import { Link } from '../link/Link';
+import { ColorButton } from '../buttons/colorButton/ColorButton';
+import { SectionTitle } from '../typography/Styled';
+
+const FullDiv = styled.div`
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ min-height: 400px;
+
+ @media (${mediaWidths.mobile}) {
+ justify-content: center;
+ }
+`;
+
+export const LoadingView = () => (
+
+ Connecting to your Node
+
+
+);
+
+const StyledTitle = styled(SectionTitle)`
+ text-align: center;
+ margin: 16px 0 32px;
+`;
+
+const StyledSubtitle = styled(SubTitle)`
+ text-align: center;
+ margin: 48px 0 4px;
+`;
+
+const StyledParagraph = styled.p`
+ color: ${fontColors.grey7};
+ text-align: center;
+ margin: 4px 0;
+`;
+
+export const ErrorView = () => (
+
+ Connection Error
+
+ ThunderHub was unable to connect to your node.
+
+
+ Please make sure it's online and that the connection details are correct.
+
+ If the problem persists please contact us.
+
+
+
+ Go to settings
+
+
+
+
+);
diff --git a/src/components/statusCheck/StatusCheck.tsx b/src/components/statusCheck/StatusCheck.tsx
new file mode 100644
index 00000000..f14a82f8
--- /dev/null
+++ b/src/components/statusCheck/StatusCheck.tsx
@@ -0,0 +1,68 @@
+import { useConnectionState } from '../../context/ConnectionContext';
+import { useQuery } from '@apollo/react-hooks';
+import { useAccount } from '../../context/AccountContext';
+import { useStatusDispatch } from '../../context/StatusContext';
+import { useEffect } from 'react';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../utils/error';
+import { GET_NODE_INFO } from '../../graphql/query';
+
+export const StatusCheck = () => {
+ const { connected } = useConnectionState();
+ const dispatch = useStatusDispatch();
+
+ const { loggedIn, host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { data, loading, error, stopPolling } = useQuery(GET_NODE_INFO, {
+ variables: { auth },
+ skip: !connected || !loggedIn,
+ pollInterval: 10000,
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ useEffect(() => {
+ if (!connected || !loggedIn) {
+ stopPolling();
+ }
+ }, [connected, loggedIn, stopPolling]);
+
+ useEffect(() => {
+ if (data && !loading && !error) {
+ const {
+ getChainBalance,
+ getPendingChainBalance,
+ getChannelBalance,
+ getNodeInfo,
+ } = data;
+ const { alias, is_synced_to_chain, version } = getNodeInfo;
+ const { confirmedBalance, pendingBalance } = getChannelBalance;
+
+ const versionNumber = version.split(' ');
+ const onlyVersion = versionNumber[0].split('-');
+ const numbers = onlyVersion[0].split('.');
+
+ const state = {
+ loading: false,
+ alias,
+ syncedToChain: is_synced_to_chain,
+ version: versionNumber[0],
+ mayorVersion: numbers[0],
+ minorVersion: numbers[1],
+ revision: numbers[2],
+ chainBalance: getChainBalance,
+ chainPending: getPendingChainBalance,
+ channelBalance: confirmedBalance,
+ channelPending: pendingBalance,
+ };
+
+ dispatch({ type: 'connected', state });
+ }
+ }, [data, dispatch, error, loading]);
+
+ return null;
+};
diff --git a/src/components/typography/Styled.tsx b/src/components/typography/Styled.tsx
new file mode 100644
index 00000000..e35370d8
--- /dev/null
+++ b/src/components/typography/Styled.tsx
@@ -0,0 +1,85 @@
+import styled from 'styled-components';
+// import { Card, CardProps } from 'components/generic/Styled';
+import { fontColors, mediaWidths, textColor } from '../../styles/Themes';
+import { Card, CardProps } from '../generic/CardGeneric';
+
+export const Center = styled.div`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ text-align: center;
+`;
+
+export const Title = styled.h1`
+ width: 100%;
+ text-align: center;
+ color: ${({ textColor }: { textColor?: string }) =>
+ textColor ? textColor : fontColors.grey3};
+ font-size: 40px;
+
+ @media (${mediaWidths.mobile}) {
+ font-size: 24px;
+ }
+`;
+
+export const SectionTitle = styled.h2`
+ color: ${({ textColor }: { textColor?: string }) =>
+ textColor ? textColor : fontColors.blue};
+ font-size: 24px;
+`;
+
+export const Subtitle = styled.h2`
+ color: ${({ textColor }: { textColor?: string }) =>
+ textColor ? textColor : fontColors.blue};
+ font-size: 16px;
+ max-width: 600px;
+`;
+
+export const Question = styled.h3`
+ color: ${fontColors.grey8};
+`;
+
+export const Text = styled.p`
+ color: ${fontColors.grey6};
+ text-align: justify;
+`;
+
+export const SmallText = styled(Text)`
+ color: ${textColor};
+ text-align: start;
+`;
+
+export const BulletPoint = styled(Text)`
+ margin-left: 32px;
+`;
+
+export const DetailCard = styled(Card)`
+ margin-bottom: 0;
+ margin: 8px 16px;
+ z-index: 1;
+ flex: 1 0 30%;
+
+ @media (${mediaWidths.mobile}) {
+ flex: 1 0 100%;
+ }
+`;
+
+export const DetailLine = styled.div`
+ margin: 0 -16px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-wrap: wrap;
+ @media (${mediaWidths.mobile}) {
+ margin: 0;
+ }
+`;
+
+export const IconTitle = styled.div`
+ display: flex;
+ color: ${textColor};
+`;
+
+export const IconMargin = styled.span`
+ margin-right: 4px;
+`;
diff --git a/src/context/AccountContext.tsx b/src/context/AccountContext.tsx
new file mode 100644
index 00000000..8d5638f4
--- /dev/null
+++ b/src/context/AccountContext.tsx
@@ -0,0 +1,197 @@
+import React, { createContext, useState, useContext, useEffect } from 'react';
+import merge from 'lodash.merge';
+import { getAuth } from '../utils/auth';
+import { saveAccounts } from '../utils/storage';
+
+interface SingleAccountProps {
+ name: string;
+ host: string;
+ admin: string;
+ viewOnly: string;
+ cert: string;
+ id: string;
+}
+
+interface ChangeProps {
+ loggedIn?: boolean;
+ name?: string;
+ host?: string;
+ admin?: string;
+ sessionAdmin?: string;
+ viewOnly?: string;
+ cert?: string;
+ id?: string;
+}
+
+interface AccountProps {
+ loggedIn: boolean;
+ name: string;
+ host: string;
+ admin: string;
+ sessionAdmin: string;
+ viewOnly: string;
+ cert: string;
+ id: string;
+ accounts: SingleAccountProps[];
+ setAccount: (newProps: ChangeProps) => void;
+ changeAccount: (account: string) => void;
+ deleteAccount: (account: string) => void;
+ refreshAccount: () => void;
+}
+
+export const AccountContext = createContext({
+ loggedIn: false,
+ name: '',
+ host: '',
+ admin: '',
+ sessionAdmin: '',
+ viewOnly: '',
+ cert: '',
+ id: '',
+ accounts: [],
+ setAccount: () => {},
+ changeAccount: () => {},
+ deleteAccount: () => {},
+ refreshAccount: () => {},
+});
+
+const AccountProvider = ({ children }: any) => {
+ // const sessionAdmin = sessionStorage.getItem('session') || '';
+ // const { name, host, admin, viewOnly, cert, id, accounts, loggedIn } = getAuth();
+
+ useEffect(() => {
+ refreshAccount();
+ }, []);
+
+ const setAccount = ({
+ loggedIn,
+ name,
+ host,
+ admin,
+ sessionAdmin,
+ viewOnly,
+ cert,
+ id,
+ }: ChangeProps) => {
+ updateAccount((prevState: any) => {
+ const newState = { ...prevState };
+ return merge(newState, {
+ loggedIn,
+ name,
+ host,
+ admin,
+ sessionAdmin,
+ viewOnly,
+ cert,
+ id,
+ });
+ });
+ };
+
+ const changeAccount = (changeToId: string) => {
+ const currentAccounts = JSON.parse(
+ localStorage.getItem('accounts') || '[]'
+ );
+ const index = currentAccounts.findIndex(
+ (account: any) => account.id === changeToId
+ );
+
+ if (index < 0) return;
+
+ sessionStorage.removeItem('session');
+ localStorage.setItem('active', `${index}`);
+
+ refreshAccount(`${index}`);
+ };
+
+ const deleteAccount = (deleteId: string) => {
+ const currentAccounts = JSON.parse(
+ localStorage.getItem('accounts') || '[]'
+ );
+ const current = currentAccounts.find(
+ (account: any) => account.id === deleteId
+ );
+
+ if (!current) return;
+
+ const isCurrentAccount = current.id === settings.id;
+
+ const changedAccounts = [...currentAccounts].filter(
+ account => account.id !== deleteId
+ );
+ const length = changedAccounts.length;
+
+ if (isCurrentAccount) {
+ sessionStorage.removeItem('session');
+ localStorage.setItem('active', `${length - 1}`);
+ } else {
+ const newIndex = changedAccounts.findIndex(
+ (account: any) => account.id === settings.id
+ );
+ localStorage.setItem('active', `${newIndex}`);
+ }
+
+ saveAccounts(changedAccounts);
+
+ refreshAccount();
+ };
+
+ const refreshAccount = (account?: string) => {
+ const sessionAdmin = sessionStorage.getItem('session') || '';
+ const {
+ name,
+ host,
+ admin,
+ viewOnly,
+ cert,
+ id,
+ accounts,
+ loggedIn,
+ } = getAuth(account);
+
+ updateAccount((prevState: any) => {
+ const newState = { ...prevState };
+
+ const merged = merge(newState, {
+ loggedIn,
+ name,
+ host,
+ admin,
+ sessionAdmin,
+ viewOnly,
+ cert,
+ id,
+ });
+
+ return { ...merged, accounts };
+ });
+ };
+
+ const accountState = {
+ loggedIn: false,
+ name: '',
+ host: '',
+ admin: '',
+ sessionAdmin: '',
+ viewOnly: '',
+ cert: '',
+ id: '',
+ accounts: [],
+ setAccount,
+ changeAccount,
+ deleteAccount,
+ refreshAccount,
+ };
+
+ const [settings, updateAccount] = useState(accountState);
+
+ return (
+
+ {children}
+
+ );
+};
+
+const useAccount = () => useContext(AccountContext);
+
+export { AccountProvider, useAccount };
diff --git a/src/context/BitcoinContext.tsx b/src/context/BitcoinContext.tsx
new file mode 100644
index 00000000..91fdffde
--- /dev/null
+++ b/src/context/BitcoinContext.tsx
@@ -0,0 +1,74 @@
+import React, { createContext, useContext, useReducer } from 'react';
+
+type State = {
+ loading: boolean;
+ error: boolean;
+ fast: number;
+ halfHour: number;
+ hour: number;
+};
+
+type ActionType = {
+ type: 'fetched' | 'error';
+ state?: State;
+};
+
+type Dispatch = (action: ActionType) => void;
+
+export const StateContext = createContext(undefined);
+export const DispatchContext = createContext(undefined);
+
+const initialState = {
+ loading: true,
+ error: false,
+ fast: 0,
+ halfHour: 0,
+ hour: 0,
+};
+
+const stateReducer = (state: State, action: ActionType): State => {
+ switch (action.type) {
+ case 'fetched':
+ return action.state || initialState;
+ case 'error':
+ return {
+ ...initialState,
+ loading: false,
+ error: true,
+ };
+ default:
+ return initialState;
+ }
+};
+
+const BitcoinInfoProvider = ({ children }: any) => {
+ const [state, dispatch] = useReducer(stateReducer, initialState);
+
+ return (
+
+ {children}
+
+ );
+};
+
+const useBitcoinState = () => {
+ const context = useContext(StateContext);
+ if (context === undefined) {
+ throw new Error(
+ 'useBitcoinState must be used within a BitcoinInfoProvider'
+ );
+ }
+ return context;
+};
+
+const useBitcoinDispatch = () => {
+ const context = useContext(DispatchContext);
+ if (context === undefined) {
+ throw new Error(
+ 'useBitcoinDispatch must be used within a BitcoinInfoProvider'
+ );
+ }
+ return context;
+};
+
+export { BitcoinInfoProvider, useBitcoinState, useBitcoinDispatch };
diff --git a/src/context/ConnectionContext.tsx b/src/context/ConnectionContext.tsx
new file mode 100644
index 00000000..e97d5162
--- /dev/null
+++ b/src/context/ConnectionContext.tsx
@@ -0,0 +1,71 @@
+import React, { createContext, useContext, useReducer } from 'react';
+
+type State = {
+ connected: boolean;
+ loading: boolean;
+ error: boolean;
+};
+
+type ActionType = {
+ type: 'connected' | 'loading' | 'error' | 'disconnected';
+};
+
+type Dispatch = (action: ActionType) => void;
+
+const StateContext = createContext(undefined);
+const DispatchContext = createContext(undefined);
+
+const stateReducer = (state: State, action: ActionType) => {
+ switch (action.type) {
+ case 'connected':
+ return { connected: true, loading: false, error: false };
+ case 'loading':
+ return { connected: false, loading: true, error: false };
+ case 'disconnected':
+ return { connected: false, loading: false, error: false };
+ case 'error':
+ return { connected: false, loading: false, error: true };
+ default:
+ return { connected: false, loading: false, error: false };
+ }
+};
+
+const initialState = {
+ connected: false,
+ loading: false,
+ error: false,
+};
+
+const ConnectionProvider = ({ children }: any) => {
+ const [state, dispatch] = useReducer(stateReducer, initialState);
+
+ return (
+
+
+ {children}
+
+
+ );
+};
+
+const useConnectionState = () => {
+ const context = useContext(StateContext);
+ if (context === undefined) {
+ throw new Error(
+ 'useConnectionState must be used within a ConnectionProvider'
+ );
+ }
+ return context;
+};
+
+const useConnectionDispatch = () => {
+ const context = useContext(DispatchContext);
+ if (context === undefined) {
+ throw new Error(
+ 'useConnectionDispatch must be used within a ConnectionProvider'
+ );
+ }
+ return context;
+};
+
+export { ConnectionProvider, useConnectionState, useConnectionDispatch };
diff --git a/client/src/context/ContextProvider.tsx b/src/context/ContextProvider.tsx
similarity index 51%
rename from client/src/context/ContextProvider.tsx
rename to src/context/ContextProvider.tsx
index 99f6d109..08089cab 100644
--- a/client/src/context/ContextProvider.tsx
+++ b/src/context/ContextProvider.tsx
@@ -7,15 +7,15 @@ import { StatusProvider } from './StatusContext';
import { PriceProvider } from './PriceContext';
export const ContextProvider: React.FC = ({ children }) => (
-
-
-
-
-
- {children}
-
-
-
-
-
+
+
+
+
+
+ {children}
+
+
+
+
+
);
diff --git a/src/context/PriceContext.tsx b/src/context/PriceContext.tsx
new file mode 100644
index 00000000..1e044c96
--- /dev/null
+++ b/src/context/PriceContext.tsx
@@ -0,0 +1,71 @@
+import React, { createContext, useContext, useReducer } from 'react';
+
+type PriceProps = {
+ last: number;
+ symbol: string;
+};
+
+type State = {
+ loading: boolean;
+ error: boolean;
+ prices?: { [key: string]: PriceProps };
+};
+
+type ActionType = {
+ type: 'fetched' | 'error';
+ state?: State;
+};
+
+type Dispatch = (action: ActionType) => void;
+
+export const StateContext = createContext(undefined);
+export const DispatchContext = createContext(undefined);
+
+const initialState: State = {
+ loading: true,
+ error: false,
+ prices: { EUR: { last: 0, symbol: '€' } },
+};
+
+const stateReducer = (state: State, action: ActionType): State => {
+ switch (action.type) {
+ case 'fetched':
+ return action.state || initialState;
+ case 'error':
+ return {
+ ...initialState,
+ loading: false,
+ error: true,
+ };
+ default:
+ return initialState;
+ }
+};
+
+const PriceProvider = ({ children }: any) => {
+ const [state, dispatch] = useReducer(stateReducer, initialState);
+
+ return (
+
+ {children}
+
+ );
+};
+
+const usePriceState = () => {
+ const context = useContext(StateContext);
+ if (context === undefined) {
+ throw new Error('usePriceState must be used within a PriceProvider');
+ }
+ return context;
+};
+
+const usePriceDispatch = () => {
+ const context = useContext(DispatchContext);
+ if (context === undefined) {
+ throw new Error('usePriceDispatch must be used within a PriceProvider');
+ }
+ return context;
+};
+
+export { PriceProvider, usePriceState, usePriceDispatch };
diff --git a/src/context/SettingsContext.tsx b/src/context/SettingsContext.tsx
new file mode 100644
index 00000000..8d40c6a8
--- /dev/null
+++ b/src/context/SettingsContext.tsx
@@ -0,0 +1,92 @@
+import React, { createContext, useState, useContext, useEffect } from 'react';
+import merge from 'lodash.merge';
+
+interface ChangeProps {
+ theme?: string;
+ sidebar?: boolean;
+ currency?: string;
+ nodeInfo?: boolean;
+}
+
+interface SettingsProps {
+ currency: string;
+ theme: string;
+ sidebar: boolean;
+ nodeInfo: boolean;
+ setSettings: (newProps: ChangeProps) => void;
+ refreshSettings: () => void;
+}
+
+export const SettingsContext = createContext({
+ currency: '',
+ theme: '',
+ sidebar: true,
+ nodeInfo: false,
+ setSettings: () => {},
+ refreshSettings: () => {},
+});
+
+const SettingsProvider = ({ children }: any) => {
+ // const savedTheme = localStorage.getItem('theme') || 'light';
+ // const savedSidebar = localStorage.getItem('sidebar') === 'false' ? false : true;
+ // const savedCurrency = localStorage.getItem('currency') || 'sat';
+ // const savedNodeInfo = localStorage.getItem('nodeInfo') === 'true' ? true : false;
+
+ useEffect(() => {
+ refreshSettings();
+ }, []);
+
+ const refreshSettings = (account?: string) => {
+ const savedTheme = localStorage.getItem('theme') || 'light';
+ const savedSidebar =
+ localStorage.getItem('sidebar') === 'false' ? false : true;
+ const savedCurrency = localStorage.getItem('currency') || 'sat';
+ const savedNodeInfo =
+ localStorage.getItem('nodeInfo') === 'true' ? true : false;
+
+ updateSettings((prevState: any) => {
+ const newState = { ...prevState };
+ return merge(newState, {
+ currency: savedCurrency,
+ theme: savedTheme,
+ sidebar: savedSidebar,
+ nodeInfo: savedNodeInfo,
+ });
+ });
+ };
+
+ const setSettings = ({ currency, theme, sidebar }: ChangeProps) => {
+ updateSettings((prevState: any) => {
+ const newState = { ...prevState };
+ return merge(newState, {
+ currency,
+ theme,
+ sidebar,
+ });
+ });
+ };
+
+ const settingsState = {
+ prices: { EUR: { last: 0, symbol: '€' } },
+ price: 0,
+ symbol: '',
+ currency: 'sat',
+ theme: 'dark',
+ sidebar: true,
+ nodeInfo: false,
+ setSettings,
+ refreshSettings,
+ };
+
+ const [settings, updateSettings] = useState(settingsState);
+
+ return (
+
+ {children}
+
+ );
+};
+
+const useSettings = () => useContext(SettingsContext);
+
+export { SettingsProvider, useSettings };
diff --git a/src/context/StatusContext.tsx b/src/context/StatusContext.tsx
new file mode 100644
index 00000000..23e296d2
--- /dev/null
+++ b/src/context/StatusContext.tsx
@@ -0,0 +1,78 @@
+import React, { createContext, useContext, useReducer } from 'react';
+
+type State = {
+ loading: boolean;
+ alias: string;
+ syncedToChain: boolean;
+ version: string;
+ mayorVersion: number;
+ minorVersion: number;
+ revision: number;
+ chainBalance: number;
+ chainPending: number;
+ channelBalance: number;
+ channelPending: number;
+};
+
+type ActionType = {
+ type: 'connected' | 'disconnected';
+ state?: State;
+};
+
+type Dispatch = (action: ActionType) => void;
+
+const StateContext = createContext(undefined);
+const DispatchContext = createContext(undefined);
+
+const initialState = {
+ loading: false,
+ alias: '',
+ syncedToChain: false,
+ version: '',
+ mayorVersion: 0,
+ minorVersion: 0,
+ revision: 0,
+ chainBalance: 0,
+ chainPending: 0,
+ channelBalance: 0,
+ channelPending: 0,
+};
+
+const stateReducer = (state: State, action: ActionType): State => {
+ switch (action.type) {
+ case 'connected':
+ return action.state || initialState;
+ case 'disconnected':
+ return initialState;
+ default:
+ return initialState;
+ }
+};
+
+const StatusProvider = ({ children }: any) => {
+ const [state, dispatch] = useReducer(stateReducer, initialState);
+
+ return (
+
+ {children}
+
+ );
+};
+
+const useStatusState = () => {
+ const context = useContext(StateContext);
+ if (context === undefined) {
+ throw new Error('useStatusState must be used within a StatusProvider');
+ }
+ return context;
+};
+
+const useStatusDispatch = () => {
+ const context = useContext(DispatchContext);
+ if (context === undefined) {
+ throw new Error('useStatusDispatch must be used within a StatusProvider');
+ }
+ return context;
+};
+
+export { StatusProvider, useStatusState, useStatusDispatch };
diff --git a/src/graphql/hodlhodl/query.ts b/src/graphql/hodlhodl/query.ts
new file mode 100644
index 00000000..c944b26a
--- /dev/null
+++ b/src/graphql/hodlhodl/query.ts
@@ -0,0 +1,71 @@
+import gql from 'graphql-tag';
+
+export const GET_HODL_COUNTRIES = gql`
+ query GetCountries {
+ getCountries {
+ code
+ name
+ native_name
+ currency_code
+ currency_name
+ }
+ }
+`;
+
+export const GET_HODL_CURRENCIES = gql`
+ query GetCurrencies {
+ getCurrencies {
+ code
+ name
+ type
+ }
+ }
+`;
+
+export const GET_HODL_OFFERS = gql`
+ query GetOffers($filter: String) {
+ getOffers(filter: $filter) {
+ id
+ asset_code
+ country
+ country_code
+ working_now
+ side
+ title
+ description
+ currency_code
+ price
+ min_amount
+ max_amount
+ first_trade_limit
+ fee {
+ author_fee_rate
+ }
+ balance
+ payment_window_minutes
+ confirmations
+ payment_method_instructions {
+ id
+ version
+ payment_method_id
+ payment_method_type
+ payment_method_name
+ }
+ trader {
+ login
+ online_status
+ rating
+ trades_count
+ url
+ verified
+ verified_by
+ strong_hodler
+ country
+ country_code
+ average_payment_time_minutes
+ average_release_time_minutes
+ days_since_last_trade
+ }
+ }
+ }
+`;
diff --git a/src/graphql/mutation.ts b/src/graphql/mutation.ts
new file mode 100644
index 00000000..9d9de269
--- /dev/null
+++ b/src/graphql/mutation.ts
@@ -0,0 +1,159 @@
+import gql from 'graphql-tag';
+
+export const CLOSE_CHANNEL = gql`
+ mutation CloseChannel(
+ $id: String!
+ $auth: authType!
+ $forceClose: Boolean
+ $target: Int
+ $tokens: Int
+ ) {
+ closeChannel(
+ id: $id
+ forceClose: $forceClose
+ targetConfirmations: $target
+ tokensPerVByte: $tokens
+ auth: $auth
+ ) {
+ transactionId
+ transactionOutputIndex
+ }
+ }
+`;
+
+export const OPEN_CHANNEL = gql`
+ mutation openChannel(
+ $amount: Int!
+ $partnerPublicKey: String!
+ $auth: authType!
+ $tokensPerVByte: Int
+ $isPrivate: Boolean
+ ) {
+ openChannel(
+ amount: $amount
+ partnerPublicKey: $partnerPublicKey
+ auth: $auth
+ tokensPerVByte: $tokensPerVByte
+ isPrivate: $isPrivate
+ ) {
+ transactionId
+ transactionOutputIndex
+ }
+ }
+`;
+
+export const PAY_INVOICE = gql`
+ mutation PayInvoice($request: String!, $auth: authType!) {
+ pay(request: $request, auth: $auth) {
+ isConfirmed
+ }
+ }
+`;
+
+export const CREATE_INVOICE = gql`
+ mutation PayInvoice($amount: Int!, $auth: authType!) {
+ createInvoice(amount: $amount, auth: $auth) {
+ request
+ }
+ }
+`;
+
+export const CREATE_ADDRESS = gql`
+ mutation CreateAddress($nested: Boolean, $auth: authType!) {
+ createAddress(nested: $nested, auth: $auth)
+ }
+`;
+
+export const PAY_ADDRESS = gql`
+ mutation PayAddress(
+ $auth: authType!
+ $address: String!
+ $tokens: Int
+ $fee: Int
+ $target: Int
+ $sendAll: Boolean
+ ) {
+ sendToAddress(
+ auth: $auth
+ address: $address
+ tokens: $tokens
+ fee: $fee
+ target: $target
+ sendAll: $sendAll
+ ) {
+ confirmationCount
+ id
+ isConfirmed
+ isOutgoing
+ tokens
+ }
+ }
+`;
+
+export const DECODE_REQUEST = gql`
+ mutation decodeRequest($auth: authType!, $request: String!) {
+ decodeRequest(auth: $auth, request: $request) {
+ chainAddress
+ cltvDelta
+ description
+ descriptionHash
+ destination
+ expiresAt
+ id
+ routes {
+ baseFeeMTokens
+ channel
+ cltvDelta
+ feeRate
+ publicKey
+ }
+ tokens
+ }
+ }
+`;
+
+export const UPDATE_FEES = gql`
+ mutation updateFees(
+ $auth: authType!
+ $transactionId: String
+ $transactionVout: Int
+ $baseFee: Int
+ $feeRate: Int
+ ) {
+ updateFees(
+ auth: $auth
+ transactionId: $transactionId
+ transactionVout: $transactionVout
+ baseFee: $baseFee
+ feeRate: $feeRate
+ )
+ }
+`;
+
+export const PAY_VIA_ROUTE = gql`
+ mutation PayViaRoute($auth: authType!, $route: String!) {
+ payViaRoute(auth: $auth, route: $route)
+ }
+`;
+
+export const REMOVE_PEER = gql`
+ mutation RemovePeer($auth: authType!, $publicKey: String!) {
+ removePeer(auth: $auth, publicKey: $publicKey)
+ }
+`;
+
+export const ADD_PEER = gql`
+ mutation AddPeer(
+ $auth: authType!
+ $publicKey: String!
+ $socket: String!
+ $isTemporary: Boolean
+ ) {
+ addPeer(
+ auth: $auth
+ publicKey: $publicKey
+ socket: $socket
+ isTemporary: $isTemporary
+ )
+ }
+`;
diff --git a/src/graphql/query.ts b/src/graphql/query.ts
new file mode 100644
index 00000000..6152419c
--- /dev/null
+++ b/src/graphql/query.ts
@@ -0,0 +1,378 @@
+import gql from 'graphql-tag';
+
+export const GET_NETWORK_INFO = gql`
+ query GetNetworkInfo($auth: authType!) {
+ getNetworkInfo(auth: $auth) {
+ averageChannelSize
+ channelCount
+ maxChannelSize
+ medianChannelSize
+ minChannelSize
+ nodeCount
+ notRecentlyUpdatedPolicyCount
+ totalCapacity
+ }
+ }
+`;
+
+export const GET_CAN_CONNECT = gql`
+ query GetNodeInfo($auth: authType!) {
+ getNodeInfo(auth: $auth) {
+ chains
+ color
+ active_channels_count
+ closed_channels_count
+ alias
+ is_synced_to_chain
+ peers_count
+ pending_channels_count
+ version
+ }
+ }
+`;
+
+export const GET_CAN_ADMIN = gql`
+ query AdminCheck($auth: authType!) {
+ adminCheck(auth: $auth)
+ }
+`;
+
+export const GET_NODE_INFO = gql`
+ query GetNodeInfo($auth: authType!) {
+ getNodeInfo(auth: $auth) {
+ chains
+ color
+ active_channels_count
+ closed_channels_count
+ alias
+ is_synced_to_chain
+ peers_count
+ pending_channels_count
+ version
+ }
+ getChainBalance(auth: $auth)
+ getPendingChainBalance(auth: $auth)
+ getChannelBalance(auth: $auth) {
+ confirmedBalance
+ pendingBalance
+ }
+ }
+`;
+
+export const GET_CHANNEL_AMOUNT_INFO = gql`
+ query GetChannelAmountInfo($auth: authType!) {
+ getNodeInfo(auth: $auth) {
+ active_channels_count
+ closed_channels_count
+ pending_channels_count
+ }
+ }
+`;
+
+export const GET_CHANNELS = gql`
+ query GetChannels($auth: authType!, $active: Boolean) {
+ getChannels(auth: $auth, active: $active) {
+ capacity
+ commit_transaction_fee
+ commit_transaction_weight
+ id
+ is_active
+ is_closing
+ is_opening
+ is_partner_initiated
+ is_private
+ is_static_remote_key
+ local_balance
+ local_reserve
+ partner_public_key
+ received
+ remote_balance
+ remote_reserve
+ sent
+ time_offline
+ time_online
+ transaction_id
+ transaction_vout
+ unsettled_balance
+ partner_node_info {
+ alias
+ capacity
+ channel_count
+ color
+ updated_at
+ }
+ }
+ }
+`;
+
+export const GET_PENDING_CHANNELS = gql`
+ query GetPendingChannels($auth: authType!) {
+ getPendingChannels(auth: $auth) {
+ close_transaction_id
+ is_active
+ is_closing
+ is_opening
+ local_balance
+ local_reserve
+ partner_public_key
+ received
+ remote_balance
+ remote_reserve
+ sent
+ transaction_fee
+ transaction_id
+ transaction_vout
+ partner_node_info {
+ alias
+ capacity
+ channel_count
+ color
+ updated_at
+ }
+ }
+ }
+`;
+
+export const GET_CLOSED_CHANNELS = gql`
+ query GetClosedChannels($auth: authType!) {
+ getClosedChannels(auth: $auth) {
+ capacity
+ close_confirm_height
+ close_transaction_id
+ final_local_balance
+ final_time_locked_balance
+ id
+ is_breach_close
+ is_cooperative_close
+ is_funding_cancel
+ is_local_force_close
+ is_remote_force_close
+ partner_public_key
+ transaction_id
+ transaction_vout
+ partner_node_info {
+ alias
+ capacity
+ channel_count
+ color
+ updated_at
+ }
+ }
+ }
+`;
+
+export const GET_RESUME = gql`
+ query GetResume($auth: authType!, $token: String) {
+ getResume(auth: $auth, token: $token) {
+ token
+ resume
+ }
+ }
+`;
+
+export const GET_BITCOIN_PRICE = gql`
+ query GetBitcoinPrice {
+ getBitcoinPrice
+ }
+`;
+
+export const GET_BITCOIN_FEES = gql`
+ query GetBitcoinFees {
+ getBitcoinFees {
+ fast
+ halfHour
+ hour
+ }
+ }
+`;
+
+export const GET_FORWARD_REPORT = gql`
+ query GetForwardReport($time: String, $auth: authType!) {
+ getForwardReport(time: $time, auth: $auth)
+ }
+`;
+
+export const GET_LIQUID_REPORT = gql`
+ query GetLiquidReport($auth: authType!) {
+ getChannelReport(auth: $auth) {
+ local
+ remote
+ maxIn
+ maxOut
+ }
+ }
+`;
+
+export const GET_FORWARD_CHANNELS_REPORT = gql`
+ query GetForwardChannelsReport(
+ $time: String
+ $order: String
+ $type: String
+ $auth: authType!
+ ) {
+ getForwardChannelsReport(
+ time: $time
+ order: $order
+ auth: $auth
+ type: $type
+ )
+ }
+`;
+
+export const GET_IN_OUT = gql`
+ query GetInOut($auth: authType!, $time: String) {
+ getInOut(auth: $auth, time: $time) {
+ invoices
+ payments
+ confirmedInvoices
+ unConfirmedInvoices
+ }
+ }
+`;
+
+export const GET_CHAIN_TRANSACTIONS = gql`
+ query GetChainTransactions($auth: authType!) {
+ getChainTransactions(auth: $auth) {
+ block_id
+ confirmation_count
+ confirmation_height
+ created_at
+ fee
+ id
+ output_addresses
+ tokens
+ }
+ }
+`;
+
+export const GET_FORWARDS = gql`
+ query GetForwards($auth: authType!, $time: String) {
+ getForwards(auth: $auth, time: $time) {
+ forwards {
+ created_at
+ fee
+ fee_mtokens
+ incoming_channel
+ incoming_alias
+ incoming_color
+ mtokens
+ outgoing_channel
+ outgoing_alias
+ outgoing_color
+ tokens
+ }
+ token
+ }
+ }
+`;
+
+export const GET_CONNECT_INFO = gql`
+ query GetNodeInfo($auth: authType!) {
+ getNodeInfo(auth: $auth) {
+ public_key
+ uris
+ }
+ }
+`;
+
+export const GET_BACKUPS = gql`
+ query GetBackups($auth: authType!) {
+ getBackups(auth: $auth)
+ }
+`;
+
+export const VERIFY_BACKUPS = gql`
+ query VerifyBackups($auth: authType!, $backup: String!) {
+ verifyBackups(auth: $auth, backup: $backup)
+ }
+`;
+
+export const SIGN_MESSAGE = gql`
+ query SignMessage($auth: authType!, $message: String!) {
+ signMessage(auth: $auth, message: $message)
+ }
+`;
+
+export const VERIFY_MESSAGE = gql`
+ query VerifyMessage(
+ $auth: authType!
+ $message: String!
+ $signature: String!
+ ) {
+ verifyMessage(auth: $auth, message: $message, signature: $signature)
+ }
+`;
+
+export const RECOVER_FUNDS = gql`
+ query RecoverFunds($auth: authType!, $backup: String!) {
+ recoverFunds(auth: $auth, backup: $backup)
+ }
+`;
+
+export const CHANNEL_FEES = gql`
+ query GetChannelFees($auth: authType!) {
+ getChannelFees(auth: $auth) {
+ alias
+ color
+ baseFee
+ feeRate
+ transactionId
+ transactionVout
+ }
+ }
+`;
+
+export const GET_ROUTES = gql`
+ query GetRoutes(
+ $auth: authType!
+ $outgoing: String!
+ $incoming: String!
+ $tokens: Int!
+ $maxFee: Int
+ ) {
+ getRoutes(
+ auth: $auth
+ outgoing: $outgoing
+ incoming: $incoming
+ tokens: $tokens
+ maxFee: $maxFee
+ )
+ }
+`;
+
+export const GET_PEERS = gql`
+ query GetPeers($auth: authType!) {
+ getPeers(auth: $auth) {
+ bytes_received
+ bytes_sent
+ is_inbound
+ is_sync_peer
+ ping_time
+ public_key
+ socket
+ tokens_received
+ tokens_sent
+ partner_node_info {
+ alias
+ capacity
+ channel_count
+ color
+ updated_at
+ }
+ }
+ }
+`;
+
+export const GET_UTXOS = gql`
+ query GetUtxos($auth: authType!) {
+ getUtxos(auth: $auth) {
+ address
+ address_format
+ confirmation_count
+ output_script
+ tokens
+ transaction_id
+ transaction_vout
+ }
+ }
+`;
diff --git a/src/hooks/UseInterval.tsx b/src/hooks/UseInterval.tsx
new file mode 100644
index 00000000..22073378
--- /dev/null
+++ b/src/hooks/UseInterval.tsx
@@ -0,0 +1,17 @@
+import { useEffect, useRef } from 'react';
+
+export const useInterval = (callback: any, delay: number) => {
+ const savedCallback = useRef(callback);
+
+ useEffect(() => {
+ savedCallback.current = callback;
+ }, [callback]);
+
+ useEffect(() => {
+ const tick = () => {
+ savedCallback.current();
+ };
+ const id = setInterval(tick, delay);
+ return () => clearInterval(id);
+ }, [delay]);
+};
diff --git a/src/hooks/UseSize.tsx b/src/hooks/UseSize.tsx
new file mode 100644
index 00000000..fc8df42a
--- /dev/null
+++ b/src/hooks/UseSize.tsx
@@ -0,0 +1,28 @@
+import { useState, useEffect } from 'react';
+import debounce from 'lodash.debounce';
+
+const getSize = () => {
+ const isClient = typeof window === 'object';
+ return {
+ width: isClient ? window.innerWidth : 0,
+ height: isClient ? window.innerHeight : 0,
+ };
+};
+
+export const useSize = () => {
+ const [windowSize, setWindowSize] = useState(getSize());
+
+ useEffect(() => {
+ const handleResize = () => {
+ setWindowSize(getSize());
+ };
+
+ handleResize();
+
+ const debouncedHandle = debounce(handleResize, 250);
+ window.addEventListener('resize', debouncedHandle);
+ return () => window.removeEventListener('resize', debouncedHandle);
+ }, []);
+
+ return windowSize;
+};
diff --git a/src/layouts/footer/Footer.tsx b/src/layouts/footer/Footer.tsx
new file mode 100644
index 00000000..bc86f415
--- /dev/null
+++ b/src/layouts/footer/Footer.tsx
@@ -0,0 +1,151 @@
+import React from 'react';
+import styled from 'styled-components';
+import {
+ headerColor,
+ headerTextColor,
+ fontColors,
+ mediaWidths,
+} from '../../styles/Themes';
+import { Section } from '../../components/section/Section';
+import { Link } from '../../components/link/Link';
+import { Emoji } from '../../components/emoji/Emoji';
+import { useAccount } from '../../context/AccountContext';
+import RouterLink from 'next/link';
+import { HomeButton } from '../../views/homepage/HomePage.styled';
+import { Zap } from '../../components/generic/Icons';
+
+const FooterStyle = styled.div`
+ padding: 40px 0;
+ min-height: 300px;
+ color: ${headerTextColor};
+ display: flex;
+ justify-content: space-between;
+
+ @media (${mediaWidths.mobile}) {
+ flex-direction: column;
+ padding: 0 0 40px;
+ justify-content: center;
+ align-items: center;
+ }
+`;
+
+const SideFooter = styled.div`
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: flex-start;
+
+ @media (${mediaWidths.mobile}) {
+ width: 100%;
+ justify-content: center;
+ align-items: center;
+ text-align: center;
+ }
+`;
+
+const RightFooter = styled(SideFooter)`
+ justify-content: flex-start;
+ align-items: flex-end;
+ width: 80%;
+
+ @media (${mediaWidths.mobile}) {
+ margin-top: 32px;
+ }
+`;
+
+const Title = styled.div`
+ font-weight: 900;
+ color: ${headerTextColor};
+`;
+
+const SideText = styled.p`
+ font-size: 14px;
+ color: ${fontColors.grey7};
+
+ @media (${mediaWidths.mobile}) {
+ padding-right: 0;
+ }
+`;
+
+const CopyrightText = styled(SideText)`
+ font-size: 12px;
+ color: ${fontColors.blue};
+`;
+
+const StyledRouter = styled.div`
+ margin-top: 16px;
+
+ ${HomeButton} {
+ font-size: 14px;
+ }
+`;
+
+const Line = styled.div`
+ display: flex;
+ justify-content: center;
+ align-items: flex-end;
+`;
+
+const Version = styled.div`
+ font-size: 12px;
+ margin-left: 8px;
+`;
+
+export const Footer = () => {
+ const { loggedIn } = useAccount();
+ return (
+
+
+
+
+
+ ThunderHub
+
+ {'0.3.0'}
+
+
+ Open-source lightning node manager to control and monitor your LND
+ node.
+
+
+ Made in Munich with and{' '}
+ .
+
+
+ Copyright © 2020. All rights reserved. ThunderHub
+
+
+
+
+ FAQ
+
+
+ Github
+
+
+ Twitter
+
+
+ Terms of Use
+
+
+ Privacy Policy
+
+ {!loggedIn && (
+
+
+
+
+ LOGIN
+
+
+
+ )}
+
+
+
+ );
+};
diff --git a/src/layouts/header/Header.tsx b/src/layouts/header/Header.tsx
new file mode 100644
index 00000000..53a1c7b0
--- /dev/null
+++ b/src/layouts/header/Header.tsx
@@ -0,0 +1,156 @@
+import React, { useState } from 'react';
+import styled, { css } from 'styled-components';
+import {
+ headerColor,
+ headerTextColor,
+ themeColors,
+ mediaWidths,
+ mediaDimensions,
+} from '../../styles/Themes';
+import { HomeButton } from '../../views/homepage/HomePage.styled';
+import { useAccount } from '../../context/AccountContext';
+import { SingleLine, ResponsiveLine } from '../../components/generic/Styled';
+import {
+ Cpu,
+ MenuIcon,
+ XSvg,
+ Zap,
+ Circle,
+} from '../../components/generic/Icons';
+import { BurgerMenu } from '../../components/burgerMenu/BurgerMenu';
+import { useSize } from '../../hooks/UseSize';
+import { useTransition, animated } from 'react-spring';
+import { Section } from '../../components/section/Section';
+import { useStatusState } from '../../context/StatusContext';
+import { Link } from '../../components/link/Link';
+
+const HeaderStyle = styled.div`
+ padding: 16px 0;
+`;
+
+const IconPadding = styled.div`
+ padding-right: 6px;
+ margin-bottom: -4px;
+`;
+
+const HeaderTitle = styled.div`
+ color: ${headerTextColor};
+ font-weight: 900;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ ${({ withPadding }: { withPadding: boolean }) =>
+ withPadding &&
+ css`
+ @media (${mediaWidths.mobile}) {
+ margin-bottom: 16px;
+ }
+ `}
+`;
+
+const IconWrapper = styled.div`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 24px;
+ height: 24px;
+`;
+
+const LinkWrapper = styled.div`
+ color: ${headerTextColor};
+ margin: ${({ last }: { last?: boolean }) =>
+ last ? '0 16px 0 4px' : '0 4px'};
+
+ :hover {
+ color: ${themeColors.blue2};
+ }
+`;
+
+const AnimatedBurger = animated(MenuIcon);
+const AnimatedClose = animated(XSvg);
+
+export const Header = () => {
+ const { width } = useSize();
+ const { loggedIn } = useAccount();
+ const [open, setOpen] = useState(false);
+ const { syncedToChain } = useStatusState();
+
+ const transitions = useTransition(open, null, {
+ from: { position: 'absolute', opacity: 0 },
+ enter: { opacity: 1 },
+ leave: { opacity: 0 },
+ });
+
+ const renderLoggedIn = () => {
+ if (width <= mediaDimensions.mobile) {
+ return (
+ setOpen(prev => !prev)}>
+ {transitions.map(({ item, key, props }) =>
+ item ? (
+
+ ) : (
+
+ )
+ )}
+
+ );
+ }
+ return (
+
+ );
+ };
+
+ const renderLoggedOut = () => (
+ <>
+
+ Faq
+
+
+ Terms
+
+
+ Privacy
+
+
+
+
+
+
+ >
+ );
+
+ const HeaderWrapper =
+ width <= mediaDimensions.mobile && !loggedIn ? ResponsiveLine : SingleLine;
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+ ThunderHub
+
+
+
+ {loggedIn ? renderLoggedIn() : renderLoggedOut()}
+
+
+
+
+ {open && width <= mediaDimensions.mobile && (
+
+ )}
+ >
+ );
+};
diff --git a/src/layouts/navigation/Navigation.tsx b/src/layouts/navigation/Navigation.tsx
new file mode 100644
index 00000000..80d692d5
--- /dev/null
+++ b/src/layouts/navigation/Navigation.tsx
@@ -0,0 +1,210 @@
+import React from 'react';
+import styled, { css } from 'styled-components';
+import { NodeInfo } from './nodeInfo/NodeInfo';
+import { SideSettings } from './sideSettings/SideSettings';
+import {
+ unSelectedNavButton,
+ navBackgroundColor,
+ navTextColor,
+ subCardColor,
+ cardBorderColor,
+ mediaWidths,
+} from '../../styles/Themes';
+import {
+ Home,
+ Cpu,
+ Server,
+ Settings,
+ Shield,
+ Crosshair,
+ GitPullRequest,
+ LinkIcon,
+ RepeatIcon,
+ Users,
+ CreditCard,
+} from '../../components/generic/Icons';
+import { useSettings } from '../../context/SettingsContext';
+import { useConnectionState } from '../../context/ConnectionContext';
+import { useRouter } from 'next/router';
+import { Link } from '../../components/link/Link';
+
+const NavigationStyle = styled.div`
+ grid-area: nav;
+ width: ${({ isOpen }: { isOpen: boolean }) => (isOpen ? '200px' : '60px')};
+
+ @media (${mediaWidths.mobile}) {
+ display: none;
+ }
+`;
+
+const StickyCard = styled.div`
+ position: -webkit-sticky;
+ position: sticky;
+ top: 16px;
+`;
+
+const LinkView = styled.div`
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ padding: 8px 0;
+`;
+
+const ButtonSection = styled.div`
+ width: 100%;
+ ${({ isOpen }: { isOpen: boolean }) =>
+ !isOpen &&
+ css`
+ margin: 8px 0;
+ `}
+`;
+
+const NavSeparation = styled.div`
+ margin-left: 8px;
+ font-size: 14px;
+`;
+
+interface NavProps {
+ selected: boolean;
+ isOpen?: boolean;
+}
+
+const NavButton = styled.div`
+ padding: 4px;
+ border-radius: 4px;
+ background: ${({ selected }: NavProps) => selected && navBackgroundColor};
+ display: flex;
+ align-items: center;
+ ${({ isOpen }: NavProps) => !isOpen && 'justify-content: center'};
+ width: 100%;
+ text-decoration: none;
+ margin: 4px 0;
+ color: ${({ selected }: NavProps) =>
+ selected ? navTextColor : unSelectedNavButton};
+
+ &:hover {
+ color: ${navTextColor};
+ background: ${navBackgroundColor};
+ }
+`;
+
+const BurgerRow = styled.div`
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+ overflow: scroll;
+ background: ${cardBorderColor};
+ margin: 0 -16px;
+ padding: 16px;
+`;
+
+const BurgerNav = styled.a`
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 16px 16px 8px;
+ border-radius: 4px;
+ text-decoration: none;
+ background: ${({ selected }: NavProps) => selected && subCardColor};
+ ${({ isOpen }: NavProps) => !isOpen && 'justify-content: center'};
+ color: ${({ selected }: NavProps) =>
+ selected ? navTextColor : unSelectedNavButton};
+`;
+
+const HOME = '/home';
+const PEERS = '/peers';
+const CHANNEL = '/channels';
+const BALANCE = '/balance';
+const TRANS = '/transactions';
+const FORWARDS = '/forwards';
+const CHAIN_TRANS = '/chain';
+const TOOLS = '/tools';
+const SETTINGS = '/settings';
+const FEES = '/fees';
+const TRADER = '/trading';
+
+interface NavigationProps {
+ isBurger?: boolean;
+ setOpen?: (state: boolean) => void;
+}
+
+export const Navigation = ({ isBurger, setOpen }: NavigationProps) => {
+ const { pathname } = useRouter();
+ const { sidebar, setSettings } = useSettings();
+ const { connected } = useConnectionState();
+
+ const renderNavButton = (
+ title: string,
+ link: string,
+ NavIcon: any,
+ open: boolean = true
+ ) => (
+
+
+
+ {open && {title} }
+
+
+ );
+
+ const renderBurgerNav = (title: string, link: string, NavIcon: any) => (
+
+ setOpen && setOpen(false)}
+ >
+
+ {title}
+
+
+ );
+
+ const renderLinks = () => (
+
+ {renderNavButton('Home', HOME, Home, sidebar)}
+ {renderNavButton('Peers', PEERS, Users, sidebar)}
+ {renderNavButton('Channels', CHANNEL, Cpu, sidebar)}
+ {renderNavButton('Balance', BALANCE, RepeatIcon, sidebar)}
+ {renderNavButton('Fees', FEES, Crosshair, sidebar)}
+ {renderNavButton('Transactions', TRANS, Server, sidebar)}
+ {renderNavButton('Forwards', FORWARDS, GitPullRequest, sidebar)}
+ {renderNavButton('Chain', CHAIN_TRANS, LinkIcon, sidebar)}
+ {renderNavButton('Tools', TOOLS, Shield, sidebar)}
+ {renderNavButton('P2P Trading', TRADER, CreditCard, sidebar)}
+ {renderNavButton('Settings', SETTINGS, Settings, sidebar)}
+
+ );
+
+ const renderBurger = () => (
+
+ {renderBurgerNav('Home', HOME, Home)}
+ {renderBurgerNav('Peers', PEERS, Users)}
+ {renderBurgerNav('Channels', CHANNEL, Cpu)}
+ {renderBurgerNav('Balance', BALANCE, RepeatIcon)}
+ {renderBurgerNav('Fees', FEES, Crosshair)}
+ {renderBurgerNav('Transactions', TRANS, Server)}
+ {renderBurgerNav('Forwards', FORWARDS, GitPullRequest)}
+ {renderBurgerNav('Chain', CHAIN_TRANS, LinkIcon)}
+ {renderBurgerNav('Tools', TOOLS, Shield)}
+ {renderBurgerNav('Trading', TRADER, CreditCard)}
+ {renderBurgerNav('Settings', SETTINGS, Settings)}
+
+ );
+
+ if (isBurger) {
+ return renderBurger();
+ }
+
+ return (
+
+
+
+ {connected && }
+ {renderLinks()}
+
+
+
+
+ );
+};
diff --git a/src/layouts/navigation/nodeInfo/NodeInfo.tsx b/src/layouts/navigation/nodeInfo/NodeInfo.tsx
new file mode 100644
index 00000000..3ebd5b41
--- /dev/null
+++ b/src/layouts/navigation/nodeInfo/NodeInfo.tsx
@@ -0,0 +1,278 @@
+import React from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import { GET_NODE_INFO } from '../../../graphql/query';
+import { useSettings } from '../../../context/SettingsContext';
+import {
+ Separation,
+ SingleLine,
+ SubTitle,
+ Sub4Title,
+} from '../../../components/generic/Styled';
+import {
+ QuestionIcon,
+ Zap,
+ Anchor,
+ Circle,
+} from '../../../components/generic/Icons';
+import { getTooltipType } from '../../../components/generic/Helpers';
+import { useAccount } from '../../../context/AccountContext';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { textColorMap, unSelectedNavButton } from '../../../styles/Themes';
+import ReactTooltip from 'react-tooltip';
+import styled from 'styled-components';
+import ScaleLoader from 'react-spinners/ScaleLoader';
+import { getPrice } from '../../../../src/components/price/Price';
+import { AnimatedNumber } from '../../../../src/components/animated/AnimatedNumber';
+import { useStatusState } from '../../../context/StatusContext';
+import { usePriceState } from '../../../context/PriceContext';
+
+const Closed = styled.div`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ width: 100%;
+`;
+
+const Margin = styled.div`
+ margin: 8px 0 2px;
+`;
+
+const Title = styled.div`
+ font-size: 18px;
+ font-weight: bold;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+`;
+
+const Info = styled.div`
+ font-size: 14px;
+ color: #bfbfbf;
+ border-bottom: 2px solid
+ ${({ bottomColor }: { bottomColor: string }) => bottomColor};
+`;
+
+const Balance = styled.div`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin: 2px 0;
+ padding: 0 5px;
+ cursor: default;
+`;
+
+const Alias = styled.div`
+ border-bottom: 2px solid
+ ${({ bottomColor }: { bottomColor: string }) => bottomColor};
+`;
+
+interface NodeInfoProps {
+ isOpen?: boolean;
+ isBurger?: boolean;
+}
+
+export const NodeInfo = ({ isOpen, isBurger }: NodeInfoProps) => {
+ const {
+ syncedToChain,
+ chainBalance,
+ chainPending,
+ channelBalance,
+ channelPending,
+ } = useStatusState();
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data } = useQuery(GET_NODE_INFO, {
+ variables: { auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ const { theme, currency } = useSettings();
+ const priceContext = usePriceState();
+ const format = getPrice(currency, priceContext);
+
+ const tooltipType = getTooltipType(theme);
+
+ if (loading || !data || !data.getNodeInfo) {
+ return (
+
+
+
+ );
+ }
+
+ const {
+ color,
+ active_channels_count,
+ closed_channels_count,
+ alias,
+ peers_count,
+ pending_channels_count,
+ version,
+ } = data.getNodeInfo;
+
+ const formatCB = format({ amount: chainBalance });
+ const formatPB = format({ amount: chainPending });
+ const formatCCB = format({ amount: channelBalance });
+ const formatPCB = format({ amount: channelPending });
+
+ if (isBurger) {
+ return (
+ <>
+
+ {alias}
+
+
+
+ Channels
+ {`${active_channels_count} / ${pending_channels_count} / ${closed_channels_count} / ${peers_count}`}
+
+
+
+ {channelPending > 0 ? (
+ `${formatCCB} / ${formatPCB}`
+ ) : (
+
+ )}
+
+
+
+ {chainPending > 0 ? (
+ `${formatCB} / ${formatPB}`
+ ) : (
+
+ )}
+
+ >
+ );
+ }
+
+ if (!isOpen) {
+ return (
+ <>
+
+
+
+ {(channelPending > 0 || chainPending > 0) && (
+
+
+
+ )}
+
+
+
+
+
+
+ {active_channels_count}
+ {pending_channels_count}
+ {closed_channels_count}
+ {peers_count}
+
+
+
+
+ {`Channel Balance: ${formatCCB}`}
+ {`Pending Channel Balance: ${formatPCB}`}
+ {`Chain Balance: ${formatCB}`}
+ {`Pending Chain Balance: ${formatPB}`}
+
+
+ {`Active Channels: ${active_channels_count}`}
+ {`Pending Channels: ${pending_channels_count}`}
+ {`Closed Channels: ${closed_channels_count}`}
+ {`Peers: ${peers_count}`}
+
+ >
+ );
+ }
+
+ return (
+ <>
+
+ {alias}
+ {isOpen && (
+
+ )}
+
+
+
+
+
+
+
+
+
+
+ {`${active_channels_count} / ${pending_channels_count} / ${closed_channels_count} / ${peers_count}`}
+
+
+ {syncedToChain ? 'Synced' : 'Not Synced'}
+
+
+
+
+
+ {`Channel Balance: ${formatCCB}`}
+ {`Pending Channel Balance: ${formatPCB}`}
+
+
+ {`Chain Balance: ${formatCB}`}
+ {`Pending Chain Balance: ${formatPB}`}
+
+
+ {`Active Channels: ${active_channels_count}`}
+ {`Pending Channels: ${pending_channels_count}`}
+ {`Closed Channels: ${closed_channels_count}`}
+ {`Peers: ${peers_count}`}
+
+ >
+ );
+};
diff --git a/src/layouts/navigation/sideSettings/SideSettings.tsx b/src/layouts/navigation/sideSettings/SideSettings.tsx
new file mode 100644
index 00000000..7832cc6e
--- /dev/null
+++ b/src/layouts/navigation/sideSettings/SideSettings.tsx
@@ -0,0 +1,194 @@
+import React from 'react';
+import { Separation, SingleLine } from '../../../components/generic/Styled';
+import { useSettings } from '../../../context/SettingsContext';
+import {
+ Sun,
+ Moon,
+ ChevronLeft,
+ ChevronRight,
+} from '../../../components/generic/Icons';
+import styled from 'styled-components';
+import {
+ progressBackground,
+ iconButtonHover,
+ inverseTextColor,
+ unSelectedNavButton,
+} from '../../../styles/Themes';
+
+const SelectedIcon = styled.div`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ outline: none;
+ width: 30px;
+ height: 30px;
+ border-radius: 100%;
+ margin: 0 5px;
+ cursor: pointer;
+
+ @media (min-width: 579px) {
+ &:hover {
+ background-color: ${iconButtonHover};
+ color: ${inverseTextColor};
+ }
+ }
+ background-color: ${({ selected }: { selected: boolean }) =>
+ selected ? progressBackground : ''};
+`;
+
+const Symbol = styled.div`
+ margin-top: 2px;
+ font-weight: bold;
+`;
+
+const IconRow = styled.div`
+ margin: 5px 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ ${({ center }: { center?: boolean }) => center && 'width: 100%'}
+`;
+
+const BurgerPadding = styled(SingleLine)`
+ margin: 16px 0;
+`;
+
+const currencyArray = ['sat', 'btc', 'EUR', 'USD'];
+const themeArray = ['light', 'dark'];
+const currencyMap: { [key: string]: string } = {
+ sat: 'S',
+ btc: '₿',
+ EUR: '€',
+ USD: '$',
+};
+const themeMap: { [key: string]: string } = {
+ light: Sun,
+ dark: Moon,
+};
+
+const getNextValue = (array: string[], current: string): string => {
+ const length = array.length;
+ const index = array.indexOf(current);
+
+ let value = '';
+ if (index + 1 === length) {
+ value = array[0];
+ } else {
+ value = array[index + 1];
+ }
+
+ return value;
+};
+
+interface SideSettingsProps {
+ isOpen?: boolean;
+ isBurger?: boolean;
+ setIsOpen?: (state: any) => void;
+}
+
+export const SideSettings = ({
+ isOpen,
+ isBurger,
+ setIsOpen,
+}: SideSettingsProps) => {
+ const { theme, currency, setSettings } = useSettings();
+
+ const renderIcon = (
+ type: string,
+ value: string,
+ text: string,
+ on: boolean = false,
+ Icon?: any
+ ) => (
+ {
+ localStorage.setItem(type, value);
+ type === 'currency' &&
+ setSettings({
+ currency:
+ isOpen || isBurger ? value : getNextValue(currencyArray, value),
+ });
+ type === 'theme' && setSettings({ theme: value });
+ }}
+ >
+ {type === 'currency' && {text} }
+ {type === 'theme' && }
+
+ );
+
+ const renderContent = () => {
+ if (!isOpen) {
+ return (
+ <>
+
+
+ {renderIcon('currency', currency, currencyMap[currency], true)}
+
+
+ {renderIcon(
+ 'theme',
+ getNextValue(themeArray, theme),
+ '',
+ true,
+ themeMap[getNextValue(themeArray, theme)]
+ )}
+
+ >
+ );
+ }
+ return (
+ <>
+
+
+ {renderIcon('currency', 'sat', 'S')}
+ {renderIcon('currency', 'btc', '₿')}
+ {renderIcon('currency', 'EUR', '€')}
+ {renderIcon('currency', 'USD', '$')}
+
+
+ {renderIcon('theme', 'light', '', false, Sun)}
+ {renderIcon('theme', 'dark', '', false, Moon)}
+
+ >
+ );
+ };
+
+ if (isBurger) {
+ return (
+
+
+ {renderIcon('currency', 'sat', 'S')}
+ {renderIcon('currency', 'btc', '₿')}
+ {renderIcon('currency', 'EUR', '€')}
+ {renderIcon('currency', 'USD', '$')}
+
+
+ {renderIcon('theme', 'light', '', false, Sun)}
+ {renderIcon('theme', 'dark', '', false, Moon)}
+
+
+ );
+ }
+
+ return (
+ <>
+ {renderContent()}
+ {setIsOpen && (
+
+ {
+ localStorage.setItem('sidebar', (!isOpen).toString());
+ setIsOpen({ sidebar: !isOpen });
+ }}
+ >
+ {isOpen ? : }
+
+
+ )}
+ >
+ );
+};
diff --git a/src/styles/FontStyles.css b/src/styles/FontStyles.css
new file mode 100644
index 00000000..f0bf700e
--- /dev/null
+++ b/src/styles/FontStyles.css
@@ -0,0 +1,48 @@
+@font-face {
+ font-family: 'Manrope';
+ font-style: normal;
+ font-weight: 900;
+ src: url('../../public/fonts/Manrope-ExtraBold.otf') format('opentype');
+}
+
+@font-face {
+ font-family: 'Manrope';
+ font-style: normal;
+ font-weight: 700;
+ src: url('../../public/fonts//Manrope-Bold.otf') format('opentype');
+}
+
+@font-face {
+ font-family: 'Manrope';
+ font-style: normal;
+ font-weight: 600;
+ src: url('../../public/fonts//Manrope-SemiBold.otf') format('opentype');
+}
+
+@font-face {
+ font-family: 'Manrope';
+ font-style: normal;
+ font-weight: 500;
+ src: url('../../public/fonts//Manrope-Medium.otf') format('opentype');
+}
+
+@font-face {
+ font-family: 'Manrope';
+ font-style: normal;
+ font-weight: 400;
+ src: url('../../public/fonts//Manrope-Regular.otf') format('opentype');
+}
+
+@font-face {
+ font-family: 'Manrope';
+ font-style: normal;
+ font-weight: 200;
+ src: url('../../public/fonts//Manrope-Light.otf') format('opentype');
+}
+
+@font-face {
+ font-family: 'Manrope';
+ font-style: normal;
+ font-weight: 100;
+ src: url('../../public/fonts//Manrope-ExtraLight.otf') format('opentype');
+}
diff --git a/client/src/styles/GlobalStyle.ts b/src/styles/GlobalStyle.ts
similarity index 96%
rename from client/src/styles/GlobalStyle.ts
rename to src/styles/GlobalStyle.ts
index a4f706e1..ab4e0802 100644
--- a/client/src/styles/GlobalStyle.ts
+++ b/src/styles/GlobalStyle.ts
@@ -12,6 +12,7 @@ export const GlobalStyles = createGlobalStyle`
body {
background: ${backgroundColor};
color: ${textColor};
+ /* color: ${textColor}; */
/* font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; */
font-family: Manrope;
text-rendering: optimizeLegibility;
diff --git a/client/src/styles/Themes.ts b/src/styles/Themes.ts
similarity index 54%
rename from client/src/styles/Themes.ts
rename to src/styles/Themes.ts
index ef6b44bb..d1d04d93 100644
--- a/client/src/styles/Themes.ts
+++ b/src/styles/Themes.ts
@@ -1,289 +1,289 @@
import theme from 'styled-theming';
export const themeColors = {
- white: '#fff',
- grey: '#f5f6f9',
- grey2: '#f0f2f8',
- grey3: '#e1e6ed',
- grey7: '#b0b3c7',
- grey8: '#4a5669',
- blue2: '#6284e4',
- blue3: '#5163ba',
- blue4: '#20263d',
- blue5: '#181c30',
- blue6: '#1a1f35',
- blue7: '#151727',
- black: '#212735',
+ white: '#fff',
+ grey: '#f5f6f9',
+ grey2: '#f0f2f8',
+ grey3: '#e1e6ed',
+ grey7: '#b0b3c7',
+ grey8: '#4a5669',
+ blue2: '#6284e4',
+ blue3: '#5163ba',
+ blue4: '#20263d',
+ blue5: '#181c30',
+ blue6: '#1a1f35',
+ blue7: '#151727',
+ black: '#212735',
};
export const chartColors = {
- darkyellow: '#ffd300',
- orange: '#ffa940',
- orange2: '#FD5F00',
- lightblue: '#1890ff',
- green: '#a0d911',
- purple: '#6938f1',
- red: 'red',
+ darkyellow: '#ffd300',
+ orange: '#ffa940',
+ orange2: '#FD5F00',
+ lightblue: '#1890ff',
+ green: '#a0d911',
+ purple: '#6938f1',
+ red: 'red',
};
export const fontColors = {
- white: '#fff',
- grey3: '#e1e6ed',
- grey4: '#6e7887',
- grey5: '#5e6575',
- grey6: '#667587',
- grey7: '#b0b3c7',
- grey8: '#4a5669',
- blue: '#ccd0e7',
- blue1: '#9197b9',
- blue2: '#6284e4',
- blue3: '#5163ba',
- black: '#212735',
+ white: '#fff',
+ grey3: '#e1e6ed',
+ grey4: '#6e7887',
+ grey5: '#5e6575',
+ grey6: '#667587',
+ grey7: '#b0b3c7',
+ grey8: '#4a5669',
+ blue: '#ccd0e7',
+ blue1: '#9197b9',
+ blue2: '#6284e4',
+ blue3: '#5163ba',
+ black: '#212735',
};
export const mediaDimensions = {
- mobile: 700,
+ mobile: 700,
};
export const mediaWidths = {
- mobile: `max-width: ${mediaDimensions.mobile}px`,
+ mobile: `max-width: ${mediaDimensions.mobile}px`,
};
// ---------------------------------------
// APP COLORS
// ---------------------------------------
export const backgroundColor = theme('mode', {
- light: themeColors.grey,
- dark: themeColors.blue5,
+ light: themeColors.grey,
+ dark: themeColors.blue5,
});
export const textColor = theme('mode', {
- light: fontColors.black,
- dark: fontColors.white,
+ light: fontColors.black,
+ dark: fontColors.white,
});
export const textColorMap: { [key: string]: string } = {
- light: fontColors.black,
- dark: fontColors.white,
+ light: fontColors.black,
+ dark: fontColors.white,
};
export const inverseTextColor = theme('mode', {
- light: fontColors.white,
- dark: fontColors.black,
+ light: fontColors.white,
+ dark: fontColors.black,
});
export const burgerColor = theme('mode', {
- light: themeColors.white,
- dark: themeColors.blue6,
+ light: themeColors.white,
+ dark: themeColors.blue6,
});
export const linkHighlight = theme('mode', {
- light: fontColors.blue3,
- dark: fontColors.blue3,
+ light: fontColors.blue3,
+ dark: fontColors.blue3,
});
export const separationColor = theme('mode', {
- light: themeColors.grey2,
- dark: themeColors.black,
+ light: themeColors.grey2,
+ dark: themeColors.black,
});
export const unSelectedNavButton = theme('mode', {
- light: 'grey',
- dark: 'grey',
+ light: 'grey',
+ dark: 'grey',
});
export const buttonBorderColor = theme('mode', {
- light: '#d9d9d9',
- dark: '#2e3245',
+ light: '#d9d9d9',
+ dark: '#2e3245',
});
// ---------------------------------------
// HOMEPAGE COLORS
// ---------------------------------------
export const headerColor = theme('mode', {
- light: themeColors.blue7,
- dark: themeColors.blue7,
+ light: themeColors.blue7,
+ dark: themeColors.blue7,
});
export const headerTextColor = theme('mode', {
- light: fontColors.white,
- dark: fontColors.white,
+ light: fontColors.white,
+ dark: fontColors.white,
});
export const homeBackgroundColor = theme('mode', {
- light: themeColors.grey,
- dark: themeColors.blue4,
+ light: themeColors.grey,
+ dark: themeColors.blue4,
});
export const homeBackgroundSecondColor = theme('mode', {
- light: themeColors.grey2,
- dark: themeColors.blue6,
+ light: themeColors.grey2,
+ dark: themeColors.blue6,
});
// ---------------------------------------
// CARD COLORS
// ---------------------------------------
export const cardColor = theme('mode', {
- light: themeColors.white,
- dark: themeColors.blue6,
+ light: themeColors.white,
+ dark: themeColors.blue6,
});
export const subCardColor = theme('mode', {
- light: themeColors.white,
- dark: themeColors.blue7,
+ light: themeColors.white,
+ dark: themeColors.blue7,
});
export const cardBorderColor = theme('mode', {
- light: themeColors.grey2,
- dark: themeColors.blue4,
+ light: themeColors.grey2,
+ dark: themeColors.blue4,
});
// ---------------------------------------
// BUTTON COLORS
// ---------------------------------------
export const colorButtonBackground = theme('mode', {
- light: themeColors.grey,
- dark: themeColors.blue7,
+ light: themeColors.grey,
+ dark: themeColors.blue7,
});
export const colorButtonBorder = theme('mode', {
- light: themeColors.blue3,
- dark: themeColors.blue3,
+ light: themeColors.blue3,
+ dark: themeColors.blue3,
});
export const colorButtonBorderTwo = theme('mode', {
- light: themeColors.grey2,
- dark: themeColors.blue7,
+ light: themeColors.grey2,
+ dark: themeColors.blue7,
});
export const disabledButtonBackground = theme('mode', {
- light: themeColors.grey2,
- dark: themeColors.blue7,
+ light: themeColors.grey2,
+ dark: themeColors.blue7,
});
export const disabledButtonBorder = theme('mode', {
- light: themeColors.grey,
- dark: themeColors.blue6,
+ light: themeColors.grey,
+ dark: themeColors.blue6,
});
export const disabledTextColor = theme('mode', {
- light: fontColors.grey7,
- dark: fontColors.grey8,
+ light: fontColors.grey7,
+ dark: fontColors.grey8,
});
export const hoverTextColor = theme('mode', {
- light: fontColors.white,
- dark: fontColors.white,
+ light: fontColors.white,
+ dark: fontColors.white,
});
// ---------------------------------------
// MULTI BUTTON COLORS
// ---------------------------------------
export const multiButtonColor = theme('mode', {
- light: themeColors.grey2,
- dark: themeColors.blue7,
+ light: themeColors.grey2,
+ dark: themeColors.blue7,
});
export const multiSelectColor = theme('mode', {
- light: fontColors.black,
- dark: fontColors.white,
+ light: fontColors.black,
+ dark: fontColors.white,
});
// ---------------------------------------
// NAVIGATION COLORS
// ---------------------------------------
export const navBackgroundColor = theme('mode', {
- light: themeColors.white,
- dark: themeColors.blue7,
+ light: themeColors.white,
+ dark: themeColors.blue7,
});
export const navTextColor = theme('mode', {
- light: fontColors.black,
- dark: fontColors.white,
+ light: fontColors.black,
+ dark: fontColors.white,
});
// ---------------------------------------
// INPUT COLORS
// ---------------------------------------
export const inputBackgroundColor = theme('mode', {
- light: themeColors.grey,
- dark: themeColors.blue5,
+ light: themeColors.grey,
+ dark: themeColors.blue5,
});
export const inputBorderColor = theme('mode', {
- light: themeColors.grey3,
- dark: themeColors.grey8,
+ light: themeColors.grey3,
+ dark: themeColors.grey8,
});
// ---------------------------------------
// ICON COLORS
// ---------------------------------------
export const iconButtonHover = theme('mode', {
- light: themeColors.blue3,
- dark: themeColors.grey,
+ light: themeColors.blue3,
+ dark: themeColors.grey,
});
export const smallLinkColor = theme('mode', {
- light: '#9254de',
- dark: '#adc6ff',
+ light: '#9254de',
+ dark: '#adc6ff',
});
// ---------------------------------------
// PROGRESS BAR COLORS
// ---------------------------------------
export const progressBackground = theme('mode', {
- light: themeColors.grey3,
- dark: themeColors.black,
+ light: themeColors.grey3,
+ dark: themeColors.black,
});
export const progressFirst = theme('mode', {
- light: chartColors.orange,
- dark: chartColors.orange,
+ light: chartColors.orange,
+ dark: chartColors.orange,
});
export const progressSecond = theme('mode', {
- light: chartColors.lightblue,
- dark: chartColors.lightblue,
+ light: chartColors.lightblue,
+ dark: chartColors.lightblue,
});
// ---------------------------------------
// CHART COLORS
// ---------------------------------------
export const chartLinkColor = theme('mode', {
- light: '#595959',
- dark: '#8c8c8c',
+ light: '#595959',
+ dark: '#8c8c8c',
});
export const chartAxisColor: { [key: string]: string } = {
- light: '#1b1c22',
- dark: 'white',
+ light: '#1b1c22',
+ dark: 'white',
};
export const chartGridColor: { [key: string]: string } = {
- light: '#e8e8e8',
- dark: '#595959',
+ light: '#e8e8e8',
+ dark: '#595959',
};
export const chartBarColor: { [key: string]: string } = {
- light: chartColors.purple,
- dark: chartColors.purple,
+ light: chartColors.purple,
+ dark: chartColors.purple,
};
// ---------------------------------------
// Liquidity Report Bar Colors
// ---------------------------------------
export const liquidityBarColor: { [key: string]: string } = {
- light: chartColors.green,
- dark: chartColors.green,
+ light: chartColors.green,
+ dark: chartColors.green,
};
// ---------------------------------------
// Flow Report Bar Colors
// ---------------------------------------
export const flowBarColor: { [key: string]: string } = {
- light: chartColors.orange2,
- dark: chartColors.orange2,
+ light: chartColors.orange2,
+ dark: chartColors.orange2,
};
export const flowBarColor2: { [key: string]: string } = {
- light: chartColors.darkyellow,
- dark: chartColors.darkyellow,
+ light: chartColors.darkyellow,
+ dark: chartColors.darkyellow,
};
diff --git a/src/utils/Helpers.tsx b/src/utils/Helpers.tsx
new file mode 100644
index 00000000..c8e60584
--- /dev/null
+++ b/src/utils/Helpers.tsx
@@ -0,0 +1,83 @@
+import numeral from 'numeral';
+
+const getValueString = (amount: number): string => {
+ if (amount >= 100000) {
+ return `${amount / 1000000}m`;
+ }
+ if (amount >= 1000) {
+ return `${amount / 1000}k`;
+ }
+ return `${amount}`;
+};
+
+interface GetNumberProps {
+ amount: string | number;
+ price: number;
+ symbol: string;
+ currency: string;
+ breakNumber?: boolean;
+}
+
+export const getValue = ({
+ amount,
+ price,
+ symbol,
+ currency,
+ breakNumber,
+}: GetNumberProps): string => {
+ let value: number = 0;
+ if (typeof amount === 'string') {
+ value = Number(amount);
+ } else {
+ value = amount;
+ }
+
+ if (currency === 'btc') {
+ if (!value) return '₿0.0';
+ const amountInBtc = value / 100000000;
+ return `₿${amountInBtc}`;
+ }
+ if (currency === 'sat') {
+ const breakAmount = breakNumber
+ ? getValueString(value)
+ : numeral(value).format('0,0');
+ return `${breakAmount} sats`;
+ }
+
+ const amountInFiat = (value / 100000000) * price;
+ return `${symbol}${numeral(amountInFiat).format('0,0.00')}`;
+};
+
+export const getPercent = (
+ local: number,
+ remote: number,
+ withDecimals?: boolean
+): number => {
+ const total = remote + local;
+ const percent = (local / total) * 100;
+
+ if (remote === 0 && local === 0) {
+ return 0;
+ }
+
+ if (withDecimals) {
+ return Math.round(percent * 100) / 100;
+ }
+
+ return Math.round(percent);
+};
+
+export const saveToPc = (jsonData: string, filename: string) => {
+ const fileData = jsonData;
+ const blob = new Blob([fileData], { type: 'text/plain' });
+ const url = URL.createObjectURL(blob);
+ const link = document.createElement('a');
+ link.download = `${filename}.txt`;
+ link.href = url;
+ link.click();
+};
+
+export const encode = (data: string): string =>
+ Buffer.from(data, 'binary').toString('base64');
+export const decode = (data: string): string =>
+ Buffer.from(data, 'base64').toString('binary');
diff --git a/src/utils/auth.ts b/src/utils/auth.ts
new file mode 100644
index 00000000..0b232587
--- /dev/null
+++ b/src/utils/auth.ts
@@ -0,0 +1,185 @@
+import base64url from 'base64url';
+import { saveAccounts } from './storage';
+import { v5 as uuidv5 } from 'uuid';
+
+const THUNDERHUB_NAMESPACE = '00000000-0000-0000-0000-000000000000';
+
+interface BuildProps {
+ name?: string;
+ host: string;
+ admin?: string;
+ viewOnly?: string;
+ cert?: string;
+ accounts: any;
+}
+
+export const saveUserAuth = ({
+ name = '',
+ host,
+ admin = '',
+ viewOnly = '',
+ cert = '',
+ accounts,
+}: BuildProps) => {
+ const id = getAccountId(host, viewOnly, admin, cert);
+ const newAccount = {
+ name,
+ host,
+ admin,
+ viewOnly,
+ cert,
+ id,
+ };
+
+ const newAccounts = [...accounts, newAccount];
+ saveAccounts(newAccounts);
+};
+
+export const getAccountId = (
+ host: string = '',
+ viewOnly: string = '',
+ admin: string = '',
+ cert: string = ''
+) =>
+ uuidv5(
+ `${host}-${viewOnly}-${admin !== '' ? 1 : 0}-${cert}`,
+ THUNDERHUB_NAMESPACE
+ );
+
+export const saveSessionAuth = (sessionAdmin: string) =>
+ sessionStorage.setItem('session', sessionAdmin);
+
+export const getAuth = (account?: string) => {
+ const accounts = JSON.parse(localStorage.getItem('accounts') || '[]');
+ const currentActive = Math.max(
+ Number(account ?? (localStorage.getItem('active') || '0')),
+ 0
+ );
+ const sessionAdmin = sessionStorage.getItem('session') || '';
+
+ const accountsLength = accounts.length;
+
+ const active =
+ accountsLength > 0 && currentActive >= accountsLength ? 0 : currentActive;
+
+ const defaultAccount = {
+ name: '',
+ host: '',
+ admin: '',
+ viewOnly: '',
+ cert: '',
+ id: '',
+ };
+
+ const activeAccount =
+ accountsLength > 0 && active < accountsLength
+ ? accounts[active]
+ : defaultAccount;
+
+ const { name, host, admin, viewOnly, cert, id } = activeAccount;
+ const currentId =
+ id ??
+ uuidv5(
+ `${host}-${viewOnly}-${admin !== '' ? 1 : 0}-${cert}`,
+ THUNDERHUB_NAMESPACE
+ );
+ const loggedIn = host !== '' && (viewOnly !== '' || sessionAdmin !== '');
+
+ return {
+ name,
+ host,
+ admin,
+ viewOnly,
+ cert,
+ id: currentId,
+ accounts,
+ loggedIn,
+ };
+};
+
+export const getAuthLnd = (lndconnect: string) => {
+ const auth = lndconnect.replace('lndconnect', 'https');
+
+ let url;
+
+ try {
+ url = new URL(auth);
+ } catch (error) {
+ return {
+ cert: '',
+ macaroon: '',
+ socket: '',
+ };
+ }
+
+ const cert = url.searchParams.get('cert') || '';
+ const macaroon = url.searchParams.get('macaroon') || '';
+ const socket = url.host;
+
+ return {
+ cert: base64url.toBase64(cert),
+ macaroon: base64url.toBase64(macaroon),
+ socket,
+ };
+};
+
+export const getBase64CertfromDerFormat = (base64: string) => {
+ if (!base64) return null;
+
+ const prefix = '-----BEGIN CERTIFICATE-----\n';
+ const postfix = '-----END CERTIFICATE-----';
+ const pem = base64.match(/.{0,64}/g) || [];
+ const pemString = pem.join('\n');
+ const pemComplete = prefix + pemString + postfix;
+ const pemText = base64url.encode(pemComplete);
+
+ return pemText;
+};
+
+const emptyObject = {
+ cert: undefined,
+ admin: undefined,
+ viewOnly: undefined,
+ host: undefined,
+};
+
+export const getConfigLnd = (json: string) => {
+ const parsedJson = JSON.parse(json);
+
+ const config = parsedJson.configurations;
+
+ if (config && config.length >= 1) {
+ const cert = config[0].certificateThumbprint || '';
+ const admin = config[0].adminMacaroon;
+ const viewOnly = config[0].readonlyMacaroon;
+ const host = config[0].host;
+ const port = config[0].port;
+
+ return {
+ cert,
+ admin,
+ viewOnly,
+ host: `${host}:${port}`,
+ };
+ }
+
+ return emptyObject;
+};
+
+export const getQRConfig = (json: string) => {
+ const config = JSON.parse(json);
+
+ if (config) {
+ const { name = '', cert = '', admin, viewOnly, host } = config;
+
+ return {
+ name,
+ cert,
+ admin,
+ viewOnly,
+ host,
+ };
+ }
+
+ return { ...emptyObject, name: undefined };
+};
diff --git a/src/utils/error.tsx b/src/utils/error.tsx
new file mode 100644
index 00000000..a7f28cdb
--- /dev/null
+++ b/src/utils/error.tsx
@@ -0,0 +1,20 @@
+import React, { ReactNode } from 'react';
+
+export const getErrorContent = (error: any): ReactNode => {
+ const errors = error.graphQLErrors.map(x => x.message);
+
+ const renderMessage = errors.map((error, i) => {
+ try {
+ const errorMsg = JSON.parse(error);
+ return (
+ {`${errorMsg.details} [${errorMsg.msg}/${errorMsg.code}]`}
+ );
+ } catch (e) {
+ return error;
+ }
+ });
+
+ return {renderMessage}
;
+};
diff --git a/src/utils/storage.ts b/src/utils/storage.ts
new file mode 100644
index 00000000..0636bc57
--- /dev/null
+++ b/src/utils/storage.ts
@@ -0,0 +1,28 @@
+export const saveAccounts = (accounts: any[]) => {
+ localStorage.setItem('accounts', JSON.stringify(accounts));
+};
+
+export const deleteAccountPermissions = (
+ id: string,
+ accounts: any[],
+ admin?: boolean
+): void => {
+ const changedAccounts = [...accounts];
+ changedAccounts.find((account, index) => {
+ if (account.id === id) {
+ if (admin) {
+ changedAccounts[index] = { ...account, viewOnly: '' };
+ } else {
+ changedAccounts[index] = { ...account, admin: '' };
+ }
+ return true;
+ }
+ return false;
+ });
+ saveAccounts(changedAccounts);
+};
+
+export const deleteStorage = () => {
+ localStorage.clear();
+ sessionStorage.clear();
+};
diff --git a/src/views/balance/Balance.styled.tsx b/src/views/balance/Balance.styled.tsx
new file mode 100644
index 00000000..5359088e
--- /dev/null
+++ b/src/views/balance/Balance.styled.tsx
@@ -0,0 +1,46 @@
+import styled from 'styled-components';
+import { mediaWidths } from '../../styles/Themes';
+
+export const HopCard = styled.div`
+ margin-left: 16px;
+`;
+
+export const CardPadding = styled.div`
+ @media (${mediaWidths.mobile}) {
+ padding: 16px 0;
+ }
+`;
+
+export const Padding = styled.div`
+ padding-right: 8px;
+`;
+
+export const CirclePadding = styled(Padding)`
+ display: flex;
+ align-items: center;
+`;
+
+export const ChannelColumnSection = styled.div`
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ flex-wrap: wrap;
+
+ @media (${mediaWidths.mobile}) {
+ min-width: unset;
+ width: 100%;
+ }
+`;
+
+export const ChannelLineSection = styled.div`
+ display: flex;
+ align-items: center;
+ max-width: 300px;
+
+ @media (${mediaWidths.mobile}) {
+ max-width: unset;
+ justify-content: center;
+ width: 100%;
+ padding-bottom: 8px;
+ }
+`;
diff --git a/src/views/balance/BalanceCard.tsx b/src/views/balance/BalanceCard.tsx
new file mode 100644
index 00000000..64fa83b4
--- /dev/null
+++ b/src/views/balance/BalanceCard.tsx
@@ -0,0 +1,110 @@
+import React from 'react';
+import {
+ SubCard,
+ SingleLine,
+ DarkSubTitle,
+ ResponsiveLine,
+} from '../../components/generic/Styled';
+import { MainInfo } from '../../components/generic/CardGeneric';
+import { Circle, ChevronRight, XSvg } from '../../components/generic/Icons';
+import { getPercent } from '../../utils/Helpers';
+import { Price } from '../../components/price/Price';
+import { themeColors, chartColors } from '../../styles/Themes';
+import {
+ ChannelColumnSection,
+ Padding,
+ ChannelLineSection,
+ CirclePadding,
+} from './Balance.styled';
+import numeral from 'numeral';
+import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
+
+type BalanceCardProps = {
+ index: number;
+ channel: any;
+ withArrow?: boolean;
+ withColor?: boolean;
+ callback?: () => void;
+ closeCallback?: () => void;
+};
+
+const getColor = (balance: number) => {
+ const difference = Math.abs(balance * 100 - 50);
+
+ switch (true) {
+ case difference <= 5:
+ return chartColors.green;
+ case difference <= 10:
+ return chartColors.darkyellow;
+ case difference <= 15:
+ return chartColors.orange;
+ case difference <= 20:
+ return chartColors.orange2;
+ default:
+ return chartColors.red;
+ }
+};
+
+export const BalanceCard = ({
+ index,
+ channel,
+ withArrow,
+ withColor,
+ callback,
+ closeCallback,
+}: BalanceCardProps) => {
+ const { partner_node_info, local_balance, remote_balance, id } = channel;
+ const { alias } = partner_node_info;
+
+ const balancedness = getPercent(remote_balance, local_balance) / 100;
+ const formatBalance = numeral(balancedness).format('0,0.00');
+
+ const props = withColor ? { color: themeColors.blue3 } : {};
+
+ return (
+
+ callback && callback()}>
+
+
+ {alias === '' ? `Unknown - ${id}` : `${alias} - ${id}`}
+
+
+
+
+ Local
+
+
+
+
+
+
+ Remote
+
+
+
+
+
+
+ Balance
+
+ {formatBalance}
+
+
+
+
+
+
+
+ {withArrow && }
+ {closeCallback && (
+
+
+
+ )}
+
+
+
+
+
+ );
+};
diff --git a/src/views/balance/BalanceRoute.tsx b/src/views/balance/BalanceRoute.tsx
new file mode 100644
index 00000000..1326df6e
--- /dev/null
+++ b/src/views/balance/BalanceRoute.tsx
@@ -0,0 +1,151 @@
+import React from 'react';
+import {
+ SubCard,
+ Sub4Title,
+ Separation,
+ SingleLine,
+} from '../../components/generic/Styled';
+import { useMutation, useLazyQuery } from '@apollo/react-hooks';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../utils/error';
+import { themeColors, chartColors } from '../../styles/Themes';
+import { renderLine } from '../../components/generic/Helpers';
+import { HopCard } from './Balance.styled';
+import { SecureButton } from '../../components/buttons/secureButton/SecureButton';
+import { PAY_VIA_ROUTE } from '../../graphql/mutation';
+import { GET_ROUTES } from '../../graphql/query';
+import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
+import { Price } from '../../components/price/Price';
+import { getPercent } from '../../utils/Helpers';
+import { AdminSwitch } from '../../components/adminSwitch/AdminSwitch';
+
+type BalancedRouteProps = {
+ incoming: any;
+ outgoing: any;
+ amount: number;
+ maxFee?: number;
+ auth: {};
+ blocked: boolean;
+ setBlocked: () => void;
+ callback: () => void;
+};
+
+export const BalanceRoute = ({
+ incoming,
+ outgoing,
+ amount,
+ maxFee,
+ auth,
+ blocked,
+ setBlocked,
+ callback,
+}: BalancedRouteProps) => {
+ const [getRoute, { loading, data, called }] = useLazyQuery(GET_ROUTES, {
+ fetchPolicy: 'no-cache',
+ onError: error => {
+ callback();
+ toast.error(getErrorContent(error));
+ },
+ });
+
+ const canShow = (): boolean =>
+ incoming && outgoing && amount && data && data.getRoutes && blocked;
+
+ const [payRoute, { loading: loadingP }] = useMutation(PAY_VIA_ROUTE, {
+ onError: error => {
+ callback();
+ toast.error(getErrorContent(error));
+ },
+ onCompleted: () => {
+ callback();
+ toast.success('Balancing finished');
+ },
+ refetchQueries: ['GetChannels'],
+ });
+
+ const renderHop = (hop: any, index: number) => (
+
+ {renderLine('Channel', hop.channel)}
+ {renderLine('Fee', hop.fee)}
+
+ );
+
+ const renderGetRoute = () => (
+ {
+ setBlocked();
+ getRoute({
+ variables: {
+ auth,
+ outgoing: outgoing.id,
+ incoming: incoming.partner_public_key,
+ tokens: amount,
+ ...(maxFee && { maxFee }),
+ },
+ });
+ }}
+ >
+ {called ? 'Get Another Route' : 'Get Route'}
+
+ );
+
+ const renderRoute = () => {
+ if (canShow()) {
+ const route = JSON.parse(data.getRoutes);
+ return (
+ <>
+ Route
+
+ {renderLine('Total Tokens', )}
+ {renderLine(
+ 'Fee %',
+ `${getPercent(route.fee, route.tokens - route.fee, true)} %`
+ )}
+ {renderLine('Fee', `${route.fee} sats`)}
+ {renderLine('Confidence', route.confidence)}
+ {renderLine('Hops', route.hops.length)}
+
+ {route.hops.map((hop: any, index: number) =>
+ renderLine(`${index + 1}`, renderHop(hop, index), index)
+ )}
+
+ >
+ );
+ }
+ return null;
+ };
+
+ const renderButton = () => {
+ if (canShow()) {
+ return (
+
+
+ Reset
+
+
+ Balance Channel
+
+
+ );
+ }
+ return null;
+ };
+
+ return (
+ <>
+ {renderGetRoute()}
+ {renderRoute()}
+ {renderButton()}
+ >
+ );
+};
diff --git a/src/views/chain/transactions/ChainTransactions.tsx b/src/views/chain/transactions/ChainTransactions.tsx
new file mode 100644
index 00000000..e0f51928
--- /dev/null
+++ b/src/views/chain/transactions/ChainTransactions.tsx
@@ -0,0 +1,49 @@
+import React, { useState } from 'react';
+import {
+ SubTitle,
+ Card,
+ CardWithTitle,
+} from '../../../components/generic/Styled';
+import { useAccount } from '../../../context/AccountContext';
+import { GET_CHAIN_TRANSACTIONS } from '../../../graphql/query';
+import { useQuery } from '@apollo/react-hooks';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { LoadingCard } from '../../../components/loading/LoadingCard';
+import { TransactionsCard } from './TransactionsCard';
+
+export const ChainTransactions = () => {
+ const [indexOpen, setIndexOpen] = useState(0);
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data } = useQuery(GET_CHAIN_TRANSACTIONS, {
+ variables: { auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ if (loading || !data || !data.getChainTransactions) {
+ return ;
+ }
+
+ return (
+
+ Chain Transactions
+
+ {data.getChainTransactions.map((transaction: any, index: number) => (
+
+ ))}
+
+
+ );
+};
diff --git a/src/views/chain/transactions/TransactionsCard.tsx b/src/views/chain/transactions/TransactionsCard.tsx
new file mode 100644
index 00000000..ccedba81
--- /dev/null
+++ b/src/views/chain/transactions/TransactionsCard.tsx
@@ -0,0 +1,97 @@
+import React from 'react';
+import {
+ Separation,
+ SubCard,
+ SingleLine,
+ DarkSubTitle,
+ ResponsiveLine,
+} from '../../../components/generic/Styled';
+import { MainInfo } from '../../../components/generic/CardGeneric';
+import {
+ getDateDif,
+ getFormatDate,
+ renderLine,
+} from '../../../components/generic/Helpers';
+import styled from 'styled-components';
+import { getPrice } from '../../../components/price/Price';
+import { useSettings } from '../../../context/SettingsContext';
+import { usePriceState } from '../../../context/PriceContext';
+
+const AddMargin = styled.div`
+ margin-right: 10px;
+`;
+
+interface TransactionsCardProps {
+ transaction: any;
+ index: number;
+ setIndexOpen: (index: number) => void;
+ indexOpen: number;
+}
+
+export const TransactionsCard = ({
+ transaction,
+ index,
+ setIndexOpen,
+ indexOpen,
+}: TransactionsCardProps) => {
+ const { currency } = useSettings();
+ const priceContext = usePriceState();
+ const format = getPrice(currency, priceContext);
+
+ const {
+ block_id,
+ confirmation_count,
+ confirmation_height,
+ created_at,
+ fee,
+ id,
+ output_addresses,
+ tokens,
+ } = transaction;
+
+ const formatAmount = format({ amount: tokens });
+
+ const handleClick = () => {
+ if (indexOpen === index) {
+ setIndexOpen(0);
+ } else {
+ setIndexOpen(index);
+ }
+ };
+
+ const renderDetails = () => {
+ return (
+ <>
+
+ {renderLine('Transaction Id: ', id)}
+ {renderLine('Block Id: ', block_id)}
+ {renderLine('Confirmations: ', confirmation_count)}
+ {renderLine('Confirmation Height: ', confirmation_height)}
+ {renderLine('Fee: ', fee)}
+ {renderLine('Output Addresses: ', output_addresses.length)}
+ {output_addresses.map((address: any, index: number) =>
+ renderLine(`${index + 1}`, address, `${index}`)
+ )}
+ >
+ );
+ };
+
+ return (
+
+ handleClick()}>
+
+ {`${
+ fee !== null ? 'Sent' : 'Received'
+ }: ${formatAmount}`}
+
+
+ {`(${getDateDif(created_at)} ago)`}
+
+ {getFormatDate(created_at)}
+
+
+
+ {index === indexOpen && renderDetails()}
+
+ );
+};
diff --git a/src/views/chain/utxos/ChainUtxos.tsx b/src/views/chain/utxos/ChainUtxos.tsx
new file mode 100644
index 00000000..36f37e60
--- /dev/null
+++ b/src/views/chain/utxos/ChainUtxos.tsx
@@ -0,0 +1,49 @@
+import React, { useState } from 'react';
+import {
+ SubTitle,
+ Card,
+ CardWithTitle,
+} from '../../../components/generic/Styled';
+import { useAccount } from '../../../context/AccountContext';
+import { GET_UTXOS } from '../../../graphql/query';
+import { useQuery } from '@apollo/react-hooks';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { LoadingCard } from '../../../components/loading/LoadingCard';
+import { UtxoCard } from './UtxoCard';
+
+export const ChainUtxos = () => {
+ const [indexOpen, setIndexOpen] = useState(0);
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data } = useQuery(GET_UTXOS, {
+ variables: { auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ if (loading || !data || !data.getUtxos) {
+ return ;
+ }
+
+ return (
+
+ Unspent Utxos
+
+ {data.getUtxos.map((utxo: any, index: number) => (
+
+ ))}
+
+
+ );
+};
diff --git a/src/views/chain/utxos/UtxoCard.tsx b/src/views/chain/utxos/UtxoCard.tsx
new file mode 100644
index 00000000..eae7d8e8
--- /dev/null
+++ b/src/views/chain/utxos/UtxoCard.tsx
@@ -0,0 +1,68 @@
+import React from 'react';
+import { Separation, SubCard } from '../../../components/generic/Styled';
+import { MainInfo } from '../../../components/generic/CardGeneric';
+import { renderLine } from '../../../components/generic/Helpers';
+import { getPrice } from '../../../components/price/Price';
+import { useSettings } from '../../../context/SettingsContext';
+import { usePriceState } from '../../../context/PriceContext';
+
+interface TransactionsCardProps {
+ utxo: any;
+ index: number;
+ setIndexOpen: (index: number) => void;
+ indexOpen: number;
+}
+
+export const UtxoCard = ({
+ utxo,
+ index,
+ setIndexOpen,
+ indexOpen,
+}: TransactionsCardProps) => {
+ const { currency } = useSettings();
+ const priceContext = usePriceState();
+ const format = getPrice(currency, priceContext);
+
+ const {
+ address,
+ address_format,
+ confirmation_count,
+ output_script,
+ tokens,
+ transaction_id,
+ transaction_vout,
+ } = utxo;
+
+ const formatAmount = format({ amount: tokens });
+
+ const handleClick = () => {
+ if (indexOpen === index) {
+ setIndexOpen(0);
+ } else {
+ setIndexOpen(index);
+ }
+ };
+
+ const renderDetails = () => {
+ return (
+ <>
+
+ {renderLine('Address Format:', address_format)}
+ {renderLine('Confirmations: ', confirmation_count)}
+ {renderLine('Output Script: ', output_script)}
+ {renderLine('Transaction Id: ', transaction_id)}
+ {renderLine('Transaction Vout: ', transaction_vout)}
+ >
+ );
+ };
+
+ return (
+
+ handleClick()}>
+ {renderLine('Address', address)}
+ {renderLine('Amount', formatAmount)}
+
+ {index === indexOpen && renderDetails()}
+
+ );
+};
diff --git a/src/views/channels/channels/ChannelCard.tsx b/src/views/channels/channels/ChannelCard.tsx
new file mode 100644
index 00000000..b1c4d7c9
--- /dev/null
+++ b/src/views/channels/channels/ChannelCard.tsx
@@ -0,0 +1,232 @@
+import React, { useState } from 'react';
+import { getPercent } from '../../../utils/Helpers';
+import {
+ Progress,
+ ProgressBar,
+ NodeTitle,
+ StatusLine,
+ MainInfo,
+} from '../../../components/generic/CardGeneric';
+import ReactTooltip from 'react-tooltip';
+import {
+ SubCard,
+ Separation,
+ Sub4Title,
+ RightAlign,
+ ResponsiveLine,
+ ResponsiveSingle,
+ ResponsiveCol,
+} from '../../../components/generic/Styled';
+import { useSettings } from '../../../context/SettingsContext';
+import {
+ getStatusDot,
+ getTooltipType,
+ getFormatDate,
+ getDateDif,
+ renderLine,
+ getTransactionLink,
+ getNodeLink,
+} from '../../../components/generic/Helpers';
+import Modal from '../../../components/modal/ReactModal';
+import { CloseChannel } from '../../../components/modal/closeChannel/CloseChannel';
+import styled from 'styled-components';
+import { AdminSwitch } from '../../../components/adminSwitch/AdminSwitch';
+import { DownArrow, UpArrow, EyeOff } from '../../../components/generic/Icons';
+import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
+import { getPrice } from '../../../components/price/Price';
+import { usePriceState } from '../../../context/PriceContext';
+
+const IconPadding = styled.div`
+ margin-left: 16px;
+ margin-right: 8px;
+`;
+
+const getSymbol = (status: boolean) => {
+ return status ? : ;
+};
+
+const getPrivate = (status: boolean) => {
+ return status && ;
+};
+
+interface ChannelCardProps {
+ channelInfo: any;
+ index: number;
+ setIndexOpen: (index: number) => void;
+ indexOpen: number;
+}
+
+export const ChannelCard = ({
+ channelInfo,
+ index,
+ setIndexOpen,
+ indexOpen,
+}: ChannelCardProps) => {
+ const [modalOpen, setModalOpen] = useState(false);
+
+ const { theme, currency } = useSettings();
+ const priceContext = usePriceState();
+ const format = getPrice(currency, priceContext);
+
+ const tooltipType = getTooltipType(theme);
+
+ const {
+ capacity,
+ commit_transaction_fee,
+ commit_transaction_weight,
+ id,
+ is_active,
+ is_closing,
+ is_opening,
+ is_partner_initiated,
+ is_private,
+ is_static_remote_key,
+ local_balance,
+ local_reserve,
+ partner_public_key,
+ received,
+ remote_balance,
+ remote_reserve,
+ sent,
+ time_offline,
+ time_online,
+ transaction_id,
+ transaction_vout,
+ unsettled_balance,
+ partner_node_info,
+ } = channelInfo;
+
+ const {
+ alias,
+ capacity: partnerNodeCapacity,
+ channel_count,
+ color: nodeColor,
+ updated_at,
+ } = partner_node_info;
+
+ const formatBalance = format({ amount: capacity });
+ const formatLocal = format({ amount: local_balance });
+ const formatRemote = format({ amount: remote_balance });
+ const formatReceived = format({ amount: received });
+ const formatSent = format({ amount: sent });
+ const commitFee = format({ amount: commit_transaction_fee });
+ const commitWeight = format({ amount: commit_transaction_weight });
+ const localReserve = format({ amount: local_reserve });
+ const remoteReserve = format({ amount: remote_reserve });
+ const nodeCapacity = format({ amount: partnerNodeCapacity });
+
+ const handleClick = () => {
+ if (indexOpen === index) {
+ setIndexOpen(0);
+ } else {
+ setIndexOpen(index);
+ }
+ };
+
+ const renderDetails = () => {
+ return (
+ <>
+
+ {renderLine(
+ 'Balancedness:',
+ getPercent(local_balance, remote_balance) / 100
+ )}
+ {renderLine('Local Balance:', formatLocal)}
+ {renderLine('Remote Balance:', formatRemote)}
+ {renderLine('Received:', formatReceived)}
+ {renderLine('Sent:', formatSent)}
+ {renderLine('Node Public Key:', getNodeLink(partner_public_key))}
+ {renderLine('Transaction Id:', getTransactionLink(transaction_id))}
+ {renderLine('Channel Id:', id)}
+ {renderLine('Commit Fee:', commitFee)}
+ {renderLine('Commit Weight:', commitWeight)}
+ {renderLine('Is Static Remote Key:', is_static_remote_key)}
+ {renderLine('Local Reserve:', localReserve)}
+ {renderLine('Remote Reserve:', remoteReserve)}
+ {renderLine('Time Offline:', time_offline)}
+ {renderLine('Time Online:', time_online)}
+ {renderLine('Transaction Vout:', transaction_vout)}
+ {renderLine('Unsettled Balance:', unsettled_balance)}
+ Partner Node Info
+ {renderLine('Node Capacity:', nodeCapacity)}
+ {renderLine('Channel Count:', channel_count)}
+ {renderLine(
+ 'Last Update:',
+ `${getDateDif(updated_at)} ago (${getFormatDate(updated_at)})`
+ )}
+
+
+
+ setModalOpen(true)}
+ >
+ Close Channel
+
+
+
+ >
+ );
+ };
+
+ return (
+
+ handleClick()}>
+
+ {getStatusDot(is_active, 'active')}
+ {getStatusDot(is_opening, 'opening')}
+ {getStatusDot(is_closing, 'closing')}
+
+
+
+ {alias ? alias : 'Unknown'}
+
+
+ {formatBalance}
+
+ {getPrivate(is_private)}
+ {getSymbol(is_partner_initiated)}
+
+
+
+
+
+
+
+
+
+
+
+
+ {index === indexOpen && renderDetails()}
+
+ {`Local Balance: ${formatLocal}`}
+ {`Remote Balance: ${formatRemote}`}
+
+
+ {`Received: ${formatReceived}`}
+ {`Sent: ${formatSent}`}
+
+ setModalOpen(false)}>
+
+
+
+ );
+};
diff --git a/src/views/channels/channels/Channels.tsx b/src/views/channels/channels/Channels.tsx
new file mode 100644
index 00000000..4801ef77
--- /dev/null
+++ b/src/views/channels/channels/Channels.tsx
@@ -0,0 +1,43 @@
+import React, { useState } from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import { GET_CHANNELS } from '../../../graphql/query';
+import { Card } from '../../../components/generic/Styled';
+import { ChannelCard } from './ChannelCard';
+import { useAccount } from '../../../context/AccountContext';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { LoadingCard } from '../../../components/loading/LoadingCard';
+
+export const Channels = () => {
+ const [indexOpen, setIndexOpen] = useState(0);
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data } = useQuery(GET_CHANNELS, {
+ variables: { auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ if (loading || !data || !data.getChannels) {
+ return ;
+ }
+
+ return (
+
+ {data.getChannels.map((channel: any, index: number) => (
+
+ ))}
+
+ );
+};
diff --git a/src/views/channels/closedChannels/ClosedCard.tsx b/src/views/channels/closedChannels/ClosedCard.tsx
new file mode 100644
index 00000000..76df5605
--- /dev/null
+++ b/src/views/channels/closedChannels/ClosedCard.tsx
@@ -0,0 +1,133 @@
+import React from 'react';
+import { NodeTitle, MainInfo } from '../../../components/generic/CardGeneric';
+import {
+ SubCard,
+ Separation,
+ SingleLine,
+ DarkSubTitle,
+ ResponsiveLine,
+} from '../../../components/generic/Styled';
+import {
+ getTransactionLink,
+ renderLine,
+ getNodeLink,
+} from '../../../components/generic/Helpers';
+import styled from 'styled-components';
+import { Price } from '../../../components/price/Price';
+
+const Padding = styled.div`
+ padding-left: 8px;
+`;
+
+interface PendingCardProps {
+ channelInfo: any;
+ index: number;
+ setIndexOpen: (index: number) => void;
+ indexOpen: number;
+}
+
+const Column = styled.div`
+ display: flex;
+ flex-direction: column;
+ flex-basis: 30%;
+ width: 100%;
+`;
+
+export const ClosedCard = ({
+ channelInfo,
+ index,
+ setIndexOpen,
+ indexOpen,
+}: PendingCardProps) => {
+ const {
+ capacity,
+ close_confirm_height,
+ close_transaction_id,
+ final_local_balance,
+ final_time_locked_balance,
+ id,
+ is_breach_close,
+ is_cooperative_close,
+ is_funding_cancel,
+ is_local_force_close,
+ is_remote_force_close,
+ partner_public_key,
+ transaction_id,
+ transaction_vout,
+ partner_node_info,
+ } = channelInfo;
+
+ const { alias, color: nodeColor } = partner_node_info;
+
+ const formatCapacity = ;
+
+ const getCloseType = (): string => {
+ const types: string[] = [];
+
+ if (is_breach_close) {
+ types.push('Breach');
+ }
+ if (is_cooperative_close) {
+ types.push('Cooperative');
+ }
+ if (is_funding_cancel) {
+ types.push('Funding Cancel');
+ }
+ if (is_local_force_close) {
+ types.push('Local Force Close');
+ }
+ if (is_remote_force_close) {
+ types.push('Remote Force Close');
+ }
+
+ return types.join(', ');
+ };
+
+ const handleClick = () => {
+ if (indexOpen === index) {
+ setIndexOpen(0);
+ } else {
+ setIndexOpen(index);
+ }
+ };
+
+ const renderDetails = () => {
+ return (
+ <>
+
+ {renderLine('Channel Id:', id)}
+ {renderLine('Node Public Key:', getNodeLink(partner_public_key))}
+ {renderLine('Transaction Id:', getTransactionLink(transaction_id))}
+ {renderLine('Transaction Vout:', transaction_vout)}
+ {renderLine(
+ 'Close Transaction Id:',
+ getTransactionLink(close_transaction_id)
+ )}
+ {renderLine('Close Confirm Height:', close_confirm_height)}
+ {renderLine('Final Local Balance:', final_local_balance)}
+ {renderLine('Final Time Lock Balance:', final_time_locked_balance)}
+ >
+ );
+ };
+
+ return (
+
+ handleClick()}>
+
+ {alias ? alias : 'Unknown'}
+
+
+ Size:
+ {formatCapacity}
+
+
+ Close Type:
+ {getCloseType()}
+
+
+
+
+ {index === indexOpen && renderDetails()}
+
+ );
+};
diff --git a/src/views/channels/closedChannels/ClosedChannels.tsx b/src/views/channels/closedChannels/ClosedChannels.tsx
new file mode 100644
index 00000000..ac815b8f
--- /dev/null
+++ b/src/views/channels/closedChannels/ClosedChannels.tsx
@@ -0,0 +1,43 @@
+import React, { useState } from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import { GET_CLOSED_CHANNELS } from '../../../graphql/query';
+import { Card } from '../../../components/generic/Styled';
+import { ClosedCard } from './ClosedCard';
+import { useAccount } from '../../../context/AccountContext';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { LoadingCard } from '../../../components/loading/LoadingCard';
+
+export const ClosedChannels = () => {
+ const [indexOpen, setIndexOpen] = useState(0);
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data } = useQuery(GET_CLOSED_CHANNELS, {
+ variables: { auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ if (loading || !data || !data.getClosedChannels) {
+ return ;
+ }
+
+ return (
+
+ {data.getClosedChannels.map((channel: any, index: number) => (
+
+ ))}
+
+ );
+};
diff --git a/src/views/channels/pendingChannels/PendingCard.tsx b/src/views/channels/pendingChannels/PendingCard.tsx
new file mode 100644
index 00000000..bb8abdde
--- /dev/null
+++ b/src/views/channels/pendingChannels/PendingCard.tsx
@@ -0,0 +1,190 @@
+import React from 'react';
+import { getPercent } from '../../../utils/Helpers';
+import {
+ Progress,
+ ProgressBar,
+ NodeTitle,
+ StatusLine,
+ MainInfo,
+} from '../../../components/generic/CardGeneric';
+import ReactTooltip from 'react-tooltip';
+import {
+ SubCard,
+ Separation,
+ Sub4Title,
+ ResponsiveLine,
+ ResponsiveSingle,
+ ResponsiveCol,
+} from '../../../components/generic/Styled';
+import { useSettings } from '../../../context/SettingsContext';
+import {
+ getStatusDot,
+ getTooltipType,
+ getTransactionLink,
+ renderLine,
+ getDateDif,
+ getFormatDate,
+ getNodeLink,
+} from '../../../components/generic/Helpers';
+import { getPrice } from '../../../components/price/Price';
+import { usePriceState } from '../../../context/PriceContext';
+
+interface ChannelProps {
+ close_transaction_id: string;
+ is_active: boolean;
+ is_closing: boolean;
+ is_opening: boolean;
+ local_balance: number;
+ local_reserve: number;
+ partner_public_key: string;
+ received: number;
+ remote_balance: number;
+ remote_reserve: number;
+ sent: number;
+ transaction_fee: number;
+ transaction_id: string;
+ transaction_vout: number;
+ partner_node_info: {
+ alias: string;
+ capacity: string;
+ channelCount: string;
+ color: string;
+ updated_at: string;
+ };
+}
+
+interface PendingCardProps {
+ channelInfo: ChannelProps;
+ index: number;
+ setIndexOpen: (index: number) => void;
+ indexOpen: number;
+}
+
+export const PendingCard = ({
+ channelInfo,
+ index,
+ setIndexOpen,
+ indexOpen,
+}: PendingCardProps) => {
+ const { theme, currency } = useSettings();
+ const priceContext = usePriceState();
+ const format = getPrice(currency, priceContext);
+
+ const tooltipType = getTooltipType(theme);
+
+ const {
+ close_transaction_id,
+ is_active,
+ is_closing,
+ is_opening,
+ local_balance,
+ local_reserve,
+ partner_public_key,
+ received,
+ remote_balance,
+ remote_reserve,
+ sent,
+ transaction_fee,
+ transaction_id,
+ transaction_vout,
+ partner_node_info,
+ } = channelInfo;
+
+ const {
+ alias,
+ capacity,
+ channelCount,
+ color: nodeColor,
+ updated_at,
+ } = partner_node_info;
+
+ const formatBalance = format({ amount: local_balance + remote_balance });
+ const formatLocal = format({ amount: local_balance });
+ const formatRemote = format({ amount: remote_balance });
+ const formatReceived = format({ amount: received });
+ const formatSent = format({ amount: sent });
+
+ const handleClick = () => {
+ if (indexOpen === index) {
+ setIndexOpen(0);
+ } else {
+ setIndexOpen(index);
+ }
+ };
+
+ const renderDetails = () => {
+ return (
+ <>
+
+ {renderLine('State:', is_active ? 'Active' : 'Inactive')}
+ {renderLine('Status:', is_opening ? 'Opening' : 'Closing')}
+ {renderLine('Local Balance:', local_balance)}
+ {renderLine('Remote Balance:', remote_balance)}
+ {renderLine('Node Public Key:', getNodeLink(partner_public_key))}
+ {renderLine('Transaction Id:', getTransactionLink(transaction_id))}
+ {renderLine('Transaction Vout:', transaction_vout)}
+ {renderLine('Transaction Fee:', transaction_fee)}
+ {renderLine(
+ 'Close Transaction Id:',
+ getTransactionLink(close_transaction_id)
+ )}
+ {renderLine('Local Reserve:', local_reserve)}
+ {renderLine('Remote Reserve:', remote_reserve)}
+ Partner Node Info
+ {renderLine('Node Capacity:', capacity)}
+ {renderLine('Channels:', channelCount)}
+ {renderLine(
+ 'Last Update:',
+ `${getDateDif(updated_at)} ago (${getFormatDate(updated_at)})`
+ )}
+ >
+ );
+ };
+
+ return (
+
+ handleClick()}>
+
+ {getStatusDot(is_active, 'active')}
+ {getStatusDot(is_opening, 'opening')}
+ {getStatusDot(is_closing, 'closing')}
+
+
+ {alias ? alias : 'Unknown'}
+
+ {formatBalance}
+
+
+
+
+
+
+
+
+
+
+
+ {index === indexOpen && renderDetails()}
+
+ {`Local Balance: ${formatLocal}`}
+ {`Remote Balance: ${formatRemote}`}
+
+
+ {`received: ${formatReceived}`}
+ {`Sent: ${formatSent}`}
+
+
+ );
+};
diff --git a/src/views/channels/pendingChannels/PendingChannels.tsx b/src/views/channels/pendingChannels/PendingChannels.tsx
new file mode 100644
index 00000000..712c6d10
--- /dev/null
+++ b/src/views/channels/pendingChannels/PendingChannels.tsx
@@ -0,0 +1,43 @@
+import React, { useState } from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import { GET_PENDING_CHANNELS } from '../../../graphql/query';
+import { Card } from '../../../components/generic/Styled';
+import { PendingCard } from './PendingCard';
+import { useAccount } from '../../../context/AccountContext';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { LoadingCard } from '../../../components/loading/LoadingCard';
+
+export const PendingChannels = () => {
+ const [indexOpen, setIndexOpen] = useState(0);
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data } = useQuery(GET_PENDING_CHANNELS, {
+ variables: { auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ if (loading || !data || !data.getPendingChannels) {
+ return ;
+ }
+
+ return (
+
+ {data.getPendingChannels.map((channel: any, index: number) => (
+
+ ))}
+
+ );
+};
diff --git a/src/views/fees/FeeCard.tsx b/src/views/fees/FeeCard.tsx
new file mode 100644
index 00000000..7ad33c25
--- /dev/null
+++ b/src/views/fees/FeeCard.tsx
@@ -0,0 +1,160 @@
+import React, { useState } from 'react';
+import {
+ SubCard,
+ Separation,
+ SingleLine,
+ DarkSubTitle,
+ ResponsiveLine,
+ NoWrapTitle,
+} from '../../components/generic/Styled';
+import { renderLine } from '../../components/generic/Helpers';
+import {
+ MainInfo,
+ NodeTitle,
+ ColLine,
+} from '../../components/generic/CardGeneric';
+import { useMutation } from '@apollo/react-hooks';
+import { UPDATE_FEES } from '../../graphql/mutation';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../utils/error';
+import { ChevronRight } from '../../components/generic/Icons';
+import { SecureButton } from '../../components/buttons/secureButton/SecureButton';
+import { useSettings } from '../../context/SettingsContext';
+import { textColorMap } from '../../styles/Themes';
+import { Input } from '../../components/input/Input';
+import { AdminSwitch } from '../../components/adminSwitch/AdminSwitch';
+
+interface FeeCardProps {
+ channelInfo: any;
+ index: number;
+ setIndexOpen: (index: number) => void;
+ indexOpen: number;
+}
+
+export const FeeCard = ({
+ channelInfo,
+ index,
+ setIndexOpen,
+ indexOpen,
+}: FeeCardProps) => {
+ const [newBaseFee, setBaseFee] = useState(0);
+ const [newFeeRate, setFeeRate] = useState(0);
+
+ const { theme } = useSettings();
+
+ const {
+ alias,
+ color,
+ baseFee,
+ feeRate,
+ transactionId,
+ transactionVout,
+ } = channelInfo;
+
+ const [updateFees] = useMutation(UPDATE_FEES, {
+ onError: error => toast.error(getErrorContent(error)),
+ onCompleted: data => {
+ setIndexOpen(0);
+ data.updateFees
+ ? toast.success('Channel fees updated')
+ : toast.error('Error updating channel fees');
+ },
+ refetchQueries: ['GetChannelFees'],
+ });
+
+ const handleClick = () => {
+ if (indexOpen === index) {
+ setIndexOpen(0);
+ } else {
+ setIndexOpen(index);
+ }
+ };
+
+ const renderDetails = () => {
+ return (
+ <>
+
+ {renderLine('Transaction Id:', transactionId)}
+ {renderLine('Transaction Vout:', transactionVout)}
+
+
+
+
+ {'Base Fee:'}
+
+ setBaseFee(Number(e.target.value))}
+ />
+
+
+
+ {'Fee Rate:'}
+
+ setFeeRate(Number(e.target.value))}
+ />
+
+
+ Update Fees
+
+
+
+ >
+ );
+ };
+
+ return (
+
+ handleClick()}>
+
+ {alias ? alias : 'Unknown'}
+
+
+
+ {'Base Fee:'}
+
+
+ {baseFee}
+ {baseFee === 1 ? 'sat' : 'sats'}
+
+
+
+
+ {'Fee Rate:'}
+
+
+ {feeRate}
+
+ {feeRate === 1 ? 'sat/million' : 'sats/million'}
+
+
+
+
+
+
+ {index === indexOpen && renderDetails()}
+
+ );
+};
diff --git a/src/views/forwards/ForwardsCard.tsx b/src/views/forwards/ForwardsCard.tsx
new file mode 100644
index 00000000..25c270a0
--- /dev/null
+++ b/src/views/forwards/ForwardsCard.tsx
@@ -0,0 +1,84 @@
+import React from 'react';
+import {
+ Separation,
+ SubCard,
+ ColumnLine,
+ ResponsiveLine,
+ ResponsiveSingle,
+} from '../../components/generic/Styled';
+import { MainInfo } from '../../components/generic/CardGeneric';
+import {
+ getDateDif,
+ getFormatDate,
+ renderLine,
+} from '../../components/generic/Helpers';
+import { Price } from '../../components/price/Price';
+
+interface ForwardCardProps {
+ forward: any;
+ index: number;
+ setIndexOpen: (index: number) => void;
+ indexOpen: number;
+}
+
+export const ForwardCard = ({
+ forward,
+ index,
+ setIndexOpen,
+ indexOpen,
+}: ForwardCardProps) => {
+ const {
+ created_at,
+ fee,
+ fee_mtokens,
+ incoming_channel,
+ incoming_alias,
+ outgoing_channel,
+ outgoing_alias,
+ tokens,
+ } = forward;
+
+ const formatAmount = ;
+ const formatFee = ;
+
+ const handleClick = () => {
+ if (indexOpen === index) {
+ setIndexOpen(0);
+ } else {
+ setIndexOpen(index);
+ }
+ };
+
+ const renderDetails = () => {
+ return (
+ <>
+
+ {renderLine('Incoming Channel: ', incoming_channel)}
+ {renderLine('Outgoing Channel: ', outgoing_channel)}
+ {renderLine('Fee MilliTokens: ', fee_mtokens)}
+ {renderLine('Date: ', getFormatDate(created_at))}
+ >
+ );
+ };
+
+ return (
+
+ handleClick()}>
+
+
+
+ {renderLine('Incoming:', incoming_alias)}
+ {renderLine('Outgoing:', outgoing_alias)}
+
+
+
+ {renderLine('Amount:', formatAmount)}
+ {renderLine('Fee:', formatFee)}
+ {renderLine('Date:', `${getDateDif(created_at)} ago`)}
+
+
+
+ {index === indexOpen && renderDetails()}
+
+ );
+};
diff --git a/src/views/home/account/AccountInfo.tsx b/src/views/home/account/AccountInfo.tsx
new file mode 100644
index 00000000..d6e938d0
--- /dev/null
+++ b/src/views/home/account/AccountInfo.tsx
@@ -0,0 +1,263 @@
+import React, { useState, ReactNode } from 'react';
+import {
+ Card,
+ CardWithTitle,
+ SubTitle,
+ SingleLine,
+ Separation,
+ DarkSubTitle,
+ ColorButton,
+} from '../../../components/generic/Styled';
+import styled from 'styled-components';
+import {
+ UpArrow,
+ Zap,
+ Anchor,
+ Pocket,
+ DownArrow,
+ XSvg,
+} from '../../../components/generic/Icons';
+import { PayCard } from './pay/pay';
+import { CreateInvoiceCard } from './createInvoice/CreateInvoice';
+import { SendOnChainCard } from './sendOnChain/SendOnChain';
+import { ReceiveOnChainCard } from './receiveOnChain/ReceiveOnChain';
+import { LoadingCard } from '../../../components/loading/LoadingCard';
+import { AdminSwitch } from '../../../components/adminSwitch/AdminSwitch';
+import { useSize } from '../../../hooks/UseSize';
+import { Price } from '../../../components/price/Price';
+import { mediaWidths, mediaDimensions } from '../../../styles/Themes';
+import { useStatusState } from '../../../context/StatusContext';
+
+const Tile = styled.div`
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: ${({ startTile }: { startTile?: boolean }) =>
+ startTile ? 'flex-start' : 'flex-end'};
+`;
+
+const ButtonRow = styled.div`
+ display: flex;
+`;
+
+const Responsive = styled(SingleLine)`
+ @media (${mediaWidths.mobile}) {
+ flex-direction: column;
+ }
+`;
+
+const sectionColor = '#FFD300';
+
+interface WrapperProps {
+ width?: number;
+ children: ReactNode;
+}
+
+const ResponsiveWrapper = ({ children, width = 0 }: WrapperProps) => {
+ if (width <= mediaDimensions.mobile) {
+ return {children} ;
+ }
+ return <>{children}>;
+};
+
+export const AccountInfo = () => {
+ const { width } = useSize();
+ const [state, setState] = useState('none');
+
+ const {
+ loading,
+ chainBalance,
+ chainPending,
+ channelBalance,
+ channelPending,
+ } = useStatusState();
+
+ if (loading) {
+ return (
+ <>
+
+
+ >
+ );
+ }
+
+ const formatCB = ;
+ const formatPB = ;
+ const formatCCB = ;
+ const formatPCB = ;
+
+ const totalB = ;
+ const totalPB = ;
+
+ const renderContent = () => {
+ switch (state) {
+ case 'send_ln':
+ return setState('none')} />;
+ case 'receive_ln':
+ return ;
+ case 'send_chain':
+ return setState('none')} />;
+ case 'receive_chain':
+ return ;
+ default:
+ return null;
+ }
+ };
+
+ const getTitle = () => {
+ switch (state) {
+ case 'send_ln':
+ return 'Send Sats over Lightning';
+ case 'receive_ln':
+ return 'Receive Sats over Lightning';
+ case 'send_chain':
+ return 'Send To On Chain Address';
+ case 'receive_chain':
+ return 'Create Address to Receive';
+ default:
+ return 'Your Accounts';
+ }
+ };
+
+ const showLn =
+ state === 'send_ln' || state === 'receive_ln' || state === 'none';
+ const showChain =
+ state === 'send_chain' || state === 'receive_chain' || state === 'none';
+
+ const renderLnAccount = () => (
+
+
+
+
+ Account
+ Lightning
+
+
+
+
+ Current Balance
+ {formatCCB}
+
+
+ Pending Balance
+ {formatPCB}
+
+
+
+
+ {showLn && showChain && (
+
+ setState('send_ln')}
+ >
+
+
+ setState('receive_ln')}
+ >
+
+
+
+ )}
+ {showLn && !showChain && (
+ setState('none')}>
+
+
+ )}
+
+
+
+ );
+
+ const renderChainAccount = () => (
+
+
+
+
+ Account
+ Bitcoin
+
+
+
+
+ Current Balance
+ {formatCB}
+
+
+ Pending Balance
+ {formatPB}
+
+
+
+
+ {showLn && showChain && (
+
+ setState('send_chain')}
+ >
+
+
+ setState('receive_chain')}
+ >
+
+
+
+ )}
+ {!showLn && showChain && (
+ setState('none')}>
+
+
+ )}
+
+
+
+ );
+
+ return (
+ <>
+
+ Resume
+
+
+
+
+ Account
+ Total
+
+
+
+ Current Balance
+ {totalB}
+
+
+ Pending Balance
+ {totalPB}
+
+
+
+
+
+
+ {getTitle()}
+
+ {showLn && renderLnAccount()}
+ {showLn && }
+ {showChain && renderChainAccount()}
+ {!showLn && showChain && }
+ {renderContent()}
+
+
+ >
+ );
+};
diff --git a/src/views/home/account/createInvoice/CreateInvoice.tsx b/src/views/home/account/createInvoice/CreateInvoice.tsx
new file mode 100644
index 00000000..d23a571d
--- /dev/null
+++ b/src/views/home/account/createInvoice/CreateInvoice.tsx
@@ -0,0 +1,113 @@
+import React, { useState, useEffect } from 'react';
+import {
+ NoWrapTitle,
+ ResponsiveLine,
+} from '../../../../components/generic/Styled';
+import { useMutation } from '@apollo/react-hooks';
+import { CREATE_INVOICE } from '../../../../graphql/mutation';
+import { Copy } from '../../../../components/generic/Icons';
+import styled from 'styled-components';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../../utils/error';
+import { SecureButton } from '../../../../components/buttons/secureButton/SecureButton';
+import QRCode from 'qrcode.react';
+import { ColorButton } from '../../../../components/buttons/colorButton/ColorButton';
+import CopyToClipboard from 'react-copy-to-clipboard';
+import { Input } from '../../../../components/input/Input';
+import { useSize } from '../../../../hooks/UseSize';
+import { mediaWidths, mediaDimensions } from '../../../../styles/Themes';
+
+const Responsive = styled.div`
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ @media (${mediaWidths.mobile}) {
+ flex-direction: column;
+ }
+`;
+
+const WrapRequest = styled.div`
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+ -ms-word-break: break-all;
+ word-break: break-word;
+ margin: 24px;
+ font-size: 14px;
+`;
+
+const QRWrapper = styled.div`
+ width: 200px;
+ margin: 16px;
+`;
+
+const Column = styled.div`
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+`;
+
+export const CreateInvoiceCard = ({ color }: { color: string }) => {
+ const { width } = useSize();
+ const [amount, setAmount] = useState(0);
+ const [request, setRequest] = useState('');
+
+ const [createInvoice, { data, loading }] = useMutation(CREATE_INVOICE, {
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ useEffect(() => {
+ if (!loading && data && data.createInvoice && data.createInvoice.request) {
+ setRequest(data.createInvoice.request);
+ }
+ }, [data, loading]);
+
+ const renderQr = () => (
+
+
+
+
+
+ {request}
+ toast.success('Request Copied')}
+ >
+
+
+ Copy
+
+
+
+
+ );
+
+ const renderContent = () => (
+
+ Amount to receive:
+ setAmount(Number(e.target.value))}
+ />
+
+ Create Invoice
+
+
+ );
+
+ return request !== '' ? renderQr() : renderContent();
+};
diff --git a/src/views/home/account/pay/pay.tsx b/src/views/home/account/pay/pay.tsx
new file mode 100644
index 00000000..7d56c90e
--- /dev/null
+++ b/src/views/home/account/pay/pay.tsx
@@ -0,0 +1,117 @@
+import React, { useState, useEffect } from 'react';
+import {
+ Sub4Title,
+ ResponsiveLine,
+ SubTitle,
+ Separation,
+ SingleLine,
+} from '../../../../components/generic/Styled';
+import { useMutation } from '@apollo/react-hooks';
+import { PAY_INVOICE, DECODE_REQUEST } from '../../../../graphql/mutation';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../../utils/error';
+import { SecureButton } from '../../../../components/buttons/secureButton/SecureButton';
+import { Input } from '../../../../components/input/Input';
+import { useSize } from '../../../../hooks/UseSize';
+import Modal from '../../../../components/modal/ReactModal';
+import { useAccount } from '../../../../context/AccountContext';
+import { ColorButton } from '../../../../components/buttons/colorButton/ColorButton';
+import {
+ renderLine,
+ getNodeLink,
+} from '../../../../components/generic/Helpers';
+import { Price } from '../../../../components/price/Price';
+import { mediaDimensions } from '../../../../styles/Themes';
+
+export const PayCard = ({ setOpen }: { setOpen: () => void }) => {
+ const { width } = useSize();
+ const [request, setRequest] = useState('');
+ const [modalOpen, setModalOpen] = useState(false);
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const [makePayment, { loading }] = useMutation(PAY_INVOICE, {
+ onError: error => toast.error(getErrorContent(error)),
+ onCompleted: () => {
+ toast.success('Payment Sent');
+ setRequest('');
+ setModalOpen(false);
+ setOpen();
+ },
+ });
+
+ const [decode, { data, loading: decodeLoading }] = useMutation(
+ DECODE_REQUEST,
+ {
+ onError: error => toast.error(getErrorContent(error)),
+ }
+ );
+
+ useEffect(() => {
+ if (data && data.decodeRequest) setModalOpen(true);
+ }, [data, setModalOpen]);
+
+ const renderData = () => {
+ if (!data || !data.decodeRequest) return null;
+
+ const { description, destination, expiresAt, tokens } = data.decodeRequest;
+
+ return (
+ <>
+
+ Pay Invoice
+
+
+
+ {renderLine('Description:', description)}
+ {renderLine('Destination:', getNodeLink(destination))}
+ {renderLine('Expires At:', expiresAt)}
+ >
+ );
+ };
+
+ return (
+ <>
+
+ Invoice:
+ setRequest(e.target.value)}
+ />
+ {
+ decode({ variables: { request, auth } });
+ }}
+ >
+ Send Sats
+
+
+ setModalOpen(false)}>
+ {renderData()}
+
+ Send
+
+
+ >
+ );
+};
diff --git a/src/views/home/account/receiveOnChain/ReceiveOnChain.tsx b/src/views/home/account/receiveOnChain/ReceiveOnChain.tsx
new file mode 100644
index 00000000..55699f91
--- /dev/null
+++ b/src/views/home/account/receiveOnChain/ReceiveOnChain.tsx
@@ -0,0 +1,109 @@
+import React, { useState, useEffect } from 'react';
+import {
+ NoWrapTitle,
+ DarkSubTitle,
+ OverflowText,
+ ResponsiveLine,
+} from '../../../../components/generic/Styled';
+import { useMutation } from '@apollo/react-hooks';
+import { CREATE_ADDRESS } from '../../../../graphql/mutation';
+import styled from 'styled-components';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../../utils/error';
+import { SecureButton } from '../../../../components/buttons/secureButton/SecureButton';
+import { useSize } from '../../../../hooks/UseSize';
+import CopyToClipboard from 'react-copy-to-clipboard';
+import { ColorButton } from '../../../../components/buttons/colorButton/ColorButton';
+import {
+ MultiButton,
+ SingleButton,
+} from '../../../../components/buttons/multiButton/MultiButton';
+import { mediaDimensions } from '../../../../styles/Themes';
+
+const ButtonRow = styled.div`
+ width: auto;
+ display: flex;
+`;
+
+const TitleWithSpacing = styled(NoWrapTitle)`
+ margin-right: 10px;
+`;
+
+export const ReceiveOnChainCard = () => {
+ const { width } = useSize();
+
+ const [nested, setNested] = useState(false);
+ const [received, setReceived] = useState(false);
+
+ const [createAddress, { data, loading }] = useMutation(CREATE_ADDRESS, {
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ useEffect(() => {
+ data && data.createAddress && setReceived(true);
+ }, [data]);
+
+ return (
+ <>
+ {data && data.createAddress ? (
+ <>
+
+ New Address:
+ {data.createAddress}
+ toast.success('Address Copied')}
+ >
+
+ Copy
+
+
+
+ >
+ ) : (
+
+
+ Type of Address:
+
+ {
+ setNested(false);
+ }}
+ >
+ P2WPKH
+
+ {
+ setNested(true);
+ }}
+ >
+ NP2WPKH
+
+
+
+
+ Create Address
+
+
+ )}
+ >
+ );
+};
diff --git a/src/views/home/account/sendOnChain/SendOnChain.tsx b/src/views/home/account/sendOnChain/SendOnChain.tsx
new file mode 100644
index 00000000..995b0f8d
--- /dev/null
+++ b/src/views/home/account/sendOnChain/SendOnChain.tsx
@@ -0,0 +1,250 @@
+import React, { useState, useEffect } from 'react';
+import {
+ NoWrapTitle,
+ DarkSubTitle,
+ Separation,
+ SingleLine,
+ ResponsiveLine,
+ SubTitle,
+} from '../../../../components/generic/Styled';
+import { useMutation } from '@apollo/react-hooks';
+import { PAY_ADDRESS } from '../../../../graphql/mutation';
+import styled from 'styled-components';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../../utils/error';
+import { useBitcoinState } from '../../../../context/BitcoinContext';
+import { SecureButton } from '../../../../components/buttons/secureButton/SecureButton';
+import { Input } from '../../../../components/input/Input';
+import { useSize } from '../../../../hooks/UseSize';
+import {
+ MultiButton,
+ SingleButton,
+} from '../../../../components/buttons/multiButton/MultiButton';
+import { Price, getPrice } from '../../../../components/price/Price';
+import { mediaWidths, mediaDimensions } from '../../../../styles/Themes';
+import { useSettings } from '../../../../context/SettingsContext';
+import Modal from '../../../../components/modal/ReactModal';
+import { ColorButton } from '../../../../components/buttons/colorButton/ColorButton';
+import { renderLine } from '../../../../components/generic/Helpers';
+import { usePriceState } from '../../../../context/PriceContext';
+
+const ResponsiveWrap = styled(SingleLine)`
+ @media (${mediaWidths.mobile}) {
+ flex-wrap: wrap;
+ }
+`;
+
+const NoWrap = styled.div`
+ margin-left: 8px;
+ white-space: nowrap;
+`;
+
+const Margin = styled.div`
+ margin-left: 8px;
+ margin-right: 24px;
+`;
+
+export const SendOnChainCard = ({ setOpen }: { setOpen: () => void }) => {
+ const { currency } = useSettings();
+ const priceContext = usePriceState();
+ const format = getPrice(currency, priceContext);
+
+ const [modalOpen, setModalOpen] = useState(false);
+
+ const { width } = useSize();
+ const [address, setAddress] = useState('');
+ const [tokens, setTokens] = useState(0);
+ const [type, setType] = useState('none');
+ const [amount, setAmount] = useState(0);
+ const [sendAll, setSendAll] = useState(false);
+
+ const canSend = address !== '' && (sendAll || tokens > 0) && amount > 0;
+
+ const { fast, halfHour, hour } = useBitcoinState();
+
+ const [payAddress, { loading }] = useMutation(PAY_ADDRESS, {
+ onError: error => toast.error(getErrorContent(error)),
+ onCompleted: () => {
+ toast.success('Payment Sent!');
+ setOpen();
+ },
+ refetchQueries: ['GetNodeInfo', 'GetBalances'],
+ });
+
+ useEffect(() => {
+ if (type === 'none' && amount === 0) {
+ setAmount(fast);
+ }
+ }, [type, amount, fast]);
+
+ const feeFormat = (amount: number) => {
+ if (type === 'fee' || type === 'none') {
+ return format({ amount });
+ }
+ return `${amount} blocks`;
+ };
+
+ const typeAmount =
+ type === 'fee'
+ ? { fee: amount }
+ : type === 'target'
+ ? { target: amount }
+ : {};
+
+ const tokenAmount = sendAll ? { sendAll } : { tokens };
+
+ const renderButton = (
+ onClick: () => void,
+ text: string,
+ selected: boolean
+ ) => (
+
+ {text}
+
+ );
+
+ return (
+ <>
+
+ Send to Address:
+ setAddress(e.target.value)}
+ />
+
+
+
+ Send All:
+
+ {renderButton(() => setSendAll(true), 'Yes', sendAll)}
+ {renderButton(() => setSendAll(false), 'No', !sendAll)}
+
+
+ {!sendAll && (
+
+
+ Amount:
+
+
+
+
+
+
+
+
+ setTokens(Number(e.target.value))}
+ />
+
+ )}
+
+
+ Fee:
+
+ {renderButton(
+ () => {
+ setType('none');
+ setAmount(fast);
+ },
+ 'Auto',
+ type === 'none'
+ )}
+ {renderButton(
+ () => {
+ setType('fee');
+ setAmount(0);
+ },
+ 'Fee (Sats/Byte)',
+ type === 'fee'
+ )}
+ {renderButton(
+ () => {
+ setType('target');
+ setAmount(0);
+ },
+ 'Target Confirmations',
+ type === 'target'
+ )}
+
+
+
+
+ Fee Amount:
+
+ {`(~${
+ type === 'target' ? `${amount} blocks` : feeFormat(amount * 223)
+ })`}
+
+
+ {type !== 'none' && (
+ <>
+ setAmount(Number(e.target.value))}
+ />
+ >
+ )}
+ {type === 'none' && (
+
+ {renderButton(
+ () => setAmount(fast),
+ `Fastest (${fast} sats)`,
+ amount === fast
+ )}
+ {halfHour !== fast &&
+ renderButton(
+ () => setAmount(halfHour),
+ `Half Hour (${halfHour} sats)`,
+ amount === halfHour
+ )}
+ {renderButton(
+ () => setAmount(hour),
+ `Hour (${hour} sats)`,
+ amount === hour
+ )}
+
+ )}
+
+
+ {
+ setModalOpen(true);
+ }}
+ >
+ Send
+
+ setModalOpen(false)}>
+
+ Send to Address
+
+ {renderLine('Amount:', )}
+ {renderLine('Address:', address)}
+ {renderLine(
+ 'Fee:',
+ type === 'target' ? `${amount} Blocks` : `${amount} Sats/Byte`
+ )}
+
+ Send To Address
+
+
+ >
+ );
+};
diff --git a/src/views/home/connect/Connect.tsx b/src/views/home/connect/Connect.tsx
new file mode 100644
index 00000000..1252b72a
--- /dev/null
+++ b/src/views/home/connect/Connect.tsx
@@ -0,0 +1,119 @@
+import React from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import { useAccount } from '../../../context/AccountContext';
+import { GET_CONNECT_INFO } from '../../../graphql/query';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { LoadingCard } from '../../../components/loading/LoadingCard';
+import {
+ CardWithTitle,
+ CardTitle,
+ SubTitle,
+ Card,
+ SingleLine,
+ DarkSubTitle,
+ ColorButton,
+} from '../../../components/generic/Styled';
+import { Radio, Copy } from '../../../components/generic/Icons';
+import styled from 'styled-components';
+import CopyToClipboard from 'react-copy-to-clipboard';
+import { mediaWidths } from '../../../styles/Themes';
+
+const Key = styled.div`
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 400px;
+
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+
+ -ms-word-break: break-all;
+ word-break: break-all;
+`;
+
+const Responsive = styled(SingleLine)`
+ @media (${mediaWidths.mobile}) {
+ flex-direction: column;
+ }
+`;
+
+const Tile = styled.div`
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: ${({ startTile }: { startTile?: boolean }) =>
+ startTile ? 'flex-start' : 'flex-end'};
+
+ @media (${mediaWidths.mobile}) {
+ margin: 16px 0;
+ }
+`;
+
+const TextPadding = styled.span`
+ margin-left: 5px;
+`;
+
+const sectionColor = '#fa541c';
+
+export const ConnectCard = () => {
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data } = useQuery(GET_CONNECT_INFO, {
+ variables: { auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ if (!data || loading) {
+ return ;
+ }
+
+ const { public_key, uris } = data.getNodeInfo;
+
+ const onionAddress = uris.find((uri: string) => uri.indexOf('onion') >= 0);
+ const normalAddress = uris.find((uri: string) => uri.indexOf('onion') < 0);
+
+ return (
+
+
+ Connect
+
+
+
+
+
+ Public Key
+ {public_key}
+
+
+ {onionAddress ? (
+ toast.success('Onion Address Copied')}
+ >
+
+
+ Onion
+
+
+ ) : null}
+ {normalAddress ? (
+ toast.success('Public Address Copied')}
+ >
+
+
+
+
+ ) : null}
+
+
+
+
+ );
+};
diff --git a/src/views/home/networkInfo/NetworkInfo.tsx b/src/views/home/networkInfo/NetworkInfo.tsx
new file mode 100644
index 00000000..9bbab8f9
--- /dev/null
+++ b/src/views/home/networkInfo/NetworkInfo.tsx
@@ -0,0 +1,157 @@
+import React from 'react';
+import { useQuery } from '@apollo/react-hooks';
+import {
+ Card,
+ CardWithTitle,
+ SubTitle,
+ SingleLine,
+ Separation,
+} from '../../../components/generic/Styled';
+import { useAccount } from '../../../context/AccountContext';
+import styled from 'styled-components';
+import { unSelectedNavButton, mediaWidths } from '../../../styles/Themes';
+import { Globe, Cpu } from '../../../components/generic/Icons';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { LoadingCard } from '../../../components/loading/LoadingCard';
+import { Price } from '../../../components/price/Price';
+import { GET_NETWORK_INFO } from '../../../graphql/query';
+
+const Tile = styled.div`
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ margin: 0 16px;
+ align-items: ${({ start }: { start?: boolean }) =>
+ start ? 'flex-start' : 'flex-end'};
+
+ @media (${mediaWidths.mobile}) {
+ margin: 0 0 8px;
+ flex-direction: row;
+ width: 100%;
+ }
+`;
+
+const TileTitle = styled.div`
+ font-size: 14px;
+ color: ${unSelectedNavButton};
+ margin-bottom: 10px;
+
+ @media (${mediaWidths.mobile}) {
+ margin-bottom: 0;
+ }
+`;
+
+const Title = styled.div`
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+ width: 120px;
+
+ @media (${mediaWidths.mobile}) {
+ justify-content: center;
+ padding-bottom: 16px;
+ width: 100%;
+ }
+`;
+
+const ResponsiveLine = styled(SingleLine)`
+ flex-wrap: wrap;
+`;
+
+const Padding = styled.span`
+ margin-bottom: -2px;
+ margin-right: 2px;
+`;
+
+export const NetworkInfo = () => {
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { loading, data } = useQuery(GET_NETWORK_INFO, {
+ variables: { auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ if (loading || !data || !data.getNetworkInfo) {
+ return ;
+ }
+
+ const {
+ averageChannelSize,
+ channelCount,
+ maxChannelSize,
+ medianChannelSize,
+ minChannelSize,
+ nodeCount,
+ notRecentlyUpdatedPolicyCount,
+ totalCapacity,
+ } = data.getNetworkInfo;
+
+ const capacity = ;
+ const maxSize = ;
+ const averageSize = ;
+ const medianSize = ;
+ const minSize = ;
+
+ return (
+
+ Network Info
+
+
+
+
+
+
+ Global
+
+
+ Capacity
+ {capacity}
+
+
+ Channels
+ {channelCount}
+
+
+ Nodes
+ {nodeCount}
+
+
+ Zombie Nodes
+ {notRecentlyUpdatedPolicyCount}
+
+
+
+
+
+
+
+
+ Channel Size
+
+
+ Max
+ {maxSize}
+
+
+ Average
+ {averageSize}
+
+
+ Median
+ {medianSize}
+
+
+ Min
+ {minSize}
+
+
+
+
+ );
+};
diff --git a/src/views/home/quickActions/QuickActions.tsx b/src/views/home/quickActions/QuickActions.tsx
new file mode 100644
index 00000000..f289aab6
--- /dev/null
+++ b/src/views/home/quickActions/QuickActions.tsx
@@ -0,0 +1,98 @@
+import React, { useState } from 'react';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+ CardTitle,
+ ColorButton,
+} from '../../../components/generic/Styled';
+import styled from 'styled-components';
+import { XSvg, Layers, GitBranch } from '../../../components/generic/Icons';
+import { unSelectedNavButton } from '../../../styles/Themes';
+import { DecodeCard } from './decode/Decode';
+import { OpenChannelCard } from './openChannel/OpenChannel';
+import { AdminSwitch } from '../../../components/adminSwitch/AdminSwitch';
+
+const sectionColor = '#69c0ff';
+
+const QuickCard = styled(Card)`
+ height: 100px;
+ width: 100px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ margin-bottom: 25px;
+ padding: 10px;
+ margin-right: 10px;
+ cursor: pointer;
+
+ &:hover {
+ border: 1px solid ${sectionColor};
+ }
+`;
+
+const QuickTitle = styled.div`
+ font-size: 14px;
+ color: ${unSelectedNavButton};
+ margin-top: 10px;
+`;
+
+const QuickRow = styled.div`
+ display: flex;
+`;
+
+export const QuickActions = () => {
+ const [openCard, setOpenCard] = useState('none');
+
+ const getTitle = () => {
+ switch (openCard) {
+ case 'decode':
+ return 'Decode a Lightning Request';
+ case 'open_channel':
+ return 'Open a Channel';
+ default:
+ return 'Quick Actions';
+ }
+ };
+
+ const renderContent = () => {
+ switch (openCard) {
+ case 'decode':
+ return ;
+ case 'open_channel':
+ return (
+
+ );
+ default:
+ return (
+
+
+ setOpenCard('open_channel')}>
+
+ Open
+
+
+ setOpenCard('decode')}>
+
+ Decode
+
+
+ );
+ }
+ };
+
+ return (
+
+
+ {getTitle()}
+ {openCard !== 'none' && (
+ setOpenCard('none')} color={sectionColor}>
+
+
+ )}
+
+ {renderContent()}
+
+ );
+};
diff --git a/src/views/home/quickActions/decode/Decode.tsx b/src/views/home/quickActions/decode/Decode.tsx
new file mode 100644
index 00000000..876cd2b2
--- /dev/null
+++ b/src/views/home/quickActions/decode/Decode.tsx
@@ -0,0 +1,98 @@
+import React, { useState } from 'react';
+import {
+ Card,
+ Sub4Title,
+ Separation,
+ ResponsiveLine,
+} from '../../../../components/generic/Styled';
+import {
+ renderLine,
+ getNodeLink,
+} from '../../../../components/generic/Helpers';
+import { useMutation } from '@apollo/react-hooks';
+import { useAccount } from '../../../../context/AccountContext';
+import { DECODE_REQUEST } from '../../../../graphql/mutation';
+import { getErrorContent } from '../../../../utils/error';
+import { toast } from 'react-toastify';
+import { ColorButton } from '../../../../components/buttons/colorButton/ColorButton';
+import { Input } from '../../../../components/input/Input';
+import { useSize } from '../../../../hooks/UseSize';
+import { Price } from '../../../../components/price/Price';
+import { mediaDimensions } from '../../../../styles/Themes';
+
+export const DecodeCard = ({ color }: { color: string }) => {
+ const { width } = useSize();
+ const [request, setRequest] = useState('');
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const [decode, { data, loading }] = useMutation(DECODE_REQUEST, {
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ const renderData = () => {
+ if (!data || !data.decodeRequest) return null;
+
+ const {
+ chainAddress,
+ cltvDelta,
+ description,
+ descriptionHash,
+ destination,
+ expiresAt,
+ id,
+ tokens,
+ } = data.decodeRequest;
+
+ return (
+ <>
+
+ {renderLine('Id:', id)}
+ {renderLine('Destination:', getNodeLink(destination))}
+ {renderLine('Description:', description)}
+ {renderLine('Description Hash:', descriptionHash)}
+ {renderLine('Chain Address:', chainAddress)}
+ {renderLine('CLTV Delta:', cltvDelta)}
+ {renderLine('Expires At:', expiresAt)}
+ {renderLine('Amount:', )}
+ >
+ );
+ };
+
+ return (
+
+
+ Request:
+ setRequest(e.target.value)}
+ />
+ {
+ setRequest('');
+ decode({ variables: { request, auth } });
+ }}
+ >
+ Decode
+
+
+ {renderData()}
+
+ );
+};
diff --git a/src/views/home/quickActions/openChannel/OpenChannel.tsx b/src/views/home/quickActions/openChannel/OpenChannel.tsx
new file mode 100644
index 00000000..38af4fcf
--- /dev/null
+++ b/src/views/home/quickActions/openChannel/OpenChannel.tsx
@@ -0,0 +1,186 @@
+import React, { useState, useEffect } from 'react';
+import {
+ Card,
+ SingleLine,
+ Separation,
+ DarkSubTitle,
+ NoWrapTitle,
+ ResponsiveLine,
+} from '../../../../components/generic/Styled';
+import { useMutation } from '@apollo/react-hooks';
+import { ChevronRight } from '../../../../components/generic/Icons';
+import { OPEN_CHANNEL } from '../../../../graphql/mutation';
+import { getErrorContent } from '../../../../utils/error';
+import { toast } from 'react-toastify';
+import { useBitcoinState } from '../../../../context/BitcoinContext';
+import styled from 'styled-components';
+import { SecureButton } from '../../../../components/buttons/secureButton/SecureButton';
+import { Input } from '../../../../components/input/Input';
+import { useSize } from '../../../../hooks/UseSize';
+import {
+ SingleButton,
+ MultiButton,
+} from '../../../../components/buttons/multiButton/MultiButton';
+import { Price } from '../../../../components/price/Price';
+import { mediaWidths, mediaDimensions } from '../../../../styles/Themes';
+
+const ResponsiveWrap = styled(SingleLine)`
+ @media (${mediaWidths.mobile}) {
+ flex-wrap: wrap;
+ }
+`;
+
+interface OpenChannelProps {
+ color: string;
+ setOpenCard: (card: string) => void;
+}
+
+export const OpenChannelCard = ({ color, setOpenCard }: OpenChannelProps) => {
+ const { width } = useSize();
+ const [size, setSize] = useState(0);
+ const [fee, setFee] = useState(0);
+ const [publicKey, setPublicKey] = useState('');
+ const [privateChannel, setPrivateChannel] = useState(false);
+ const [type, setType] = useState('none');
+
+ const { fast, halfHour, hour } = useBitcoinState();
+
+ const [openChannel] = useMutation(OPEN_CHANNEL, {
+ onError: error => toast.error(getErrorContent(error)),
+ onCompleted: () => {
+ toast.success('Channel Opened');
+ setOpenCard('none');
+ },
+ refetchQueries: ['GetChannels', 'GetPendingChannels'],
+ });
+
+ const canOpen = publicKey !== '' && size > 0 && fee > 0;
+
+ useEffect(() => {
+ if (type === 'none' && fee === 0) {
+ setFee(fast);
+ }
+ }, [type, fee, fast]);
+
+ const renderButton = (
+ onClick: () => void,
+ text: string,
+ selected: boolean
+ ) => (
+
+ {text}
+
+ );
+
+ return (
+
+
+ Node Public Key:
+ setPublicKey(e.target.value)}
+ />
+
+
+
+ Channel Size:
+
+
+
+
+
+
+ setSize(Number(e.target.value))}
+ />
+
+
+
+ Private Channel:
+
+ {renderButton(() => setPrivateChannel(true), 'Yes', privateChannel)}
+ {renderButton(() => setPrivateChannel(false), 'No', !privateChannel)}
+
+
+
+
+ Fee:
+
+ {renderButton(
+ () => {
+ setType('none');
+ setFee(fast);
+ },
+ 'Auto',
+ type === 'none'
+ )}
+ {renderButton(
+ () => setType('fee'),
+ 'Fee (Sats/Byte)',
+ type === 'fee'
+ )}
+
+
+
+
+ Fee Amount:
+
+
+
+
+ {type !== 'none' && (
+ setFee(Number(e.target.value))}
+ />
+ //
+ )}
+ {type === 'none' && (
+
+ {renderButton(
+ () => setFee(fast),
+ `Fastest (${fast} sats)`,
+ fee === fast
+ )}
+ {halfHour !== fast &&
+ renderButton(
+ () => setFee(halfHour),
+ `Half Hour (${halfHour} sats)`,
+ fee === halfHour
+ )}
+ {renderButton(
+ () => setFee(hour),
+ `Hour (${hour} sats)`,
+ fee === hour
+ )}
+
+ )}
+
+
+
+ Open Channel
+
+
+
+ );
+};
diff --git a/src/views/home/reports/flow/FlowPie.tsx b/src/views/home/reports/flow/FlowPie.tsx
new file mode 100644
index 00000000..329d1d10
--- /dev/null
+++ b/src/views/home/reports/flow/FlowPie.tsx
@@ -0,0 +1,51 @@
+import React from 'react';
+import { DarkSubTitle } from '../../../../components/generic/Styled';
+import { useSettings } from '../../../../context/SettingsContext';
+import { VictoryPie } from 'victory';
+import { chartAxisColor } from '../../../../styles/Themes';
+import { Row, Col, PieRow } from '.';
+import { getPrice } from '../../../../components/price/Price';
+import { usePriceState } from '../../../../context/PriceContext';
+
+interface Props {
+ flowPie: { x: string; y: number }[];
+ isType: string;
+}
+
+export const FlowPie = ({ flowPie, isType }: Props) => {
+ const { theme, currency } = useSettings();
+ const priceContext = usePriceState();
+ const format = getPrice(currency, priceContext);
+
+ return (
+
+
+
+ {flowPie[0].x}
+ {isType === 'tokens'
+ ? format({ amount: flowPie[0].y })
+ : flowPie[0].y}
+
+
+ {flowPie[1].x}
+ {isType === 'tokens'
+ ? format({ amount: flowPie[1].y })
+ : flowPie[1].y}
+
+
+ ''}
+ padAngle={3}
+ innerRadius={50}
+ labelRadius={55}
+ data={flowPie}
+ style={{
+ labels: { fontSize: 24, fill: chartAxisColor[theme] },
+ }}
+ />
+
+ );
+};
diff --git a/src/views/home/reports/flow/FlowReport.tsx b/src/views/home/reports/flow/FlowReport.tsx
new file mode 100644
index 00000000..edff1f16
--- /dev/null
+++ b/src/views/home/reports/flow/FlowReport.tsx
@@ -0,0 +1,157 @@
+import React from 'react';
+import numeral from 'numeral';
+import { useSettings } from '../../../../context/SettingsContext';
+import {
+ VictoryBar,
+ VictoryChart,
+ VictoryAxis,
+ VictoryVoronoiContainer,
+ VictoryGroup,
+} from 'victory';
+import {
+ chartAxisColor,
+ chartGridColor,
+ // chartColors,
+ flowBarColor,
+ flowBarColor2,
+} from '../../../../styles/Themes';
+import { getPrice } from '../../../../components/price/Price';
+import { usePriceState } from '../../../../context/PriceContext';
+// import { WaterfallProps } from '.';
+
+// const beforeMap = {
+// amount: 'amountBefore',
+// tokens: 'tokensBefore',
+// };
+
+interface Props {
+ isTime: string;
+ isType: string;
+ // isGraph: string;
+ parsedData: {}[];
+ parsedData2: {}[];
+ // waterfall: WaterfallProps[];
+}
+
+export const FlowReport = ({
+ isTime,
+ isType,
+ // isGraph,
+ parsedData,
+ parsedData2,
+}: // waterfall,
+Props) => {
+ const { theme, currency } = useSettings();
+ const priceContext = usePriceState();
+ const format = getPrice(currency, priceContext);
+
+ let domain = 24;
+ let barWidth = 3;
+ if (isTime === 'week') {
+ domain = 7;
+ barWidth = 15;
+ } else if (isTime === 'month') {
+ domain = 30;
+ barWidth = 3;
+ }
+
+ const getLabelString = (value: number) => {
+ if (isType === 'amount') {
+ return numeral(value).format('0,0');
+ }
+ return format({ amount: value });
+ };
+
+ return (
+ `${getLabelString(datum[isType])}`}
+ />
+ }
+ >
+ ''}
+ style={{
+ axis: { stroke: chartGridColor[theme] },
+ }}
+ />
+ (isType === 'tokens' ? format({ amount: a }) : a)}
+ />
+
+
+
+ {/* {isGraph === 'graph' && (
+ {
+ console.log(data, index);
+ return data[index][isType] -
+ data[index][beforeMap[isType]] >
+ 0
+ ? chartColors.green
+ : 'red';
+ },
+ width: barWidth,
+ },
+ labels: {
+ fontSize: '12px',
+ },
+ }}
+ />
+ )} */}
+
+
+ );
+};
diff --git a/src/views/home/reports/flow/Helpers.tsx b/src/views/home/reports/flow/Helpers.tsx
new file mode 100644
index 00000000..329465f6
--- /dev/null
+++ b/src/views/home/reports/flow/Helpers.tsx
@@ -0,0 +1,63 @@
+import { PeriodProps, WaterfallProps } from '.';
+
+export const getWaterfall = (
+ invoices: PeriodProps[],
+ payments: PeriodProps[]
+): WaterfallProps[] => {
+ const initialInvoicePeriod = invoices[0]?.period;
+ const initialPaymentPeriod = payments[0]?.period;
+
+ const initialPeriod = Math.min(initialInvoicePeriod, initialPaymentPeriod);
+
+ const lastInvoicePeriod = invoices[invoices.length - 1]?.period;
+ const lastPaymentPeriod = payments[payments.length - 1]?.period;
+
+ const lastPeriod = Math.max(lastInvoicePeriod, lastPaymentPeriod);
+
+ const waterfall = [];
+
+ let previousAmount = 0;
+ let previousTokens = 0;
+
+ for (let i = initialPeriod; i <= lastPeriod; i += 1) {
+ const currentInvoice = invoices.find(invoice => invoice.period === i) ?? {
+ period: undefined,
+ amount: 0,
+ tokens: 0,
+ };
+ const currentPayment = payments.find(payment => payment.period === i) ?? {
+ period: undefined,
+ amount: 0,
+ tokens: 0,
+ };
+
+ const amountChange = currentInvoice.amount - currentPayment.amount;
+ const tokensChange = currentInvoice.tokens - currentPayment.tokens;
+
+ if (waterfall.length <= 0) {
+ waterfall.push({
+ period: i,
+ amount: amountChange,
+ tokens: tokensChange,
+ amountBefore: 0,
+ tokensBefore: 0,
+ });
+
+ previousAmount = amountChange;
+ previousTokens = tokensChange;
+ } else if (currentInvoice.period || currentPayment.period) {
+ waterfall.push({
+ period: i,
+ amount: amountChange + previousAmount,
+ tokens: tokensChange + previousTokens,
+ amountBefore: previousAmount,
+ tokensBefore: previousTokens,
+ });
+
+ previousAmount = amountChange + previousAmount;
+ previousTokens = tokensChange + previousTokens;
+ }
+ }
+
+ return waterfall;
+};
diff --git a/src/views/home/reports/flow/InvoicePie.tsx b/src/views/home/reports/flow/InvoicePie.tsx
new file mode 100644
index 00000000..8b45e4fc
--- /dev/null
+++ b/src/views/home/reports/flow/InvoicePie.tsx
@@ -0,0 +1,42 @@
+import React from 'react';
+import { DarkSubTitle } from '../../../../components/generic/Styled';
+import { useSettings } from '../../../../context/SettingsContext';
+import { VictoryPie } from 'victory';
+import { chartAxisColor } from '../../../../styles/Themes';
+import { Row, Col, PieRow } from '.';
+
+interface Props {
+ invoicePie: { x: string; y: string }[];
+}
+
+export const InvoicePie = ({ invoicePie }: Props) => {
+ const { theme } = useSettings();
+
+ return (
+
+
+
+ Confirmed:
+ {invoicePie[0].y}
+
+
+ Unconfirmed:
+ {invoicePie[1].y}
+
+
+ ''}
+ padAngle={3}
+ innerRadius={50}
+ labelRadius={55}
+ data={invoicePie}
+ style={{
+ labels: { fontSize: 24, fill: chartAxisColor[theme] },
+ }}
+ />
+
+ );
+};
diff --git a/src/views/home/reports/flow/index.tsx b/src/views/home/reports/flow/index.tsx
new file mode 100644
index 00000000..7fad15bb
--- /dev/null
+++ b/src/views/home/reports/flow/index.tsx
@@ -0,0 +1,213 @@
+import React, { useState } from 'react';
+import styled, { css } from 'styled-components';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+ CardTitle,
+ Sub4Title,
+} from '../../../../components/generic/Styled';
+import { ButtonRow } from '../forwardReport/Buttons';
+import { FlowReport } from './FlowReport';
+import { useAccount } from '../../../../context/AccountContext';
+import { useQuery } from '@apollo/react-hooks';
+import { FlowPie } from './FlowPie';
+import { InvoicePie } from './InvoicePie';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../../utils/error';
+import { LoadingCard } from '../../../../components/loading/LoadingCard';
+import { useSize } from '../../../../hooks/UseSize';
+import { mediaDimensions } from '../../../../styles/Themes';
+import { GET_IN_OUT } from '../../../../graphql/query';
+// import { getWaterfall } from './Helpers';
+
+export const ChannelRow = styled.div`
+ font-size: 14px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+`;
+
+export const Row = styled.div`
+ display: flex;
+
+ @media (max-width: 770px) {
+ ${({ noWrap }: { noWrap?: boolean }) =>
+ !noWrap &&
+ css`
+ flex-wrap: wrap;
+ `};
+ }
+`;
+
+export const PieRow = styled(Row)`
+ justify-content: space-between;
+`;
+
+export const Col = styled.div`
+ display: flex;
+ flex-direction: column;
+ justify-content: space-around;
+ min-width: 200px;
+
+ @media (max-width: 770px) {
+ min-width: unset;
+ width: 100%;
+ padding-bottom: 16px;
+ }
+`;
+
+const HalfCardWithTitle = styled(CardWithTitle)`
+ width: 50%;
+`;
+
+export interface PeriodProps {
+ period: number;
+ amount: number;
+ tokens: number;
+}
+
+export interface WaterfallProps {
+ period: number;
+ amount: number;
+ tokens: number;
+ amountBefore: number;
+ tokensBefore: number;
+}
+
+const timeMap: { [key: string]: string } = {
+ day: 'today',
+ week: 'this week',
+ month: 'this month',
+};
+
+export const FlowBox = () => {
+ const { width } = useSize();
+ const [isTime, setIsTime] = useState('month');
+ const [isType, setIsType] = useState('amount');
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+ const { data, loading } = useQuery(GET_IN_OUT, {
+ variables: { time: isTime, auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ const buttonProps = {
+ isTime,
+ isType,
+ // isGraph,
+ setIsTime,
+ setIsType,
+ // setIsGraph,
+ };
+
+ if (!data || loading) {
+ return ;
+ }
+
+ const parsedData: PeriodProps[] = JSON.parse(data.getInOut.invoices);
+ const parsedData2: PeriodProps[] = JSON.parse(data.getInOut.payments);
+
+ // const waterfall: WaterfallProps[] = getWaterfall(parsedData, parsedData2);
+
+ if (parsedData.length <= 0 && parsedData2.length <= 0) {
+ return (
+
+
+ Invoices and Payments Report
+
+
+
+ {`Your node has not forwarded any payments ${timeMap[isTime]}.`}
+
+
+ );
+ }
+
+ const reduce = (array: PeriodProps[]) =>
+ array.reduce((p, c) => {
+ return {
+ tokens: p.tokens + c.tokens,
+ period: 0,
+ amount: p.amount + c.amount,
+ };
+ });
+
+ const emptyArray = {
+ tokens: 0,
+ period: 0,
+ amount: 0,
+ };
+
+ const totalInvoices: any =
+ parsedData.length > 0 ? reduce(parsedData) : emptyArray;
+ const totalPayments: any =
+ parsedData2.length > 0 ? reduce(parsedData2) : emptyArray;
+
+ const flowPie = [
+ { x: 'Invoice', y: totalInvoices[isType] },
+ { x: 'Payments', y: totalPayments[isType] },
+ ];
+
+ const invoicePie = [
+ { x: 'Confirmed', y: data.getInOut.confirmedInvoices },
+ { x: 'Unconfirmed', y: data.getInOut.unConfirmedInvoices },
+ ];
+
+ const props = {
+ isTime,
+ isType,
+ parsedData,
+ parsedData2,
+ };
+ const pieProps = { invoicePie };
+ const flowProps = { flowPie, isType };
+
+ return (
+ <>
+
+
+ Invoices and Payments Report
+
+
+
+
+
+
+
+
+
+ Total
+
+
+
+
+
+
+
+
+ Invoices
+
+
+
+
+
+
+ >
+ );
+};
diff --git a/src/views/home/reports/forwardReport/Buttons.tsx b/src/views/home/reports/forwardReport/Buttons.tsx
new file mode 100644
index 00000000..09923bc9
--- /dev/null
+++ b/src/views/home/reports/forwardReport/Buttons.tsx
@@ -0,0 +1,69 @@
+import React from 'react';
+import { CardTitle, ColorButton } from '../../../../components/generic/Styled';
+
+interface ButtonProps {
+ isTime: string;
+ isType: string;
+ // isGraph?: string;
+ setIsTime: (text: string) => void;
+ setIsType: (text: string) => void;
+ // setIsGraph?: (text: string) => void;
+}
+
+const availableTimes = ['day', 'week', 'month'];
+const mappedTimes = ['Day', 'Week', 'Month'];
+const availableTypes = ['amount', 'tokens'];
+const mappedTypes = ['Amount', 'Value'];
+// const availableGraphs = ['waterfall', 'bar'];
+// const mappedGraphs = ['Waterfall', 'Bar'];
+const buttonBorder = '#FD5F00';
+
+export const ButtonRow = ({
+ isTime,
+ setIsTime,
+ isType,
+ setIsType,
+}: // isGraph = 'bar',
+// setIsGraph,
+ButtonProps) => {
+ const timeIndex = availableTimes.indexOf(isTime);
+ const typeIndex = availableTypes.indexOf(isType);
+ // const graphIndex = availableGraphs.indexOf(isGraph);
+
+ const toggleButtons = (array: string[], index: number) => {
+ if (index === array.length - 1) {
+ return array[0];
+ }
+ return array[index + 1];
+ };
+
+ const buttonToShow = (
+ setFn: (text: string) => void,
+ array: string[],
+ mapped: string[],
+ index: number
+ ) => {
+ return (
+ setFn(toggleButtons(array, index))}
+ >
+ {mapped[index]}
+
+ );
+ };
+
+ return (
+
+ {buttonToShow(setIsTime, availableTimes, mappedTimes, timeIndex)}
+ {buttonToShow(setIsType, availableTypes, mappedTypes, typeIndex)}
+ {/* {setIsGraph &&
+ buttonToShow(
+ setIsGraph,
+ availableGraphs,
+ mappedGraphs,
+ graphIndex,
+ )} */}
+
+ );
+};
diff --git a/src/views/home/reports/forwardReport/ForwardChannelReport.tsx b/src/views/home/reports/forwardReport/ForwardChannelReport.tsx
new file mode 100644
index 00000000..a8e6a6ee
--- /dev/null
+++ b/src/views/home/reports/forwardReport/ForwardChannelReport.tsx
@@ -0,0 +1,230 @@
+import React, { useState } from 'react';
+import {
+ DarkSubTitle,
+ ColorButton,
+ SingleLine,
+} from '../../../../components/generic/Styled';
+import { useQuery } from '@apollo/react-hooks';
+import { useAccount } from '../../../../context/AccountContext';
+import { CardContent } from '.';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../../utils/error';
+import {
+ GitCommit,
+ DownArrow,
+ UpArrow,
+} from '../../../../components/generic/Icons';
+import styled from 'styled-components';
+import { LoadingCard } from '../../../../components/loading/LoadingCard';
+import { getPrice } from '../../../../components/price/Price';
+import { useSettings } from '../../../../context/SettingsContext';
+import { usePriceState } from '../../../../context/PriceContext';
+import { GET_FORWARD_CHANNELS_REPORT } from '../../../../graphql/query';
+
+const ChannelRow = styled.div`
+ font-size: 14px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+`;
+
+const ButtonRow = styled.div`
+ display: flex;
+ margin-bottom: 5px;
+`;
+
+const TriButton = styled(ColorButton)`
+ margin: 0;
+ border-radius: 0;
+`;
+
+const LeftButton = styled(TriButton)`
+ border-bottom-left-radius: 5px;
+ border-top-left-radius: 5px;
+`;
+
+const RightButton = styled(TriButton)`
+ border-bottom-right-radius: 5px;
+ border-top-right-radius: 5px;
+`;
+
+const TableLine = styled.div`
+ width: 35%;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+`;
+
+const LastTableLine = styled(TableLine)`
+ width: auto;
+ text-align: right;
+`;
+
+interface Props {
+ isTime: string;
+ isType: string;
+ color: string;
+}
+
+export const ForwardChannelsReport = ({ isTime, isType, color }: Props) => {
+ const [type, setType] = useState('route');
+
+ const { currency } = useSettings();
+ const priceContext = usePriceState();
+ const format = getPrice(currency, priceContext);
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { data, loading } = useQuery(GET_FORWARD_CHANNELS_REPORT, {
+ variables: { time: isTime, order: isType, auth, type },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ if (!data || loading) {
+ return ;
+ }
+
+ const report = data.getForwardChannelsReport;
+
+ const fillArray = (array: {}[]) => {
+ const lengthMissing = 10 - array.length;
+ if (lengthMissing === 10) {
+ return [];
+ }
+ if (lengthMissing > 0) {
+ for (let i = 0; i < lengthMissing; i += 1) {
+ array.push({
+ aliasIn: '-',
+ aliasOut: '-',
+ alias: '-',
+ name: '-',
+ amount: '',
+ fee: '',
+ tokens: '',
+ });
+ }
+ }
+ return array;
+ };
+
+ const parsed = fillArray(JSON.parse(report));
+
+ const getFormatString = (amount: number | string) => {
+ if (typeof amount === 'string') return amount;
+ if (isType !== 'amount') {
+ return format({ amount });
+ }
+ return amount;
+ };
+
+ const renderRoute = (parsed: {}[]) => {
+ const routes = parsed.map((channel: any, index: number) => (
+
+ {channel.aliasIn}
+ {channel.aliasOut}
+ {getFormatString(channel[isType])}
+
+ ));
+
+ return (
+ <>
+
+ Incoming
+ Outgoing
+
+
+ {routes}
+ >
+ );
+ };
+
+ const renderChannels = (parsed: {}[]) => {
+ const channels = parsed.map((channel: any, index: number) => (
+
+ {`${channel.alias}`}
+ {`${channel.name}`}
+ {getFormatString(channel[isType])}
+
+ ));
+
+ return (
+ <>
+
+ Alias
+ ID
+
+
+ {channels}
+ >
+ );
+ };
+
+ const renderContent = (parsed: {}[]) => {
+ switch (type) {
+ case 'route':
+ return renderRoute(parsed);
+ default:
+ return renderChannels(parsed);
+ }
+ };
+
+ const renderButtons = () => (
+
+ setType('incoming')}
+ >
+
+
+ setType('route')}
+ color={color}
+ >
+
+
+ setType('outgoing')}
+ >
+
+
+
+ );
+
+ const renderTop = (title: string) => (
+
+ {title}
+ {renderButtons()}
+
+ );
+
+ const renderTitle = () => {
+ switch (type) {
+ case 'route':
+ return renderTop('Routes');
+ case 'incoming':
+ return renderTop('Incoming');
+ default:
+ return renderTop('Outgoing');
+ }
+ };
+
+ if (parsed.length <= 0) {
+ return null;
+ }
+
+ return (
+
+ {renderTitle()}
+ {renderContent(parsed)}
+
+ );
+};
diff --git a/src/views/home/reports/forwardReport/ForwardReport.tsx b/src/views/home/reports/forwardReport/ForwardReport.tsx
new file mode 100644
index 00000000..dc64fc0f
--- /dev/null
+++ b/src/views/home/reports/forwardReport/ForwardReport.tsx
@@ -0,0 +1,149 @@
+import React from 'react';
+import { Sub4Title } from '../../../../components/generic/Styled';
+import { useQuery } from '@apollo/react-hooks';
+import numeral from 'numeral';
+import { useSettings } from '../../../../context/SettingsContext';
+import { useAccount } from '../../../../context/AccountContext';
+import {
+ VictoryBar,
+ VictoryChart,
+ VictoryAxis,
+ VictoryVoronoiContainer,
+} from 'victory';
+import {
+ chartAxisColor,
+ chartBarColor,
+ chartGridColor,
+} from '../../../../styles/Themes';
+import { CardContent } from '.';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../../utils/error';
+import { LoadingCard } from '../../../../components/loading/LoadingCard';
+import { getPrice } from '../../../../components/price/Price';
+import { usePriceState } from '../../../../context/PriceContext';
+import { GET_FORWARD_REPORT } from '../../../../graphql/query';
+
+interface Props {
+ isTime: string;
+ isType: string;
+}
+
+const timeMap: { [key: string]: string } = {
+ day: 'today',
+ week: 'this week',
+ month: 'this month',
+};
+
+export const ForwardReport = ({ isTime, isType }: Props) => {
+ const { theme, currency } = useSettings();
+ const priceContext = usePriceState();
+ const format = getPrice(currency, priceContext);
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { data, loading } = useQuery(GET_FORWARD_REPORT, {
+ variables: { time: isTime, auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ if (!data || loading) {
+ return ;
+ }
+
+ let domain = 24;
+ let barWidth = 10;
+ if (isTime === 'week') {
+ domain = 7;
+ barWidth = 15;
+ } else if (isTime === 'month') {
+ domain = 30;
+ barWidth = 5;
+ }
+
+ const parsedData: {}[] = JSON.parse(data.getForwardReport);
+
+ const getLabelString = (value: number) => {
+ if (isType === 'amount') {
+ return numeral(value).format('0,0');
+ }
+ return format({ amount: value });
+ };
+
+ const total = getLabelString(
+ parsedData
+ .map((x: any) => x[isType])
+ .reduce((a: number, c: number) => a + c, 0)
+ );
+
+ const renderContent = () => {
+ if (parsedData.length <= 0) {
+ return (
+ {`Your node has not forwarded any payments ${timeMap[isTime]}.`}
+ );
+ }
+ return (
+ <>
+
+ `${getLabelString(datum[isType])}`}
+ />
+ }
+ >
+ ''}
+ style={{
+ axis: { stroke: chartGridColor[theme] },
+ }}
+ />
+
+ isType === 'tokens'
+ ? format({ amount: a, breakNumber: true })
+ : a
+ }
+ />
+
+
+
+ {`Total: ${total}`}
+ >
+ );
+ };
+
+ return {renderContent()} ;
+};
diff --git a/src/views/home/reports/forwardReport/index.tsx b/src/views/home/reports/forwardReport/index.tsx
new file mode 100644
index 00000000..836884bd
--- /dev/null
+++ b/src/views/home/reports/forwardReport/index.tsx
@@ -0,0 +1,75 @@
+import React, { useState } from 'react';
+import { ForwardReport } from './ForwardReport';
+import { ForwardChannelsReport } from './ForwardChannelReport';
+import styled from 'styled-components';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+ CardTitle,
+} from '../../../../components/generic/Styled';
+import { ButtonRow } from './Buttons';
+import { mediaWidths, mediaDimensions } from '../../../../styles/Themes';
+import { useSize } from '../../../../hooks/UseSize';
+
+export const CardContent = styled.div`
+ height: 100%;
+ display: flex;
+ flex-flow: column;
+ width: 50%;
+ padding: 0 16px;
+
+ @media (${mediaWidths.mobile}) {
+ width: 100%;
+ padding: 0 8px;
+ }
+`;
+
+const Row = styled.div`
+ display: flex;
+
+ @media (${mediaWidths.mobile}) {
+ flex-wrap: wrap;
+ }
+`;
+
+const availableTimes = ['day', 'week', 'month'];
+const mappedTimes = ['Day', 'Week', 'Month'];
+const availableTypes = ['amount', 'fee', 'tokens'];
+const mappedTypes = ['Amount', 'Fees', 'Value'];
+const buttonBorder = '#6938f1';
+
+export const ForwardBox = () => {
+ const { width } = useSize();
+ const [isTime, setIsTime] = useState('week');
+ const [isType, setIsType] = useState('amount');
+
+ const props = { isTime, isType, color: buttonBorder };
+
+ const buttonProps = {
+ isTime,
+ isType,
+ setIsTime,
+ setIsType,
+ availableTimes,
+ availableTypes,
+ mappedTimes,
+ mappedTypes,
+ buttonBorder,
+ };
+
+ return (
+
+
+ Foward Report
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/views/home/reports/liquidReport/LiquidReport.tsx b/src/views/home/reports/liquidReport/LiquidReport.tsx
new file mode 100644
index 00000000..5c6b7554
--- /dev/null
+++ b/src/views/home/reports/liquidReport/LiquidReport.tsx
@@ -0,0 +1,121 @@
+import React from 'react';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+} from '../../../../components/generic/Styled';
+import { useQuery } from '@apollo/react-hooks';
+import { useAccount } from '../../../../context/AccountContext';
+import {
+ VictoryChart,
+ VictoryAxis,
+ VictoryBar,
+ VictoryVoronoiContainer,
+ VictoryTooltip,
+} from 'victory';
+import { useSettings } from '../../../../context/SettingsContext';
+import {
+ chartGridColor,
+ chartAxisColor,
+ liquidityBarColor,
+ mediaDimensions,
+} from '../../../../styles/Themes';
+import { LoadingCard } from '../../../../components/loading/LoadingCard';
+import { getPrice } from '../../../../components/price/Price';
+import { useSize } from '../../../../hooks/UseSize';
+import { usePriceState } from '../../../../context/PriceContext';
+import { GET_LIQUID_REPORT } from '../../../../graphql/query';
+
+export const LiquidReport = () => {
+ const { width } = useSize();
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const { theme, currency } = useSettings();
+ const priceContext = usePriceState();
+ const format = getPrice(currency, priceContext);
+
+ const { data, loading } = useQuery(GET_LIQUID_REPORT, {
+ variables: { auth },
+ });
+
+ if (loading) {
+ return ;
+ }
+
+ if (!data || !data.getChannelReport) {
+ return null;
+ }
+
+ const { local, remote, maxIn, maxOut } = data.getChannelReport;
+ const liquidity = [
+ { x: 'Max Outgoing', y: maxOut },
+ { x: 'Max Incoming', y: maxIn },
+ { x: 'Local Balance', y: local },
+ { x: 'Remote Balance', y: remote },
+ ];
+
+ return (
+
+ Liquidity Report
+
+ `${format({ amount: datum.y })}`}
+ labelComponent={ }
+ />
+ }
+ >
+
+ `${format({ amount: a })}`}
+ />
+
+
+
+
+ );
+};
diff --git a/src/views/homepage/HomePage.styled.tsx b/src/views/homepage/HomePage.styled.tsx
new file mode 100644
index 00000000..e6f8176c
--- /dev/null
+++ b/src/views/homepage/HomePage.styled.tsx
@@ -0,0 +1,91 @@
+import React from 'react';
+import styled, { keyframes } from 'styled-components';
+import { fontColors, mediaWidths } from '../../styles/Themes';
+
+export const Headline = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 48px 0 140px;
+
+ @media (${mediaWidths.mobile}) {
+ flex-direction: column-reverse;
+ }
+`;
+
+export const LeftHeadline = styled.div`
+ width: 50%;
+ display: flex;
+ flex-direction: column;
+
+ @media (${mediaWidths.mobile}) {
+ width: 100%;
+ text-align: center;
+ }
+`;
+
+const flicker = keyframes`
+ 0% { opacity: 1; }
+ 3% { opacity: 0.4; }
+ 6% { opacity: 1; }
+ 7% { opacity: 0.4; }
+ 8% { opacity: 1; }
+ 9% { opacity: 0.4; }
+ 10% { opacity: 0; }
+ 100% { opacity: 0; }
+`;
+
+const HeadlineImage = () => ;
+
+export const StyledImage = styled(HeadlineImage)`
+ width: 500px;
+
+ & .glowEffect {
+ animation: ${flicker} 3s infinite step-end;
+ }
+ & .glowEffectTwo {
+ animation: ${flicker} 5s infinite step-end;
+ }
+ & .glowEffectThree {
+ animation: ${flicker} 7s infinite step-end;
+ }
+ & .glowEffectFour {
+ animation: ${flicker} 3.5s infinite step-end;
+ }
+
+ @media (${mediaWidths.mobile}) {
+ width: unset;
+ }
+`;
+
+export const HomeButton = styled.button`
+ cursor: pointer;
+ outline: none;
+ padding: 8px 24px;
+ text-decoration: 2px solid blue;
+ font-size: 16px;
+ background-image: linear-gradient(to right, #fd5f00, #f99325);
+ color: white;
+ border: none;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 8px;
+ white-space: nowrap;
+ width: 100%;
+`;
+
+export const Title = styled.h1`
+ width: 100%;
+ text-align: center;
+ color: ${({ textColor }: { textColor?: string }) =>
+ textColor ? textColor : fontColors.white};
+ font-size: 32px;
+ margin-bottom: 0;
+`;
+
+export const Text = styled.p`
+ color: ${fontColors.white};
+ text-align: justify;
+ max-width: 400px;
+`;
diff --git a/client/src/views/entry/homepage/HomePage.tsx b/src/views/homepage/HomePage.tsx
similarity index 54%
rename from client/src/views/entry/homepage/HomePage.tsx
rename to src/views/homepage/HomePage.tsx
index fa79e8d3..51765453 100644
--- a/client/src/views/entry/homepage/HomePage.tsx
+++ b/src/views/homepage/HomePage.tsx
@@ -1,20 +1,20 @@
import React from 'react';
import { DetailSection } from './Sections/DetailSection';
-import { ContactSection } from 'views/other/ContactSection';
+import { ContactSection } from './Sections/ContactSection';
import { Compatible } from './Sections/Compatible';
import { InfoSection } from './Sections/InfoSection';
import { CallToAction } from './Sections/CallToAction';
import { TopSection } from './Sections/Top';
export const HomePageView = () => {
- return (
- <>
-
-
-
-
-
-
- >
- );
+ return (
+ <>
+
+
+
+
+
+
+ >
+ );
};
diff --git a/src/views/homepage/Sections/CallToAction.tsx b/src/views/homepage/Sections/CallToAction.tsx
new file mode 100644
index 00000000..a0e13713
--- /dev/null
+++ b/src/views/homepage/Sections/CallToAction.tsx
@@ -0,0 +1,43 @@
+import React from 'react';
+import { Center } from '../../../components/typography/Styled';
+import { Section } from '../../../components/section/Section';
+import { Padding, StyledH2, StyledH1 } from './Sections.styled';
+import {
+ homeBackgroundColor,
+ homeBackgroundSecondColor,
+} from '../../../styles/Themes';
+import { HomeButton } from '../HomePage.styled';
+import { Zap } from '../../../components/generic/Icons';
+import styled from 'styled-components';
+import { Link } from '../../../components/link/Link';
+
+const CallToActionButton = styled(HomeButton)`
+ margin: 16px 0 0;
+`;
+
+export const CallToAction = () => {
+ return (
+ <>
+
+
+
+ Ready to take control of your Lightning Node?
+
+
+
+
+
+
+
+ Control The Lightning
+
+
+
+
+ >
+ );
+};
diff --git a/src/views/homepage/Sections/Compatible.tsx b/src/views/homepage/Sections/Compatible.tsx
new file mode 100644
index 00000000..03e01fe3
--- /dev/null
+++ b/src/views/homepage/Sections/Compatible.tsx
@@ -0,0 +1,22 @@
+import React from 'react';
+import { Center } from '../../../components/typography/Styled';
+import { Section } from '../../../components/section/Section';
+import { WrapSingleLine, StyledH2, StyledP } from './Sections.styled';
+import { homeBackgroundColor } from '../../../styles/Themes';
+
+export const Compatible = () => {
+ return (
+
+
+ Compatible with the latest LND node versions.
+
+
+ v0.7.1-beta
+ v0.8.0-beta
+ v0.8.1-beta
+ v0.8.2-beta
+ v0.9.0-beta
+
+
+ );
+};
diff --git a/src/views/homepage/Sections/ContactSection.tsx b/src/views/homepage/Sections/ContactSection.tsx
new file mode 100644
index 00000000..18124efa
--- /dev/null
+++ b/src/views/homepage/Sections/ContactSection.tsx
@@ -0,0 +1,63 @@
+import React from 'react';
+import { Section } from '../../../components/section/Section';
+import { fontColors, homeBackgroundColor } from '../../../styles/Themes';
+import { Send, GithubIcon, MailIcon } from '../../../components/generic/Icons';
+import {
+ Center,
+ Question,
+ SectionTitle,
+ DetailCard,
+ DetailLine,
+ SmallText,
+ IconMargin,
+ IconTitle,
+} from '../../../components/typography/Styled';
+
+export const ContactSection = () => (
+
+
+
+ Need to contact us?
+
+
+
+
+
+
+
+
+
+ Telegram
+
+
+
+ Write to me on Telegram @apotdevin. Usually a quick response.
+
+
+
+
+
+
+
+
+ Github
+
+
+
+ See the code, open issues or contribute on github.
+
+
+
+
+
+
+
+
+ Email
+
+
+ Write us an email at thunderhub@protonmail.com
+
+
+
+);
diff --git a/src/views/homepage/Sections/DetailSection.tsx b/src/views/homepage/Sections/DetailSection.tsx
new file mode 100644
index 00000000..66a26a52
--- /dev/null
+++ b/src/views/homepage/Sections/DetailSection.tsx
@@ -0,0 +1,100 @@
+import React from 'react';
+import {
+ Card,
+ SubTitle,
+ ColumnLine,
+ Sub4Title,
+ SingleLine,
+} from '../../../components/generic/Styled';
+import styled from 'styled-components';
+import {
+ Eye,
+ Send,
+ Key,
+ Server,
+ Sliders,
+ Users,
+} from '../../../components/generic/Icons';
+import { cardColor, mediaWidths } from '../../../styles/Themes';
+import { Section } from '../../../components/section/Section';
+
+const Padding = styled.div`
+ padding: ${({ padding }: { padding?: string }) =>
+ padding ? padding : '16px'};
+`;
+
+const DetailCard = styled(Card)`
+ background-color: ${cardColor};
+ margin-bottom: 0;
+ margin: 8px 16px;
+ z-index: 1;
+ flex: 1 0 30%;
+
+ @media (${mediaWidths.mobile}) {
+ flex: 1 0 100%;
+ }
+`;
+
+const DetailLine = styled.div`
+ margin: 0 -16px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-wrap: wrap;
+ @media (${mediaWidths.mobile}) {
+ margin: 0;
+ }
+`;
+
+const detailCardContent = (title: string, text: string, Icon: any) => (
+
+
+
+
+
+
+ {title}
+ {text}
+
+
+
+);
+
+export const DetailSection = () => {
+ return (
+
+
+ {detailCardContent(
+ 'Make Payments',
+ 'Send and receive both Lightning and On-Chain payments.',
+ Send
+ )}
+ {detailCardContent(
+ 'Multiple Nodes',
+ 'Connect to multiple nodes and quickly switch between them.',
+ Server
+ )}
+ {detailCardContent(
+ 'View-Only Mode',
+ 'Check the status of your node any time without risk.',
+ Eye
+ )}
+ {detailCardContent(
+ 'AES Encryption',
+ 'Your Macaroon is AES encrypted with a password only you know.',
+ Key
+ )}
+ {detailCardContent(
+ 'Open Source',
+ "Don't trust anyone. Verify the code yourself.",
+ Users
+ )}
+ {detailCardContent(
+ 'Manage Channels',
+ 'Open, close and monitor channel status and liquidity',
+ Sliders
+ )}
+
+
+ );
+};
diff --git a/src/views/homepage/Sections/InfoSection.tsx b/src/views/homepage/Sections/InfoSection.tsx
new file mode 100644
index 00000000..f7593231
--- /dev/null
+++ b/src/views/homepage/Sections/InfoSection.tsx
@@ -0,0 +1,89 @@
+import React from 'react';
+import { Section } from '../../../components/section/Section';
+import {
+ InfoRow,
+ ImageSection,
+ ImagePlace,
+ TextSection,
+} from './Sections.styled';
+import { Text } from '../../../components/typography/Styled';
+
+export const InfoSection = () => {
+ return (
+ <>
+
+
+
+ Send and Receive
+
+ Send and receive both Lightning and Bitcoin payments in a simple
+ and easy to use interface with both basic and advanced features.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Transaction Reports
+
+ Have a quick overview of the invoices coming into your node and
+ payments being made. Check both the amount and value of your
+ transactions. See total amount together with confirmed and
+ unconfirmed invoices.
+
+
+
+
+
+
+
+ Channel Management
+
+ See all your channels and get a quick preview of how balanced and
+ active they are. Open new channels or close them.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Forwarded Payments
+
+ Quick glance at the forwarded payments that have been going
+ through your node. See the incoming and outgoing channels being
+ used.
+
+
+
+
+
+
+
+ Night/Day Mode
+
+ Prefer working in the dark? We have an awesome night mode just for
+ you. Want it more bright? Got you covered as well.
+
+
+
+
+
+
+
+ >
+ );
+};
diff --git a/src/views/homepage/Sections/Sections.styled.tsx b/src/views/homepage/Sections/Sections.styled.tsx
new file mode 100644
index 00000000..31076ebb
--- /dev/null
+++ b/src/views/homepage/Sections/Sections.styled.tsx
@@ -0,0 +1,91 @@
+import styled from 'styled-components';
+import { SingleLine } from '../../../components/generic/Styled';
+import { headerColor, mediaWidths } from '../../../styles/Themes';
+
+export const Padding = styled.div`
+ padding: 4px 4px 0 0;
+`;
+
+export const SlantedWrapper = styled.div`
+ width: 100%;
+ height: 200px;
+ margin-bottom: -260px;
+ overflow: hidden;
+ z-index: -5;
+`;
+
+export const SlantedEdge = styled.div`
+ content: '';
+ width: 100%;
+ height: 100%;
+ background: ${headerColor};
+ -webkit-transform-origin: 100% 0;
+ -ms-transform-origin: 100% 0;
+ transform-origin: 100% 0;
+ -webkit-transform: skew(84deg);
+ -ms-transform: skew(84deg);
+ transform: skew(88deg);
+ z-index: -5;
+`;
+
+export const FullWidth = styled.div`
+ display: flex;
+ justify-content: center;
+ width: 100%;
+ margin-top: 18px;
+`;
+
+export const InfoRow = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ align-items: stretch;
+
+ @media (${mediaWidths.mobile}) {
+ flex-direction: ${({ reverse }: { reverse?: boolean }) =>
+ reverse ? 'column-reverse' : 'column'};
+ }
+`;
+
+export const HalfSection = styled.div`
+ width: 50%;
+ display: flex;
+ flex-direction: column;
+
+ @media (${mediaWidths.mobile}) {
+ width: 100%;
+ text-align: center;
+ }
+`;
+
+export const ImageSection = styled(HalfSection)`
+ align-self: center;
+`;
+
+export const TextSection = styled(HalfSection)`
+ padding: 0 32px;
+
+ @media (${mediaWidths.mobile}) {
+ padding: 0 8px;
+ }
+`;
+
+export const ImagePlace = styled.img`
+ display: flex;
+ width: 100%;
+ height: auto;
+ justify-content: center;
+ align-items: center;
+`;
+
+export const WrapSingleLine = styled(SingleLine)`
+ flex-wrap: wrap;
+ justify-content: space-around;
+ flex-grow: 1;
+`;
+
+export const StyledH1 = styled.h1``;
+
+export const StyledH2 = styled.h2``;
+
+export const StyledP = styled.p``;
diff --git a/src/views/homepage/Sections/Top.tsx b/src/views/homepage/Sections/Top.tsx
new file mode 100644
index 00000000..bec77a74
--- /dev/null
+++ b/src/views/homepage/Sections/Top.tsx
@@ -0,0 +1,53 @@
+import React from 'react';
+import {
+ Headline,
+ LeftHeadline,
+ StyledImage,
+ HomeButton,
+ Title,
+ Text,
+} from '../HomePage.styled';
+import { Zap } from '../../../components/generic/Icons';
+import { headerColor, inverseTextColor } from '../../../styles/Themes';
+import { Section } from '../../../components/section/Section';
+import {
+ FullWidth,
+ Padding,
+ SlantedWrapper,
+ SlantedEdge,
+} from './Sections.styled';
+import { Link } from '../../../components/link/Link';
+
+export const TopSection = () => {
+ return (
+ <>
+
+
+
+ Control The Power of Lightning
+
+
+ Take full control of your lightning node for quick monitoring
+ and management inside your browser.
+
+
+
+
+
+
+
+
+ Control The Lightning
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
diff --git a/src/views/login/SessionLogin.tsx b/src/views/login/SessionLogin.tsx
new file mode 100644
index 00000000..47e64e9a
--- /dev/null
+++ b/src/views/login/SessionLogin.tsx
@@ -0,0 +1,61 @@
+import React, { useState } from 'react';
+import { useAccount } from '../../context/AccountContext';
+import {
+ SingleLine,
+ Sub4Title,
+ CardWithTitle,
+ Card,
+ SubTitle,
+} from '../../components/generic/Styled';
+import CryptoJS from 'crypto-js';
+import { toast } from 'react-toastify';
+import { saveSessionAuth } from '../../utils/auth';
+import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
+import { Input } from '../../components/input/Input';
+import { Section } from '../../components/section/Section';
+
+export const SessionLogin = () => {
+ const { name, admin, refreshAccount } = useAccount();
+ const [pass, setPass] = useState('');
+
+ const handleClick = () => {
+ try {
+ const bytes = CryptoJS.AES.decrypt(admin, pass);
+ const decrypted = bytes.toString(CryptoJS.enc.Utf8);
+
+ saveSessionAuth(decrypted);
+ refreshAccount();
+ } catch (error) {
+ toast.error('Wrong Password');
+ }
+ };
+
+ return (
+
+ );
+};
diff --git a/src/views/peers/AddPeer.tsx b/src/views/peers/AddPeer.tsx
new file mode 100644
index 00000000..2ecfdac8
--- /dev/null
+++ b/src/views/peers/AddPeer.tsx
@@ -0,0 +1,119 @@
+import React, { useState } from 'react';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+ SingleLine,
+ DarkSubTitle,
+ NoWrapTitle,
+ Separation,
+ ResponsiveLine,
+ Sub4Title,
+} from '../../components/generic/Styled';
+import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
+import { XSvg } from '../../components/generic/Icons';
+import {
+ MultiButton,
+ SingleButton,
+} from '../../components/buttons/multiButton/MultiButton';
+import { Input } from '../../components/input/Input';
+import { mediaDimensions } from '../../styles/Themes';
+import { useSize } from '../../hooks/UseSize';
+import { useMutation } from '@apollo/react-hooks';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../utils/error';
+import { ADD_PEER } from '../../graphql/mutation';
+import { SecureButton } from '../../components/buttons/secureButton/SecureButton';
+
+export const AddPeer = () => {
+ const [isAdding, setIsAdding] = useState(false);
+ const [temp, setTemp] = useState(false);
+ const [key, setKey] = useState('');
+ const [socket, setSocket] = useState('');
+
+ const { width } = useSize();
+
+ const [addPeer, { loading }] = useMutation(ADD_PEER, {
+ onError: error => toast.error(getErrorContent(error)),
+ onCompleted: () => {
+ toast.success('Peer Added');
+ setIsAdding(false);
+ setTemp(false);
+ setKey('');
+ setSocket('');
+ },
+ refetchQueries: ['GetPeers'],
+ });
+
+ const renderButton = (
+ onClick: () => void,
+ text: string,
+ selected: boolean
+ ) => (
+
+ {text}
+
+ );
+
+ const renderAdding = () => (
+ <>
+
+
+ Peer Public Key:
+ setKey(e.target.value)}
+ />
+
+
+ Peer Socket:
+ setSocket(e.target.value)}
+ />
+
+
+ Is Temporary:
+
+ {renderButton(() => setTemp(true), 'Yes', temp)}
+ {renderButton(() => setTemp(false), 'No', !temp)}
+
+
+
+ Add
+
+ >
+ );
+
+ return (
+
+ Peer Management
+
+
+ Add Peer
+ setIsAdding(prev => !prev)}
+ >
+ {isAdding ? : 'Add'}
+
+
+ {isAdding && renderAdding()}
+
+
+ );
+};
diff --git a/src/views/peers/PeersCard.tsx b/src/views/peers/PeersCard.tsx
new file mode 100644
index 00000000..cac550b9
--- /dev/null
+++ b/src/views/peers/PeersCard.tsx
@@ -0,0 +1,185 @@
+import React, { useState } from 'react';
+import {
+ SubCard,
+ Separation,
+ Sub4Title,
+ ResponsiveLine,
+ ResponsiveSingle,
+ ResponsiveCol,
+ RightAlign,
+} from '../../components/generic/Styled';
+import {
+ renderLine,
+ getDateDif,
+ getFormatDate,
+ getTooltipType,
+ getNodeLink,
+} from '../../components/generic/Helpers';
+import styled from 'styled-components';
+import { DownArrow, UpArrow } from '../../components/generic/Icons';
+import {
+ Progress,
+ ProgressBar,
+ NodeTitle,
+ MainInfo,
+} from '../../components/generic/CardGeneric';
+import { getPercent } from '../../utils/Helpers';
+import { useSettings } from '../../context/SettingsContext';
+import ReactTooltip from 'react-tooltip';
+import { usePriceState } from '../../context/PriceContext';
+import { getPrice } from '../../components/price/Price';
+import { AdminSwitch } from '../../components/adminSwitch/AdminSwitch';
+import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
+import Modal from '../../components/modal/ReactModal';
+import { RemovePeerModal } from '../../components/modal/removePeer/RemovePeer';
+
+const IconPadding = styled.div`
+ margin-left: 16px;
+ margin-right: 8px;
+`;
+
+const getSymbol = (status: boolean) => {
+ return status ? : ;
+};
+
+interface PeerProps {
+ peer: any;
+ index: number;
+ setIndexOpen: (index: number) => void;
+ indexOpen: number;
+}
+
+export const PeersCard = ({
+ peer,
+ index,
+ setIndexOpen,
+ indexOpen,
+}: PeerProps) => {
+ const [modalOpen, setModalOpen] = useState(false);
+
+ const { theme, currency } = useSettings();
+ const priceContext = usePriceState();
+
+ const format = getPrice(currency, priceContext);
+ const tooltipType = getTooltipType(theme);
+
+ const {
+ bytes_received,
+ bytes_sent,
+ is_inbound,
+ is_sync_peer,
+ ping_time,
+ public_key,
+ socket,
+ tokens_received,
+ tokens_sent,
+ partner_node_info = {},
+ } = peer;
+
+ const formatReceived = format({ amount: tokens_received });
+ const formatSent = format({ amount: tokens_sent });
+
+ const {
+ alias,
+ capacity,
+ channel_count,
+ color,
+ updated_at,
+ } = partner_node_info;
+
+ const handleClick = () => {
+ if (indexOpen === index) {
+ setIndexOpen(0);
+ } else {
+ setIndexOpen(index);
+ }
+ };
+
+ const renderDetails = () => {
+ return (
+ <>
+
+ {renderLine('Tokens Received:', formatReceived)}
+ {renderLine('Tokens Sent:', formatSent)}
+ {renderLine('bytes Received:', bytes_received)}
+ {renderLine('bytes Sent:', bytes_sent)}
+ {renderLine('Public Key:', getNodeLink(public_key))}
+ {renderLine('Socket:', socket)}
+ {renderLine('Is Inbound:', is_inbound.toString())}
+ {renderLine('Is Sync Peer:', is_sync_peer.toString())}
+ {renderLine('Ping Time:', ping_time)}
+ Partner Node Info
+ {renderLine('Node Capacity:', capacity)}
+ {renderLine('Channel Count:', channel_count)}
+ {renderLine(
+ 'Last Update:',
+ `${getDateDif(updated_at)} ago (${getFormatDate(updated_at)})`
+ )}
+
+
+
+ setModalOpen(true)}
+ >
+ Remove Peer
+
+
+
+ >
+ );
+ };
+
+ return (
+
+ handleClick()}>
+
+
+ {alias ? alias : 'Unknown'}
+
+
+ {getSymbol(is_inbound)}
+
+
+
+
+
+
+
+
+
+
+
+ {index === indexOpen && renderDetails()}
+
+ {`bytes Received: ${bytes_received}`}
+ {`bytes Sent: ${bytes_sent}`}
+
+
+ {`Tokens Received: ${formatReceived}`}
+ {`Tokens Sent: ${formatSent}`}
+
+ setModalOpen(false)}>
+
+
+
+ );
+};
diff --git a/src/views/settings/Account.tsx b/src/views/settings/Account.tsx
new file mode 100644
index 00000000..7edd349a
--- /dev/null
+++ b/src/views/settings/Account.tsx
@@ -0,0 +1,134 @@
+import React, { useState } from 'react';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+ SingleLine,
+ Sub4Title,
+ Separation,
+} from '../../components/generic/Styled';
+import { SettingsLine } from '../../../pages/settings';
+import { useAccount } from '../../context/AccountContext';
+import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
+import { XSvg } from '../../components/generic/Icons';
+import {
+ MultiButton,
+ SingleButton,
+} from '../../components/buttons/multiButton/MultiButton';
+import { useConnectionDispatch } from '../../context/ConnectionContext';
+import { useStatusDispatch } from '../../context/StatusContext';
+import { Auth } from '../../components/auth';
+import { useRouter } from 'next/router';
+
+export const AccountSettings = () => {
+ const [status, setStatus] = useState('none');
+
+ const { push } = useRouter();
+ const { id, changeAccount, accounts } = useAccount();
+
+ const dispatch = useConnectionDispatch();
+ const dispatchState = useStatusDispatch();
+
+ const [isType, setIsType] = useState('login');
+ const [willAdd, setWillAdd] = useState(false);
+
+ const renderButtons = () => (
+
+ Connection Type:
+
+ setIsType('login')}
+ >
+ Connection Details
+
+ setIsType('connect')}
+ >
+ LndConnect Url
+
+ setIsType('btcpay')}
+ >
+ BTCPayServer Info
+
+ setIsType('qrcode')}
+ >
+ QR Code
+
+
+
+ );
+
+ const renderChangeAccount = () => {
+ if (accounts.length <= 1) {
+ return null;
+ }
+
+ return (
+
+ Change Account
+
+ {accounts.map(({ name: accountName, id: accountId }) => {
+ return (
+ {
+ if (accountId !== id) {
+ dispatch({ type: 'disconnected' });
+ dispatchState({
+ type: 'disconnected',
+ });
+ changeAccount(accountId);
+ push('/');
+ }
+ }}
+ >
+ {accountName}
+
+ );
+ })}
+
+
+ );
+ };
+
+ return (
+
+ Account
+
+ {renderChangeAccount()}
+
+ Add Account
+ {
+ if (willAdd) {
+ setIsType('login');
+ }
+ setWillAdd(prev => !prev);
+ }}
+ >
+ {willAdd ? : 'Add New Account'}
+
+
+ {willAdd && (
+ <>
+
+ {status === 'none' && renderButtons()}
+ setStatus('none')}
+ />
+ >
+ )}
+
+
+ );
+};
diff --git a/src/views/settings/Current.tsx b/src/views/settings/Current.tsx
new file mode 100644
index 00000000..7d1da198
--- /dev/null
+++ b/src/views/settings/Current.tsx
@@ -0,0 +1,51 @@
+import React from 'react';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+ Sub4Title,
+} from '../../components/generic/Styled';
+import styled from 'styled-components';
+import { chartLinkColor, colorButtonBackground } from '../../styles/Themes';
+import { useAccount } from '../../context/AccountContext';
+
+const CurrentField = styled.textarea`
+ width: 100%;
+ color: ${chartLinkColor};
+ margin: 10px 0;
+ font-size: 14px;
+ padding: 5px 10px;
+ border-radius: 5px;
+ background-color: ${colorButtonBackground};
+ border: none;
+ word-wrap: break-word;
+ resize: none;
+`;
+
+export const CurrentSettings = () => {
+ const { name, host, admin, viewOnly, cert } = useAccount();
+
+ const renderField = (title: string, field: string | null, rows?: number) => {
+ if (!field) return null;
+
+ return (
+ <>
+ {title}
+
+ >
+ );
+ };
+
+ return (
+
+ Current Account:
+
+ {renderField('Name:', name, 2)}
+ {renderField('Host:', host, 2)}
+ {renderField('AES-256 Encrypted Admin Macaroon:', admin)}
+ {renderField('Read-only Macaroon:', viewOnly)}
+ {renderField('Certificate:', cert)}
+
+
+ );
+};
diff --git a/src/views/settings/Danger.tsx b/src/views/settings/Danger.tsx
new file mode 100644
index 00000000..82953144
--- /dev/null
+++ b/src/views/settings/Danger.tsx
@@ -0,0 +1,178 @@
+import React from 'react';
+import {
+ Card,
+ CardWithTitle,
+ SubTitle,
+ SingleLine,
+ SimpleButton,
+ Sub4Title,
+} from '../../components/generic/Styled';
+import { deleteStorage, deleteAccountPermissions } from '../../utils/storage';
+import { useAccount } from '../../context/AccountContext';
+import styled from 'styled-components';
+import { textColor, fontColors } from '../../styles/Themes';
+import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
+import {
+ MultiButton,
+ SingleButton,
+} from '../../components/buttons/multiButton/MultiButton';
+import { AlertCircle } from '../../components/generic/Icons';
+import { useConnectionDispatch } from '../../context/ConnectionContext';
+import { useStatusDispatch } from '../../context/StatusContext';
+import { useRouter } from 'next/router';
+
+export const ButtonRow = styled.div`
+ width: auto;
+ display: flex;
+`;
+
+const OutlineCard = styled(Card)`
+ &:hover {
+ border: 1px solid red;
+ }
+`;
+
+export const SettingsLine = styled(SingleLine)`
+ margin: 10px 0;
+`;
+
+export const SettingsButton = styled(SimpleButton)`
+ padding: 10px;
+
+ &:hover {
+ border: 1px solid ${textColor};
+ }
+`;
+
+export const CheckboxText = styled.div`
+ font-size: 13px;
+ color: ${fontColors.grey7};
+ text-align: justify;
+`;
+
+export const StyledContainer = styled.div`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin-top: 16px;
+`;
+
+export const FixedWidth = styled.div`
+ height: 18px;
+ width: 18px;
+ margin: 0px;
+ margin-right: 8px;
+`;
+
+export const DangerView = () => {
+ const {
+ deleteAccount,
+ refreshAccount,
+ changeAccount,
+ accounts,
+ admin,
+ viewOnly,
+ id,
+ } = useAccount();
+
+ const dispatch = useConnectionDispatch();
+ const dispatchState = useStatusDispatch();
+
+ const { push } = useRouter();
+
+ const renderButton = () => {
+ if (accounts.length > 1) {
+ return (
+
+ {accounts.map(({ name: accountName, id: accountId }) => {
+ return (
+ {
+ deleteAccount(accountId);
+ }}
+ >
+ {accountName}
+
+ );
+ })}
+
+ );
+ }
+ if (accounts.length === 1) {
+ return (
+ {
+ deleteAccount(accounts[0].id);
+ }}
+ >
+ {accounts[0].name}
+
+ );
+ }
+ return null;
+ };
+
+ const handleDelete = (admin?: boolean) => {
+ deleteAccountPermissions(id, accounts, admin);
+ dispatch({ type: 'disconnected' });
+ dispatchState({
+ type: 'disconnected',
+ });
+ changeAccount(id);
+ push('/');
+ };
+
+ const renderSwitch = () => {
+ return (
+
+ Change Permissions
+
+ handleDelete()}>View-Only
+ handleDelete(true)}>
+ Admin-Only
+
+
+
+ );
+ };
+
+ return (
+
+ Danger Zone
+
+ {admin && viewOnly && renderSwitch()}
+
+ Delete Account:
+ {renderButton()}
+
+
+ Delete all Accounts and Settings:
+
+ {
+ deleteStorage();
+ refreshAccount();
+ push('/');
+ }}
+ >
+ Delete All
+
+
+
+
+
+
+
+
+ This does not affect in any way your node, only the ThunderHub
+ accounts saved in this browser.
+
+
+
+
+ );
+};
diff --git a/src/views/settings/Interface.tsx b/src/views/settings/Interface.tsx
new file mode 100644
index 00000000..1371fe62
--- /dev/null
+++ b/src/views/settings/Interface.tsx
@@ -0,0 +1,83 @@
+import React from 'react';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+ Sub4Title,
+} from '../../components/generic/Styled';
+import { SettingsLine } from '../../../pages/settings';
+import { useSettings } from '../../context/SettingsContext';
+
+import {
+ MultiButton,
+ SingleButton,
+} from '../../components/buttons/multiButton/MultiButton';
+import { useAccount } from '../../context/AccountContext';
+
+export const InterfaceSettings = () => {
+ const {
+ theme,
+ currency,
+ nodeInfo,
+ setSettings,
+ refreshSettings,
+ } = useSettings();
+
+ const { accounts } = useAccount();
+
+ const viewOnlyAccounts = accounts.filter(account => account.viewOnly !== '');
+
+ const renderButton = (
+ title: string,
+ value: string,
+ type: string,
+ current: string
+ ) => (
+ {
+ localStorage.setItem(type, value);
+ type === 'theme' && setSettings({ theme: value });
+ type === 'currency' && setSettings({ currency: value });
+ type === 'nodeInfo' &&
+ setSettings({ nodeInfo: value === 'true' ? true : false });
+ refreshSettings();
+ }}
+ >
+ {title}
+
+ );
+
+ return (
+
+ Interface
+
+
+ Theme:
+
+ {renderButton('Light', 'light', 'theme', theme)}
+ {renderButton('Dark', 'dark', 'theme', theme)}
+
+
+ {viewOnlyAccounts.length > 1 && (
+
+ Show all accounts on homepage:
+
+ {renderButton('Yes', 'true', 'nodeInfo', `${nodeInfo}`)}
+ {renderButton('No', 'false', 'nodeInfo', `${nodeInfo}`)}
+
+
+ )}
+
+ Currency:
+
+ {renderButton('Bitcoin', 'btc', 'currency', currency)}
+ {renderButton('Satoshis', 'sat', 'currency', currency)}
+ {renderButton('Euro', 'EUR', 'currency', currency)}
+ {renderButton('US Dollar', 'USD', 'currency', currency)}
+
+
+
+
+ );
+};
diff --git a/src/views/settings/Sync.tsx b/src/views/settings/Sync.tsx
new file mode 100644
index 00000000..936e3296
--- /dev/null
+++ b/src/views/settings/Sync.tsx
@@ -0,0 +1,172 @@
+import React, { useState } from 'react';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+ Sub4Title,
+ Separation,
+} from '../../components/generic/Styled';
+import { SettingsLine } from '../../../pages/settings';
+import {
+ MultiButton,
+ SingleButton,
+} from '../../components/buttons/multiButton/MultiButton';
+import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
+import { XSvg } from '../../components/generic/Icons';
+import { useAccount } from '../../context/AccountContext';
+import QRCode from 'qrcode.react';
+import styled from 'styled-components';
+import { useInterval } from '../../hooks/UseInterval';
+import Modal from '../../components/modal/ReactModal';
+import { themeColors } from '../../styles/Themes';
+
+const QRWrapper = styled.div`
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+`;
+
+export const SyncSettings = () => {
+ const { name, host, admin, viewOnly, cert } = useAccount();
+
+ const getValue = () => {
+ switch (true) {
+ case !!viewOnly:
+ return 'viewOnly';
+ default:
+ return 'adminOnly';
+ }
+ };
+
+ const [state, setState] = useState('none');
+ const [type, setType] = useState(getValue());
+
+ const getObject = () => {
+ switch (type) {
+ case 'complete':
+ return { viewOnly, admin };
+ case 'adminOnly':
+ return { admin };
+ default:
+ return { viewOnly };
+ }
+ };
+
+ const renderSettings = () => (
+ <>
+
+
+ Sync Type
+
+ {viewOnly && (
+ setType('viewOnly')}
+ >
+ View-Only
+
+ )}
+ {admin && (
+ setType('adminOnly')}
+ >
+ Admin-Only
+
+ )}
+ {viewOnly && admin && (
+ setType('complete')}
+ >
+ Admin and View
+
+ )}
+
+
+
+ setState('finish')}
+ >
+ Generate QR
+
+
+ >
+ );
+
+ const renderQRCode = () => {
+ const connection = JSON.stringify({
+ name,
+ host,
+ cert,
+ ...getObject(),
+ });
+
+ return (
+ setState('none')}
+ >
+
+
+ Scan with ThunderHub
+
+
+
+
+ );
+ };
+
+ return (
+
+ Sync
+
+
+ Sync account to another device
+
+ setState((prev: string) =>
+ prev !== 'none' ? 'none' : 'generate'
+ )
+ }
+ >
+ {state !== 'none' ? : 'Sync'}
+
+
+ {state === 'generate' && renderSettings()}
+ {state === 'finish' && renderQRCode()}
+
+
+ );
+};
+
+const QRLoop = ({ connection }: { connection: string }) => {
+ const textArray = connection.match(/.{1,100}/g) ?? [];
+ const length = textArray.length;
+
+ const objectArray = textArray.map((value: string, index: number) =>
+ JSON.stringify({
+ index,
+ total: length,
+ auth: value,
+ })
+ );
+
+ const [count, setCount] = useState(0);
+
+ useInterval(() => {
+ setCount((prev: number) => {
+ if (prev < length - 1) {
+ return prev + 1;
+ }
+ return 0;
+ });
+ }, 1000);
+
+ return ;
+};
diff --git a/client/src/views/settings/Settings.tsx b/src/views/settings/index.tsx
similarity index 60%
rename from client/src/views/settings/Settings.tsx
rename to src/views/settings/index.tsx
index b1e42957..aa1f0e52 100644
--- a/client/src/views/settings/Settings.tsx
+++ b/src/views/settings/index.tsx
@@ -9,30 +9,32 @@ import { CurrentSettings } from './Current';
import { SyncSettings } from './Sync';
export const ButtonRow = styled.div`
- width: auto;
- display: flex;
+ width: auto;
+ display: flex;
`;
export const SettingsLine = styled(SingleLine)`
- margin: 8px 0;
+ margin: 8px 0;
`;
export const SettingsButton = styled(SimpleButton)`
- padding: 8px;
+ padding: 8px;
- &:hover {
- border: 1px solid ${textColor};
- }
+ &:hover {
+ border: 1px solid ${textColor};
+ }
`;
-export const SettingsView = () => {
- return (
- <>
-
-
-
-
-
- >
- );
+const SettingsView = () => {
+ return (
+ <>
+
+
+
+
+
+ >
+ );
};
+
+export default SettingsView;
diff --git a/src/views/tools/Tools.styled.tsx b/src/views/tools/Tools.styled.tsx
new file mode 100644
index 00000000..6a7d63bf
--- /dev/null
+++ b/src/views/tools/Tools.styled.tsx
@@ -0,0 +1,24 @@
+import styled from 'styled-components';
+
+export const NoWrap = styled.div`
+ margin-right: 16px;
+ white-space: nowrap;
+`;
+
+export const WrapRequest = styled.div`
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+ -ms-word-break: break-all;
+ word-break: break-word;
+ margin: 24px;
+ font-size: 14px;
+`;
+
+export const Column = styled.div`
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+`;
diff --git a/src/views/tools/backups/Backups.tsx b/src/views/tools/backups/Backups.tsx
new file mode 100644
index 00000000..67a0a678
--- /dev/null
+++ b/src/views/tools/backups/Backups.tsx
@@ -0,0 +1,52 @@
+import React, { useState, useEffect } from 'react';
+import {
+ CardWithTitle,
+ CardTitle,
+ SubTitle,
+ Card,
+ Separation,
+ Sub4Title,
+ ResponsiveLine,
+ DarkSubTitle,
+} from '../../../components/generic/Styled';
+import { DownloadBackups } from './DownloadBackups';
+import { VerifyBackups } from './VerifyBackups';
+import { RecoverFunds } from './RecoverFunds';
+import { AdminSwitch } from '../../../components/adminSwitch/AdminSwitch';
+import { getDateDif, getFormatDate } from '../../../components/generic/Helpers';
+
+export const BackupsView = () => {
+ const [lastDate, setLastDate] = useState('');
+
+ useEffect(() => {
+ const date = localStorage.getItem('lastBackup');
+ setLastDate(date);
+ }, []);
+
+ const getDate = () => {
+ if (lastDate) {
+ return `${getDateDif(lastDate)} ago (${getFormatDate(lastDate)})`;
+ }
+ return 'Has not been backed up!';
+ };
+
+ return (
+
+
+ Backups
+
+
+
+ Last Backup Date:
+ {getDate()}
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/views/tools/backups/DownloadBackups.tsx b/src/views/tools/backups/DownloadBackups.tsx
new file mode 100644
index 00000000..1bb42e27
--- /dev/null
+++ b/src/views/tools/backups/DownloadBackups.tsx
@@ -0,0 +1,45 @@
+import React, { useEffect } from 'react';
+import { DarkSubTitle, SingleLine } from '../../../components/generic/Styled';
+import { saveToPc } from '../../../utils/Helpers';
+import { useLazyQuery } from '@apollo/react-hooks';
+import { GET_BACKUPS } from '../../../graphql/query';
+import { useAccount } from '../../../context/AccountContext';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
+
+export const DownloadBackups = () => {
+ const { name, host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const [getBackups, { data, loading }] = useLazyQuery(GET_BACKUPS, {
+ variables: { auth },
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ useEffect(() => {
+ if (!loading && data && data.getBackups) {
+ saveToPc(data.getBackups, `Backup-${name}`);
+ localStorage.setItem('lastBackup', new Date().toString());
+ toast.success('Downloaded');
+ }
+ }, [data, loading, name]);
+
+ return (
+
+ Backup All Channels
+ getBackups()}
+ loading={loading}
+ >
+ Download
+
+
+ );
+};
diff --git a/src/views/tools/backups/RecoverFunds.tsx b/src/views/tools/backups/RecoverFunds.tsx
new file mode 100644
index 00000000..61066e39
--- /dev/null
+++ b/src/views/tools/backups/RecoverFunds.tsx
@@ -0,0 +1,64 @@
+import React, { useState, useEffect } from 'react';
+import { useLazyQuery } from '@apollo/react-hooks';
+import { RECOVER_FUNDS } from '../../../graphql/query';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import { SingleLine, DarkSubTitle } from '../../../components/generic/Styled';
+import { XSvg } from '../../../components/generic/Icons';
+import { SecureButton } from '../../../components/buttons/secureButton/SecureButton';
+import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
+import { Input } from '../../../components/input/Input';
+import { NoWrap } from '../Tools.styled';
+
+export const RecoverFunds = () => {
+ const [backupString, setBackupString] = useState('');
+ const [isPasting, setIsPasting] = useState(false);
+
+ const [recoverFunds, { data, loading }] = useLazyQuery(RECOVER_FUNDS, {
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ useEffect(() => {
+ if (!loading && data && data.recoverFunds) {
+ toast.success('Recovery Succesfull');
+ }
+ }, [data, loading]);
+
+ const renderInput = () => (
+ <>
+
+
+ Backup String:
+
+ setBackupString(e.target.value)} />
+
+
+ Recover
+
+ >
+ );
+
+ return (
+ <>
+
+ Recover Funds from Channels
+ setIsPasting(prev => !prev)}
+ >
+ {isPasting ? : 'Recover'}
+
+
+ {isPasting && renderInput()}
+ >
+ );
+};
diff --git a/src/views/tools/backups/VerifyBackups.tsx b/src/views/tools/backups/VerifyBackups.tsx
new file mode 100644
index 00000000..5dfe33eb
--- /dev/null
+++ b/src/views/tools/backups/VerifyBackups.tsx
@@ -0,0 +1,85 @@
+import React, { useState, useEffect } from 'react';
+import { useAccount } from '../../../context/AccountContext';
+import { useLazyQuery } from '@apollo/react-hooks';
+import { VERIFY_BACKUPS } from '../../../graphql/query';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import {
+ SingleLine,
+ DarkSubTitle,
+ Separation,
+} from '../../../components/generic/Styled';
+import { XSvg } from '../../../components/generic/Icons';
+import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
+import { Input } from '../../../components/input/Input';
+import { NoWrap } from '../Tools.styled';
+
+export const VerifyBackups = () => {
+ const [backupString, setBackupString] = useState('');
+ const [isPasting, setIsPasting] = useState(false);
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const [verifyBackup, { data, loading }] = useLazyQuery(VERIFY_BACKUPS, {
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ useEffect(() => {
+ if (!loading && data && data.verifyBackups) {
+ toast.success('Valid Backup String');
+ }
+ if (!loading && data && !data.verifyBackups) {
+ toast.error('Invalid Backup String');
+ }
+ }, [data, loading]);
+
+ const renderInput = () => (
+ <>
+
+
+ Backup String:
+
+ setBackupString(e.target.value)}
+ />
+
+
+ verifyBackup({
+ variables: { auth, backup: backupString },
+ })
+ }
+ >
+ Verify
+
+
+ >
+ );
+
+ return (
+ <>
+
+ Verify Channels Backup
+ setIsPasting(prev => !prev)}
+ >
+ {isPasting ? : 'Verify'}
+
+
+ {isPasting && renderInput()}
+ >
+ );
+};
diff --git a/src/views/tools/messages/Messages.tsx b/src/views/tools/messages/Messages.tsx
new file mode 100644
index 00000000..6041ec60
--- /dev/null
+++ b/src/views/tools/messages/Messages.tsx
@@ -0,0 +1,26 @@
+import React from 'react';
+import {
+ CardWithTitle,
+ SubTitle,
+ Card,
+} from '../../../components/generic/Styled';
+import styled from 'styled-components';
+import { SignMessage } from './SignMessage';
+import { VerifyMessage } from './VerifyMessage';
+
+export const NoWrap = styled.div`
+ margin-right: 16px;
+ white-space: nowrap;
+`;
+
+export const MessagesView = () => {
+ return (
+
+ Messages
+
+
+
+
+
+ );
+};
diff --git a/src/views/tools/messages/SignMessage.tsx b/src/views/tools/messages/SignMessage.tsx
new file mode 100644
index 00000000..473d0d34
--- /dev/null
+++ b/src/views/tools/messages/SignMessage.tsx
@@ -0,0 +1,100 @@
+import React, { useState, useEffect } from 'react';
+import { useAccount } from '../../../context/AccountContext';
+import { useLazyQuery } from '@apollo/react-hooks';
+import { SIGN_MESSAGE } from '../../../graphql/query';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import {
+ SingleLine,
+ DarkSubTitle,
+ Separation,
+} from '../../../components/generic/Styled';
+import { XSvg, Copy } from '../../../components/generic/Icons';
+import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
+import { NoWrap } from './Messages';
+import { Input } from '../../../components/input/Input';
+import { SecureButton } from '../../../components/buttons/secureButton/SecureButton';
+import CopyToClipboard from 'react-copy-to-clipboard';
+import { AdminSwitch } from '../../../components/adminSwitch/AdminSwitch';
+import { Column, WrapRequest } from '../Tools.styled';
+
+export const SignMessage = () => {
+ const [message, setMessage] = useState('');
+ const [isPasting, setIsPasting] = useState(false);
+ const [signed, setSigned] = useState('');
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ cert,
+ };
+
+ const [signMessage, { data, loading }] = useLazyQuery(SIGN_MESSAGE, {
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ useEffect(() => {
+ if (!loading && data && data.signMessage) {
+ setSigned(data.signMessage);
+ }
+ }, [loading, data]);
+
+ const renderInput = () => (
+ <>
+
+
+ Message:
+
+ setMessage(e.target.value)}
+ />
+
+
+ Sign
+
+
+ >
+ );
+
+ const renderMessage = () => (
+
+ {signed}
+ toast.success('Signature Copied')}
+ >
+
+
+ Copy
+
+
+
+ );
+
+ return (
+
+
+ Sign Message
+ setIsPasting(prev => !prev)}
+ >
+ {isPasting ? : 'Sign'}
+
+
+ {isPasting && renderInput()}
+ {signed !== '' && isPasting && renderMessage()}
+
+ );
+};
diff --git a/src/views/tools/messages/VerifyMessage.tsx b/src/views/tools/messages/VerifyMessage.tsx
new file mode 100644
index 00000000..fa936f13
--- /dev/null
+++ b/src/views/tools/messages/VerifyMessage.tsx
@@ -0,0 +1,108 @@
+import React, { useState, useEffect } from 'react';
+import { useAccount } from '../../../context/AccountContext';
+import { useLazyQuery } from '@apollo/react-hooks';
+import { VERIFY_MESSAGE } from '../../../graphql/query';
+import { toast } from 'react-toastify';
+import { getErrorContent } from '../../../utils/error';
+import {
+ SingleLine,
+ DarkSubTitle,
+ Separation,
+} from '../../../components/generic/Styled';
+import { XSvg, Copy } from '../../../components/generic/Icons';
+import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
+import { NoWrap } from './Messages';
+import { Input } from '../../../components/input/Input';
+import CopyToClipboard from 'react-copy-to-clipboard';
+import { Column, WrapRequest } from '../Tools.styled';
+import { getNodeLink } from '../../../components/generic/Helpers';
+
+export const VerifyMessage = () => {
+ const [message, setMessage] = useState('');
+ const [signature, setSignature] = useState('');
+ const [isPasting, setIsPasting] = useState(false);
+ const [signedBy, setSignedBy] = useState('');
+
+ const { host, viewOnly, cert, sessionAdmin } = useAccount();
+ const auth = {
+ host,
+ cert,
+ macaroon: viewOnly !== '' ? viewOnly : sessionAdmin,
+ };
+
+ const [signMessage, { data, loading }] = useLazyQuery(VERIFY_MESSAGE, {
+ onError: error => toast.error(getErrorContent(error)),
+ });
+
+ useEffect(() => {
+ if (!loading && data && data.verifyMessage) {
+ setSignedBy(data.verifyMessage);
+ }
+ }, [loading, data]);
+
+ const renderInput = () => (
+ <>
+
+
+ Message:
+
+ setMessage(e.target.value)}
+ />
+
+
+
+ Signature:
+
+ setSignature(e.target.value)}
+ />
+
+ signMessage({ variables: { auth, message, signature } })}
+ >
+ Verify
+
+
+ >
+ );
+
+ const renderMessage = () => (
+
+ {getNodeLink(signedBy)}
+ toast.success('Public Node Key Copied')}
+ >
+
+
+ Copy
+
+
+
+ );
+
+ return (
+ <>
+
+ Verify Message
+ setIsPasting(prev => !prev)}
+ >
+ {isPasting ? : 'Verify'}
+
+
+ {isPasting && renderInput()}
+ {signedBy !== '' && isPasting && renderMessage()}
+ >
+ );
+};
diff --git a/src/views/trading/MethodBoxes.tsx b/src/views/trading/MethodBoxes.tsx
new file mode 100644
index 00000000..eaa321ae
--- /dev/null
+++ b/src/views/trading/MethodBoxes.tsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import styled from 'styled-components';
+import { themeColors, subCardColor } from '../../styles/Themes';
+
+interface MethodProps {
+ id: string;
+ payment_method_type: string;
+ payment_method_name: string;
+}
+
+interface MethodBoxesProps {
+ methods: MethodProps[] | undefined;
+}
+
+const StyledMethodBoxes = styled.div`
+ width: 100%;
+ position: relative;
+ right: -16px;
+ top: -26px;
+ display: flex;
+ justify-content: flex-end;
+ margin: 0 0 -24px 0;
+ flex-wrap: wrap;
+ overflow: hidden;
+ height: 24px;
+`;
+
+const StyledMethod = styled.div`
+ font-size: 12px;
+ margin: 0 0 0 8px;
+ border: 1px solid ${themeColors.blue2};
+ border-radius: 4px;
+ padding: 2px 4px;
+ background: ${subCardColor};
+ white-space: nowrap;
+`;
+
+export const MethodBoxes = ({ methods }: MethodBoxesProps) => {
+ if (!methods) return null;
+
+ return (
+
+ {methods.map(method => (
+ {method.payment_method_name}
+ ))}
+
+ );
+};
diff --git a/src/views/trading/Modal/FilterModal.tsx b/src/views/trading/Modal/FilterModal.tsx
new file mode 100644
index 00000000..88cf068e
--- /dev/null
+++ b/src/views/trading/Modal/FilterModal.tsx
@@ -0,0 +1,159 @@
+import React, { useState, useEffect } from 'react';
+import { SubTitle } from '../../../components/generic/Styled';
+import { SortOptions, NewOptions } from '../OfferConfigs';
+import { FilterType } from '../OfferFilters';
+import { useQuery } from '@apollo/react-hooks';
+import {
+ GET_HODL_COUNTRIES,
+ GET_HODL_CURRENCIES,
+} from '../../../graphql/hodlhodl/query';
+import { themeColors } from '../../../styles/Themes';
+import ScaleLoader from 'react-spinners/ScaleLoader';
+import { FilteredList } from './FilteredList';
+import { OptionsLoading } from '../OfferCard.styled';
+import { toast } from 'react-toastify';
+
+interface FilterProps {
+ type: string;
+ dispatch: any;
+ final?: {};
+ newOptions?: FilterType[];
+ setModalType: (type: string) => void;
+}
+
+interface CountryType {
+ code: string;
+ name: string;
+ native_name: string;
+ currency_code: string;
+ currency_name: string;
+}
+
+interface CurrencyType {
+ code: string;
+ name: string;
+ type: string;
+}
+
+export const FilterModal = ({
+ type,
+ dispatch,
+ final,
+ newOptions,
+ setModalType,
+}: FilterProps) => {
+ const searchable: boolean = final?.['searchable'] || false;
+ const skipable: boolean = type !== 'Country' && type !== 'Currency';
+
+ const [selected, setSelected] = useState<{} | undefined>();
+
+ const [options, setOptions] = useState(newOptions ?? []);
+ const [title, setTitle] = useState(final?.['title'] || '');
+
+ const query = type === 'Country' ? GET_HODL_COUNTRIES : GET_HODL_CURRENCIES;
+
+ const { loading, data, error } = useQuery(query, {
+ skip: skipable,
+ onError: () => toast.error('Error Loading Options. Please try again.'),
+ });
+
+ useEffect(() => {
+ switch (type) {
+ case 'sort':
+ setTitle('Sort Offers by:');
+ setOptions(SortOptions);
+ break;
+ case 'new':
+ setTitle('Add New Filter:');
+ setOptions(NewOptions);
+ break;
+ default:
+ break;
+ }
+ }, [type]);
+
+ useEffect(() => {
+ if (!loading && data && data.getCountries) {
+ const countryOptions = data.getCountries.map((country: CountryType) => {
+ const { code, name, native_name } = country;
+ return { name: code, title: `${name} (${native_name})` };
+ });
+
+ setOptions(countryOptions);
+ }
+ if (!loading && data && data.getCurrencies) {
+ const filtered = data.getCurrencies.filter(
+ (currency: CurrencyType) => currency.type === 'fiat'
+ );
+
+ const currencyOptions = filtered.map((currency: CurrencyType) => {
+ const { code, name } = currency;
+ return { name: code, title: name };
+ });
+
+ setOptions(currencyOptions);
+ }
+ }, [data, loading]);
+
+ const handleClick = (name: string, option?: {}) => () => {
+ if (final) {
+ dispatch({
+ type: 'addFilter',
+ newItem: { [final['name']]: name },
+ });
+ setModalType('none');
+ }
+ switch (type) {
+ case 'sort':
+ if (name === 'none') {
+ dispatch({
+ type: 'removeSort',
+ });
+ } else {
+ dispatch({
+ type: 'addSort',
+ newItem: { by: name },
+ });
+ }
+ setModalType('none');
+ break;
+ case 'new':
+ setSelected(option);
+ break;
+ default:
+ break;
+ }
+ };
+
+ if (error) {
+ return null;
+ }
+
+ if (selected) {
+ return (
+ <>
+
+ >
+ );
+ }
+
+ return (
+ <>
+ {title}
+
+
+ {loading && }
+
+ >
+ );
+};
diff --git a/src/views/trading/Modal/FilteredList.tsx b/src/views/trading/Modal/FilteredList.tsx
new file mode 100644
index 00000000..a1692323
--- /dev/null
+++ b/src/views/trading/Modal/FilteredList.tsx
@@ -0,0 +1,78 @@
+import React, { useState, useEffect } from 'react';
+import { ColorButton } from '../../../components/buttons/colorButton/ColorButton';
+import { OfferModalBox } from '../OfferCard.styled';
+import { Input } from '../../../components/input/Input';
+import { Sub4Title } from '../../../components/generic/Styled';
+
+interface FilteredProps {
+ searchable: boolean;
+ options: any;
+ handleClick: any;
+}
+
+interface FilteredOptionsProps {
+ name: string;
+ title: string;
+}
+
+export const FilteredList = ({
+ searchable,
+ options,
+ handleClick,
+}: FilteredProps) => {
+ const [searchTerm, setSearchTerm] = useState('');
+ const [filteredOptions, setOptions] = useState(
+ options
+ );
+
+ useEffect(() => {
+ const filtered = options.filter(
+ (option: { name: string; title: string }) => {
+ const inName = option.name
+ .toLowerCase()
+ .includes(searchTerm.toLowerCase());
+ const inTitle = option.title
+ .toLowerCase()
+ .includes(searchTerm.toLowerCase());
+
+ return inName || inTitle;
+ }
+ );
+ setOptions(filtered);
+ }, [searchTerm, options]);
+
+ const handleChange = (event: any) => {
+ setSearchTerm(event.target.value);
+ };
+
+ return (
+ <>
+ {searchable && (
+
+ )}
+
+ {filteredOptions.length > 0 ? (
+ filteredOptions.map(
+ (option: { name: string; title: string }, index: number) => (
+
+ {option.title}
+
+ )
+ )
+ ) : (
+ No results
+ )}
+
+ >
+ );
+};
diff --git a/src/views/trading/OfferCard.styled.tsx b/src/views/trading/OfferCard.styled.tsx
new file mode 100644
index 00000000..b20f2008
--- /dev/null
+++ b/src/views/trading/OfferCard.styled.tsx
@@ -0,0 +1,54 @@
+import styled from 'styled-components';
+import { unSelectedNavButton, mediaWidths } from '../../styles/Themes';
+import { ChevronRight } from '../../components/generic/Icons';
+
+export const TradesAmount = styled.div`
+ font-size: 14px;
+ color: ${unSelectedNavButton};
+ margin: 0 4px;
+`;
+
+export const StyleArrow = styled(ChevronRight)`
+ margin-bottom: -3px;
+`;
+
+export const OfferModalBox = styled.div`
+ overflow-y: auto;
+ max-height: 640px;
+ min-height: 240px;
+ @media (${mediaWidths.mobile}) {
+ max-height: 240px;
+ min-height: 120px;
+ }
+`;
+
+export const StyledTitle = styled.div`
+ font-size: 14px;
+ margin: 16px 0;
+
+ @media (${mediaWidths.mobile}) {
+ text-align: center;
+ margin-top: 8px;
+ }
+`;
+
+export const StyledLogin = styled.div`
+ max-width: 160px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+`;
+
+export const StyledDescription = styled(StyledLogin)`
+ max-width: unset;
+ overflow-y: auto;
+ font-size: 14px;
+ max-height: 160px;
+`;
+
+export const OptionsLoading = styled.div`
+ display: flex;
+ height: 100%;
+ width: 100%;
+ justify-content: center;
+ align-items: center;
+`;
diff --git a/src/views/trading/OfferCard.tsx b/src/views/trading/OfferCard.tsx
new file mode 100644
index 00000000..5f9021ab
--- /dev/null
+++ b/src/views/trading/OfferCard.tsx
@@ -0,0 +1,188 @@
+import React from 'react';
+import {
+ SubCard,
+ Sub4Title,
+ SubTitle,
+ SingleLine,
+ ResponsiveLine,
+ Separation,
+} from '../../components/generic/Styled';
+import { Rating } from '../../components/rating/Rating';
+import {
+ TradesAmount,
+ StyleArrow,
+ StyledTitle,
+ StyledLogin,
+ StyledDescription,
+} from './OfferCard.styled';
+import { MainInfo } from '../../components/generic/CardGeneric';
+import { themeColors } from '../../styles/Themes';
+import { renderLine } from '../../components/generic/Helpers';
+import numeral from 'numeral';
+import { MethodBoxes } from './MethodBoxes';
+import { Link } from '../../components/link/Link';
+import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
+
+const format = (value: number | string, format: string = '0,0.00') =>
+ numeral(value).format(format);
+
+interface OfferCardProps {
+ offer: any;
+ index: number;
+ setIndexOpen: (index: number) => void;
+ indexOpen: number;
+}
+
+export const OfferCard = ({
+ offer,
+ index,
+ setIndexOpen,
+ indexOpen,
+}: OfferCardProps) => {
+ const {
+ id,
+ asset_code,
+ country,
+ country_code,
+ working_now,
+ side,
+ title,
+ description,
+ currency_code,
+ price,
+ min_amount,
+ max_amount,
+ first_trade_limit,
+ fee,
+ balance,
+ payment_window_minutes,
+ confirmations,
+ payment_method_instructions,
+ trader,
+ } = offer;
+
+ const { author_fee_rate } = fee;
+
+ const {
+ login,
+ online_status,
+ rating,
+ trades_count = 0,
+ url,
+ verified,
+ verified_by,
+ strong_hodler,
+ country: traderCountry,
+ country_code: traderCode,
+ average_payment_time_minutes,
+ average_release_time_minutes,
+ days_since_last_trade,
+ } = trader;
+
+ const handleClick = () => {
+ if (indexOpen === index) {
+ setIndexOpen(0);
+ } else {
+ setIndexOpen(index);
+ }
+ };
+
+ const renderPayments = (): string => {
+ if (payment_method_instructions) {
+ const methods = payment_method_instructions.map(
+ (method: {
+ payment_method_name: string;
+ payment_method_type: string;
+ }) => `${method.payment_method_name} (${method.payment_method_type})`
+ );
+
+ return methods.join(', ');
+ }
+ return '';
+ };
+
+ const renderDetails = () => (
+ <>
+
+ {description}
+
+ {renderLine('Price', format(price))}
+ {renderLine('Min Amount:', format(min_amount))}
+ {renderLine('Max Amount:', format(max_amount))}
+ {renderLine('First Trade Limit:', format(first_trade_limit))}
+ {renderLine('Payment Options:', renderPayments())}
+ {renderLine('Country:', `${country} (${country_code})`)}
+ {renderLine('Available Now:', working_now ? 'Yes' : 'No')}
+ {renderLine('Balance:', format(balance))}
+ {renderLine('Payment Window (min):', payment_window_minutes)}
+ {renderLine('Confirmations:', confirmations)}
+ {renderLine('Fee Rate:', `${format(author_fee_rate * 100)}%`)}
+
+ Trader
+ {renderLine('User:', login)}
+ {renderLine('Online:', online_status)}
+ {renderLine('Rating:', rating)}
+ {renderLine('Amount of Trades:', trades_count)}
+ {renderLine('Verified:', verified)}
+ {renderLine('Verified By:', verified_by)}
+ {renderLine('Strong Hodler:', strong_hodler)}
+ {renderLine('Country:', `${traderCountry} (${traderCode})`)}
+ {renderLine('Average Payment Time (min):', average_payment_time_minutes)}
+ {renderLine('Average Release Time (min):', average_release_time_minutes)}
+ {renderLine('Days since last trade:', days_since_last_trade)}
+
+
+
+ View Offer
+
+
+
+
+ View trader
+
+
+
+ >
+ );
+
+ return (
+
+ handleClick()}>
+
+
+
+ {side !== 'buy' ? asset_code : currency_code}
+
+ {side !== 'buy' ? currency_code : asset_code}
+
+
+ {login}
+ {trades_count > 0 && (
+ {`(${trades_count}) `}
+ )}
+
+
+
+ {title}
+ {renderLine('Price:', format(price))}
+ {renderLine(
+ 'Min/Max amount:',
+ `${format(min_amount, '0a')}/${format(max_amount, '0a')}`
+ )}
+
+ {index === indexOpen && renderDetails()}
+
+ );
+};
diff --git a/src/views/trading/OfferConfigs.tsx b/src/views/trading/OfferConfigs.tsx
new file mode 100644
index 00000000..d1084e9f
--- /dev/null
+++ b/src/views/trading/OfferConfigs.tsx
@@ -0,0 +1,141 @@
+export const SortOptions = [
+ {
+ name: 'none',
+ title: 'None',
+ },
+ {
+ name: 'price',
+ title: 'Price',
+ },
+ {
+ name: 'payment_window_minutes',
+ title: 'Payment Window',
+ },
+ {
+ name: 'user_average_payment_time_minutes',
+ title: 'Average Payment Time',
+ },
+ {
+ name: 'user_average_release_time_minutes',
+ title: 'Average Release Time',
+ },
+ {
+ name: 'rating',
+ title: 'Rating',
+ },
+];
+
+export const NewOptions = [
+ {
+ name: 'asset_code',
+ title: 'Asset Code',
+ options: [
+ {
+ name: 'BTC',
+ title: 'Bitcoin',
+ },
+ {
+ name: 'BTCLN',
+ title: 'Lightning Bitcoin',
+ },
+ ],
+ },
+ {
+ name: 'side',
+ title: 'Side',
+ options: [
+ {
+ name: 'buy',
+ title: 'I want to sell Bitcoin',
+ },
+ {
+ name: 'sell',
+ title: 'I want to buy Bitcoin',
+ },
+ ],
+ },
+ {
+ name: 'include_global',
+ title: 'Include Global Offers',
+ options: [
+ {
+ name: 'true',
+ title: 'Yes',
+ },
+ {
+ name: 'false',
+ title: 'No',
+ },
+ ],
+ },
+ {
+ name: 'only_working_now',
+ title: 'Only Working Now Offers',
+ options: [
+ {
+ name: 'true',
+ title: 'Yes',
+ },
+ {
+ name: 'false',
+ title: 'No',
+ },
+ ],
+ },
+ {
+ name: 'country',
+ title: 'Country',
+ searchable: true,
+ },
+ {
+ name: 'currency_code',
+ title: 'Currency',
+ searchable: true,
+ },
+ {
+ name: 'payment_method_type',
+ title: 'Payment Type',
+ options: [
+ {
+ name: 'Bank wire',
+ title: 'Bank wire',
+ },
+ {
+ name: 'Cash',
+ title: 'Cash',
+ },
+ {
+ name: 'Cryptocurrency',
+ title: 'Cryptocurrency',
+ },
+ {
+ name: 'Online payment system',
+ title: 'Online payment system',
+ },
+ ],
+ },
+ // {
+ // name: 'payment_method_id',
+ // title: 'Payment Id',
+ // },
+ // {
+ // name: 'payment_method_name',
+ // title: 'Payment Name',
+ // },
+ // {
+ // name: 'volume',
+ // title: 'Volume',
+ // },
+ // {
+ // name: 'payment_window_minutes_max',
+ // title: 'Max Payment Window',
+ // },
+ // {
+ // name: 'user_average_payment_time_minutes_max',
+ // title: 'Max User Payment Time',
+ // },
+ // {
+ // name: 'user_average_release_time_minutes_max',
+ // title: 'Max User Release Time',
+ // },
+];
diff --git a/src/views/trading/OfferFilters.tsx b/src/views/trading/OfferFilters.tsx
new file mode 100644
index 00000000..fc62a9f6
--- /dev/null
+++ b/src/views/trading/OfferFilters.tsx
@@ -0,0 +1,240 @@
+import React, { useState, useReducer } from 'react';
+import {
+ SingleLine,
+ Separation,
+ ResponsiveLine,
+ NoWrapTitle,
+} from '../../components/generic/Styled';
+import { ColorButton } from '../../components/buttons/colorButton/ColorButton';
+import {
+ MultiButton,
+ SingleButton,
+} from '../../components/buttons/multiButton/MultiButton';
+import Modal from '../../components/modal/ReactModal';
+import { FilterModal } from './Modal/FilterModal';
+import { SortOptions } from './OfferConfigs';
+import { QueryProps } from '../../../pages/trading';
+import { XSvg } from '../../components/generic/Icons';
+import { renderLine } from '../../components/generic/Helpers';
+import { chartColors } from '../../styles/Themes';
+import { useRouter } from 'next/router';
+import { encode } from '../../utils/Helpers';
+
+type ActionType = {
+ type: 'addFilter' | 'addSort' | 'removeSort' | 'removeFilter' | 'changeLimit';
+ state?: QueryProps;
+ newItem?: {};
+ removeKey?: string;
+ changeLimit?: number;
+};
+
+const reducer = (state: QueryProps, action: ActionType): QueryProps => {
+ const { sort, filters } = state;
+ switch (action.type) {
+ case 'addSort':
+ let direction = {};
+ if (sort && !sort.direction) {
+ direction = { direction: 'desc' };
+ }
+ const newSort = { ...sort, ...direction, ...action.newItem };
+ return { ...state, sort: newSort };
+ case 'removeSort':
+ return { ...state, sort: { by: '', direction: '' } };
+ case 'addFilter':
+ const newFilters = { ...filters, ...action.newItem };
+ return { ...state, filters: newFilters };
+ case 'removeFilter':
+ if (action.removeKey) {
+ const remaining = { ...filters };
+ delete remaining[action.removeKey];
+ return { ...state, filters: remaining };
+ }
+ return state;
+ case 'changeLimit':
+ if (action.changeLimit) {
+ return {
+ ...state,
+ pagination: { limit: action.changeLimit, offset: 0 },
+ };
+ }
+ return state;
+ default:
+ throw new Error();
+ }
+};
+
+interface FilterProps {
+ offerFilters: QueryProps;
+}
+
+export interface FilterType {
+ name: string;
+ title: string;
+ optionOne?: string;
+ optionTwo?: string;
+}
+
+export const OfferFilters = ({ offerFilters }: FilterProps) => {
+ const { push } = useRouter();
+
+ const [filterState, dispatch] = useReducer(reducer, offerFilters);
+
+ const [modalType, setModalType] = useState('none');
+ const [willApply, setWillApply] = useState(false);
+
+ const renderButton = (
+ onClick: () => void,
+ text: string,
+ selected: boolean
+ ) => (
+
+ {text}
+
+ );
+
+ const handleSave = () => {
+ const stringFormat = JSON.stringify(filterState);
+ const encoded = encode(stringFormat);
+ push(`/trading?filter=${encoded}`);
+ };
+
+ const handleRemoveAll = () => push('/trading');
+
+ const handleRemove = (removeKey: string) => {
+ dispatch({ type: 'removeFilter', removeKey });
+ };
+
+ const renderAppliedFilters = () => {
+ const currentFilters = filterState.filters;
+ const activeFilters = [];
+ for (const key in currentFilters) {
+ if (currentFilters.hasOwnProperty(key)) {
+ const element = currentFilters[key];
+ activeFilters.push(
+ renderLine(key, element, `${key}-${element}`, () => handleRemove(key))
+ );
+ }
+ }
+ return <>{activeFilters.map(filter => filter)}>;
+ };
+
+ const renderLimitOptions = () => {
+ const currentLimit = filterState.pagination.limit;
+
+ const renderButton = (value: number, margin?: string) => (
+ dispatch({ type: 'changeLimit', changeLimit: value })}
+ selected={currentLimit === value}
+ withMargin={margin}
+ >
+ {value}
+
+ );
+
+ return (
+
+ {renderButton(25)}
+ {renderButton(50, '0 4px 0')}
+ {renderButton(100)}
+
+ );
+ };
+
+ const renderFilters = () => {
+ return (
+ <>
+
+
+ Results:
+ {renderLimitOptions()}
+
+
+
+ Filters
+ setModalType('new')}>
+ New Filter
+
+
+ {Object.keys(filterState.filters).length > 0 && renderAppliedFilters()}
+
+
+ Sort By:
+ setModalType('sort')}>
+ {SortOptions.find(option => option.name === filterState.sort.by)
+ ?.title ?? 'None'}
+
+
+ {!!filterState.sort.by && (
+
+ Sort Direction:
+
+ {renderButton(
+ () => {
+ dispatch({
+ type: 'addSort',
+ newItem: { direction: 'asc' },
+ });
+ },
+ 'Asc',
+ filterState.sort.direction === 'asc'
+ )}
+ {renderButton(
+ () => {
+ dispatch({
+ type: 'addSort',
+ newItem: { direction: 'desc' },
+ });
+ },
+ 'Desc',
+ filterState.sort.direction !== 'asc'
+ )}
+
+
+ )}
+
+
+
+ Filter
+
+
+ Remove All
+
+
+ >
+ );
+ };
+
+ return (
+ <>
+
+ Filters
+ setWillApply(prev => !prev)}
+ >
+ {willApply ? : 'Apply'}
+
+
+ {willApply && renderFilters()}
+ setModalType('none')}
+ >
+
+
+ >
+ );
+};
diff --git a/src/views/transactions/InvoiceCard.tsx b/src/views/transactions/InvoiceCard.tsx
new file mode 100644
index 00000000..be581377
--- /dev/null
+++ b/src/views/transactions/InvoiceCard.tsx
@@ -0,0 +1,109 @@
+import React from 'react';
+import {
+ Separation,
+ SubCard,
+ SingleLine,
+ ResponsiveLine,
+ DarkSubTitle,
+} from '../../components/generic/Styled';
+import {
+ StatusLine,
+ NodeTitle,
+ MainInfo,
+} from '../../components/generic/CardGeneric';
+import {
+ getStatusDot,
+ getDateDif,
+ getFormatDate,
+ renderLine,
+} from '../../components/generic/Helpers';
+import { Price } from '../../components/price/Price';
+
+interface InvoiceCardProps {
+ invoice: any;
+ index: number;
+ setIndexOpen: (index: number) => void;
+ indexOpen: number;
+}
+
+export const InvoiceCard = ({
+ invoice,
+ index,
+ setIndexOpen,
+ indexOpen,
+}: InvoiceCardProps) => {
+ const {
+ date,
+ confirmed_at,
+ created_at,
+ description,
+ expires_at,
+ is_confirmed,
+ // received,
+ tokens,
+ chain_address,
+ description_hash,
+ id,
+ is_canceled,
+ is_held,
+ is_outgoing,
+ is_private,
+ // payments,
+ // received_mtokens,
+ // request,
+ secret,
+ } = invoice;
+
+ const formatAmount = ;
+
+ const handleClick = () => {
+ if (indexOpen === index) {
+ setIndexOpen(0);
+ } else {
+ setIndexOpen(index);
+ }
+ };
+
+ const renderDetails = () => {
+ return (
+ <>
+
+ {is_confirmed &&
+ renderLine(
+ 'Confirmed:',
+ `${getDateDif(confirmed_at)} ago (${getFormatDate(confirmed_at)})`
+ )}
+ {renderLine(
+ 'Created:',
+ `${getDateDif(created_at)} ago (${getFormatDate(created_at)})`
+ )}
+ {renderLine(
+ 'Expires:',
+ `${getDateDif(expires_at)} ago (${getFormatDate(expires_at)})`
+ )}
+ {renderLine('Id:', id)}
+ {renderLine('Chain Address:', chain_address)}
+ {renderLine('Description Hash:', description_hash)}
+ {renderLine('Is Canceled:', is_canceled)}
+ {renderLine('Is Held:', is_held)}
+ {renderLine('Is Outgoing:', is_outgoing)}
+ {renderLine('Is Private:', is_private)}
+ {renderLine('Secret:', secret)}
+ >
+ );
+ };
+
+ return (
+
+ handleClick()}>
+ {getStatusDot(is_confirmed, 'active')}
+
+ {description ? description : 'Invoice'}
+ {`(${getDateDif(date)} ago)`}
+ {formatAmount}
+
+
+ {index === indexOpen && renderDetails()}
+
+ );
+};
diff --git a/src/views/transactions/PaymentsCards.tsx b/src/views/transactions/PaymentsCards.tsx
new file mode 100644
index 00000000..92560d41
--- /dev/null
+++ b/src/views/transactions/PaymentsCards.tsx
@@ -0,0 +1,103 @@
+import React from 'react';
+import {
+ Separation,
+ SubCard,
+ DarkSubTitle,
+ ResponsiveLine,
+} from '../../components/generic/Styled';
+import {
+ StatusLine,
+ NodeTitle,
+ MainInfo,
+} from '../../components/generic/CardGeneric';
+import {
+ getStatusDot,
+ getDateDif,
+ getFormatDate,
+ getNodeLink,
+ renderLine,
+} from '../../components/generic/Helpers';
+import styled from 'styled-components';
+import { Price } from '../../components/price/Price';
+
+interface PaymentsCardProps {
+ payment: any;
+ index: number;
+ setIndexOpen: (index: number) => void;
+ indexOpen: number;
+}
+
+const RedValue = styled.div`
+ color: red;
+`;
+
+export const PaymentsCard = ({
+ payment,
+ index,
+ setIndexOpen,
+ indexOpen,
+}: PaymentsCardProps) => {
+ const {
+ alias,
+ date,
+ created_at,
+ destination,
+ fee,
+ fee_mtokens,
+ hops,
+ is_confirmed,
+ tokens,
+ id,
+ is_outgoing,
+ mtokens,
+ secret,
+ } = payment;
+
+ const formatAmount = ;
+ const formatFee = ;
+
+ const handleClick = () => {
+ if (indexOpen === index) {
+ setIndexOpen(0);
+ } else {
+ setIndexOpen(index);
+ }
+ };
+
+ const renderDetails = () => {
+ return (
+ <>
+
+ {renderLine(
+ 'Created:',
+ `${getDateDif(created_at)} ago (${getFormatDate(created_at)})`
+ )}
+ {renderLine('Destination Node:', getNodeLink(destination))}
+ {renderLine('Fee:', formatFee)}
+ {renderLine('Fee msats:', `${fee_mtokens} millisats`)}
+ {renderLine('Hops:', hops.length)}
+ {hops.map((hop: any, index: number) =>
+ renderLine(`Hop ${index + 1}:`, hop)
+ )}
+ {renderLine('Id:', id)}
+ {renderLine('Is Outgoing:', is_outgoing ? 'true' : 'false')}
+ {renderLine('Secret:', secret)}
+ {renderLine('M Tokens:', `${mtokens} millisats`)}
+ >
+ );
+ };
+
+ return (
+
+ handleClick()}>
+ {getStatusDot(is_confirmed, 'active')}
+
+ {`Payment to: ${alias}`}
+ {`(${getDateDif(date)} ago)`}
+ {formatAmount}
+
+
+ {index === indexOpen && renderDetails()}
+
+ );
+};
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 00000000..381ee2bb
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": false,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "downlevelIteration": true
+ },
+ "exclude": ["node_modules", ".next"],
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"]
+}
diff --git a/tslint.json b/tslint.json
new file mode 100644
index 00000000..31583420
--- /dev/null
+++ b/tslint.json
@@ -0,0 +1,37 @@
+{
+ "extends": ["tslint-config-airbnb", "tslint-react-hooks"],
+ "rules": {
+ "no-conditional-assignment": true,
+ "no-unbound-method": true,
+ "no-sparse-arrays": true,
+ "restrict-plus-operands": true,
+ "no-invalid-template-strings": true,
+ "no-boolean-literal-compare": true,
+ "no-console": true,
+ "object-shorthand-properties-first": false,
+ "ter-arrow-parens": [true, "as-needed"],
+ "trailing-comma": false,
+ "indent": [true, "spaces", 4],
+ "import-name": false,
+ "align": false,
+ "function-name": [
+ true,
+ {
+ "function-regex": "^[a-zA-Z$][\\w\\d]+$",
+ "method-regex": "^[a-z$][\\w\\d]+$",
+ "private-method-regex": "^[a-z$][\\w\\d]+$",
+ "protected-method-regex": "^[a-z$][\\w\\d]+$",
+ "static-method-regex": "^[a-z$][\\w\\d]+$"
+ }
+ ],
+ "variable-name": {
+ "options": [
+ "ban-keywords",
+ "check-format",
+ "allow-leading-underscore",
+ "allow-pascal-case"
+ ]
+ },
+ "react-hooks-nesting": true
+ }
+}
diff --git a/yarn.lock b/yarn.lock
index 05589a30..f87cfc29 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -28,6 +28,48 @@
tunnel-agent "0.6.0"
uuid "3.4.0"
+"@ampproject/toolbox-core@^2.0.0", "@ampproject/toolbox-core@^2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-core/-/toolbox-core-2.2.0.tgz#3878c5fbdd2acdd865f070ded43ee84652a7a16b"
+ integrity sha512-g0NnZZqPJttIcdplIpiMDmOLewwvCWPSnFKvNdyYXN7vknRvR4krpV2qveuVgjnA+dSlDmtzuFapFCaWh4V7FQ==
+ dependencies:
+ cross-fetch "3.0.4"
+
+"@ampproject/toolbox-optimizer@2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-optimizer/-/toolbox-optimizer-2.0.1.tgz#943681faf24443044aa66f0b55eefb13cdcc068c"
+ integrity sha512-zroXqrV7mY77+/6hV7kaaWxp4LA85V0B/2vg7WdF+FrwiO9Wior/lIW8UbpRek6INjw0VOp1ED73MmGJkwaDhA==
+ dependencies:
+ "@ampproject/toolbox-core" "^2.0.0"
+ "@ampproject/toolbox-runtime-version" "^2.0.0"
+ "@ampproject/toolbox-script-csp" "^2.0.0"
+ "@ampproject/toolbox-validator-rules" "^2.0.0"
+ css "2.2.4"
+ domhandler "3.0.0"
+ domutils "2.0.0"
+ htmlparser2 "4.1.0"
+ normalize-html-whitespace "1.0.0"
+ terser "4.6.7"
+
+"@ampproject/toolbox-runtime-version@^2.0.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.2.0.tgz#e90ae9e97081c9c5362262f9ba093ac029837a8c"
+ integrity sha512-kQRLMreDp1Wp9DotQzJ4k/ZKK6ZxtI6ce2JIvyH8Xfi6H4BQNu0Ht0agMgm51/OsMKyHD+dDIGEHKaKWIOiPLQ==
+ dependencies:
+ "@ampproject/toolbox-core" "^2.2.0"
+
+"@ampproject/toolbox-script-csp@^2.0.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-script-csp/-/toolbox-script-csp-2.2.0.tgz#7bc33985e94a40acdbddb5695dc8d85f11066803"
+ integrity sha512-Z5AzbWFTlTMJg0z1/frMDmW6Gj+EbOw0dVdFYfdma4AJq4rNoxCQMVgVOjl4ryWNouJvK1RUA8o7sY1WmMx6eg==
+
+"@ampproject/toolbox-validator-rules@^2.0.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/toolbox-validator-rules/-/toolbox-validator-rules-2.2.0.tgz#830a2bc22a09dc17ff37835991858902d04cfe19"
+ integrity sha512-R5VkDmhmNatq9SuuHaeA2Uno4O5K4YSh11o6A/5jJZ2EjilAcpuAKvZlRp9tjucPWHi+/z/n5PCJ8YUxzCzWaQ==
+ dependencies:
+ cross-fetch "3.0.4"
+
"@apollo/protobufjs@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.0.3.tgz#02c655aedd4ba7c7f64cbc3d2b1dd9a000a391ba"
@@ -55,7 +97,7 @@
ts-invariant "^0.4.4"
tslib "^1.10.0"
-"@apollo/react-hooks@^3.1.3":
+"@apollo/react-hooks@^3.1.4":
version "3.1.4"
resolved "https://registry.yarnpkg.com/@apollo/react-hooks/-/react-hooks-3.1.4.tgz#2d966ed4fdf01729113850a72698faee490fd429"
integrity sha512-yamD5a1Gu9fGQjZYEQn2nSG+BRyde4dy055agtYOvP/5/njJBSJ25tRFbjxKf7+YW9fsu2Xguib3anoQTuesNg==
@@ -84,7 +126,7 @@
dependencies:
"@babel/highlight" "^7.0.0"
-"@babel/code-frame@7.8.3", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3":
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
@@ -100,7 +142,27 @@
invariant "^2.2.4"
semver "^5.5.0"
-"@babel/core@7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5", "@babel/core@^7.7.5":
+"@babel/core@7.7.2":
+ version "7.7.2"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.2.tgz#ea5b99693bcfc058116f42fa1dd54da412b29d91"
+ integrity sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==
+ dependencies:
+ "@babel/code-frame" "^7.5.5"
+ "@babel/generator" "^7.7.2"
+ "@babel/helpers" "^7.7.0"
+ "@babel/parser" "^7.7.2"
+ "@babel/template" "^7.7.0"
+ "@babel/traverse" "^7.7.2"
+ "@babel/types" "^7.7.2"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ json5 "^2.1.0"
+ lodash "^4.17.13"
+ resolve "^1.3.2"
+ semver "^5.4.1"
+ source-map "^0.5.0"
+
+"@babel/core@7.9.0", "@babel/core@^7.4.5", "@babel/core@^7.7.5", "@babel/core@^7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e"
integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==
@@ -122,12 +184,12 @@
semver "^5.4.1"
source-map "^0.5.0"
-"@babel/generator@^7.4.0", "@babel/generator@^7.9.0":
- version "7.9.4"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce"
- integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==
+"@babel/generator@^7.7.2", "@babel/generator@^7.9.0", "@babel/generator@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9"
+ integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==
dependencies:
- "@babel/types" "^7.9.0"
+ "@babel/types" "^7.9.5"
jsesc "^2.5.1"
lodash "^4.17.13"
source-map "^0.5.0"
@@ -148,13 +210,13 @@
"@babel/types" "^7.8.3"
"@babel/helper-builder-react-jsx-experimental@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43"
- integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ==
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz#0b4b3e04e6123f03b404ca4dfd6528fe6bb92fe3"
+ integrity sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg==
dependencies:
"@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/helper-module-imports" "^7.8.3"
- "@babel/types" "^7.9.0"
+ "@babel/types" "^7.9.5"
"@babel/helper-builder-react-jsx@^7.9.0":
version "7.9.0"
@@ -175,12 +237,12 @@
levenary "^1.1.1"
semver "^5.5.0"
-"@babel/helper-create-class-features-plugin@^7.8.3":
- version "7.8.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0"
- integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg==
+"@babel/helper-create-class-features-plugin@^7.7.0", "@babel/helper-create-class-features-plugin@^7.8.3":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.5.tgz#79753d44017806b481017f24b02fd4113c7106ea"
+ integrity sha512-IipaxGaQmW4TfWoXdqjY0TzoXQ1HRS0kPpEgvjosb3u7Uedcq297xFqDQiCcQtRRwzIMif+N1MLVI8C5a4/PAA==
dependencies:
- "@babel/helper-function-name" "^7.8.3"
+ "@babel/helper-function-name" "^7.9.5"
"@babel/helper-member-expression-to-functions" "^7.8.3"
"@babel/helper-optimise-call-expression" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
@@ -213,14 +275,14 @@
"@babel/traverse" "^7.8.3"
"@babel/types" "^7.8.3"
-"@babel/helper-function-name@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca"
- integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==
+"@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c"
+ integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==
dependencies:
"@babel/helper-get-function-arity" "^7.8.3"
"@babel/template" "^7.8.3"
- "@babel/types" "^7.8.3"
+ "@babel/types" "^7.9.5"
"@babel/helper-get-function-arity@^7.8.3":
version "7.8.3"
@@ -243,14 +305,14 @@
dependencies:
"@babel/types" "^7.8.3"
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.8.3":
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.0", "@babel/helper-module-imports@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498"
integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
dependencies:
"@babel/types" "^7.8.3"
-"@babel/helper-module-transforms@^7.9.0":
+"@babel/helper-module-transforms@^7.7.0", "@babel/helper-module-transforms@^7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5"
integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==
@@ -303,7 +365,7 @@
"@babel/traverse" "^7.8.6"
"@babel/types" "^7.8.6"
-"@babel/helper-simple-access@^7.8.3":
+"@babel/helper-simple-access@^7.7.0", "@babel/helper-simple-access@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae"
integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==
@@ -318,10 +380,10 @@
dependencies:
"@babel/types" "^7.8.3"
-"@babel/helper-validator-identifier@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed"
- integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==
+"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80"
+ integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==
"@babel/helper-wrap-function@^7.8.3":
version "7.8.3"
@@ -333,7 +395,7 @@
"@babel/traverse" "^7.8.3"
"@babel/types" "^7.8.3"
-"@babel/helpers@^7.9.0":
+"@babel/helpers@^7.7.0", "@babel/helpers@^7.9.0":
version "7.9.2"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f"
integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==
@@ -351,12 +413,12 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0":
+"@babel/parser@^7.0.0", "@babel/parser@^7.7.2", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0":
version "7.9.4"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8"
integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==
-"@babel/plugin-proposal-async-generator-functions@^7.8.3":
+"@babel/plugin-proposal-async-generator-functions@^7.7.0", "@babel/plugin-proposal-async-generator-functions@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f"
integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==
@@ -365,6 +427,14 @@
"@babel/helper-remap-async-to-generator" "^7.8.3"
"@babel/plugin-syntax-async-generators" "^7.8.0"
+"@babel/plugin-proposal-class-properties@7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.0.tgz#ac54e728ecf81d90e8f4d2a9c05a890457107917"
+ integrity sha512-tufDcFA1Vj+eWvwHN+jvMN6QsV5o+vUlytNKrbMiCeDL0F2j92RURzUsUMWE5EJkLyWxjdUslCsMQa9FWth16A==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+
"@babel/plugin-proposal-class-properties@7.8.3", "@babel/plugin-proposal-class-properties@^7.7.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e"
@@ -382,7 +452,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-decorators" "^7.8.3"
-"@babel/plugin-proposal-dynamic-import@^7.8.3":
+"@babel/plugin-proposal-dynamic-import@^7.7.0", "@babel/plugin-proposal-dynamic-import@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054"
integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==
@@ -390,7 +460,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-dynamic-import" "^7.8.0"
-"@babel/plugin-proposal-json-strings@^7.8.3":
+"@babel/plugin-proposal-json-strings@^7.2.0", "@babel/plugin-proposal-json-strings@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b"
integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==
@@ -398,6 +468,14 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-json-strings" "^7.8.0"
+"@babel/plugin-proposal-nullish-coalescing-operator@7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz#7db302c83bc30caa89e38fee935635ef6bd11c28"
+ integrity sha512-TbYHmr1Gl1UC7Vo2HVuj/Naci5BEGNZ0AJhzqD2Vpr6QPFWpUmBRLrIDjedzx7/CShq0bRDS2gI4FIs77VHLVQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.7.4"
+
"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2"
@@ -414,15 +492,24 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-numeric-separator" "^7.8.3"
-"@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f"
- integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==
+"@babel/plugin-proposal-object-rest-spread@7.6.2":
+ version "7.6.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096"
+ integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
+
+"@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.9.0", "@babel/plugin-proposal-object-rest-spread@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz#3fd65911306d8746014ec0d0cf78f0e39a149116"
+ integrity sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+ "@babel/plugin-transform-parameters" "^7.9.5"
-"@babel/plugin-proposal-optional-catch-binding@^7.8.3":
+"@babel/plugin-proposal-optional-catch-binding@^7.2.0", "@babel/plugin-proposal-optional-catch-binding@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9"
integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==
@@ -430,6 +517,14 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
+"@babel/plugin-proposal-optional-chaining@7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.4.tgz#3f04c2de1a942cbd3008324df8144b9cbc0ca0ba"
+ integrity sha512-JmgaS+ygAWDR/STPe3/7y0lNlHgS+19qZ9aC06nYLwQ/XB7c0q5Xs+ksFU3EDnp9EiEsO0dnRAOKeyLHTZuW3A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.7.4"
+
"@babel/plugin-proposal-optional-chaining@7.9.0", "@babel/plugin-proposal-optional-chaining@^7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58"
@@ -438,7 +533,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-optional-chaining" "^7.8.0"
-"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3":
+"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.7.0", "@babel/plugin-proposal-unicode-property-regex@^7.8.3":
version "7.8.8"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d"
integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==
@@ -446,13 +541,20 @@
"@babel/helper-create-regexp-features-plugin" "^7.8.8"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-syntax-async-generators@^7.8.0":
+"@babel/plugin-syntax-async-generators@^7.2.0", "@babel/plugin-syntax-async-generators@^7.8.0":
version "7.8.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
+"@babel/plugin-syntax-bigint@7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
+ integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
"@babel/plugin-syntax-decorators@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda"
@@ -460,6 +562,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
+"@babel/plugin-syntax-dynamic-import@7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612"
+ integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+
"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
@@ -474,7 +583,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-syntax-json-strings@^7.8.0":
+"@babel/plugin-syntax-json-strings@^7.2.0", "@babel/plugin-syntax-json-strings@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
@@ -488,7 +597,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0":
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.7.4", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
@@ -502,28 +611,28 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0":
+"@babel/plugin-syntax-object-rest-spread@^7.2.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-optional-catch-binding@^7.8.0":
+"@babel/plugin-syntax-optional-catch-binding@^7.2.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-optional-chaining@^7.8.0":
+"@babel/plugin-syntax-optional-chaining@^7.7.4", "@babel/plugin-syntax-optional-chaining@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-top-level-await@^7.8.3":
+"@babel/plugin-syntax-top-level-await@^7.7.0", "@babel/plugin-syntax-top-level-await@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391"
integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==
@@ -537,14 +646,14 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-arrow-functions@^7.8.3":
+"@babel/plugin-transform-arrow-functions@^7.2.0", "@babel/plugin-transform-arrow-functions@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6"
integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-async-to-generator@^7.8.3":
+"@babel/plugin-transform-async-to-generator@^7.7.0", "@babel/plugin-transform-async-to-generator@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086"
integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==
@@ -553,14 +662,14 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-remap-async-to-generator" "^7.8.3"
-"@babel/plugin-transform-block-scoped-functions@^7.8.3":
+"@babel/plugin-transform-block-scoped-functions@^7.2.0", "@babel/plugin-transform-block-scoped-functions@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3"
integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-block-scoping@^7.8.3":
+"@babel/plugin-transform-block-scoping@^7.6.3", "@babel/plugin-transform-block-scoping@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a"
integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==
@@ -568,35 +677,35 @@
"@babel/helper-plugin-utils" "^7.8.3"
lodash "^4.17.13"
-"@babel/plugin-transform-classes@^7.9.0":
- version "7.9.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d"
- integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==
+"@babel/plugin-transform-classes@^7.7.0", "@babel/plugin-transform-classes@^7.9.0", "@babel/plugin-transform-classes@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c"
+ integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==
dependencies:
"@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/helper-define-map" "^7.8.3"
- "@babel/helper-function-name" "^7.8.3"
+ "@babel/helper-function-name" "^7.9.5"
"@babel/helper-optimise-call-expression" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-replace-supers" "^7.8.6"
"@babel/helper-split-export-declaration" "^7.8.3"
globals "^11.1.0"
-"@babel/plugin-transform-computed-properties@^7.8.3":
+"@babel/plugin-transform-computed-properties@^7.2.0", "@babel/plugin-transform-computed-properties@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b"
integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-destructuring@^7.8.3":
- version "7.8.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b"
- integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==
+"@babel/plugin-transform-destructuring@^7.6.0", "@babel/plugin-transform-destructuring@^7.8.3", "@babel/plugin-transform-destructuring@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50"
+ integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3":
+"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.7.0", "@babel/plugin-transform-dotall-regex@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e"
integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==
@@ -604,14 +713,14 @@
"@babel/helper-create-regexp-features-plugin" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-duplicate-keys@^7.8.3":
+"@babel/plugin-transform-duplicate-keys@^7.5.0", "@babel/plugin-transform-duplicate-keys@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1"
integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-exponentiation-operator@^7.8.3":
+"@babel/plugin-transform-exponentiation-operator@^7.2.0", "@babel/plugin-transform-exponentiation-operator@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7"
integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==
@@ -627,14 +736,14 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-flow" "^7.8.3"
-"@babel/plugin-transform-for-of@^7.9.0":
+"@babel/plugin-transform-for-of@^7.4.4", "@babel/plugin-transform-for-of@^7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e"
integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-function-name@^7.8.3":
+"@babel/plugin-transform-function-name@^7.7.0", "@babel/plugin-transform-function-name@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b"
integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==
@@ -642,21 +751,21 @@
"@babel/helper-function-name" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-literals@^7.8.3":
+"@babel/plugin-transform-literals@^7.2.0", "@babel/plugin-transform-literals@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1"
integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-member-expression-literals@^7.8.3":
+"@babel/plugin-transform-member-expression-literals@^7.2.0", "@babel/plugin-transform-member-expression-literals@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410"
integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-modules-amd@^7.9.0":
+"@babel/plugin-transform-modules-amd@^7.5.0", "@babel/plugin-transform-modules-amd@^7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4"
integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==
@@ -665,7 +774,17 @@
"@babel/helper-plugin-utils" "^7.8.3"
babel-plugin-dynamic-import-node "^2.3.0"
-"@babel/plugin-transform-modules-commonjs@^7.9.0":
+"@babel/plugin-transform-modules-commonjs@7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz#3e5ffb4fd8c947feede69cbe24c9554ab4113fe3"
+ integrity sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/helper-simple-access" "^7.7.0"
+ babel-plugin-dynamic-import-node "^2.3.0"
+
+"@babel/plugin-transform-modules-commonjs@^7.7.0", "@babel/plugin-transform-modules-commonjs@^7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940"
integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==
@@ -675,7 +794,7 @@
"@babel/helper-simple-access" "^7.8.3"
babel-plugin-dynamic-import-node "^2.3.0"
-"@babel/plugin-transform-modules-systemjs@^7.9.0":
+"@babel/plugin-transform-modules-systemjs@^7.7.0", "@babel/plugin-transform-modules-systemjs@^7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90"
integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==
@@ -685,7 +804,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
babel-plugin-dynamic-import-node "^2.3.0"
-"@babel/plugin-transform-modules-umd@^7.9.0":
+"@babel/plugin-transform-modules-umd@^7.7.0", "@babel/plugin-transform-modules-umd@^7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697"
integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==
@@ -693,21 +812,21 @@
"@babel/helper-module-transforms" "^7.9.0"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3":
+"@babel/plugin-transform-named-capturing-groups-regex@^7.7.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c"
integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.8.3"
-"@babel/plugin-transform-new-target@^7.8.3":
+"@babel/plugin-transform-new-target@^7.4.4", "@babel/plugin-transform-new-target@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43"
integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-object-super@^7.8.3":
+"@babel/plugin-transform-object-super@^7.5.5", "@babel/plugin-transform-object-super@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725"
integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==
@@ -715,15 +834,15 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-replace-supers" "^7.8.3"
-"@babel/plugin-transform-parameters@^7.8.7":
- version "7.9.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a"
- integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==
+"@babel/plugin-transform-parameters@^7.4.4", "@babel/plugin-transform-parameters@^7.8.7", "@babel/plugin-transform-parameters@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795"
+ integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==
dependencies:
"@babel/helper-get-function-arity" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-property-literals@^7.8.3":
+"@babel/plugin-transform-property-literals@^7.2.0", "@babel/plugin-transform-property-literals@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263"
integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==
@@ -737,7 +856,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-react-display-name@7.8.3", "@babel/plugin-transform-react-display-name@^7.8.3":
+"@babel/plugin-transform-react-display-name@7.8.3", "@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5"
integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==
@@ -753,7 +872,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-jsx" "^7.8.3"
-"@babel/plugin-transform-react-jsx-self@^7.9.0":
+"@babel/plugin-transform-react-jsx-self@^7.0.0", "@babel/plugin-transform-react-jsx-self@^7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b"
integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==
@@ -761,7 +880,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-jsx" "^7.8.3"
-"@babel/plugin-transform-react-jsx-source@^7.9.0":
+"@babel/plugin-transform-react-jsx-source@^7.0.0", "@babel/plugin-transform-react-jsx-source@^7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0"
integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==
@@ -769,7 +888,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-jsx" "^7.8.3"
-"@babel/plugin-transform-react-jsx@^7.9.1", "@babel/plugin-transform-react-jsx@^7.9.4":
+"@babel/plugin-transform-react-jsx@^7.7.0", "@babel/plugin-transform-react-jsx@^7.9.1", "@babel/plugin-transform-react-jsx@^7.9.4":
version "7.9.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f"
integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==
@@ -779,20 +898,30 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-jsx" "^7.8.3"
-"@babel/plugin-transform-regenerator@^7.8.7":
+"@babel/plugin-transform-regenerator@^7.7.0", "@babel/plugin-transform-regenerator@^7.8.7":
version "7.8.7"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8"
integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==
dependencies:
regenerator-transform "^0.14.2"
-"@babel/plugin-transform-reserved-words@^7.8.3":
+"@babel/plugin-transform-reserved-words@^7.2.0", "@babel/plugin-transform-reserved-words@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5"
integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
+"@babel/plugin-transform-runtime@7.6.2":
+ version "7.6.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.2.tgz#2669f67c1fae0ae8d8bf696e4263ad52cb98b6f8"
+ integrity sha512-cqULw/QB4yl73cS5Y0TZlQSjDvNkzDbu0FurTZyHlJpWE5T3PCMdnyV+xXoH1opr1ldyHODe3QAX3OMAii5NxA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ resolve "^1.8.1"
+ semver "^5.5.1"
+
"@babel/plugin-transform-runtime@7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b"
@@ -803,21 +932,21 @@
resolve "^1.8.1"
semver "^5.5.1"
-"@babel/plugin-transform-shorthand-properties@^7.8.3":
+"@babel/plugin-transform-shorthand-properties@^7.2.0", "@babel/plugin-transform-shorthand-properties@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8"
integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-spread@^7.8.3":
+"@babel/plugin-transform-spread@^7.6.2", "@babel/plugin-transform-spread@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8"
integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-sticky-regex@^7.8.3":
+"@babel/plugin-transform-sticky-regex@^7.2.0", "@babel/plugin-transform-sticky-regex@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100"
integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==
@@ -825,7 +954,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/helper-regex" "^7.8.3"
-"@babel/plugin-transform-template-literals@^7.8.3":
+"@babel/plugin-transform-template-literals@^7.4.4", "@babel/plugin-transform-template-literals@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80"
integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==
@@ -833,14 +962,14 @@
"@babel/helper-annotate-as-pure" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-typeof-symbol@^7.8.4":
+"@babel/plugin-transform-typeof-symbol@^7.2.0", "@babel/plugin-transform-typeof-symbol@^7.8.4":
version "7.8.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412"
integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-transform-typescript@^7.9.0":
+"@babel/plugin-transform-typescript@^7.7.2", "@babel/plugin-transform-typescript@^7.9.0":
version "7.9.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz#4bb4dde4f10bbf2d787fce9707fb09b483e33359"
integrity sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==
@@ -849,7 +978,7 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-typescript" "^7.8.3"
-"@babel/plugin-transform-unicode-regex@^7.8.3":
+"@babel/plugin-transform-unicode-regex@^7.7.0", "@babel/plugin-transform-unicode-regex@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad"
integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==
@@ -857,7 +986,64 @@
"@babel/helper-create-regexp-features-plugin" "^7.8.3"
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/preset-env@7.9.0", "@babel/preset-env@^7.4.5":
+"@babel/preset-env@7.7.1":
+ version "7.7.1"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.1.tgz#04a2ff53552c5885cf1083e291c8dd5490f744bb"
+ integrity sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.7.0"
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-proposal-async-generator-functions" "^7.7.0"
+ "@babel/plugin-proposal-dynamic-import" "^7.7.0"
+ "@babel/plugin-proposal-json-strings" "^7.2.0"
+ "@babel/plugin-proposal-object-rest-spread" "^7.6.2"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.7.0"
+ "@babel/plugin-syntax-async-generators" "^7.2.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.2.0"
+ "@babel/plugin-syntax-json-strings" "^7.2.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
+ "@babel/plugin-syntax-top-level-await" "^7.7.0"
+ "@babel/plugin-transform-arrow-functions" "^7.2.0"
+ "@babel/plugin-transform-async-to-generator" "^7.7.0"
+ "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
+ "@babel/plugin-transform-block-scoping" "^7.6.3"
+ "@babel/plugin-transform-classes" "^7.7.0"
+ "@babel/plugin-transform-computed-properties" "^7.2.0"
+ "@babel/plugin-transform-destructuring" "^7.6.0"
+ "@babel/plugin-transform-dotall-regex" "^7.7.0"
+ "@babel/plugin-transform-duplicate-keys" "^7.5.0"
+ "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
+ "@babel/plugin-transform-for-of" "^7.4.4"
+ "@babel/plugin-transform-function-name" "^7.7.0"
+ "@babel/plugin-transform-literals" "^7.2.0"
+ "@babel/plugin-transform-member-expression-literals" "^7.2.0"
+ "@babel/plugin-transform-modules-amd" "^7.5.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.7.0"
+ "@babel/plugin-transform-modules-systemjs" "^7.7.0"
+ "@babel/plugin-transform-modules-umd" "^7.7.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.0"
+ "@babel/plugin-transform-new-target" "^7.4.4"
+ "@babel/plugin-transform-object-super" "^7.5.5"
+ "@babel/plugin-transform-parameters" "^7.4.4"
+ "@babel/plugin-transform-property-literals" "^7.2.0"
+ "@babel/plugin-transform-regenerator" "^7.7.0"
+ "@babel/plugin-transform-reserved-words" "^7.2.0"
+ "@babel/plugin-transform-shorthand-properties" "^7.2.0"
+ "@babel/plugin-transform-spread" "^7.6.2"
+ "@babel/plugin-transform-sticky-regex" "^7.2.0"
+ "@babel/plugin-transform-template-literals" "^7.4.4"
+ "@babel/plugin-transform-typeof-symbol" "^7.2.0"
+ "@babel/plugin-transform-unicode-regex" "^7.7.0"
+ "@babel/types" "^7.7.1"
+ browserslist "^4.6.0"
+ core-js-compat "^3.1.1"
+ invariant "^2.2.2"
+ js-levenshtein "^1.1.3"
+ semver "^5.5.0"
+
+"@babel/preset-env@7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8"
integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==
@@ -923,6 +1109,72 @@
levenary "^1.1.1"
semver "^5.5.0"
+"@babel/preset-env@^7.4.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.5.tgz#8ddc76039bc45b774b19e2fc548f6807d8a8919f"
+ integrity sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ==
+ dependencies:
+ "@babel/compat-data" "^7.9.0"
+ "@babel/helper-compilation-targets" "^7.8.7"
+ "@babel/helper-module-imports" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/plugin-proposal-async-generator-functions" "^7.8.3"
+ "@babel/plugin-proposal-dynamic-import" "^7.8.3"
+ "@babel/plugin-proposal-json-strings" "^7.8.3"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-proposal-numeric-separator" "^7.8.3"
+ "@babel/plugin-proposal-object-rest-spread" "^7.9.5"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-proposal-optional-chaining" "^7.9.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.8.3"
+ "@babel/plugin-syntax-async-generators" "^7.8.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+ "@babel/plugin-syntax-json-strings" "^7.8.0"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
+ "@babel/plugin-syntax-numeric-separator" "^7.8.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.0"
+ "@babel/plugin-syntax-top-level-await" "^7.8.3"
+ "@babel/plugin-transform-arrow-functions" "^7.8.3"
+ "@babel/plugin-transform-async-to-generator" "^7.8.3"
+ "@babel/plugin-transform-block-scoped-functions" "^7.8.3"
+ "@babel/plugin-transform-block-scoping" "^7.8.3"
+ "@babel/plugin-transform-classes" "^7.9.5"
+ "@babel/plugin-transform-computed-properties" "^7.8.3"
+ "@babel/plugin-transform-destructuring" "^7.9.5"
+ "@babel/plugin-transform-dotall-regex" "^7.8.3"
+ "@babel/plugin-transform-duplicate-keys" "^7.8.3"
+ "@babel/plugin-transform-exponentiation-operator" "^7.8.3"
+ "@babel/plugin-transform-for-of" "^7.9.0"
+ "@babel/plugin-transform-function-name" "^7.8.3"
+ "@babel/plugin-transform-literals" "^7.8.3"
+ "@babel/plugin-transform-member-expression-literals" "^7.8.3"
+ "@babel/plugin-transform-modules-amd" "^7.9.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.9.0"
+ "@babel/plugin-transform-modules-systemjs" "^7.9.0"
+ "@babel/plugin-transform-modules-umd" "^7.9.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
+ "@babel/plugin-transform-new-target" "^7.8.3"
+ "@babel/plugin-transform-object-super" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.9.5"
+ "@babel/plugin-transform-property-literals" "^7.8.3"
+ "@babel/plugin-transform-regenerator" "^7.8.7"
+ "@babel/plugin-transform-reserved-words" "^7.8.3"
+ "@babel/plugin-transform-shorthand-properties" "^7.8.3"
+ "@babel/plugin-transform-spread" "^7.8.3"
+ "@babel/plugin-transform-sticky-regex" "^7.8.3"
+ "@babel/plugin-transform-template-literals" "^7.8.3"
+ "@babel/plugin-transform-typeof-symbol" "^7.8.4"
+ "@babel/plugin-transform-unicode-regex" "^7.8.3"
+ "@babel/preset-modules" "^0.1.3"
+ "@babel/types" "^7.9.5"
+ browserslist "^4.9.1"
+ core-js-compat "^3.6.2"
+ invariant "^2.2.2"
+ levenary "^1.1.1"
+ semver "^5.5.0"
+
"@babel/preset-flow@^7.0.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.9.0.tgz#fee847c3e090b0b2d9227c1949e4da1d1379280d"
@@ -931,6 +1183,17 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-flow-strip-types" "^7.9.0"
+"@babel/preset-modules@0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.1.tgz#add61473e3182771b36930c1312f3c56c114e406"
+ integrity sha512-x/kt2aAZlgcFnP3P851fkkb2s4FmTiyGic58pkWMaRK9Am3u9KkH1ttHGjwlsKu7/TVJsLEBXZnjUxqsid3tww==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
+ "@babel/plugin-transform-dotall-regex" "^7.4.4"
+ "@babel/types" "^7.4.4"
+ esutils "^2.0.2"
+
"@babel/preset-modules@^0.1.3":
version "0.1.3"
resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72"
@@ -942,6 +1205,17 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
+"@babel/preset-react@7.7.0":
+ version "7.7.0"
+ resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.7.0.tgz#8ab0c4787d98cf1f5f22dabf115552bf9e4e406c"
+ integrity sha512-IXXgSUYBPHUGhUkH+89TR6faMcBtuMW0h5OHbMuVbL3/5wK2g6a2M2BBpkLa+Kw0sAHiZ9dNVgqJMDP/O4GRBA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-transform-react-display-name" "^7.0.0"
+ "@babel/plugin-transform-react-jsx" "^7.7.0"
+ "@babel/plugin-transform-react-jsx-self" "^7.0.0"
+ "@babel/plugin-transform-react-jsx-source" "^7.0.0"
+
"@babel/preset-react@7.9.1":
version "7.9.1"
resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.1.tgz#b346403c36d58c3bb544148272a0cefd9c28677a"
@@ -966,6 +1240,14 @@
"@babel/plugin-transform-react-jsx-self" "^7.9.0"
"@babel/plugin-transform-react-jsx-source" "^7.9.0"
+"@babel/preset-typescript@7.7.2":
+ version "7.7.2"
+ resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.7.2.tgz#f71c8bba2ae02f11b29dbf7d6a35f47bbe011632"
+ integrity sha512-1B4HthAelaLGfNRyrWqJtBEjXX1ulThCrLQ5B2VOtEAznWFIFXFJahgXImqppy66lx/Oh+cOSCQdJzZqh2Jh5g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-transform-typescript" "^7.7.2"
+
"@babel/preset-typescript@7.9.0":
version "7.9.0"
resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192"
@@ -974,13 +1256,12 @@
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-transform-typescript" "^7.9.0"
-"@babel/runtime-corejs3@^7.8.3":
- version "7.9.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz#26fe4aa77e9f1ecef9b776559bbb8e84d34284b7"
- integrity sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA==
+"@babel/runtime@7.7.2":
+ version "7.7.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.2.tgz#111a78002a5c25fc8e3361bedc9529c696b85a6a"
+ integrity sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==
dependencies:
- core-js-pure "^3.0.0"
- regenerator-runtime "^0.13.4"
+ regenerator-runtime "^0.13.2"
"@babel/runtime@7.9.0":
version "7.9.0"
@@ -989,19 +1270,14 @@
dependencies:
regenerator-runtime "^0.13.4"
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
version "7.9.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06"
integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==
dependencies:
regenerator-runtime "^0.13.4"
-"@babel/standalone@^7.4.5":
- version "7.9.4"
- resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.9.4.tgz#078025ada03c3d8e60b4abfb042326ad9bfb035d"
- integrity sha512-liRTBSbwxaXmrAqH43qF/fh7soqTMF3+j2eUdsRwKzPwu1WCUBPG1yZQFfk3Wrw3Pk4GFcJpI9dksXY+bhNMwg==
-
-"@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6":
+"@babel/template@^7.7.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6":
version "7.8.6"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b"
integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==
@@ -1010,52 +1286,177 @@
"@babel/parser" "^7.8.6"
"@babel/types" "^7.8.6"
-"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892"
- integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==
+"@babel/traverse@^7.4.5", "@babel/traverse@^7.7.2", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2"
+ integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==
dependencies:
"@babel/code-frame" "^7.8.3"
- "@babel/generator" "^7.9.0"
- "@babel/helper-function-name" "^7.8.3"
+ "@babel/generator" "^7.9.5"
+ "@babel/helper-function-name" "^7.9.5"
"@babel/helper-split-export-declaration" "^7.8.3"
"@babel/parser" "^7.9.0"
- "@babel/types" "^7.9.0"
+ "@babel/types" "^7.9.5"
debug "^4.1.0"
globals "^11.1.0"
lodash "^4.17.13"
-"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5"
- integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==
+"@babel/types@7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193"
+ integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==
dependencies:
- "@babel/helper-validator-identifier" "^7.9.0"
+ esutils "^2.0.2"
lodash "^4.17.13"
to-fast-properties "^2.0.0"
-"@base2/pretty-print-object@1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.0.tgz#860ce718b0b73f4009e153541faff2cb6b85d047"
- integrity sha512-4Th98KlMHr5+JkxfcoDT//6vY8vM+iSPrLNpHhRyLx2CFYi8e2RfqPLdpbnpo0Q5lQC5hNB79yes07zb02fvCw==
-
-"@cnakazawa/watch@^1.0.3":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
- integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==
+"@babel/types@7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c"
+ integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==
dependencies:
- exec-sh "^0.3.2"
- minimist "^1.2.0"
+ esutils "^2.0.2"
+ lodash "^4.17.13"
+ to-fast-properties "^2.0.0"
-"@csstools/convert-colors@^1.4.0":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
- integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==
+"@babel/types@^7.4.4", "@babel/types@^7.7.1", "@babel/types@^7.7.2", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5":
+ version "7.9.5"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444"
+ integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.9.5"
+ lodash "^4.17.13"
+ to-fast-properties "^2.0.0"
-"@csstools/normalize.css@^10.1.0":
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18"
- integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==
+"@commitlint/cli@^8.3.5":
+ version "8.3.5"
+ resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-8.3.5.tgz#6d93a3a8b2437fa978999d3f6a336bcc70be3fd3"
+ integrity sha512-6+L0vbw55UEdht71pgWOE55SRgb+8OHcEwGDB234VlIBFGK9P2QOBU7MHiYJ5cjdjCQ0rReNrGjOHmJ99jwf0w==
+ dependencies:
+ "@commitlint/format" "^8.3.4"
+ "@commitlint/lint" "^8.3.5"
+ "@commitlint/load" "^8.3.5"
+ "@commitlint/read" "^8.3.4"
+ babel-polyfill "6.26.0"
+ chalk "2.4.2"
+ get-stdin "7.0.0"
+ lodash "4.17.15"
+ meow "5.0.0"
+ resolve-from "5.0.0"
+ resolve-global "1.0.0"
+
+"@commitlint/config-conventional@^8.3.4":
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-8.3.4.tgz#fed13b3711690663b176c1f6b39c205a565618d2"
+ integrity sha512-w0Yc5+aVAjZgjYqx29igBOnVCj8O22gy3Vo6Fyp7PwoS7+AYS1x3sN7IBq6i7Ae15Mv5P+rEx1pkxXo5zOMe4g==
+ dependencies:
+ conventional-changelog-conventionalcommits "4.2.1"
+
+"@commitlint/ensure@^8.3.4":
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-8.3.4.tgz#6931677e4ca0fde71686ae3b7a367261647a341d"
+ integrity sha512-8NW77VxviLhD16O3EUd02lApMFnrHexq10YS4F4NftNoErKbKaJ0YYedktk2boKrtNRf/gQHY/Qf65edPx4ipw==
+ dependencies:
+ lodash "4.17.15"
+
+"@commitlint/execute-rule@^8.3.4":
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-8.3.4.tgz#1b63f0713b197889d90b76f9eea1abc010d256b1"
+ integrity sha512-f4HigYjeIBn9f7OuNv5zh2y5vWaAhNFrfeul8CRJDy82l3Y+09lxOTGxfF3uMXKrZq4LmuK6qvvRCZ8mUrVvzQ==
+
+"@commitlint/format@^8.3.4":
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-8.3.4.tgz#7cd1f0ba5a3289c8d14d7dac29ee1fc1597fe1d9"
+ integrity sha512-809wlQ/ND6CLZON+w2Rb3YM2TLNDfU2xyyqpZeqzf2reJNpySMSUAeaO/fNDJSOKIsOsR3bI01rGu6hv28k+Nw==
+ dependencies:
+ chalk "^2.0.1"
+
+"@commitlint/is-ignored@^8.3.5":
+ version "8.3.5"
+ resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-8.3.5.tgz#e6f59496e1b1ce58020d519cd578ad0f43169199"
+ integrity sha512-Zo+8a6gJLFDTqyNRx53wQi/XTiz8mncvmWf/4oRG+6WRcBfjSSHY7KPVj5Y6UaLy2EgZ0WQ2Tt6RdTDeQiQplA==
+ dependencies:
+ semver "6.3.0"
+
+"@commitlint/lint@^8.3.5":
+ version "8.3.5"
+ resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-8.3.5.tgz#627e75adb1cc803cc723e33cc2ba4aa27cbb9f0c"
+ integrity sha512-02AkI0a6PU6rzqUvuDkSi6rDQ2hUgkq9GpmdJqfai5bDbxx2939mK4ZO+7apbIh4H6Pae7EpYi7ffxuJgm+3hQ==
+ dependencies:
+ "@commitlint/is-ignored" "^8.3.5"
+ "@commitlint/parse" "^8.3.4"
+ "@commitlint/rules" "^8.3.4"
+ babel-runtime "^6.23.0"
+ lodash "4.17.15"
+
+"@commitlint/load@^8.3.5":
+ version "8.3.5"
+ resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-8.3.5.tgz#3f059225ede92166ba94cf4c48e3d67c8b08b18a"
+ integrity sha512-poF7R1CtQvIXRmVIe63FjSQmN9KDqjRtU5A6hxqXBga87yB2VUJzic85TV6PcQc+wStk52cjrMI+g0zFx+Zxrw==
+ dependencies:
+ "@commitlint/execute-rule" "^8.3.4"
+ "@commitlint/resolve-extends" "^8.3.5"
+ babel-runtime "^6.23.0"
+ chalk "2.4.2"
+ cosmiconfig "^5.2.0"
+ lodash "4.17.15"
+ resolve-from "^5.0.0"
+
+"@commitlint/message@^8.3.4":
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-8.3.4.tgz#b4e50d14aa6e15a5ad0767b952a7953f3681d768"
+ integrity sha512-nEj5tknoOKXqBsaQtCtgPcsAaf5VCg3+fWhss4Vmtq40633xLq0irkdDdMEsYIx8rGR0XPBTukqzln9kAWCkcA==
+
+"@commitlint/parse@^8.3.4":
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-8.3.4.tgz#d741f8b9104b35d0f4c10938165b20cbf167f81e"
+ integrity sha512-b3uQvpUQWC20EBfKSfMRnyx5Wc4Cn778bVeVOFErF/cXQK725L1bYFvPnEjQO/GT8yGVzq2wtLaoEqjm1NJ/Bw==
+ dependencies:
+ conventional-changelog-angular "^1.3.3"
+ conventional-commits-parser "^3.0.0"
+ lodash "^4.17.11"
+
+"@commitlint/read@^8.3.4":
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-8.3.4.tgz#81a34283d8cd7b2acdf57829a91761e9c7791455"
+ integrity sha512-FKv1kHPrvcAG5j+OSbd41IWexsbLhfIXpxVC/YwQZO+FR0EHmygxQNYs66r+GnhD1EfYJYM4WQIqd5bJRx6OIw==
+ dependencies:
+ "@commitlint/top-level" "^8.3.4"
+ "@marionebl/sander" "^0.6.0"
+ babel-runtime "^6.23.0"
+ git-raw-commits "^2.0.0"
+
+"@commitlint/resolve-extends@^8.3.5":
+ version "8.3.5"
+ resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-8.3.5.tgz#8fff800f292ac217ae30b1862f5f9a84b278310a"
+ integrity sha512-nHhFAK29qiXNe6oH6uG5wqBnCR+BQnxlBW/q5fjtxIaQALgfoNLHwLS9exzbIRFqwJckpR6yMCfgMbmbAOtklQ==
+ dependencies:
+ import-fresh "^3.0.0"
+ lodash "4.17.15"
+ resolve-from "^5.0.0"
+ resolve-global "^1.0.0"
+
+"@commitlint/rules@^8.3.4":
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-8.3.4.tgz#41da7e16c6b89af268fe81c87a158c1fd2ac82b1"
+ integrity sha512-xuC9dlqD5xgAoDFgnbs578cJySvwOSkMLQyZADb1xD5n7BNcUJfP8WjT9W1Aw8K3Wf8+Ym/ysr9FZHXInLeaRg==
+ dependencies:
+ "@commitlint/ensure" "^8.3.4"
+ "@commitlint/message" "^8.3.4"
+ "@commitlint/to-lines" "^8.3.4"
+ babel-runtime "^6.23.0"
+
+"@commitlint/to-lines@^8.3.4":
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-8.3.4.tgz#ce24963b6d86dbe51d88d5e3028ab28f38562e2e"
+ integrity sha512-5AvcdwRsMIVq0lrzXTwpbbG5fKRTWcHkhn/hCXJJ9pm1JidsnidS1y0RGkb3O50TEHGewhXwNoavxW9VToscUA==
+
+"@commitlint/top-level@^8.3.4":
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-8.3.4.tgz#803fc6e8f5be5efa5f3551761acfca961f1d8685"
+ integrity sha512-nOaeLBbAqSZNpKgEtO6NAxmui1G8ZvLG+0wb4rvv6mWhPDzK1GNZkCd8FUZPahCoJ1iHDoatw7F8BbJLg4nDjg==
+ dependencies:
+ find-up "^4.0.0"
"@datastructures-js/heap@^1.2.0":
version "1.2.0"
@@ -1105,7 +1506,7 @@
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
-"@emotion/is-prop-valid@0.8.8", "@emotion/is-prop-valid@^0.8.3":
+"@emotion/is-prop-valid@0.8.8", "@emotion/is-prop-valid@^0.8.8":
version "0.8.8"
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a"
integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==
@@ -1171,79 +1572,24 @@
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
-"@evocateur/libnpmaccess@^3.1.2":
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845"
- integrity sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg==
+"@fimbul/bifrost@^0.21.0":
+ version "0.21.0"
+ resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.21.0.tgz#d0fafa25938fda475657a6a1e407a21bbe02c74e"
+ integrity sha512-ou8VU+nTmOW1jeg+FT+sn+an/M0Xb9G16RucrfhjXGWv1Q97kCoM5CG9Qj7GYOSdu7km72k7nY83Eyr53Bkakg==
dependencies:
- "@evocateur/npm-registry-fetch" "^4.0.0"
- aproba "^2.0.0"
- figgy-pudding "^3.5.1"
- get-stream "^4.0.0"
- npm-package-arg "^6.1.0"
+ "@fimbul/ymir" "^0.21.0"
+ get-caller-file "^2.0.0"
+ tslib "^1.8.1"
+ tsutils "^3.5.0"
-"@evocateur/libnpmpublish@^1.2.2":
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz#55df09d2dca136afba9c88c759ca272198db9f1a"
- integrity sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg==
+"@fimbul/ymir@^0.21.0":
+ version "0.21.0"
+ resolved "https://registry.yarnpkg.com/@fimbul/ymir/-/ymir-0.21.0.tgz#8525726787aceeafd4e199472c0d795160b5d4a1"
+ integrity sha512-T/y7WqPsm4n3zhT08EpB5sfdm2Kvw3gurAxr2Lr5dQeLi8ZsMlNT/Jby+ZmuuAAd1PnXYzKp+2SXgIkQIIMCUg==
dependencies:
- "@evocateur/npm-registry-fetch" "^4.0.0"
- aproba "^2.0.0"
- figgy-pudding "^3.5.1"
- get-stream "^4.0.0"
- lodash.clonedeep "^4.5.0"
- normalize-package-data "^2.4.0"
- npm-package-arg "^6.1.0"
- semver "^5.5.1"
- ssri "^6.0.1"
-
-"@evocateur/npm-registry-fetch@^4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz#8c4c38766d8d32d3200fcb0a83f064b57365ed66"
- integrity sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g==
- dependencies:
- JSONStream "^1.3.4"
- bluebird "^3.5.1"
- figgy-pudding "^3.4.1"
- lru-cache "^5.1.1"
- make-fetch-happen "^5.0.0"
- npm-package-arg "^6.1.0"
- safe-buffer "^5.1.2"
-
-"@evocateur/pacote@^9.6.3":
- version "9.6.5"
- resolved "https://registry.yarnpkg.com/@evocateur/pacote/-/pacote-9.6.5.tgz#33de32ba210b6f17c20ebab4d497efc6755f4ae5"
- integrity sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w==
- dependencies:
- "@evocateur/npm-registry-fetch" "^4.0.0"
- bluebird "^3.5.3"
- cacache "^12.0.3"
- chownr "^1.1.2"
- figgy-pudding "^3.5.1"
- get-stream "^4.1.0"
- glob "^7.1.4"
- infer-owner "^1.0.4"
- lru-cache "^5.1.1"
- make-fetch-happen "^5.0.0"
- minimatch "^3.0.4"
- minipass "^2.3.5"
- mississippi "^3.0.0"
- mkdirp "^0.5.1"
- normalize-package-data "^2.5.0"
- npm-package-arg "^6.1.0"
- npm-packlist "^1.4.4"
- npm-pick-manifest "^3.0.0"
- osenv "^0.1.5"
- promise-inflight "^1.0.1"
- promise-retry "^1.1.1"
- protoduck "^5.0.1"
- rimraf "^2.6.3"
- safe-buffer "^5.2.0"
- semver "^5.7.0"
- ssri "^6.0.1"
- tar "^4.4.10"
- unique-filename "^1.1.1"
- which "^1.3.1"
+ inversify "^5.0.0"
+ reflect-metadata "^0.1.12"
+ tslib "^1.8.1"
"@grpc/proto-loader@0.5.3":
version "0.5.3"
@@ -1253,885 +1599,19 @@
lodash.camelcase "^4.3.0"
protobufjs "^6.8.6"
-"@hapi/address@2.x.x":
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
- integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==
-
-"@hapi/bourne@1.x.x":
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a"
- integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==
-
-"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0":
- version "8.5.1"
- resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06"
- integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==
-
-"@hapi/joi@^15.0.0":
- version "15.1.1"
- resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7"
- integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==
- dependencies:
- "@hapi/address" "2.x.x"
- "@hapi/bourne" "1.x.x"
- "@hapi/hoek" "8.x.x"
- "@hapi/topo" "3.x.x"
-
-"@hapi/topo@3.x.x":
- version "3.1.6"
- resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29"
- integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==
- dependencies:
- "@hapi/hoek" "^8.3.0"
-
"@icons/material@^0.2.4":
version "0.2.4"
resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8"
integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==
-"@jest/console@^24.7.1", "@jest/console@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0"
- integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==
- dependencies:
- "@jest/source-map" "^24.9.0"
- chalk "^2.0.1"
- slash "^2.0.0"
-
-"@jest/core@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4"
- integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==
- dependencies:
- "@jest/console" "^24.7.1"
- "@jest/reporters" "^24.9.0"
- "@jest/test-result" "^24.9.0"
- "@jest/transform" "^24.9.0"
- "@jest/types" "^24.9.0"
- ansi-escapes "^3.0.0"
- chalk "^2.0.1"
- exit "^0.1.2"
- graceful-fs "^4.1.15"
- jest-changed-files "^24.9.0"
- jest-config "^24.9.0"
- jest-haste-map "^24.9.0"
- jest-message-util "^24.9.0"
- jest-regex-util "^24.3.0"
- jest-resolve "^24.9.0"
- jest-resolve-dependencies "^24.9.0"
- jest-runner "^24.9.0"
- jest-runtime "^24.9.0"
- jest-snapshot "^24.9.0"
- jest-util "^24.9.0"
- jest-validate "^24.9.0"
- jest-watcher "^24.9.0"
- micromatch "^3.1.10"
- p-each-series "^1.0.0"
- realpath-native "^1.1.0"
- rimraf "^2.5.4"
- slash "^2.0.0"
- strip-ansi "^5.0.0"
-
-"@jest/environment@^24.3.0", "@jest/environment@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18"
- integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==
- dependencies:
- "@jest/fake-timers" "^24.9.0"
- "@jest/transform" "^24.9.0"
- "@jest/types" "^24.9.0"
- jest-mock "^24.9.0"
-
-"@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93"
- integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==
- dependencies:
- "@jest/types" "^24.9.0"
- jest-message-util "^24.9.0"
- jest-mock "^24.9.0"
-
-"@jest/reporters@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43"
- integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==
- dependencies:
- "@jest/environment" "^24.9.0"
- "@jest/test-result" "^24.9.0"
- "@jest/transform" "^24.9.0"
- "@jest/types" "^24.9.0"
- chalk "^2.0.1"
- exit "^0.1.2"
- glob "^7.1.2"
- istanbul-lib-coverage "^2.0.2"
- istanbul-lib-instrument "^3.0.1"
- istanbul-lib-report "^2.0.4"
- istanbul-lib-source-maps "^3.0.1"
- istanbul-reports "^2.2.6"
- jest-haste-map "^24.9.0"
- jest-resolve "^24.9.0"
- jest-runtime "^24.9.0"
- jest-util "^24.9.0"
- jest-worker "^24.6.0"
- node-notifier "^5.4.2"
- slash "^2.0.0"
- source-map "^0.6.0"
- string-length "^2.0.0"
-
-"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714"
- integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==
- dependencies:
- callsites "^3.0.0"
- graceful-fs "^4.1.15"
- source-map "^0.6.0"
-
-"@jest/test-result@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca"
- integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==
- dependencies:
- "@jest/console" "^24.9.0"
- "@jest/types" "^24.9.0"
- "@types/istanbul-lib-coverage" "^2.0.0"
-
-"@jest/test-sequencer@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31"
- integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==
- dependencies:
- "@jest/test-result" "^24.9.0"
- jest-haste-map "^24.9.0"
- jest-runner "^24.9.0"
- jest-runtime "^24.9.0"
-
-"@jest/transform@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56"
- integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==
- dependencies:
- "@babel/core" "^7.1.0"
- "@jest/types" "^24.9.0"
- babel-plugin-istanbul "^5.1.0"
- chalk "^2.0.1"
- convert-source-map "^1.4.0"
- fast-json-stable-stringify "^2.0.0"
- graceful-fs "^4.1.15"
- jest-haste-map "^24.9.0"
- jest-regex-util "^24.9.0"
- jest-util "^24.9.0"
- micromatch "^3.1.10"
- pirates "^4.0.1"
- realpath-native "^1.1.0"
- slash "^2.0.0"
- source-map "^0.6.1"
- write-file-atomic "2.4.1"
-
-"@jest/types@^24.3.0", "@jest/types@^24.9.0":
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59"
- integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==
- dependencies:
- "@types/istanbul-lib-coverage" "^2.0.0"
- "@types/istanbul-reports" "^1.1.1"
- "@types/yargs" "^13.0.0"
-
-"@jest/types@^25.1.0", "@jest/types@^25.2.6":
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.6.tgz#c12f44af9bed444438091e4b59e7ed05f8659cb6"
- integrity sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==
- dependencies:
- "@types/istanbul-lib-coverage" "^2.0.0"
- "@types/istanbul-reports" "^1.1.1"
- "@types/yargs" "^15.0.0"
- chalk "^3.0.0"
-
-"@lerna/add@3.20.0":
- version "3.20.0"
- resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.20.0.tgz#bea7edf36fc93fb72ec34cb9ba854c48d4abf309"
- integrity sha512-AnH1oRIEEg/VDa3SjYq4x1/UglEAvrZuV0WssHUMN81RTZgQk3we+Mv3qZNddrZ/fBcZu2IAdN/EQ3+ie2JxKQ==
- dependencies:
- "@evocateur/pacote" "^9.6.3"
- "@lerna/bootstrap" "3.20.0"
- "@lerna/command" "3.18.5"
- "@lerna/filter-options" "3.20.0"
- "@lerna/npm-conf" "3.16.0"
- "@lerna/validation-error" "3.13.0"
- dedent "^0.7.0"
- npm-package-arg "^6.1.0"
- p-map "^2.1.0"
- semver "^6.2.0"
-
-"@lerna/bootstrap@3.20.0":
- version "3.20.0"
- resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.20.0.tgz#635d71046830f208e851ab429a63da1747589e37"
- integrity sha512-Wylullx3uthKE7r4izo09qeRGL20Y5yONlQEjPCfnbxCC2Elu+QcPu4RC6kqKQ7b+g7pdC3OOgcHZjngrwr5XQ==
- dependencies:
- "@lerna/command" "3.18.5"
- "@lerna/filter-options" "3.20.0"
- "@lerna/has-npm-version" "3.16.5"
- "@lerna/npm-install" "3.16.5"
- "@lerna/package-graph" "3.18.5"
- "@lerna/pulse-till-done" "3.13.0"
- "@lerna/rimraf-dir" "3.16.5"
- "@lerna/run-lifecycle" "3.16.2"
- "@lerna/run-topologically" "3.18.5"
- "@lerna/symlink-binary" "3.17.0"
- "@lerna/symlink-dependencies" "3.17.0"
- "@lerna/validation-error" "3.13.0"
- dedent "^0.7.0"
- get-port "^4.2.0"
- multimatch "^3.0.0"
- npm-package-arg "^6.1.0"
- npmlog "^4.1.2"
- p-finally "^1.0.0"
- p-map "^2.1.0"
- p-map-series "^1.0.0"
- p-waterfall "^1.0.0"
- read-package-tree "^5.1.6"
- semver "^6.2.0"
-
-"@lerna/changed@3.20.0":
- version "3.20.0"
- resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.20.0.tgz#66b97ebd6c8f8d207152ee524a0791846a9097ae"
- integrity sha512-+hzMFSldbRPulZ0vbKk6RD9f36gaH3Osjx34wrrZ62VB4pKmjyuS/rxVYkCA3viPLHoiIw2F8zHM5BdYoDSbjw==
- dependencies:
- "@lerna/collect-updates" "3.20.0"
- "@lerna/command" "3.18.5"
- "@lerna/listable" "3.18.5"
- "@lerna/output" "3.13.0"
-
-"@lerna/check-working-tree@3.16.5":
- version "3.16.5"
- resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz#b4f8ae61bb4523561dfb9f8f8d874dd46bb44baa"
- integrity sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ==
- dependencies:
- "@lerna/collect-uncommitted" "3.16.5"
- "@lerna/describe-ref" "3.16.5"
- "@lerna/validation-error" "3.13.0"
-
-"@lerna/child-process@3.16.5":
- version "3.16.5"
- resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-3.16.5.tgz#38fa3c18064aa4ac0754ad80114776a7b36a69b2"
- integrity sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg==
- dependencies:
- chalk "^2.3.1"
- execa "^1.0.0"
- strong-log-transformer "^2.0.0"
-
-"@lerna/clean@3.20.0":
- version "3.20.0"
- resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.20.0.tgz#ba777e373ddeae63e57860df75d47a9e5264c5b2"
- integrity sha512-9ZdYrrjQvR5wNXmHfDsfjWjp0foOkCwKe3hrckTzkAeQA1ibyz5llGwz5e1AeFrV12e2/OLajVqYfe+qdkZUgg==
- dependencies:
- "@lerna/command" "3.18.5"
- "@lerna/filter-options" "3.20.0"
- "@lerna/prompt" "3.18.5"
- "@lerna/pulse-till-done" "3.13.0"
- "@lerna/rimraf-dir" "3.16.5"
- p-map "^2.1.0"
- p-map-series "^1.0.0"
- p-waterfall "^1.0.0"
-
-"@lerna/cli@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-3.18.5.tgz#c90c461542fcd35b6d5b015a290fb0dbfb41d242"
- integrity sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA==
- dependencies:
- "@lerna/global-options" "3.13.0"
- dedent "^0.7.0"
- npmlog "^4.1.2"
- yargs "^14.2.2"
-
-"@lerna/collect-uncommitted@3.16.5":
- version "3.16.5"
- resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz#a494d61aac31cdc7aec4bbe52c96550274132e63"
- integrity sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg==
- dependencies:
- "@lerna/child-process" "3.16.5"
- chalk "^2.3.1"
- figgy-pudding "^3.5.1"
- npmlog "^4.1.2"
-
-"@lerna/collect-updates@3.20.0":
- version "3.20.0"
- resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-3.20.0.tgz#62f9d76ba21a25b7d9fbf31c02de88744a564bd1"
- integrity sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q==
- dependencies:
- "@lerna/child-process" "3.16.5"
- "@lerna/describe-ref" "3.16.5"
- minimatch "^3.0.4"
- npmlog "^4.1.2"
- slash "^2.0.0"
-
-"@lerna/command@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.18.5.tgz#14c6d2454adbfd365f8027201523e6c289cd3cd9"
- integrity sha512-36EnqR59yaTU4HrR1C9XDFti2jRx0BgpIUBeWn129LZZB8kAB3ov1/dJNa1KcNRKp91DncoKHLY99FZ6zTNpMQ==
- dependencies:
- "@lerna/child-process" "3.16.5"
- "@lerna/package-graph" "3.18.5"
- "@lerna/project" "3.18.0"
- "@lerna/validation-error" "3.13.0"
- "@lerna/write-log-file" "3.13.0"
- clone-deep "^4.0.1"
- dedent "^0.7.0"
- execa "^1.0.0"
- is-ci "^2.0.0"
- npmlog "^4.1.2"
-
-"@lerna/conventional-commits@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.18.5.tgz#08efd2e5b45acfaf3f151a53a3ec7ecade58a7bc"
- integrity sha512-qcvXIEJ3qSgalxXnQ7Yxp5H9Ta5TVyai6vEor6AAEHc20WiO7UIdbLDCxBtiiHMdGdpH85dTYlsoYUwsCJu3HQ==
- dependencies:
- "@lerna/validation-error" "3.13.0"
- conventional-changelog-angular "^5.0.3"
- conventional-changelog-core "^3.1.6"
- conventional-recommended-bump "^5.0.0"
- fs-extra "^8.1.0"
- get-stream "^4.0.0"
- lodash.template "^4.5.0"
- npm-package-arg "^6.1.0"
- npmlog "^4.1.2"
- pify "^4.0.1"
- semver "^6.2.0"
-
-"@lerna/create-symlink@3.16.2":
- version "3.16.2"
- resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-3.16.2.tgz#412cb8e59a72f5a7d9463e4e4721ad2070149967"
- integrity sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw==
- dependencies:
- "@zkochan/cmd-shim" "^3.1.0"
- fs-extra "^8.1.0"
- npmlog "^4.1.2"
-
-"@lerna/create@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.18.5.tgz#11ac539f069248eaf7bc4c42e237784330f4fc47"
- integrity sha512-cHpjocbpKmLopCuZFI7cKEM3E/QY8y+yC7VtZ4FQRSaLU8D8i2xXtXmYaP1GOlVNavji0iwoXjuNpnRMInIr2g==
- dependencies:
- "@evocateur/pacote" "^9.6.3"
- "@lerna/child-process" "3.16.5"
- "@lerna/command" "3.18.5"
- "@lerna/npm-conf" "3.16.0"
- "@lerna/validation-error" "3.13.0"
- camelcase "^5.0.0"
- dedent "^0.7.0"
- fs-extra "^8.1.0"
- globby "^9.2.0"
- init-package-json "^1.10.3"
- npm-package-arg "^6.1.0"
- p-reduce "^1.0.0"
- pify "^4.0.1"
- semver "^6.2.0"
- slash "^2.0.0"
- validate-npm-package-license "^3.0.3"
- validate-npm-package-name "^3.0.0"
- whatwg-url "^7.0.0"
-
-"@lerna/describe-ref@3.16.5":
- version "3.16.5"
- resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-3.16.5.tgz#a338c25aaed837d3dc70b8a72c447c5c66346ac0"
- integrity sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw==
- dependencies:
- "@lerna/child-process" "3.16.5"
- npmlog "^4.1.2"
-
-"@lerna/diff@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.18.5.tgz#e9e2cb882f84d5b84f0487c612137305f07accbc"
- integrity sha512-u90lGs+B8DRA9Z/2xX4YaS3h9X6GbypmGV6ITzx9+1Ga12UWGTVlKaCXBgONMBjzJDzAQOK8qPTwLA57SeBLgA==
- dependencies:
- "@lerna/child-process" "3.16.5"
- "@lerna/command" "3.18.5"
- "@lerna/validation-error" "3.13.0"
- npmlog "^4.1.2"
-
-"@lerna/exec@3.20.0":
- version "3.20.0"
- resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.20.0.tgz#29f0c01aee2340eb46f90706731fef2062a49639"
- integrity sha512-pS1mmC7kzV668rHLWuv31ClngqeXjeHC8kJuM+W2D6IpUVMGQHLcCTYLudFgQsuKGVpl0DGNYG+sjLhAPiiu6A==
- dependencies:
- "@lerna/child-process" "3.16.5"
- "@lerna/command" "3.18.5"
- "@lerna/filter-options" "3.20.0"
- "@lerna/profiler" "3.20.0"
- "@lerna/run-topologically" "3.18.5"
- "@lerna/validation-error" "3.13.0"
- p-map "^2.1.0"
-
-"@lerna/filter-options@3.20.0":
- version "3.20.0"
- resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-3.20.0.tgz#0f0f5d5a4783856eece4204708cc902cbc8af59b"
- integrity sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g==
- dependencies:
- "@lerna/collect-updates" "3.20.0"
- "@lerna/filter-packages" "3.18.0"
- dedent "^0.7.0"
- figgy-pudding "^3.5.1"
- npmlog "^4.1.2"
-
-"@lerna/filter-packages@3.18.0":
- version "3.18.0"
- resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-3.18.0.tgz#6a7a376d285208db03a82958cfb8172e179b4e70"
- integrity sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ==
- dependencies:
- "@lerna/validation-error" "3.13.0"
- multimatch "^3.0.0"
- npmlog "^4.1.2"
-
-"@lerna/get-npm-exec-opts@3.13.0":
- version "3.13.0"
- resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz#d1b552cb0088199fc3e7e126f914e39a08df9ea5"
- integrity sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw==
- dependencies:
- npmlog "^4.1.2"
-
-"@lerna/get-packed@3.16.0":
- version "3.16.0"
- resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-3.16.0.tgz#1b316b706dcee86c7baa55e50b087959447852ff"
- integrity sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw==
- dependencies:
- fs-extra "^8.1.0"
- ssri "^6.0.1"
- tar "^4.4.8"
-
-"@lerna/github-client@3.16.5":
- version "3.16.5"
- resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-3.16.5.tgz#2eb0235c3bf7a7e5d92d73e09b3761ab21f35c2e"
- integrity sha512-rHQdn8Dv/CJrO3VouOP66zAcJzrHsm+wFuZ4uGAai2At2NkgKH+tpNhQy2H1PSC0Ezj9LxvdaHYrUzULqVK5Hw==
- dependencies:
- "@lerna/child-process" "3.16.5"
- "@octokit/plugin-enterprise-rest" "^3.6.1"
- "@octokit/rest" "^16.28.4"
- git-url-parse "^11.1.2"
- npmlog "^4.1.2"
-
-"@lerna/gitlab-client@3.15.0":
- version "3.15.0"
- resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz#91f4ec8c697b5ac57f7f25bd50fe659d24aa96a6"
- integrity sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q==
- dependencies:
- node-fetch "^2.5.0"
- npmlog "^4.1.2"
- whatwg-url "^7.0.0"
-
-"@lerna/global-options@3.13.0":
- version "3.13.0"
- resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-3.13.0.tgz#217662290db06ad9cf2c49d8e3100ee28eaebae1"
- integrity sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ==
-
-"@lerna/has-npm-version@3.16.5":
- version "3.16.5"
- resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz#ab83956f211d8923ea6afe9b979b38cc73b15326"
- integrity sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q==
- dependencies:
- "@lerna/child-process" "3.16.5"
- semver "^6.2.0"
-
-"@lerna/import@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.18.5.tgz#a9c7d8601870729851293c10abd18b3707f7ba5e"
- integrity sha512-PH0WVLEgp+ORyNKbGGwUcrueW89K3Iuk/DDCz8mFyG2IG09l/jOF0vzckEyGyz6PO5CMcz4TI1al/qnp3FrahQ==
- dependencies:
- "@lerna/child-process" "3.16.5"
- "@lerna/command" "3.18.5"
- "@lerna/prompt" "3.18.5"
- "@lerna/pulse-till-done" "3.13.0"
- "@lerna/validation-error" "3.13.0"
- dedent "^0.7.0"
- fs-extra "^8.1.0"
- p-map-series "^1.0.0"
-
-"@lerna/info@3.20.0":
- version "3.20.0"
- resolved "https://registry.yarnpkg.com/@lerna/info/-/info-3.20.0.tgz#3a5212f3029f2bc6255f9533bdf4bcb120ef329a"
- integrity sha512-Rsz+KQF9mczbGUbPTrtOed1N0C+cA08Qz0eX/oI+NNjvsryZIju/o7uedG4I3P55MBiAioNrJI88fHH3eTgYug==
- dependencies:
- "@lerna/command" "3.18.5"
- "@lerna/output" "3.13.0"
- envinfo "^7.3.1"
-
-"@lerna/init@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.18.5.tgz#86dd0b2b3290755a96975069b5cb007f775df9f5"
- integrity sha512-oCwipWrha98EcJAHm8AGd2YFFLNI7AW9AWi0/LbClj1+XY9ah+uifXIgYGfTk63LbgophDd8936ZEpHMxBsbAg==
- dependencies:
- "@lerna/child-process" "3.16.5"
- "@lerna/command" "3.18.5"
- fs-extra "^8.1.0"
- p-map "^2.1.0"
- write-json-file "^3.2.0"
-
-"@lerna/link@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.18.5.tgz#f24347e4f0b71d54575bd37cfa1794bc8ee91b18"
- integrity sha512-xTN3vktJpkT7Nqc3QkZRtHO4bT5NvuLMtKNIBDkks0HpGxC9PRyyqwOoCoh1yOGbrWIuDezhfMg3Qow+6I69IQ==
- dependencies:
- "@lerna/command" "3.18.5"
- "@lerna/package-graph" "3.18.5"
- "@lerna/symlink-dependencies" "3.17.0"
- p-map "^2.1.0"
- slash "^2.0.0"
-
-"@lerna/list@3.20.0":
- version "3.20.0"
- resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.20.0.tgz#7e67cc29c5cf661cfd097e8a7c2d3dcce7a81029"
- integrity sha512-fXTicPrfioVnRzknyPawmYIVkzDRBaQqk9spejS1S3O1DOidkihK0xxNkr8HCVC0L22w6f92g83qWDp2BYRUbg==
- dependencies:
- "@lerna/command" "3.18.5"
- "@lerna/filter-options" "3.20.0"
- "@lerna/listable" "3.18.5"
- "@lerna/output" "3.13.0"
-
-"@lerna/listable@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-3.18.5.tgz#e82798405b5ed8fc51843c8ef1e7a0e497388a1a"
- integrity sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg==
- dependencies:
- "@lerna/query-graph" "3.18.5"
- chalk "^2.3.1"
- columnify "^1.5.4"
-
-"@lerna/log-packed@3.16.0":
- version "3.16.0"
- resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-3.16.0.tgz#f83991041ee77b2495634e14470b42259fd2bc16"
- integrity sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ==
- dependencies:
- byte-size "^5.0.1"
- columnify "^1.5.4"
- has-unicode "^2.0.1"
- npmlog "^4.1.2"
-
-"@lerna/npm-conf@3.16.0":
- version "3.16.0"
- resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-3.16.0.tgz#1c10a89ae2f6c2ee96962557738685300d376827"
- integrity sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA==
- dependencies:
- config-chain "^1.1.11"
- pify "^4.0.1"
-
-"@lerna/npm-dist-tag@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz#9ef9abb7c104077b31f6fab22cc73b314d54ac55"
- integrity sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ==
- dependencies:
- "@evocateur/npm-registry-fetch" "^4.0.0"
- "@lerna/otplease" "3.18.5"
- figgy-pudding "^3.5.1"
- npm-package-arg "^6.1.0"
- npmlog "^4.1.2"
-
-"@lerna/npm-install@3.16.5":
- version "3.16.5"
- resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-3.16.5.tgz#d6bfdc16f81285da66515ae47924d6e278d637d3"
- integrity sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg==
- dependencies:
- "@lerna/child-process" "3.16.5"
- "@lerna/get-npm-exec-opts" "3.13.0"
- fs-extra "^8.1.0"
- npm-package-arg "^6.1.0"
- npmlog "^4.1.2"
- signal-exit "^3.0.2"
- write-pkg "^3.1.0"
-
-"@lerna/npm-publish@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.18.5.tgz#240e4039959fd9816b49c5b07421e11b5cb000af"
- integrity sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg==
- dependencies:
- "@evocateur/libnpmpublish" "^1.2.2"
- "@lerna/otplease" "3.18.5"
- "@lerna/run-lifecycle" "3.16.2"
- figgy-pudding "^3.5.1"
- fs-extra "^8.1.0"
- npm-package-arg "^6.1.0"
- npmlog "^4.1.2"
- pify "^4.0.1"
- read-package-json "^2.0.13"
-
-"@lerna/npm-run-script@3.16.5":
- version "3.16.5"
- resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz#9c2ec82453a26c0b46edc0bb7c15816c821f5c15"
- integrity sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ==
- dependencies:
- "@lerna/child-process" "3.16.5"
- "@lerna/get-npm-exec-opts" "3.13.0"
- npmlog "^4.1.2"
-
-"@lerna/otplease@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-3.18.5.tgz#b77b8e760b40abad9f7658d988f3ea77d4fd0231"
- integrity sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog==
- dependencies:
- "@lerna/prompt" "3.18.5"
- figgy-pudding "^3.5.1"
-
-"@lerna/output@3.13.0":
- version "3.13.0"
- resolved "https://registry.yarnpkg.com/@lerna/output/-/output-3.13.0.tgz#3ded7cc908b27a9872228a630d950aedae7a4989"
- integrity sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg==
- dependencies:
- npmlog "^4.1.2"
-
-"@lerna/pack-directory@3.16.4":
- version "3.16.4"
- resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-3.16.4.tgz#3eae5f91bdf5acfe0384510ed53faddc4c074693"
- integrity sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng==
- dependencies:
- "@lerna/get-packed" "3.16.0"
- "@lerna/package" "3.16.0"
- "@lerna/run-lifecycle" "3.16.2"
- figgy-pudding "^3.5.1"
- npm-packlist "^1.4.4"
- npmlog "^4.1.2"
- tar "^4.4.10"
- temp-write "^3.4.0"
-
-"@lerna/package-graph@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-3.18.5.tgz#c740e2ea3578d059e551633e950690831b941f6b"
- integrity sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA==
- dependencies:
- "@lerna/prerelease-id-from-version" "3.16.0"
- "@lerna/validation-error" "3.13.0"
- npm-package-arg "^6.1.0"
- npmlog "^4.1.2"
- semver "^6.2.0"
-
-"@lerna/package@3.16.0":
- version "3.16.0"
- resolved "https://registry.yarnpkg.com/@lerna/package/-/package-3.16.0.tgz#7e0a46e4697ed8b8a9c14d59c7f890e0d38ba13c"
- integrity sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw==
- dependencies:
- load-json-file "^5.3.0"
- npm-package-arg "^6.1.0"
- write-pkg "^3.1.0"
-
-"@lerna/prerelease-id-from-version@3.16.0":
- version "3.16.0"
- resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz#b24bfa789f5e1baab914d7b08baae9b7bd7d83a1"
- integrity sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA==
- dependencies:
- semver "^6.2.0"
-
-"@lerna/profiler@3.20.0":
- version "3.20.0"
- resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-3.20.0.tgz#0f6dc236f4ea8f9ea5f358c6703305a4f32ad051"
- integrity sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg==
- dependencies:
- figgy-pudding "^3.5.1"
- fs-extra "^8.1.0"
- npmlog "^4.1.2"
- upath "^1.2.0"
-
-"@lerna/project@3.18.0":
- version "3.18.0"
- resolved "https://registry.yarnpkg.com/@lerna/project/-/project-3.18.0.tgz#56feee01daeb42c03cbdf0ed8a2a10cbce32f670"
- integrity sha512-+LDwvdAp0BurOAWmeHE3uuticsq9hNxBI0+FMHiIai8jrygpJGahaQrBYWpwbshbQyVLeQgx3+YJdW2TbEdFWA==
- dependencies:
- "@lerna/package" "3.16.0"
- "@lerna/validation-error" "3.13.0"
- cosmiconfig "^5.1.0"
- dedent "^0.7.0"
- dot-prop "^4.2.0"
- glob-parent "^5.0.0"
- globby "^9.2.0"
- load-json-file "^5.3.0"
- npmlog "^4.1.2"
- p-map "^2.1.0"
- resolve-from "^4.0.0"
- write-json-file "^3.2.0"
-
-"@lerna/prompt@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-3.18.5.tgz#628cd545f225887d060491ab95df899cfc5218a1"
- integrity sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ==
- dependencies:
- inquirer "^6.2.0"
- npmlog "^4.1.2"
-
-"@lerna/publish@3.20.2":
- version "3.20.2"
- resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.20.2.tgz#a45d29813099b3249657ea913d0dc3f8ebc5cc2e"
- integrity sha512-N7Y6PdhJ+tYQPdI1tZum8W25cDlTp4D6brvRacKZusweWexxaopbV8RprBaKexkEX/KIbncuADq7qjDBdQHzaA==
- dependencies:
- "@evocateur/libnpmaccess" "^3.1.2"
- "@evocateur/npm-registry-fetch" "^4.0.0"
- "@evocateur/pacote" "^9.6.3"
- "@lerna/check-working-tree" "3.16.5"
- "@lerna/child-process" "3.16.5"
- "@lerna/collect-updates" "3.20.0"
- "@lerna/command" "3.18.5"
- "@lerna/describe-ref" "3.16.5"
- "@lerna/log-packed" "3.16.0"
- "@lerna/npm-conf" "3.16.0"
- "@lerna/npm-dist-tag" "3.18.5"
- "@lerna/npm-publish" "3.18.5"
- "@lerna/otplease" "3.18.5"
- "@lerna/output" "3.13.0"
- "@lerna/pack-directory" "3.16.4"
- "@lerna/prerelease-id-from-version" "3.16.0"
- "@lerna/prompt" "3.18.5"
- "@lerna/pulse-till-done" "3.13.0"
- "@lerna/run-lifecycle" "3.16.2"
- "@lerna/run-topologically" "3.18.5"
- "@lerna/validation-error" "3.13.0"
- "@lerna/version" "3.20.2"
- figgy-pudding "^3.5.1"
- fs-extra "^8.1.0"
- npm-package-arg "^6.1.0"
- npmlog "^4.1.2"
- p-finally "^1.0.0"
- p-map "^2.1.0"
- p-pipe "^1.2.0"
- semver "^6.2.0"
-
-"@lerna/pulse-till-done@3.13.0":
- version "3.13.0"
- resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz#c8e9ce5bafaf10d930a67d7ed0ccb5d958fe0110"
- integrity sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA==
- dependencies:
- npmlog "^4.1.2"
-
-"@lerna/query-graph@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-3.18.5.tgz#df4830bb5155273003bf35e8dda1c32d0927bd86"
- integrity sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA==
- dependencies:
- "@lerna/package-graph" "3.18.5"
- figgy-pudding "^3.5.1"
-
-"@lerna/resolve-symlink@3.16.0":
- version "3.16.0"
- resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz#37fc7095fabdbcf317c26eb74e0d0bde8efd2386"
- integrity sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ==
- dependencies:
- fs-extra "^8.1.0"
- npmlog "^4.1.2"
- read-cmd-shim "^1.0.1"
-
-"@lerna/rimraf-dir@3.16.5":
- version "3.16.5"
- resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz#04316ab5ffd2909657aaf388ea502cb8c2f20a09"
- integrity sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA==
- dependencies:
- "@lerna/child-process" "3.16.5"
- npmlog "^4.1.2"
- path-exists "^3.0.0"
- rimraf "^2.6.2"
-
-"@lerna/run-lifecycle@3.16.2":
- version "3.16.2"
- resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz#67b288f8ea964db9ea4fb1fbc7715d5bbb0bce00"
- integrity sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A==
- dependencies:
- "@lerna/npm-conf" "3.16.0"
- figgy-pudding "^3.5.1"
- npm-lifecycle "^3.1.2"
- npmlog "^4.1.2"
-
-"@lerna/run-topologically@3.18.5":
- version "3.18.5"
- resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-3.18.5.tgz#3cd639da20e967d7672cb88db0f756b92f2fdfc3"
- integrity sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg==
- dependencies:
- "@lerna/query-graph" "3.18.5"
- figgy-pudding "^3.5.1"
- p-queue "^4.0.0"
-
-"@lerna/run@3.20.0":
- version "3.20.0"
- resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.20.0.tgz#a479f7c42bdf9ebabb3a1e5a2bdebb7a8d201151"
- integrity sha512-9U3AqeaCeB7KsGS9oyKNp62s9vYoULg/B4cqXTKZkc+OKL6QOEjYHYVSBcMK9lUXrMjCjDIuDSX3PnTCPxQ2Dw==
- dependencies:
- "@lerna/command" "3.18.5"
- "@lerna/filter-options" "3.20.0"
- "@lerna/npm-run-script" "3.16.5"
- "@lerna/output" "3.13.0"
- "@lerna/profiler" "3.20.0"
- "@lerna/run-topologically" "3.18.5"
- "@lerna/timer" "3.13.0"
- "@lerna/validation-error" "3.13.0"
- p-map "^2.1.0"
-
-"@lerna/symlink-binary@3.17.0":
- version "3.17.0"
- resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz#8f8031b309863814883d3f009877f82e38aef45a"
- integrity sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ==
- dependencies:
- "@lerna/create-symlink" "3.16.2"
- "@lerna/package" "3.16.0"
- fs-extra "^8.1.0"
- p-map "^2.1.0"
-
-"@lerna/symlink-dependencies@3.17.0":
- version "3.17.0"
- resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz#48d6360e985865a0e56cd8b51b308a526308784a"
- integrity sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q==
- dependencies:
- "@lerna/create-symlink" "3.16.2"
- "@lerna/resolve-symlink" "3.16.0"
- "@lerna/symlink-binary" "3.17.0"
- fs-extra "^8.1.0"
- p-finally "^1.0.0"
- p-map "^2.1.0"
- p-map-series "^1.0.0"
-
-"@lerna/timer@3.13.0":
- version "3.13.0"
- resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-3.13.0.tgz#bcd0904551db16e08364d6c18e5e2160fc870781"
- integrity sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw==
-
-"@lerna/validation-error@3.13.0":
- version "3.13.0"
- resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-3.13.0.tgz#c86b8f07c5ab9539f775bd8a54976e926f3759c3"
- integrity sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA==
- dependencies:
- npmlog "^4.1.2"
-
-"@lerna/version@3.20.2":
- version "3.20.2"
- resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.20.2.tgz#3709141c0f537741d9bc10cb24f56897bcb30428"
- integrity sha512-ckBJMaBWc+xJen0cMyCE7W67QXLLrc0ELvigPIn8p609qkfNM0L0CF803MKxjVOldJAjw84b8ucNWZLvJagP/Q==
- dependencies:
- "@lerna/check-working-tree" "3.16.5"
- "@lerna/child-process" "3.16.5"
- "@lerna/collect-updates" "3.20.0"
- "@lerna/command" "3.18.5"
- "@lerna/conventional-commits" "3.18.5"
- "@lerna/github-client" "3.16.5"
- "@lerna/gitlab-client" "3.15.0"
- "@lerna/output" "3.13.0"
- "@lerna/prerelease-id-from-version" "3.16.0"
- "@lerna/prompt" "3.18.5"
- "@lerna/run-lifecycle" "3.16.2"
- "@lerna/run-topologically" "3.18.5"
- "@lerna/validation-error" "3.13.0"
- chalk "^2.3.1"
- dedent "^0.7.0"
- load-json-file "^5.3.0"
- minimatch "^3.0.4"
- npmlog "^4.1.2"
- p-map "^2.1.0"
- p-pipe "^1.2.0"
- p-reduce "^1.0.0"
- p-waterfall "^1.0.0"
- semver "^6.2.0"
- slash "^2.0.0"
- temp-write "^3.4.0"
- write-json-file "^3.2.0"
-
-"@lerna/write-log-file@3.13.0":
- version "3.13.0"
- resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-3.13.0.tgz#b78d9e4cfc1349a8be64d91324c4c8199e822a26"
- integrity sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A==
- dependencies:
- npmlog "^4.1.2"
- write-file-atomic "^2.3.0"
+"@marionebl/sander@^0.6.0":
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/@marionebl/sander/-/sander-0.6.1.tgz#1958965874f24bc51be48875feb50d642fc41f7b"
+ integrity sha1-GViWWHTyS8Ub5Ih1/rUNZC/EH3s=
+ dependencies:
+ graceful-fs "^4.1.3"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.2"
"@mrmlnc/readdir-enhanced@^2.2.1":
version "2.2.1"
@@ -2141,113 +1621,18 @@
call-me-maybe "^1.0.1"
glob-to-regexp "^0.3.0"
+"@next/bundle-analyzer@^9.3.4":
+ version "9.3.4"
+ resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-9.3.4.tgz#78927a5656442ec21d38456ae87edb8eb66ddf15"
+ integrity sha512-POS+AmzT9hTCUymYV6CDJRzDv6MWq10wCJZBnTKWOdB82o7PourD0G9DpGR40TXzyD4LpcOUzksexG8NyL8V7g==
+ dependencies:
+ webpack-bundle-analyzer "3.6.1"
+
"@nodelib/fs.stat@^1.1.2":
version "1.1.3"
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
-"@octokit/auth-token@^2.4.0":
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.0.tgz#b64178975218b99e4dfe948253f0673cbbb59d9f"
- integrity sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg==
- dependencies:
- "@octokit/types" "^2.0.0"
-
-"@octokit/endpoint@^6.0.0":
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.0.tgz#4c7acd79ab72df78732a7d63b09be53ec5a2230b"
- integrity sha512-3nx+MEYoZeD0uJ+7F/gvELLvQJzLXhep2Az0bBSXagbApDvDW0LWwpnAIY/hb0Jwe17A0fJdz0O12dPh05cj7A==
- dependencies:
- "@octokit/types" "^2.0.0"
- is-plain-object "^3.0.0"
- universal-user-agent "^5.0.0"
-
-"@octokit/plugin-enterprise-rest@^3.6.1":
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-3.6.2.tgz#74de25bef21e0182b4fa03a8678cd00a4e67e561"
- integrity sha512-3wF5eueS5OHQYuAEudkpN+xVeUsg8vYEMMenEzLphUZ7PRZ8OJtDcsreL3ad9zxXmBbaFWzLmFcdob5CLyZftA==
-
-"@octokit/plugin-paginate-rest@^1.1.1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz#004170acf8c2be535aba26727867d692f7b488fc"
- integrity sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==
- dependencies:
- "@octokit/types" "^2.0.1"
-
-"@octokit/plugin-request-log@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e"
- integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==
-
-"@octokit/plugin-rest-endpoint-methods@2.4.0":
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz#3288ecf5481f68c494dd0602fc15407a59faf61e"
- integrity sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==
- dependencies:
- "@octokit/types" "^2.0.1"
- deprecation "^2.3.1"
-
-"@octokit/request-error@^1.0.2":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.1.tgz#ede0714c773f32347576c25649dc013ae6b31801"
- integrity sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==
- dependencies:
- "@octokit/types" "^2.0.0"
- deprecation "^2.0.0"
- once "^1.4.0"
-
-"@octokit/request-error@^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.0.tgz#94ca7293373654400fbb2995f377f9473e00834b"
- integrity sha512-rtYicB4Absc60rUv74Rjpzek84UbVHGHJRu4fNVlZ1mCcyUPPuzFfG9Rn6sjHrd95DEsmjSt1Axlc699ZlbDkw==
- dependencies:
- "@octokit/types" "^2.0.0"
- deprecation "^2.0.0"
- once "^1.4.0"
-
-"@octokit/request@^5.2.0":
- version "5.3.4"
- resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.3.4.tgz#fbc950bf785d59da3b0399fc6d042c8cf52e2905"
- integrity sha512-qyj8G8BxQyXjt9Xu6NvfvOr1E0l35lsXtwm3SopsYg/JWXjlsnwqLc8rsD2OLguEL/JjLfBvrXr4az7z8Lch2A==
- dependencies:
- "@octokit/endpoint" "^6.0.0"
- "@octokit/request-error" "^2.0.0"
- "@octokit/types" "^2.0.0"
- deprecation "^2.0.0"
- is-plain-object "^3.0.0"
- node-fetch "^2.3.0"
- once "^1.4.0"
- universal-user-agent "^5.0.0"
-
-"@octokit/rest@^16.28.4":
- version "16.43.1"
- resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.1.tgz#3b11e7d1b1ac2bbeeb23b08a17df0b20947eda6b"
- integrity sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw==
- dependencies:
- "@octokit/auth-token" "^2.4.0"
- "@octokit/plugin-paginate-rest" "^1.1.1"
- "@octokit/plugin-request-log" "^1.0.0"
- "@octokit/plugin-rest-endpoint-methods" "2.4.0"
- "@octokit/request" "^5.2.0"
- "@octokit/request-error" "^1.0.2"
- atob-lite "^2.0.0"
- before-after-hook "^2.0.0"
- btoa-lite "^1.0.0"
- deprecation "^2.0.0"
- lodash.get "^4.4.2"
- lodash.set "^4.3.2"
- lodash.uniq "^4.5.0"
- octokit-pagination-methods "^1.1.0"
- once "^1.4.0"
- universal-user-agent "^4.0.0"
-
-"@octokit/types@^2.0.0", "@octokit/types@^2.0.1":
- version "2.5.1"
- resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.5.1.tgz#22563b3bb50034bea3176eac1860340c5e812e2a"
- integrity sha512-q4Wr7RexkPRrkQpXzUYF5Fj/14Mr65RyOHj6B9d/sQACpqGcStkHZj4qMEtlMY5SnD/69jlL9ItGPbDM0dR/dA==
- dependencies:
- "@types/node" ">= 8"
-
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
@@ -2311,135 +1696,12 @@
prop-types "^15.6.1"
react-lifecycles-compat "^3.0.4"
-"@snyk/cli-interface@1.5.0":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-1.5.0.tgz#b9dbe6ebfb86e67ffabf29d4e0d28a52670ac456"
- integrity sha512-+Qo+IO3YOXWgazlo+CKxOuWFLQQdaNCJ9cSfhFQd687/FuesaIxWdInaAdfpsLScq0c6M1ieZslXgiZELSzxbg==
+"@samverschueren/stream-to-observable@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
+ integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==
dependencies:
- tslib "^1.9.3"
-
-"@snyk/cli-interface@2.2.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.2.0.tgz#5536bc913917c623d16d727f9f3759521a916026"
- integrity sha512-sA7V2JhgqJB9z5uYotgQc5iNDv//y+Mdm39rANxmFjtZMSYJZHkP80arzPjw1mB5ni/sWec7ieYUUFeySZBfVg==
- dependencies:
- tslib "^1.9.3"
-
-"@snyk/cli-interface@2.3.0":
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.3.0.tgz#9d38f815a5cf2be266006954c2a058463d531e08"
- integrity sha512-ecbylK5Ol2ySb/WbfPj0s0GuLQR+KWKFzUgVaoNHaSoN6371qRWwf2uVr+hPUP4gXqCai21Ug/RDArfOhlPwrQ==
- dependencies:
- tslib "^1.9.3"
-
-"@snyk/cli-interface@2.3.1":
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.3.1.tgz#73f2f4bd717b9f03f096ede3ff5830eb8d2f3716"
- integrity sha512-JZvsmhDXSyjv1dkc12lPI3tNTNYlIaOiIQMYFg2RgqF3QmWjTyBUgRZcF7LoKyufHtS4dIudM6k1aHBpSaDrhw==
- dependencies:
- tslib "^1.9.3"
-
-"@snyk/cli-interface@2.3.2", "@snyk/cli-interface@^2.0.3":
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.3.2.tgz#e93afa82de15b912e657f1ba86f9d7963983e594"
- integrity sha512-jmZyxVHqzYU1GfdnWCGdd68WY/lAzpPVyqalHazPj4tFJehrSfEFc82RMTYAMgXEJuvFRFIwhsvXh3sWUhIQmg==
- dependencies:
- tslib "^1.9.3"
-
-"@snyk/cocoapods-lockfile-parser@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@snyk/cocoapods-lockfile-parser/-/cocoapods-lockfile-parser-3.0.0.tgz#514b744cedd9d3d3efb2a5d06fce1662fec2ff1a"
- integrity sha512-AebCc+v9vtOL9tFkU4/tommgVsXxqdx6t45kCkBW+FC4PaYvfYEg9Eg/9GqlY9+nFrLFo/uTr+E/aR0AF/KqYA==
- dependencies:
- "@snyk/dep-graph" "^1.11.0"
- "@snyk/ruby-semver" "^2.0.4"
- "@types/js-yaml" "^3.12.1"
- core-js "^3.2.0"
- js-yaml "^3.13.1"
- source-map-support "^0.5.7"
- tslib "^1.9.3"
-
-"@snyk/composer-lockfile-parser@1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@snyk/composer-lockfile-parser/-/composer-lockfile-parser-1.2.0.tgz#62c6d88c6a39c55dda591854f5380923a993182f"
- integrity sha512-kZT+HTqgNcQMeoE5NM9M3jj463M8zI7ZxqZXLw9WoyVs5JTt9g0qFWxIG1cNwZdGVI+y7tzZbNWw9BlMD1vCCQ==
- dependencies:
- lodash "^4.17.13"
-
-"@snyk/configstore@3.2.0-rc1", "@snyk/configstore@^3.2.0-rc1":
- version "3.2.0-rc1"
- resolved "https://registry.yarnpkg.com/@snyk/configstore/-/configstore-3.2.0-rc1.tgz#385c050d11926a26d0335a4b3be9e55f90f6e0ac"
- integrity sha512-CV3QggFY8BY3u8PdSSlUGLibqbqCG1zJRmGM2DhnhcxQDRRPTGTP//l7vJphOVsUP1Oe23+UQsj7KRWpRUZiqg==
- dependencies:
- dot-prop "^5.2.0"
- graceful-fs "^4.1.2"
- make-dir "^1.0.0"
- unique-string "^1.0.0"
- write-file-atomic "^2.0.0"
- xdg-basedir "^3.0.0"
-
-"@snyk/dep-graph@1.16.1":
- version "1.16.1"
- resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.16.1.tgz#d6157628d4dde363c9e7beb1c40eea2b442b0352"
- integrity sha512-2RbstN/z5A3iTmgDQr0vfpWpqsjcJY54PXXP0gVXTf137QLdvgPEsZikjlofF4qoNO1io5t1VGvf69v9E8UrOw==
- dependencies:
- graphlib "^2.1.5"
- lodash "^4.7.14"
- object-hash "^1.3.1"
- semver "^6.0.0"
- source-map-support "^0.5.11"
- tslib "^1.10.0"
-
-"@snyk/dep-graph@^1.11.0", "@snyk/dep-graph@^1.13.1":
- version "1.18.1"
- resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.18.1.tgz#b2bed1cf9a135a1c9569c5ee52e05f50eed4d130"
- integrity sha512-J2kfP8RSXBvkZUrGwCKvaWpoMlMU4250BQ9A1RBTk61dBBiU0lISwWKUHiBH+CnyAweVp0+27dY2o7DMhTvroA==
- dependencies:
- graphlib "^2.1.5"
- lodash "^4.17.15"
- object-hash "^1.3.1"
- semver "^6.0.0"
- source-map-support "^0.5.11"
- tslib "^1.10.0"
-
-"@snyk/gemfile@1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@snyk/gemfile/-/gemfile-1.2.0.tgz#919857944973cce74c650e5428aaf11bcd5c0457"
- integrity sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA==
-
-"@snyk/ruby-semver@^2.0.4":
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/@snyk/ruby-semver/-/ruby-semver-2.1.0.tgz#d76cc02fc20860c224da2646fe9cc1bb0b0d1d15"
- integrity sha512-u8ez8kWyqge+N+FxRDx/uPBmcHzY7BMfODvzEVeoTOeoD0CHPymEaVlkEKA8ZHtxzXjUzPIl2I8f2siZEzLjYg==
- dependencies:
- lodash "^4.17.14"
-
-"@snyk/snyk-cocoapods-plugin@2.0.1":
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/@snyk/snyk-cocoapods-plugin/-/snyk-cocoapods-plugin-2.0.1.tgz#be8660c854d551a56baa9d072bb4ae7f188cc1cd"
- integrity sha512-XVkvaMvMzQ3miJi/YZmsRJSAUfDloYhfg6pXPgzAeAugB4p+cNi01Z68pT62ypB8U/Ugh1Xx2pb9aoOFqBbSjA==
- dependencies:
- "@snyk/cli-interface" "1.5.0"
- "@snyk/cocoapods-lockfile-parser" "3.0.0"
- "@snyk/dep-graph" "^1.13.1"
- source-map-support "^0.5.7"
- tslib "^1.9.3"
-
-"@snyk/update-notifier@^2.5.1-rc2":
- version "2.5.1-rc2"
- resolved "https://registry.yarnpkg.com/@snyk/update-notifier/-/update-notifier-2.5.1-rc2.tgz#14bf816114b5698a255289d7170157f254202fad"
- integrity sha512-dlled3mfpnAt3cQb5hxkFiqfPCj4Yk0xV8Yl5P8PeVv1pUmO7vI4Ka4Mjs4r6CYM5f9kZhviFPQQcWOIDlMRcw==
- dependencies:
- "@snyk/configstore" "3.2.0-rc1"
- boxen "^1.3.0"
- chalk "^2.3.2"
- import-lazy "^2.1.0"
- is-ci "^1.0.10"
- is-installed-globally "^0.1.0"
- is-npm "^1.0.0"
- latest-version "^3.1.0"
- semver-diff "^2.0.0"
- xdg-basedir "^3.0.0"
+ any-observable "^0.3.0"
"@storybook/addon-actions@^5.3.18":
version "5.3.18"
@@ -2461,27 +1723,6 @@
react-inspector "^4.0.0"
uuid "^3.3.2"
-"@storybook/addon-info@^5.3.18":
- version "5.3.18"
- resolved "https://registry.yarnpkg.com/@storybook/addon-info/-/addon-info-5.3.18.tgz#2b02c43eeb79770781eea82104c32a4f12a72da0"
- integrity sha512-6j+XlBrgHl1ZaFRSFdMYVeQTDWWs1Xhz2jflrLCLY4Y99+pLFBUigzp2EByfIVF9tiDfPwNcFcPo5UvQ+kTwOg==
- dependencies:
- "@storybook/addons" "5.3.18"
- "@storybook/client-logger" "5.3.18"
- "@storybook/components" "5.3.18"
- "@storybook/theming" "5.3.18"
- core-js "^3.0.1"
- global "^4.3.2"
- marksy "^8.0.0"
- nested-object-assign "^1.0.3"
- prop-types "^15.7.2"
- react "^16.8.3"
- react-addons-create-fragment "^15.6.2"
- react-element-to-jsx-string "^14.0.2"
- react-is "^16.8.3"
- react-lifecycles-compat "^3.0.4"
- util-deprecate "^1.0.2"
-
"@storybook/addon-knobs@^5.3.18":
version "5.3.18"
resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.3.18.tgz#60365bb179699cd8dc91df8be947469266012847"
@@ -2506,22 +1747,6 @@
react-lifecycles-compat "^3.0.4"
react-select "^3.0.8"
-"@storybook/addon-links@^5.3.18":
- version "5.3.18"
- resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-5.3.18.tgz#6b4aec83e158c000221bfe1f43e4a473f0727193"
- integrity sha512-rDpsAQUr60BEM83TBh7mwKjaZvqTR+CAAMLAxXN+J8DMoOjymjd2sjq4UVJsOQVTnw3wjIc4+xpAL/eYqkJAIQ==
- dependencies:
- "@storybook/addons" "5.3.18"
- "@storybook/client-logger" "5.3.18"
- "@storybook/core-events" "5.3.18"
- "@storybook/csf" "0.0.1"
- "@storybook/router" "5.3.18"
- core-js "^3.0.1"
- global "^4.3.2"
- prop-types "^15.7.2"
- qs "^6.6.0"
- ts-dedent "^1.1.0"
-
"@storybook/addon-viewport@^5.3.18":
version "5.3.18"
resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-5.3.18.tgz#9cfeb93e473845436e0c7fb74d590305ff7ef48e"
@@ -2539,7 +1764,7 @@
prop-types "^15.7.2"
util-deprecate "^1.0.2"
-"@storybook/addons@5.3.18", "@storybook/addons@^5.3.18":
+"@storybook/addons@5.3.18":
version "5.3.18"
resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.18.tgz#5cbba6407ef7a802041c5ee831473bc3bed61f64"
integrity sha512-ZQjDgTUDFRLvAiBg2d8FgPgghfQ+9uFyXQbtiGlTBLinrPCeQd7J86qiUES0fcGoohCCw0wWKtvB0WF2z1XNDg==
@@ -2746,7 +1971,7 @@
dependencies:
lodash "^4.17.15"
-"@storybook/node-logger@5.3.18", "@storybook/node-logger@^5.3.17":
+"@storybook/node-logger@5.3.18":
version "5.3.18"
resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.3.18.tgz#ee278acb8b6f10d456a24c0ff6d59818a0c3ad94"
integrity sha512-Go/hdtaPTtjgJP+GYk8VXcOmecrdG7cXm0yyTlatd6s8xXI0txHme1/0MOZmEPows1Ec7KAQ20+NnaCGUPZUUg==
@@ -2758,18 +1983,7 @@
pretty-hrtime "^1.0.3"
regenerator-runtime "^0.13.3"
-"@storybook/preset-create-react-app@^2.1.1":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/@storybook/preset-create-react-app/-/preset-create-react-app-2.1.1.tgz#6e4249d4c594596bdced74213e4c9238505c085c"
- integrity sha512-ywnpCr7gHuIv/fv8yiQHLY8RikQRqn401CPTKh5nsWwkUbIOQ47Cyewjo2QuVTpivOLLuyJiIpq1jAAS1iW2Ow==
- dependencies:
- "@storybook/node-logger" "^5.3.17"
- "@types/babel__core" "^7.1.6"
- "@types/webpack" "^4.41.7"
- pnp-webpack-plugin "^1.6.4"
- semver "^7.1.3"
-
-"@storybook/react@^5.3.18":
+"@storybook/react@*", "@storybook/react@^5.3.18":
version "5.3.18"
resolved "https://registry.yarnpkg.com/@storybook/react/-/react-5.3.18.tgz#c057b680924e188d44149c3d67dd31aead88b28a"
integrity sha512-6yNg+phcrEqEjC2NOiu0mJuxbTwX7yzbkcusIn0S7N/KTXNO7CGvYjAkdjfw0gTLjfuVDZIjDQfoosslvfsj3w==
@@ -2958,7 +2172,7 @@
merge-deep "^3.0.2"
svgo "^1.2.2"
-"@svgr/webpack@4.3.3", "@svgr/webpack@^4.0.3":
+"@svgr/webpack@^4.0.3":
version "4.3.3"
resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-4.3.3.tgz#13cc2423bf3dff2d494f16b17eb7eacb86895017"
integrity sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==
@@ -2972,60 +2186,19 @@
"@svgr/plugin-svgo" "^4.3.1"
loader-utils "^1.2.3"
-"@types/accepts@*", "@types/accepts@^1.3.5":
+"@types/accepts@*":
version "1.3.5"
resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575"
integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==
dependencies:
"@types/node" "*"
-"@types/agent-base@^4.2.0":
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/@types/agent-base/-/agent-base-4.2.0.tgz#00644e8b395b40e1bf50aaf1d22cabc1200d5051"
- integrity sha512-8mrhPstU+ZX0Ugya8tl5DsDZ1I5ZwQzbL/8PA0z8Gj0k9nql7nkaMzmPVLj+l/nixWaliXi+EBiLA8bptw3z7Q==
- dependencies:
- "@types/events" "*"
- "@types/node" "*"
-
"@types/anymatch@*":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a"
integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==
-"@types/babel__core@^7.1.0", "@types/babel__core@^7.1.6":
- version "7.1.7"
- resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89"
- integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==
- dependencies:
- "@babel/parser" "^7.1.0"
- "@babel/types" "^7.0.0"
- "@types/babel__generator" "*"
- "@types/babel__template" "*"
- "@types/babel__traverse" "*"
-
-"@types/babel__generator@*":
- version "7.6.1"
- resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04"
- integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==
- dependencies:
- "@babel/types" "^7.0.0"
-
-"@types/babel__template@*":
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307"
- integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==
- dependencies:
- "@babel/parser" "^7.1.0"
- "@babel/types" "^7.0.0"
-
-"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
- version "7.0.9"
- resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.9.tgz#be82fab304b141c3eee81a4ce3b034d0eba1590a"
- integrity sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==
- dependencies:
- "@babel/types" "^7.3.0"
-
-"@types/body-parser@*", "@types/body-parser@1.19.0":
+"@types/body-parser@*":
version "1.19.0"
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f"
integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==
@@ -3033,13 +2206,6 @@
"@types/connect" "*"
"@types/node" "*"
-"@types/bunyan@*":
- version "1.8.6"
- resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.6.tgz#6527641cca30bedec5feb9ab527b7803b8000582"
- integrity sha512-YiozPOOsS6bIuz31ilYqR5SlLif4TBWsousN2aCWLi5233nZSX19tFbcQUPdR7xJ8ypPyxkCGNxg0CIV5n9qxQ==
- dependencies:
- "@types/node" "*"
-
"@types/bytebuffer@^5.0.40":
version "5.0.40"
resolved "https://registry.yarnpkg.com/@types/bytebuffer/-/bytebuffer-5.0.40.tgz#d6faac40dcfb09cd856cdc4c01d3690ba536d3ee"
@@ -3075,60 +2241,24 @@
"@types/keygrip" "*"
"@types/node" "*"
-"@types/cors@^2.8.4":
- version "2.8.6"
- resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.6.tgz#cfaab33c49c15b1ded32f235111ce9123009bd02"
- integrity sha512-invOmosX0DqbpA+cE2yoHGUlF/blyf7nB0OGYBBiH27crcVm5NmFaZkLP4Ta1hGaesckCi5lVLlydNJCxkTOSg==
- dependencies:
- "@types/express" "*"
-
-"@types/crypto-js@^3.1.44":
- version "3.1.44"
- resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-3.1.44.tgz#3ad6f046b8c248866b9e5726ce8a1c09f73db9e0"
- integrity sha512-WOoVHc3gv3zirPQ27BynaOUV9AvWrvPmSF/ZyAAABwb7KYn+iWrEpopW/M9gYMBfNdYHqzvu9AIggwWbt9mGYw==
-
-"@types/debug@^4.1.4":
- version "4.1.5"
- resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd"
- integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==
-
-"@types/eslint-visitor-keys@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
- integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
-
-"@types/events@*":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
- integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==
-
"@types/express-serve-static-core@*":
- version "4.17.3"
- resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.3.tgz#dc8068ee3e354d7fba69feb86b3dfeee49b10f09"
- integrity sha512-sHEsvEzjqN+zLbqP+8OXTipc10yH1QLR+hnr5uw29gi9AhCAAAdri8ClNV7iMdrJrIzXIQtlkPvq8tJGhj3QJQ==
+ version "4.17.4"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.4.tgz#157c79c2d28b632d6418497c57c93185e392e444"
+ integrity sha512-dPs6CaRWxsfHbYDVU51VjEJaUJEcli4UI0fFMT4oWmgCvHj+j7oIxz5MLHVL0Rv++N004c21ylJNdWQvPkkb5w==
dependencies:
"@types/node" "*"
"@types/range-parser" "*"
"@types/express@*":
- version "4.17.4"
- resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.4.tgz#e78bf09f3f530889575f4da8a94cd45384520aac"
- integrity sha512-DO1L53rGqIDUEvOjJKmbMEQ5Z+BM2cIEPy/eV3En+s166Gz+FeuzRerxcab757u/U4v4XF4RYrZPmqKa+aY/2w==
+ version "4.17.6"
+ resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.6.tgz#6bce49e49570507b86ea1b07b806f04697fac45e"
+ integrity sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==
dependencies:
"@types/body-parser" "*"
"@types/express-serve-static-core" "*"
"@types/qs" "*"
"@types/serve-static" "*"
-"@types/express@4.17.2":
- version "4.17.2"
- resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.2.tgz#a0fb7a23d8855bac31bc01d5a58cadd9b2173e6c"
- integrity sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==
- dependencies:
- "@types/body-parser" "*"
- "@types/express-serve-static-core" "*"
- "@types/serve-static" "*"
-
"@types/fs-capacitor@*":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e"
@@ -3136,29 +2266,6 @@
dependencies:
"@types/node" "*"
-"@types/glob@^7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
- integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==
- dependencies:
- "@types/events" "*"
- "@types/minimatch" "*"
- "@types/node" "*"
-
-"@types/graphql-depth-limit@^1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@types/graphql-depth-limit/-/graphql-depth-limit-1.1.2.tgz#8e8a7b68548d703a3c3bd7f0531f314b3051f556"
- integrity sha512-CJoghYUfE5/IKrqexgSsTECP0RcP2Ii+ulv/BjjFniABNAMgfwCTKFnCkkRskg9Sr3WZeJrSLjwBhNFetP5Tyw==
- dependencies:
- graphql "^14.5.3"
-
-"@types/graphql-iso-date@^3.3.3":
- version "3.3.3"
- resolved "https://registry.yarnpkg.com/@types/graphql-iso-date/-/graphql-iso-date-3.3.3.tgz#a368aa7370512a9cc87a5035c3701949ed7db9e2"
- integrity sha512-lchvlAox/yqk2Rcrgqh+uvwc1UC9i1hap+0tqQqyYYcAica6Uw2D4mUkCNcw+WeZ8dvSS5QdtIlJuDYUf4nLXQ==
- dependencies:
- graphql "^14.5.3"
-
"@types/graphql-upload@^8.0.0":
version "8.0.3"
resolved "https://registry.yarnpkg.com/@types/graphql-upload/-/graphql-upload-8.0.3.tgz#b371edb5f305a2a1f7b7843a890a2a7adc55c3ec"
@@ -3174,14 +2281,6 @@
resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.5.tgz#527d20ef68571a4af02ed74350164e7a67544860"
integrity sha512-wLD/Aq2VggCJXSjxEwrMafIP51Z+13H78nXIX0ABEuIGhmB5sNGbR113MOKo+yfw+RDo1ZU3DM6yfnnRF/+ouw==
-"@types/hoist-non-react-statics@*":
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
- integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
- dependencies:
- "@types/react" "*"
- hoist-non-react-statics "^3.3.0"
-
"@types/html-minifier-terser@^5.0.0":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.0.0.tgz#7532440c138605ced1b555935c3115ddd20e8bef"
@@ -3197,44 +2296,6 @@
resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.0.tgz#1b0b819b1636c7baf0d6785d030d12edf70c3e83"
integrity sha512-iTs9HReBu7evG77Q4EC8hZnqRt57irBDkK9nvmHroiOIVwYMQc4IvYvdRgwKfYepunIY7Oh/dBuuld+Gj9uo6w==
-"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff"
- integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==
-
-"@types/istanbul-lib-report@*":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
- integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
- dependencies:
- "@types/istanbul-lib-coverage" "*"
-
-"@types/istanbul-reports@^1.1.1":
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a"
- integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==
- dependencies:
- "@types/istanbul-lib-coverage" "*"
- "@types/istanbul-lib-report" "*"
-
-"@types/jest@25.1.5":
- version "25.1.5"
- resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.1.5.tgz#3c3c078b3cd19c6403e21277f1cfdc0ce5ebf9a9"
- integrity sha512-FBmb9YZHoEOH56Xo/PIYtfuyTL0IzJLM3Hy0Sqc82nn5eqqXgefKcl/eMgChM8eSGVfoDee8cdlj7K74T8a6Yg==
- dependencies:
- jest-diff "25.1.0"
- pretty-format "25.1.0"
-
-"@types/js-yaml@^3.12.1":
- version "3.12.3"
- resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.3.tgz#abf383c5b639d0aa8b8c4a420d6a85f703357d6c"
- integrity sha512-otRe77JNNWzoVGLKw8TCspKswRoQToys4tuL6XYVBFxjgeM0RUrx7m3jkaTdxILxeGry3zM8mGYkGXMeQ02guA==
-
-"@types/json-schema@^7.0.3":
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
- integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==
-
"@types/keygrip@*":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72"
@@ -3260,32 +2321,6 @@
"@types/koa-compose" "*"
"@types/node" "*"
-"@types/lodash.debounce@^4.0.6":
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.6.tgz#c5a2326cd3efc46566c47e4c0aa248dc0ee57d60"
- integrity sha512-4WTmnnhCfDvvuLMaF3KV4Qfki93KebocUF45msxhYyjMttZDQYzHkO639ohhk8+oco2cluAFL3t5+Jn4mleylQ==
- dependencies:
- "@types/lodash" "*"
-
-"@types/lodash.merge@^4.6.6":
- version "4.6.6"
- resolved "https://registry.yarnpkg.com/@types/lodash.merge/-/lodash.merge-4.6.6.tgz#b84b403c1d31bc42d51772d1cd5557fa008cd3d6"
- integrity sha512-IB90krzMf7YpfgP3u/EvZEdXVvm4e3gJbUvh5ieuI+o+XqiNEt6fCzqNRaiLlPVScLI59RxIGZMQ3+Ko/DJ8vQ==
- dependencies:
- "@types/lodash" "*"
-
-"@types/lodash.sortby@^4.7.6":
- version "4.7.6"
- resolved "https://registry.yarnpkg.com/@types/lodash.sortby/-/lodash.sortby-4.7.6.tgz#eed689835f274b553db4ae16a4a23f58b79618a1"
- integrity sha512-EnvAOmKvEg7gdYpYrS6+fVFPw5dL9rBnJi3vcKI7wqWQcLJVF/KRXK9dH29HjGNVvFUj0s9prRP3J8jEGnGKDw==
- dependencies:
- "@types/lodash" "*"
-
-"@types/lodash@*":
- version "4.14.149"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440"
- integrity sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==
-
"@types/long@*", "@types/long@^4.0.0":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9"
@@ -3296,12 +2331,7 @@
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d"
integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==
-"@types/minimatch@*", "@types/minimatch@^3.0.3":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
- integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
-
-"@types/node-fetch@2.5.5", "@types/node-fetch@^2.5.5":
+"@types/node-fetch@2.5.5":
version "2.5.5"
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.5.tgz#cd264e20a81f4600a6c52864d38e7fef72485e92"
integrity sha512-IWwjsyYjGw+em3xTvWVQi5MgYKbRs0du57klfTaZkv/B24AEQ/p/IopNeqIYNy3EsfHOpg8ieQSDomPcsYMHpA==
@@ -3309,10 +2339,10 @@
"@types/node" "*"
form-data "^3.0.0"
-"@types/node@*", "@types/node@13.11.0", "@types/node@>= 8", "@types/node@>=6":
- version "13.11.0"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b"
- integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==
+"@types/node@*", "@types/node@>=6", "@types/node@^13.11.1":
+ version "13.11.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.1.tgz#49a2a83df9d26daacead30d0ccc8762b128d53c7"
+ integrity sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==
"@types/node@10.12.18":
version "10.12.18"
@@ -3320,25 +2350,15 @@
integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==
"@types/node@^10.1.0":
- version "10.17.18"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.18.tgz#ae364d97382aacdebf583fa4e7132af2dfe56a0c"
- integrity sha512-DQ2hl/Jl3g33KuAUOcMrcAOtsbzb+y/ufakzAdeK9z/H/xsvkpbETZZbPNMIiQuk24f5ZRMCcZIViAwyFIiKmg==
-
-"@types/node@^6.14.4":
- version "6.14.9"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.9.tgz#733583e21ef0eab85a9737dfafbaa66345a92ef0"
- integrity sha512-leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w==
+ version "10.17.19"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.19.tgz#1d31ddd5503dba2af7a901aafef3392e4955620e"
+ integrity sha512-46/xThm3zvvc9t9/7M3AaLEqtOpqlYYYcCZbpYVAQHG20+oMZBkae/VMrn4BTi6AJ8cpack0mEXhGiKmDNbLrQ==
"@types/npmlog@^4.1.2":
version "4.1.2"
resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.2.tgz#d070fe6a6b78755d1092a3dc492d34c3d8f871c4"
integrity sha512-4QQmOF5KlwfxJ5IGXFIudkeLCdMABz03RcUXu+LCb24zmln8QW6aDjuGl4d4XPVLf2j+FnjelHTP7dvceAFbhA==
-"@types/numeral@^0.0.26":
- version "0.0.26"
- resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.26.tgz#cfab9842ef9349ce714b06722940ca7ebf8a6298"
- integrity sha512-DwCsRqeOWopdEsm5KLTxKVKDSDoj+pzZD1vlwu1GQJ6IF3RhjuleYlRwyRH6MJLGaf3v8wFTnC6wo3yYfz0bnA==
-
"@types/parse-json@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
@@ -3354,13 +2374,6 @@
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
-"@types/qrcode.react@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@types/qrcode.react/-/qrcode.react-1.0.0.tgz#9eff4d4a93eb32fcd65e26ea046f2efc52764431"
- integrity sha512-CyH8QizAyp/G2RTz+2W0qIp/qbJMNC6a8aossG+zN42Rmx3loQlgBCWFatjKJ3NeJaX99e22SJ75yU2EVHlu3g==
- dependencies:
- "@types/react" "*"
-
"@types/qs@*":
version "6.9.1"
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.1.tgz#937fab3194766256ee09fcd40b781740758617e7"
@@ -3386,58 +2399,6 @@
dependencies:
"@types/react" "*"
-"@types/react-copy-to-clipboard@^4.3.0":
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/@types/react-copy-to-clipboard/-/react-copy-to-clipboard-4.3.0.tgz#8e07becb4f11cfced4bd36038cb5bdf5c2658be5"
- integrity sha512-iideNPRyroENqsOFh1i2Dv3zkviYS9r/9qD9Uh3Z9NNoAAqqa2x53i7iGndGNnJFIo20wIu7Hgh77tx1io8bgw==
- dependencies:
- "@types/react" "*"
-
-"@types/react-dom@16.9.6":
- version "16.9.6"
- resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.6.tgz#9e7f83d90566521cc2083be2277c6712dcaf754c"
- integrity sha512-S6ihtlPMDotrlCJE9ST1fRmYrQNNwfgL61UB4I1W7M6kPulUKx9fXAleW5zpdIjUQ4fTaaog8uERezjsGUj9HQ==
- dependencies:
- "@types/react" "*"
-
-"@types/react-modal@^3.10.5":
- version "3.10.5"
- resolved "https://registry.yarnpkg.com/@types/react-modal/-/react-modal-3.10.5.tgz#5aa40bcb71b59243126069330856eb430ed3adcc"
- integrity sha512-iLL9afYbcgYlboW2J8mFNKH2tFgErIHR0q+JgHotKrFK99+d97v+V/dxL5LVoxt1OjlnWsuwj8sZuBMVsI1MtQ==
- dependencies:
- "@types/react" "*"
-
-"@types/react-native@*":
- version "0.62.1"
- resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.62.1.tgz#a51d50ade85420a68d594778316ed74e5040078c"
- integrity sha512-4uKqYGek9/OstJWW0hEfF/6fx8BzNkzdAFxeY+VOxec+SPKK/hvGEjnX6+0jV1MnJDBHYKdWfWA4sYCQ8G3sqA==
- dependencies:
- "@types/react" "*"
-
-"@types/react-qr-reader@^2.1.2":
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/@types/react-qr-reader/-/react-qr-reader-2.1.2.tgz#da7a674cf9e3ceb1c026e89d5aa41fb1587fc66b"
- integrity sha512-tDLqqiQMZlTKBKtWedcf7QZ3L9fyz8nPHNq/j+1mcJoEvrdM3Y89i3/FKwdmZ4H7G6uUk4JqShpWXLCuYpZK+w==
- dependencies:
- "@types/react" "*"
-
-"@types/react-router-dom@^5.1.2":
- version "5.1.3"
- resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.3.tgz#b5d28e7850bd274d944c0fbbe5d57e6b30d71196"
- integrity sha512-pCq7AkOvjE65jkGS5fQwQhvUp4+4PVD9g39gXLZViP2UqFiFzsEpB3PKf0O6mdbKsewSK8N14/eegisa/0CwnA==
- dependencies:
- "@types/history" "*"
- "@types/react" "*"
- "@types/react-router" "*"
-
-"@types/react-router@*":
- version "5.1.5"
- resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.5.tgz#7b2f9b7cc3d350e92664c4e38c0ef529286fe628"
- integrity sha512-RZPdCtZympi6X7EkGyaU7ISiAujDYTWgqMF9owE3P6efITw27IWQykcti0BvA5h4Mu1LLl5rxrpO3r8kHyUZ/Q==
- dependencies:
- "@types/history" "*"
- "@types/react" "*"
-
"@types/react-syntax-highlighter@11.0.4":
version "11.0.4"
resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.4.tgz#d86d17697db62f98046874f62fdb3e53a0bbc4cd"
@@ -3452,17 +2413,10 @@
dependencies:
"@types/react" "*"
-"@types/react-tooltip@^3.11.0":
- version "3.11.0"
- resolved "https://registry.yarnpkg.com/@types/react-tooltip/-/react-tooltip-3.11.0.tgz#e7e7e9c67629f2b6f75ea67752922c9de0b64468"
- integrity sha512-TkXMgkZ5aAKkFE9Wvt8OlOiPtF9ufgBOL9xWlRSzLBaoL12qSOBiyMcU4/8TyED1fuWkm5VTVarScwOPLSArYw==
- dependencies:
- "@types/react" "*"
-
-"@types/react@*", "@types/react@16.9.32":
- version "16.9.32"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383"
- integrity sha512-fmejdp0CTH00mOJmxUPPbWCEBWPvRIL4m8r0qD+BSDUqmutPyGQCHifzMpMzdvZwROdEdL78IuZItntFWgPXHQ==
+"@types/react@*", "@types/react@^16.9.34":
+ version "16.9.34"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.34.tgz#f7d5e331c468f53affed17a8a4d488cd44ea9349"
+ integrity sha512-8AJlYMOfPe1KGLKyHpflCg5z46n0b5DbRfqDksxBLBTUpB75ypDBAO9eCUcjNwE6LCUslwTz00yyG/X9gaVtow==
dependencies:
"@types/prop-types" "*"
csstype "^2.2.0"
@@ -3481,19 +2435,6 @@
dependencies:
"@types/node" "*"
-"@types/restify@^4.3.6":
- version "4.3.6"
- resolved "https://registry.yarnpkg.com/@types/restify/-/restify-4.3.6.tgz#5da5889b65c34c33937a67686bab591325dde806"
- integrity sha512-4l4f0EXnleXQttlhRCXtTuJ8UelsKiAKIK2AAEd2epBHu41aEbM0U2z6E5tUrNwlbxz7qaNBISduGMeg+G3PaA==
- dependencies:
- "@types/bunyan" "*"
- "@types/node" "*"
-
-"@types/semver@^5.5.0":
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45"
- integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==
-
"@types/serve-static@*":
version "1.13.3"
resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.3.tgz#eb7e1c41c4468272557e897e9171ded5e2ded9d1"
@@ -3507,36 +2448,12 @@
resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
-"@types/stack-utils@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
- integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
-
-"@types/styled-components@*", "@types/styled-components@^5.0.1":
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.0.1.tgz#44d210b0a0218a70df998d1a8e1f69c82d9cc68b"
- integrity sha512-1yRYO1dAE2MGEuYKF1yQFeMdoyerIQn6ZDnFFkxZamcs3rn8RQVn98edPsTROAxbTz81tqnVN4BJ3Qs1cm/tKg==
+"@types/storybook__react@^5.2.1":
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/@types/storybook__react/-/storybook__react-5.2.1.tgz#b5fd1612f2e5846b2f441725ea946bafd7ab9edb"
+ integrity sha512-p4QGO+VjEO3YxyWVHpPylNheA0JhStzoCg6RBTmdobrC0ZqLPEIIWu0pFkHlNkmGIiEKW2yDGFJooBe8M4Df0Q==
dependencies:
- "@types/hoist-non-react-statics" "*"
- "@types/react" "*"
- "@types/react-native" "*"
- csstype "^2.2.0"
-
-"@types/styled-react-modal@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@types/styled-react-modal/-/styled-react-modal-1.2.0.tgz#82be290f1ee9a2cfcf0b7d4eb830ce7cb3a8c027"
- integrity sha512-g+mtpYcekjAgnyKRN+xQ4bo5GQmiNdoXZ+XGb374uIgxSXx3+Wnb643o49MprYYcTTupzHf8scK3SDTzcf42Gw==
- dependencies:
- "@types/react" "*"
- "@types/styled-components" "*"
-
-"@types/styled-theming@^2.2.2":
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/@types/styled-theming/-/styled-theming-2.2.2.tgz#e9cd824be4d6bcdb95315c5a86ae3ae0a46ba731"
- integrity sha512-O8h8DFtY8IfxIOt2fDZqlqNk3aTbOsvdwU7gaFa4o7OfRRE5bBsehHZMxI1aSawq8AuISQJP4xOoz9P2imx/FQ==
- dependencies:
- "@types/styled-components" "*"
- csstype "^2.2.0"
+ "@storybook/react" "*"
"@types/tapable@*", "@types/tapable@^1.0.5":
version "1.0.5"
@@ -3550,24 +2467,7 @@
dependencies:
source-map "^0.6.1"
-"@types/underscore@^1.9.4":
- version "1.9.4"
- resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.9.4.tgz#22d1a3e6b494608e430221ec085fa0b7ccee7f33"
- integrity sha512-CjHWEMECc2/UxOZh0kpiz3lEyX2Px3rQS9HzD20lxMvx571ivOBQKeLnqEjxUY0BMgp6WJWo/pQLRBwMW5v4WQ==
-
-"@types/uuid@^7.0.2":
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-7.0.2.tgz#d680a9c596ef84abf5c4c07a32ffd66d582526f8"
- integrity sha512-8Ly3zIPTnT0/8RCU6Kg/G3uTICf9sRwYOpUzSIM3503tLIKcnJPRuinHhXngJUy2MntrEf6dlpOHXJju90Qh5w==
-
-"@types/victory@^33.1.4":
- version "33.1.4"
- resolved "https://registry.yarnpkg.com/@types/victory/-/victory-33.1.4.tgz#b843b7cee8ed1ab846d4dd03eb048a178e197b4c"
- integrity sha512-y0uROW9/p2ltaZW+VcH1llrtu6Uwp1lSJ8zZbVjcXJJgddU3Is2aUvU6PxFQhbjBMtjaqNdw1tH/44c5bn/Zsw==
- dependencies:
- "@types/react" "*"
-
-"@types/webpack-env@^1.15.0", "@types/webpack-env@^1.15.1":
+"@types/webpack-env@^1.15.0":
version "1.15.1"
resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.1.tgz#c8e84705e08eed430b5e15b39c65b0944e4d1422"
integrity sha512-eWN5ElDTeBc5lRDh95SqA8x18D0ll2pWudU3uWiyfsRmIZcmUXpEsxPU+7+BsdCrO2vfLRC629u/MmjbmF+2tA==
@@ -3581,7 +2481,7 @@
"@types/source-list-map" "*"
source-map "^0.6.1"
-"@types/webpack@^4.4.31", "@types/webpack@^4.41.7", "@types/webpack@^4.41.8":
+"@types/webpack@^4.41.8":
version "4.41.10"
resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.10.tgz#2e1f6b3508a249854efe3dcc7690905ac5ee10be"
integrity sha512-vIy0qaq8AjOjZLuFPqpo7nAJzcoVXMdw3mvpNN07Uvdy0p1IpJeLNBe3obdRP7FX2jIusDE7z1pZa0A6qYUgnA==
@@ -3600,33 +2500,6 @@
dependencies:
"@types/node" "*"
-"@types/xml2js@0.4.3":
- version "0.4.3"
- resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.3.tgz#2f41bfc74d5a4022511721f872ed395a210ad3b7"
- integrity sha512-Pv2HGRE4gWLs31In7nsyXEH4uVVsd0HNV9i2dyASvtDIlOtSTr1eczPLDpdEuyv5LWH5LT20GIXwPjkshKWI1g==
- dependencies:
- "@types/events" "*"
- "@types/node" "*"
-
-"@types/yargs-parser@*":
- version "15.0.0"
- resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d"
- integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==
-
-"@types/yargs@^13.0.0":
- version "13.0.8"
- resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.8.tgz#a38c22def2f1c2068f8971acb3ea734eb3c64a99"
- integrity sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==
- dependencies:
- "@types/yargs-parser" "*"
-
-"@types/yargs@^15.0.0":
- version "15.0.4"
- resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.4.tgz#7e5d0f8ca25e9d5849f2ea443cf7c402decd8299"
- integrity sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==
- dependencies:
- "@types/yargs-parser" "*"
-
"@types/yup@0.26.23":
version "0.26.23"
resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.23.tgz#00721a3b675e7609e5bcccb94234e86b754bcd04"
@@ -3637,54 +2510,6 @@
resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d"
integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==
-"@types/zxcvbn@^4.4.0":
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/@types/zxcvbn/-/zxcvbn-4.4.0.tgz#fbc1d941cc6d9d37d18405c513ba6b294f89b609"
- integrity sha512-GQLOT+SN20a+AI51y3fAimhyTF4Y0RG+YP3gf91OibIZ7CJmPFgoZi+ZR5a+vRbS01LbQosITWum4ATmJ1Z6Pg==
-
-"@typescript-eslint/eslint-plugin@^2.10.0":
- version "2.26.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz#04c96560c8981421e5a9caad8394192363cc423f"
- integrity sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw==
- dependencies:
- "@typescript-eslint/experimental-utils" "2.26.0"
- functional-red-black-tree "^1.0.1"
- regexpp "^3.0.0"
- tsutils "^3.17.1"
-
-"@typescript-eslint/experimental-utils@2.26.0":
- version "2.26.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz#063390c404d9980767d76274df386c0aa675d91d"
- integrity sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==
- dependencies:
- "@types/json-schema" "^7.0.3"
- "@typescript-eslint/typescript-estree" "2.26.0"
- eslint-scope "^5.0.0"
- eslint-utils "^2.0.0"
-
-"@typescript-eslint/parser@^2.10.0":
- version "2.26.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.26.0.tgz#385463615818b33acb72a25b39c03579df93d76f"
- integrity sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ==
- dependencies:
- "@types/eslint-visitor-keys" "^1.0.0"
- "@typescript-eslint/experimental-utils" "2.26.0"
- "@typescript-eslint/typescript-estree" "2.26.0"
- eslint-visitor-keys "^1.1.0"
-
-"@typescript-eslint/typescript-estree@2.26.0":
- version "2.26.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz#d8132cf1ee8a72234f996519a47d8a9118b57d56"
- integrity sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==
- dependencies:
- debug "^4.1.1"
- eslint-visitor-keys "^1.1.0"
- glob "^7.1.6"
- is-glob "^4.0.1"
- lodash "^4.17.15"
- semver "^6.3.0"
- tsutils "^3.17.1"
-
"@webassemblyjs/ast@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359"
@@ -3976,18 +2801,6 @@
"@webassemblyjs/wast-parser" "1.9.0"
"@xtuc/long" "4.2.2"
-"@webpack-contrib/schema-utils@^1.0.0-beta.0":
- version "1.0.0-beta.0"
- resolved "https://registry.yarnpkg.com/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz#bf9638c9464d177b48209e84209e23bee2eb4f65"
- integrity sha512-LonryJP+FxQQHsjGBi6W786TQB1Oym+agTpY0c+Kj8alnIw+DLUJb6SI8Y1GHGhLCH1yPRrucjObUmxNICQ1pg==
- dependencies:
- ajv "^6.1.0"
- ajv-keywords "^3.1.0"
- chalk "^2.3.2"
- strip-ansi "^4.0.0"
- text-table "^0.2.0"
- webpack-log "^1.1.2"
-
"@wry/context@^0.4.0":
version "0.4.4"
resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.4.4.tgz#e50f5fa1d6cfaabf2977d1fda5ae91717f8815f8"
@@ -4013,21 +2826,7 @@
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-"@yarnpkg/lockfile@^1.0.2":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
- integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
-
-"@zkochan/cmd-shim@^3.1.0":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e"
- integrity sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg==
- dependencies:
- is-windows "^1.0.0"
- mkdirp-promise "^5.0.1"
- mz "^2.5.0"
-
-JSONStream@^1.0.4, JSONStream@^1.3.4:
+JSONStream@^1.0.4:
version "1.3.5"
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
@@ -4035,17 +2834,20 @@ JSONStream@^1.0.4, JSONStream@^1.3.4:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
-abab@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a"
- integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==
-
-abbrev@1, abbrev@^1.1.1:
+abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
-accepts@^1.3.5, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
+accept@^3.0.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/accept/-/accept-3.1.3.tgz#29c3e2b3a8f4eedbc2b690e472b9ebbdc7385e87"
+ integrity sha512-OgOEAidVEOKPup+Gv2+2wdH2AgVKI9LxsJ4hicdJ6cY0faUuZdZoi56kkXWlHp9qicN1nWQLmW5ZRGk+SBS5xg==
+ dependencies:
+ boom "7.x.x"
+ hoek "6.x.x"
+
+accepts@~1.3.5, accepts@~1.3.7:
version "1.3.7"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
@@ -4053,30 +2855,12 @@ accepts@^1.3.5, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
mime-types "~2.1.24"
negotiator "0.6.2"
-acorn-globals@^4.1.0, acorn-globals@^4.3.0:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
- integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==
- dependencies:
- acorn "^6.0.1"
- acorn-walk "^6.0.1"
+acorn-walk@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e"
+ integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==
-acorn-jsx@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
- integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
-
-acorn-walk@^6.0.1:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
- integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
-
-acorn@^5.5.3:
- version "5.7.4"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e"
- integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
-
-acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1:
+acorn@^6.2.1:
version "6.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
@@ -4086,6 +2870,11 @@ acorn@^7.1.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
+add-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa"
+ integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=
+
address@1.1.2, address@^1.0.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
@@ -4102,27 +2891,6 @@ adjust-sourcemap-loader@2.0.0:
object-path "0.11.4"
regex-parser "2.2.10"
-agent-base@4, agent-base@^4.2.0, agent-base@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
- integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
- dependencies:
- es6-promisify "^5.0.0"
-
-agent-base@~4.2.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
- integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
- dependencies:
- es6-promisify "^5.0.0"
-
-agentkeepalive@^3.4.1:
- version "3.5.2"
- resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67"
- integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==
- dependencies:
- humanize-ms "^1.2.1"
-
aggregate-error@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
@@ -4164,7 +2932,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
-ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5:
+ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5:
version "6.12.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7"
integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==
@@ -4174,23 +2942,6 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-alphanum-sort@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
- integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
-
-amdefine@>=0.0.4:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
- integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
-
-ansi-align@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
- integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=
- dependencies:
- string-width "^2.0.0"
-
ansi-align@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
@@ -4203,7 +2954,7 @@ ansi-colors@^3.0.0:
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
-ansi-escapes@3.2.0, ansi-escapes@^3.0.0, ansi-escapes@^3.2.0:
+ansi-escapes@^3.0.0, ansi-escapes@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
@@ -4230,7 +2981,7 @@ ansi-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
-ansi-regex@^4.0.0, ansi-regex@^4.1.0:
+ansi-regex@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
@@ -4245,7 +2996,7 @@ ansi-styles@^2.2.1:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
-ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
@@ -4267,15 +3018,10 @@ ansi-to-html@^0.6.11:
dependencies:
entities "^1.1.2"
-ansicolors@^0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
- integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=
-
-any-promise@^1.0.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
- integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+any-observable@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b"
+ integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==
anymatch@^2.0.0:
version "2.0.0"
@@ -4293,7 +3039,7 @@ anymatch@~3.1.1:
normalize-path "^3.0.0"
picomatch "^2.0.4"
-apollo-boost@^0.4.4:
+apollo-boost@^0.4.7:
version "0.4.7"
resolved "https://registry.yarnpkg.com/apollo-boost/-/apollo-boost-0.4.7.tgz#b0680ab0893e3f8b1ab1058dcfa2b00cb6440d79"
integrity sha512-jfc3aqO0vpCV+W662EOG5gq4AH94yIsvSgAUuDvS3o/Z+8Joqn4zGC9CgLCDHusK30mFgtsEgwEe0pZoedohsQ==
@@ -4308,13 +3054,13 @@ apollo-boost@^0.4.4:
ts-invariant "^0.4.0"
tslib "^1.10.0"
-apollo-cache-control@^0.9.0:
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.9.0.tgz#43d2eec16d40248683f46b9b28937a89ad3b5c54"
- integrity sha512-iLT6IT4Ul5cMfBcJAvhpk3a7AD6fXqvFxNmJEPVapVJHbSKYIjra4PTis13sOyN5Y3WQS6a+NRFxAW8+hL3q3Q==
+apollo-cache-control@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.9.1.tgz#2af4c53ef697a87808285a25f2b93ca0f183880c"
+ integrity sha512-9t2EcRevUrANuGhF5XUbKJEfnc6Jy2Rn7Y8nOIKlsEEC+AX7Ko4svWYTyyTxj0h0RXfiegY2nbz4sVry/pS3rA==
dependencies:
apollo-server-env "^2.4.3"
- graphql-extensions "^0.11.0"
+ graphql-extensions "^0.11.1"
apollo-cache-inmemory@^1.6.5:
version "1.6.5"
@@ -4364,19 +3110,19 @@ apollo-engine-reporting-protobuf@^0.4.4:
dependencies:
"@apollo/protobufjs" "^1.0.3"
-apollo-engine-reporting@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.7.0.tgz#34a54ef96da5cfe1dea3a4fdf02768d1cc7e154f"
- integrity sha512-jsjSnoHrRmk4XXK4aFU17YSJILmWsilKRwIeN74QJsSxjn5SCVF4EI/ebf/MNrTHpft8EhShx+wdkAcOD9ivqA==
+apollo-engine-reporting@^1.7.1:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.7.1.tgz#469d9711507ef4c3b03f193a9b422ecf7ecff7e9"
+ integrity sha512-9ykddPxlC95R9CkkJaPaGriRbOGfzeKqqPXRAunyX1h4sG/8g+MJ/gGzmnNf63k6RvRUdRENCE83wPk2OeU+2A==
dependencies:
apollo-engine-reporting-protobuf "^0.4.4"
apollo-graphql "^0.4.0"
apollo-server-caching "^0.5.1"
apollo-server-env "^2.4.3"
- apollo-server-errors "^2.4.0"
- apollo-server-types "^0.3.0"
+ apollo-server-errors "^2.4.1"
+ apollo-server-types "^0.3.1"
async-retry "^1.2.1"
- graphql-extensions "^0.11.0"
+ graphql-extensions "^0.11.1"
apollo-env@^0.6.2:
version "0.6.2"
@@ -4397,41 +3143,41 @@ apollo-graphql@^0.4.0:
lodash.sortby "^4.7.0"
apollo-link-error@^1.0.3:
- version "1.1.12"
- resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.12.tgz#e24487bb3c30af0654047611cda87038afbacbf9"
- integrity sha512-psNmHyuy3valGikt/XHJfe0pKJnRX19tLLs6P6EHRxg+6q6JMXNVLYPaQBkL0FkwdTCB0cbFJAGRYCBviG8TDA==
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.13.tgz#c1a1bb876ffe380802c8df0506a32c33aad284cd"
+ integrity sha512-jAZOOahJU6bwSqb2ZyskEK1XdgUY9nkmeclCrW7Gddh1uasHVqmoYc4CKdb0/H0Y1J9lvaXKle2Wsw/Zx1AyUg==
dependencies:
- apollo-link "^1.2.13"
- apollo-link-http-common "^0.2.15"
+ apollo-link "^1.2.14"
+ apollo-link-http-common "^0.2.16"
tslib "^1.9.3"
-apollo-link-http-common@^0.2.15:
- version "0.2.15"
- resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.15.tgz#304e67705122bf69a9abaded4351b10bc5efd6d9"
- integrity sha512-+Heey4S2IPsPyTf8Ag3PugUupASJMW894iVps6hXbvwtg1aHSNMXUYO5VG7iRHkPzqpuzT4HMBanCTXPjtGzxg==
+apollo-link-http-common@^0.2.16:
+ version "0.2.16"
+ resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc"
+ integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==
dependencies:
- apollo-link "^1.2.13"
+ apollo-link "^1.2.14"
ts-invariant "^0.4.0"
tslib "^1.9.3"
apollo-link-http@^1.3.1:
- version "1.5.16"
- resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.16.tgz#44fe760bcc2803b8a7f57fc9269173afb00f3814"
- integrity sha512-IA3xA/OcrOzINRZEECI6IdhRp/Twom5X5L9jMehfzEo2AXdeRwAMlH5LuvTZHgKD8V1MBnXdM6YXawXkTDSmJw==
+ version "1.5.17"
+ resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.17.tgz#499e9f1711bf694497f02c51af12d82de5d8d8ba"
+ integrity sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==
dependencies:
- apollo-link "^1.2.13"
- apollo-link-http-common "^0.2.15"
+ apollo-link "^1.2.14"
+ apollo-link-http-common "^0.2.16"
tslib "^1.9.3"
-apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.13, apollo-link@^1.2.3:
- version "1.2.13"
- resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.13.tgz#dff00fbf19dfcd90fddbc14b6a3f9a771acac6c4"
- integrity sha512-+iBMcYeevMm1JpYgwDEIDt/y0BB7VWyvlm/7x+TIPNLHCTCMgcEgDuW5kH86iQZWo0I7mNwQiTOz+/3ShPFmBw==
+apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.14, apollo-link@^1.2.3:
+ version "1.2.14"
+ resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9"
+ integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==
dependencies:
apollo-utilities "^1.3.0"
ts-invariant "^0.4.0"
tslib "^1.9.3"
- zen-observable-ts "^0.8.20"
+ zen-observable-ts "^0.8.21"
apollo-server-caching@^0.5.1:
version "0.5.1"
@@ -4440,29 +3186,30 @@ apollo-server-caching@^0.5.1:
dependencies:
lru-cache "^5.0.0"
-apollo-server-core@^2.11.0:
- version "2.11.0"
- resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.11.0.tgz#91a055ce6cf12a8b43e8a4811d465d97fa324eac"
- integrity sha512-jHLOqwTRlyWzqWNRlwr2M/xfrt+lw2pHtKYyxUGRjWFo8EM5TX1gDcTKtbtvx9p5m+ZBDAhcWp/rpq0vSz4tqg==
+apollo-server-core@^2.12.0:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.12.0.tgz#980f29788c17f029e7248d331bee1ad2e1f07e5b"
+ integrity sha512-BRVdOyZrRJ1ALlmis0vaOLIHHYu5K3UVKAQKIgHkRh/YY0Av4lpeEXr49ELK04LTeh0DG0pQ5YYYhaX1wFcDEw==
dependencies:
"@apollographql/apollo-tools" "^0.4.3"
"@apollographql/graphql-playground-html" "1.6.24"
"@types/graphql-upload" "^8.0.0"
"@types/ws" "^6.0.0"
- apollo-cache-control "^0.9.0"
+ apollo-cache-control "^0.9.1"
apollo-datasource "^0.7.0"
- apollo-engine-reporting "^1.7.0"
+ apollo-engine-reporting "^1.7.1"
apollo-server-caching "^0.5.1"
apollo-server-env "^2.4.3"
- apollo-server-errors "^2.4.0"
- apollo-server-plugin-base "^0.7.0"
- apollo-server-types "^0.3.0"
- apollo-tracing "^0.9.0"
+ apollo-server-errors "^2.4.1"
+ apollo-server-plugin-base "^0.7.1"
+ apollo-server-types "^0.3.1"
+ apollo-tracing "^0.9.1"
fast-json-stable-stringify "^2.0.0"
- graphql-extensions "^0.11.0"
+ graphql-extensions "^0.11.1"
graphql-tag "^2.9.2"
graphql-tools "^4.0.0"
graphql-upload "^8.0.2"
+ loglevel "^1.6.7"
sha.js "^2.4.11"
subscriptions-transport-ws "^0.9.11"
ws "^6.0.0"
@@ -4475,67 +3222,45 @@ apollo-server-env@^2.4.3:
node-fetch "^2.1.2"
util.promisify "^1.0.0"
-apollo-server-errors@^2.4.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.0.tgz#3096db02b6ae8d434a6b2678f74eddaad8b98452"
- integrity sha512-ZouZfr2sGavvI18rgdRcyY2ausRAlVtWNOax9zca8ZG2io86dM59jXBmUVSNlVZSmBsIh45YxYC0eRvr2vmRdg==
+apollo-server-errors@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.1.tgz#16ad49de6c9134bfb2b7dede9842e73bb239dbe2"
+ integrity sha512-7oEd6pUxqyWYUbQ9TA8tM0NU/3aGtXSEibo6+txUkuHe7QaxfZ2wHRp+pfT1LC1K3RXYjKj61/C2xEO19s3Kdg==
-apollo-server-express@^2.11.0:
- version "2.11.0"
- resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.11.0.tgz#ef59a15f6f9ba8a8fb90cfa8b7c4c436be6e84c0"
- integrity sha512-9bbiD+zFAx+xyurc9lxYmNa9y79k/gsA1vEyPFVcv7jxzCFC5wc0tcbV7NPX2qi1Nn7K76fxo2fPNYbPFX/y0g==
+apollo-server-micro@^2.12.0:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/apollo-server-micro/-/apollo-server-micro-2.12.0.tgz#18d5363429e6c55be42b25bd8b3c2dd898523b48"
+ integrity sha512-mk3MPTEcRzsFSn1WYdJerXsDv1+tbPc8H359lG614XTpKTqp+sk20pZOIq4sjMOgYx4I7EOvU+Da63KK8oc09A==
dependencies:
"@apollographql/graphql-playground-html" "1.6.24"
- "@types/accepts" "^1.3.5"
- "@types/body-parser" "1.19.0"
- "@types/cors" "^2.8.4"
- "@types/express" "4.17.2"
- accepts "^1.3.5"
- apollo-server-core "^2.11.0"
- apollo-server-types "^0.3.0"
- body-parser "^1.18.3"
- cors "^2.8.4"
- express "^4.17.1"
- graphql-subscriptions "^1.0.0"
- graphql-tools "^4.0.0"
- parseurl "^1.3.2"
- subscriptions-transport-ws "^0.9.16"
- type-is "^1.6.16"
+ accept "^3.0.2"
+ apollo-server-core "^2.12.0"
+ apollo-server-types "^0.3.1"
+ micro "^9.3.2"
-apollo-server-plugin-base@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.7.0.tgz#5c52ee311c8ef884b8b17be1b7e9d4597966dae1"
- integrity sha512-//xgYrBYLQSr92W0z3mYsFGoVz3wxKNsv3KcOUBhbOCGTbjZgP7vHOE1vhHhRcpZKKXmjXTVONdrnNJ+XVGi6A==
+apollo-server-plugin-base@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.7.1.tgz#998d035723c5993171fd5aff3dbe7d2661db1a96"
+ integrity sha512-PRavvoWq7/Xufqc+qkDQg3Aqueq4QrPBFfoCFIjhkJ4n2d2YoqE3gTGccb8YoWusfa62ASMn6R47OdNuVtEbXw==
dependencies:
- apollo-server-types "^0.3.0"
+ apollo-server-types "^0.3.1"
-apollo-server-types@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.3.0.tgz#01732e5fc6c4a2a522f051d5685c57a8e3dc620e"
- integrity sha512-FMo7kbTkhph9dfIQ3xDbRLObqmdQH9mwSjxhGsX+JxGMRPPXgd3+GZvCeVKOi/udxh//w1otSeAqItjvbj0tfQ==
+apollo-server-types@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.3.1.tgz#9456e243dad525a78b689246f124a66d7d8ac409"
+ integrity sha512-6nX5VC3icOGf1RZIs7/SYQZff+Cl16LQu1FHUOIk9gAMN2XjlRCyJgCeMj5YHJzQ8Mhg4BO0weWuydEg+JxLzg==
dependencies:
apollo-engine-reporting-protobuf "^0.4.4"
apollo-server-caching "^0.5.1"
apollo-server-env "^2.4.3"
-apollo-server@^2.11.0:
- version "2.11.0"
- resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.11.0.tgz#f901f820716716e8693be8b0e234849f5819a4ae"
- integrity sha512-UhW6RHPBMWZy1v7KhzssUnxPBxpu9fGFajtqP68vtvvP3+xa2Y2GUg0594bHcUcLK+BjdMBQQSW27i0yQ/Fz9g==
- dependencies:
- apollo-server-core "^2.11.0"
- apollo-server-express "^2.11.0"
- express "^4.0.0"
- graphql-subscriptions "^1.0.0"
- graphql-tools "^4.0.0"
-
-apollo-tracing@^0.9.0:
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.9.0.tgz#673916ae674b9a8d72603f73af0b8561dfd38306"
- integrity sha512-oqspTrf4BLGbKkIk1vF+I31C2v7PPJmF36TFpT/+zJxNvJw54ji4ZMhtytgVqbVldQEintJmdHQIidYBGKmu+g==
+apollo-tracing@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.9.1.tgz#c481be727550c73fda53d20d798cbe4ad67c61bd"
+ integrity sha512-4wVNM6rc70XhwWxuDWrMBLaHA8NjB9pUS2sNpddQvP36ZtQfsa08XLSUxGAZT+bej+TzW26hKNtuO31RgqC9Hg==
dependencies:
apollo-server-env "^2.4.3"
- graphql-extensions "^0.11.0"
+ graphql-extensions "^0.11.1"
apollo-utilities@1.3.3, apollo-utilities@^1.0.1, apollo-utilities@^1.3.0, apollo-utilities@^1.3.3:
version "1.3.3"
@@ -4557,16 +3282,6 @@ aproba@^1.0.3, aproba@^1.1.1:
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
-aproba@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
- integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
-
-archy@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
- integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
-
are-we-there-yet@~1.1.2:
version "1.1.5"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
@@ -4575,6 +3290,11 @@ are-we-there-yet@~1.1.2:
delegates "^1.0.0"
readable-stream "^2.0.6"
+arg@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0"
+ integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==
+
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@@ -4582,14 +3302,6 @@ argparse@^1.0.7:
dependencies:
sprintf-js "~1.0.2"
-aria-query@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc"
- integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=
- dependencies:
- ast-types-flow "0.0.7"
- commander "^2.11.0"
-
arity-n@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745"
@@ -4610,21 +3322,6 @@ arr-union@^3.1.0:
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
-array-differ@^2.0.3:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1"
- integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==
-
-array-differ@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
- integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==
-
-array-equal@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
- integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
-
array-find-index@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
@@ -4635,17 +3332,12 @@ array-flatten@1.1.1:
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
-array-flatten@^2.1.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
- integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
-
array-ify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=
-array-includes@^3.0.3, array-includes@^3.1.1:
+array-includes@^3.0.3:
version "3.1.1"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348"
integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==
@@ -4654,18 +3346,13 @@ array-includes@^3.0.3, array-includes@^3.1.1:
es-abstract "^1.17.0"
is-string "^1.0.5"
-array-union@^1.0.1, array-union@^1.0.2:
+array-union@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
dependencies:
array-uniq "^1.0.1"
-array-union@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
- integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-
array-uniq@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
@@ -4708,16 +3395,6 @@ arrify@^1.0.1:
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
-arrify@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
- integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
-
-asap@^2.0.0, asap@~2.0.3, asap@~2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
- integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
-
ascli@~1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ascli/-/ascli-1.0.1.tgz#bcfa5974a62f18e81cabaeb49732ab4a88f906bc"
@@ -4767,36 +3444,21 @@ assign-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
-ast-types-flow@0.0.7, ast-types-flow@^0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
- integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0=
-
ast-types@0.11.3:
version "0.11.3"
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.3.tgz#c20757fe72ee71278ea0ff3d87e5c2ca30d9edf8"
integrity sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==
-ast-types@0.x.x, ast-types@^0.13.2:
+ast-types@^0.13.2:
version "0.13.3"
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7"
integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==
-astral-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
- integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
-
async-each@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
-async-foreach@^0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
- integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=
-
async-limiter@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
@@ -4814,12 +3476,7 @@ async@3.2.0:
resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
-async@^1.4.0:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
- integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
-
-async@^2.6.1, async@^2.6.2:
+async@^2.6.1:
version "2.6.3"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
@@ -4838,58 +3495,34 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
-atob-lite@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696"
- integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=
-
atob@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-autoprefixer@^9.6.1, autoprefixer@^9.7.2:
- version "9.7.5"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.5.tgz#8df10b9ff9b5814a8d411a5cfbab9c793c392376"
- integrity sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==
+autoprefixer@^9.7.2:
+ version "9.7.6"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4"
+ integrity sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==
dependencies:
- browserslist "^4.11.0"
- caniuse-lite "^1.0.30001036"
+ browserslist "^4.11.1"
+ caniuse-lite "^1.0.30001039"
chalk "^2.4.2"
normalize-range "^0.1.2"
num2fraction "^1.2.2"
postcss "^7.0.27"
postcss-value-parser "^4.0.3"
-awesome-typescript-loader@^5.2.1:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/awesome-typescript-loader/-/awesome-typescript-loader-5.2.1.tgz#a41daf7847515f4925cdbaa3075d61f289e913fc"
- integrity sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==
- dependencies:
- chalk "^2.4.1"
- enhanced-resolve "^4.0.0"
- loader-utils "^1.1.0"
- lodash "^4.17.5"
- micromatch "^3.1.9"
- mkdirp "^0.5.1"
- source-map-support "^0.5.3"
- webpack-log "^1.2.0"
-
-aws-sign2@0.7.0, aws-sign2@~0.7.0:
+aws-sign2@0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
-aws4@1.9.1, aws4@^1.8.0:
+aws4@1.9.1:
version "1.9.1"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e"
integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==
-axobject-query@^2.0.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799"
- integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==
-
babel-code-frame@^6.22.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
@@ -4899,25 +3532,6 @@ babel-code-frame@^6.22.0:
esutils "^2.0.2"
js-tokens "^3.0.2"
-babel-eslint@10.1.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
- integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- "@babel/parser" "^7.7.0"
- "@babel/traverse" "^7.7.0"
- "@babel/types" "^7.7.0"
- eslint-visitor-keys "^1.0.0"
- resolve "^1.12.0"
-
-babel-extract-comments@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21"
- integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==
- dependencies:
- babylon "^6.18.0"
-
babel-helper-evaluate-path@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz#a62fa9c4e64ff7ea5cea9353174ef023a900a67c"
@@ -4953,20 +3567,7 @@ babel-helper-to-multiple-sequence-expressions@^0.5.0:
resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz#a3f924e3561882d42fcf48907aa98f7979a4588d"
integrity sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==
-babel-jest@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54"
- integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==
- dependencies:
- "@jest/transform" "^24.9.0"
- "@jest/types" "^24.9.0"
- "@types/babel__core" "^7.1.0"
- babel-plugin-istanbul "^5.1.0"
- babel-preset-jest "^24.9.0"
- chalk "^2.4.2"
- slash "^2.0.0"
-
-babel-loader@8.1.0:
+babel-loader@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3"
integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==
@@ -5005,22 +3606,16 @@ babel-plugin-emotion@^10.0.20, babel-plugin-emotion@^10.0.27:
find-root "^1.1.0"
source-map "^0.5.7"
-babel-plugin-istanbul@^5.1.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854"
- integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==
+babel-plugin-inline-react-svg@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-inline-react-svg/-/babel-plugin-inline-react-svg-1.1.1.tgz#3fce30c5653a6c032c21ccc2b3e0141cd494b1d8"
+ integrity sha512-KCCzSKJUigDXd/dxJDE6uNyVTYE46FiTt8Md3vpYHtbADeTjOLJq5LkmaVpISplxKCK25VZU8sha2Km6uIEFJA==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
- find-up "^3.0.0"
- istanbul-lib-instrument "^3.3.0"
- test-exclude "^5.2.3"
-
-babel-plugin-jest-hoist@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756"
- integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==
- dependencies:
- "@types/babel__traverse" "^7.0.6"
+ "@babel/parser" "^7.0.0"
+ lodash.isplainobject "^4.0.6"
+ resolve "^1.10.0"
+ svgo "^0.7.2"
babel-plugin-macros@2.8.0, babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.7.0:
version "2.8.0"
@@ -5107,7 +3702,7 @@ babel-plugin-minify-type-constructors@^0.4.3:
dependencies:
babel-helper-is-void-0 "^0.4.3"
-babel-plugin-named-asset-import@^0.3.1, babel-plugin-named-asset-import@^0.3.6:
+babel-plugin-named-asset-import@^0.3.1:
version "0.3.6"
resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz#c9750a1b38d85112c9e166bf3ef7c5dbc605f4be"
integrity sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==
@@ -5121,7 +3716,7 @@ babel-plugin-react-docgen@^4.0.0:
react-docgen "^5.0.0"
recast "^0.14.7"
-"babel-plugin-styled-components@>= 1":
+"babel-plugin-styled-components@>= 1", babel-plugin-styled-components@^1.10.7:
version "1.10.7"
resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.10.7.tgz#3494e77914e9989b33cc2d7b3b29527a949d635c"
integrity sha512-MBMHGcIA22996n9hZRf/UJLVVgkEOITuR2SvjHLb5dSTUyR4ZRGn+ngITapes36FI3WLxZHfRhkA1ffHxihOrg==
@@ -5131,15 +3726,18 @@ babel-plugin-react-docgen@^4.0.0:
babel-plugin-syntax-jsx "^6.18.0"
lodash "^4.17.11"
-babel-plugin-syntax-jsx@^6.18.0:
+babel-plugin-syntax-jsx@6.18.0, babel-plugin-syntax-jsx@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=
-babel-plugin-syntax-object-rest-spread@^6.8.0:
- version "6.13.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
- integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=
+babel-plugin-transform-define@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-define/-/babel-plugin-transform-define-2.0.0.tgz#79c3536635f899aabaf830b194b25519465675a4"
+ integrity sha512-0dv5RNRUlUKxGYIIErl01lpvi8b7W2R04Qcl1mCj70ahwZcgiklfXnFlh4FGnRh6aayCfSZKdhiMryVzcq5Dmg==
+ dependencies:
+ lodash "^4.17.11"
+ traverse "0.6.6"
babel-plugin-transform-inline-consecutive-adds@^0.4.3:
version "0.4.3"
@@ -5161,14 +3759,6 @@ babel-plugin-transform-minify-booleans@^6.9.4:
resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz#acbb3e56a3555dd23928e4b582d285162dd2b198"
integrity sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg=
-babel-plugin-transform-object-rest-spread@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
- integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=
- dependencies:
- babel-plugin-syntax-object-rest-spread "^6.8.0"
- babel-runtime "^6.26.0"
-
babel-plugin-transform-property-literals@^6.9.4:
version "6.9.4"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz#98c1d21e255736573f93ece54459f6ce24985d39"
@@ -5213,13 +3803,14 @@ babel-plugin-transform-undefined-to-void@^6.9.4:
resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz#be241ca81404030678b748717322b89d0c8fe280"
integrity sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=
-babel-preset-jest@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc"
- integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==
+babel-polyfill@6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+ integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=
dependencies:
- "@babel/plugin-syntax-object-rest-spread" "^7.0.0"
- babel-plugin-jest-hoist "^24.9.0"
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ regenerator-runtime "^0.10.5"
"babel-preset-minify@^0.5.0 || 0.6.0-alpha.5":
version "0.5.1"
@@ -5271,7 +3862,7 @@ babel-preset-react-app@^9.1.2:
babel-plugin-macros "2.8.0"
babel-plugin-transform-react-remove-prop-types "0.4.24"
-babel-runtime@^6.26.0:
+babel-runtime@^6.23.0, babel-runtime@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
@@ -5279,11 +3870,6 @@ babel-runtime@^6.26.0:
core-js "^2.4.0"
regenerator-runtime "^0.11.0"
-babylon@^6.18.0:
- version "6.18.0"
- resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
- integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
-
backo2@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
@@ -5343,11 +3929,6 @@ batch-processor@1.0.0:
resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8"
integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=
-batch@0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
- integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
-
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
@@ -5360,10 +3941,15 @@ bech32@1.1.3, bech32@^1.1.2:
resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.3.tgz#bd47a8986bbb3eec34a56a097a84b8d3e9a2dfcd"
integrity sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg==
-before-after-hook@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635"
- integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==
+bfj@^6.1.1:
+ version "6.1.2"
+ resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f"
+ integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==
+ dependencies:
+ bluebird "^3.5.5"
+ check-types "^8.0.3"
+ hoopy "^0.1.4"
+ tryer "^1.0.1"
big.js@^5.2.2:
version "5.2.2"
@@ -5443,23 +4029,7 @@ bitcoinjs-lib@5.1.7:
varuint-bitcoin "^1.0.4"
wif "^2.0.1"
-bl@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.2.tgz#52b71e9088515d0606d9dd9cc7aa48dc1f98e73a"
- integrity sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==
- dependencies:
- buffer "^5.5.0"
- inherits "^2.0.4"
- readable-stream "^3.4.0"
-
-block-stream@*:
- version "0.0.9"
- resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
- integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=
- dependencies:
- inherits "~2.0.0"
-
-bluebird@^3.3.5, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
+bluebird@^3.3.5, bluebird@^3.5.5:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
@@ -5474,7 +4044,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.8, bn.js@^4.4.0:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
-body-parser@1.19.0, body-parser@^1.18.3:
+body-parser@1.19.0:
version "1.19.0"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
@@ -5514,35 +4084,17 @@ bolt09@0.0.2:
resolved "https://registry.yarnpkg.com/bolt09/-/bolt09-0.0.2.tgz#1820c0737731d5301233fd8b39ef6b5033ea8063"
integrity sha512-dBbcpDbSZPlOzityAKnEz3nFIwFHFYvqcKqqQOPbdszecR7JxIvTKqNt44MKyI253ZGvbHzt7GZYhL+Vq4/mLg==
-bonjour@^3.5.0:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
- integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU=
- dependencies:
- array-flatten "^2.1.0"
- deep-equal "^1.0.1"
- dns-equal "^1.0.0"
- dns-txt "^2.0.2"
- multicast-dns "^6.0.1"
- multicast-dns-service-types "^1.1.0"
-
boolbase@^1.0.0, boolbase@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
-boxen@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
- integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==
+boom@7.x.x:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/boom/-/boom-7.3.0.tgz#733a6d956d33b0b1999da3fe6c12996950d017b9"
+ integrity sha512-Swpoyi2t5+GhOEGw8rEsKvTxFLIDiiKoUc2gsoV6Lyr43LHBIzch3k2MvYUs8RTROrIkVJ3Al0TkaOGjnb+B6A==
dependencies:
- ansi-align "^2.0.0"
- camelcase "^4.0.0"
- chalk "^2.0.1"
- cli-boxes "^1.0.0"
- string-width "^2.0.0"
- term-size "^1.2.0"
- widest-line "^2.0.0"
+ hoek "6.x.x"
boxen@^4.1.0:
version "4.2.0"
@@ -5594,18 +4146,6 @@ brorand@^1.0.1:
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
-browser-process-hrtime@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
- integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
-
-browser-resolve@^1.11.3:
- version "1.11.3"
- resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
- integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==
- dependencies:
- resolve "1.1.7"
-
browserify-aes@^1.0.0, browserify-aes@^1.0.4:
version "1.2.0"
resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
@@ -5665,16 +4205,6 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
-browserslist@4.10.0:
- version "4.10.0"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9"
- integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==
- dependencies:
- caniuse-lite "^1.0.30001035"
- electron-to-chromium "^1.3.378"
- node-releases "^1.1.52"
- pkg-up "^3.1.0"
-
browserslist@4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17"
@@ -5684,7 +4214,16 @@ browserslist@4.7.0:
electron-to-chromium "^1.3.247"
node-releases "^1.1.29"
-browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.9.1:
+browserslist@4.8.3:
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44"
+ integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==
+ dependencies:
+ caniuse-lite "^1.0.30001017"
+ electron-to-chromium "^1.3.322"
+ node-releases "^1.1.44"
+
+browserslist@^4.11.1, browserslist@^4.6.0, browserslist@^4.8.3, browserslist@^4.8.5, browserslist@^4.9.1:
version "4.11.1"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.1.tgz#92f855ee88d6e050e7e7311d987992014f1a1f1b"
integrity sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==
@@ -5710,18 +4249,6 @@ bs58check@<3.0.0, bs58check@^2.0.0, bs58check@^2.1.1:
create-hash "^1.1.0"
safe-buffer "^5.1.2"
-bser@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
- integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
- dependencies:
- node-int64 "^0.4.0"
-
-btoa-lite@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337"
- integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc=
-
buffer-alloc-unsafe@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
@@ -5745,11 +4272,6 @@ buffer-from@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
-buffer-indexof@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
- integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==
-
buffer-xor@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
@@ -5764,24 +4286,16 @@ buffer@^4.3.0:
ieee754 "^1.1.4"
isarray "^1.0.0"
-buffer@^5.5.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.5.0.tgz#9c3caa3d623c33dd1c7ef584b89b88bf9c9bc1ce"
- integrity sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==
- dependencies:
- base64-js "^1.0.2"
- ieee754 "^1.1.4"
+builtin-modules@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+ integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
-builtins@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
- integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
-
busboy@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b"
@@ -5789,16 +4303,6 @@ busboy@^0.3.1:
dependencies:
dicer "0.3.0"
-byline@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
- integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=
-
-byte-size@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191"
- integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==
-
bytebuffer@~5:
version "5.0.1"
resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd"
@@ -5816,7 +4320,7 @@ bytes@3.1.0:
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
-cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3:
+cacache@^12.0.2:
version "12.0.4"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
@@ -5945,12 +4449,7 @@ camelcase@^2.0.0, camelcase@^2.0.1:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
-camelcase@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
- integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
-
-camelcase@^4.0.0, camelcase@^4.1.0:
+camelcase@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
@@ -5965,39 +4464,17 @@ can-use-dom@^0.1.0:
resolved "https://registry.yarnpkg.com/can-use-dom/-/can-use-dom-0.1.0.tgz#22cc4a34a0abc43950f42c6411024a3f6366b45a"
integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo=
-caniuse-api@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
- integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
- dependencies:
- browserslist "^4.0.0"
- caniuse-lite "^1.0.0"
- lodash.memoize "^4.1.2"
- lodash.uniq "^4.5.0"
+caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001017, caniuse-lite@^1.0.30001038, caniuse-lite@^1.0.30001039:
+ version "1.0.30001040"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001040.tgz#103fc8e6eb1d7397e95134cd0e996743353d58ea"
+ integrity sha512-Ep0tEPeI5wCvmJNrXjE3etgfI+lkl1fTDU6Y3ZH1mhrjkPlVI9W4pcKbMo+BQLpEWKVYYp2EmYaRsqpPC3k7lQ==
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036, caniuse-lite@^1.0.30001038:
- version "1.0.30001039"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz#b3814a1c38ffeb23567f8323500c09526a577bbe"
- integrity sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q==
-
-capture-exit@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
- integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==
- dependencies:
- rsvp "^4.8.4"
-
-capture-stack-trace@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
- integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==
-
-case-sensitive-paths-webpack-plugin@2.3.0, case-sensitive-paths-webpack-plugin@^2.2.0:
+case-sensitive-paths-webpack-plugin@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7"
integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==
-caseless@0.12.0, caseless@~0.12.0:
+caseless@0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
@@ -6010,7 +4487,7 @@ cbor@5.0.1:
bignumber.js "^9.0.0"
nofilter "^1.0.3"
-chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2:
+chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -6019,7 +4496,7 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
-chalk@^1.1.1, chalk@^1.1.3:
+chalk@^1.0.0, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
@@ -6038,6 +4515,14 @@ chalk@^3.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+chalk@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72"
+ integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
character-entities-legacy@^1.0.0:
version "1.1.4"
resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
@@ -6058,6 +4543,11 @@ chardet@^0.7.0:
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+check-types@^8.0.3:
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
+ integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
+
chokidar@^2.0.4, chokidar@^2.1.8:
version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
@@ -6104,11 +4594,6 @@ chrome-trace-event@^1.0.2:
dependencies:
tslib "^1.9.0"
-ci-info@^1.5.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
- integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
-
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
@@ -6122,6 +4607,13 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
inherits "^2.0.1"
safe-buffer "^5.0.1"
+clap@^1.0.9:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
+ integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==
+ dependencies:
+ chalk "^1.1.3"
+
class-utils@^0.3.5:
version "0.3.6"
resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
@@ -6149,25 +4641,12 @@ clean-stack@^2.0.0:
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
-clean-webpack-plugin@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz#a99d8ec34c1c628a4541567aa7b457446460c62b"
- integrity sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==
- dependencies:
- "@types/webpack" "^4.4.31"
- del "^4.1.1"
-
-cli-boxes@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
- integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=
-
cli-boxes@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d"
integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==
-cli-cursor@^2.1.0:
+cli-cursor@^2.0.0, cli-cursor@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
@@ -6181,11 +4660,6 @@ cli-cursor@^3.1.0:
dependencies:
restore-cursor "^3.1.0"
-cli-spinner@0.2.10:
- version "0.2.10"
- resolved "https://registry.yarnpkg.com/cli-spinner/-/cli-spinner-0.2.10.tgz#f7d617a36f5c47a7bc6353c697fc9338ff782a47"
- integrity sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==
-
cli-table3@0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202"
@@ -6196,6 +4670,14 @@ cli-table3@0.5.1:
optionalDependencies:
colors "^1.1.2"
+cli-truncate@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
+ integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=
+ dependencies:
+ slice-ansi "0.0.4"
+ string-width "^1.0.1"
+
cli-width@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
@@ -6210,7 +4692,7 @@ clipboard@^2.0.0:
select "^1.1.2"
tiny-emitter "^2.0.0"
-cliui@^3.0.3, cliui@^3.2.0:
+cliui@^3.0.3:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
@@ -6219,23 +4701,14 @@ cliui@^3.0.3, cliui@^3.2.0:
strip-ansi "^3.0.1"
wrap-ansi "^2.0.0"
-cliui@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
- integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
+cliui@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+ integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
dependencies:
- string-width "^2.1.1"
- strip-ansi "^4.0.0"
- wrap-ansi "^2.0.0"
-
-cliui@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
- integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
- dependencies:
- string-width "^3.1.0"
- strip-ansi "^5.2.0"
- wrap-ansi "^5.1.0"
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^6.2.0"
clone-deep@^0.2.4:
version "0.2.4"
@@ -6257,16 +4730,6 @@ clone-deep@^4.0.1:
kind-of "^6.0.2"
shallow-clone "^3.0.0"
-clone@^1.0.2:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
- integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
-
-co@^4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
- integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
-
coa@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
@@ -6276,6 +4739,13 @@ coa@^2.0.2:
chalk "^2.4.1"
q "^1.1.2"
+coa@~1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd"
+ integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=
+ dependencies:
+ q "^1.1.2"
+
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
@@ -6329,14 +4799,6 @@ color@3.0.x:
color-convert "^1.9.1"
color-string "^1.5.2"
-color@^3.0.0:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
- integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==
- dependencies:
- color-convert "^1.9.1"
- color-string "^1.5.2"
-
colornames@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96"
@@ -6347,6 +4809,11 @@ colors@^1.1.2, colors@^1.2.1:
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
+colors@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+ integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM=
+
colorspace@1.1.x:
version "1.1.2"
resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.2.tgz#e0128950d082b86a2168580796a0aa5d6c68d8c5"
@@ -6360,15 +4827,7 @@ colour@~0.7.1:
resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778"
integrity sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=
-columnify@^1.5.4:
- version "1.5.4"
- resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb"
- integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=
- dependencies:
- strip-ansi "^3.0.0"
- wcwidth "^1.0.0"
-
-combined-stream@1.0.8, combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+combined-stream@1.0.8, combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@@ -6380,7 +4839,7 @@ comma-separated-tokens@^1.0.0:
resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea"
integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==
-commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3:
+commander@^2.12.1, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -6390,11 +4849,6 @@ commander@^4.0.1, commander@^4.1.1:
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
-common-tags@^1.8.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
- integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==
-
commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -6408,7 +4862,7 @@ compare-func@^1.3.1:
array-ify "^1.0.0"
dot-prop "^3.0.0"
-compare-versions@^3.5.1:
+compare-versions@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62"
integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==
@@ -6432,7 +4886,7 @@ compressible@~2.0.16:
dependencies:
mime-db ">= 1.43.0 < 2"
-compression@1.7.4, compression@^1.7.4:
+compression@1.7.4:
version "1.7.4"
resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
@@ -6470,24 +4924,6 @@ concat-stream@^2.0.0:
readable-stream "^3.0.2"
typedarray "^0.0.6"
-config-chain@^1.1.11:
- version "1.1.12"
- resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
- integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
- dependencies:
- ini "^1.3.4"
- proto-list "~1.2.1"
-
-confusing-browser-globals@^1.0.9:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd"
- integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==
-
-connect-history-api-fallback@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
- integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
-
console-browserify@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
@@ -6503,11 +4939,6 @@ constants-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
-contains-path@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
- integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
-
content-disposition@0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
@@ -6515,12 +4946,20 @@ content-disposition@0.5.3:
dependencies:
safe-buffer "5.1.2"
-content-type@~1.0.4:
+content-type@1.0.4, content-type@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
-conventional-changelog-angular@^5.0.3:
+conventional-changelog-angular@^1.3.3:
+ version "1.6.6"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f"
+ integrity sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==
+ dependencies:
+ compare-func "^1.3.1"
+ q "^1.5.1"
+
+conventional-changelog-angular@^5.0.6:
version "5.0.6"
resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz#269540c624553aded809c29a3508fdc2b544c059"
integrity sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA==
@@ -6528,31 +4967,105 @@ conventional-changelog-angular@^5.0.3:
compare-func "^1.3.1"
q "^1.5.1"
-conventional-changelog-core@^3.1.6:
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz#b31410856f431c847086a7dcb4d2ca184a7d88fb"
- integrity sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==
+conventional-changelog-atom@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz#3bd14280aa09fe3ec49a0e8fe97b5002db02aad4"
+ integrity sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg==
dependencies:
- conventional-changelog-writer "^4.0.6"
- conventional-commits-parser "^3.0.3"
+ q "^1.5.1"
+
+conventional-changelog-codemirror@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz#ebc088154684f8f5171446b8d546ba6b460d46f2"
+ integrity sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q==
+ dependencies:
+ q "^1.5.1"
+
+conventional-changelog-config-spec@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz#874a635287ef8b581fd8558532bf655d4fb59f2d"
+ integrity sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==
+
+conventional-changelog-conventionalcommits@4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.1.tgz#d6cb2e2c5d7bfca044a08b9dba84b4082e1a1bd9"
+ integrity sha512-vC02KucnkNNap+foDKFm7BVUSDAXktXrUJqGszUuYnt6T0J2azsbYz/w9TDc3VsrW2v6JOtiQWVcgZnporHr4Q==
+ dependencies:
+ compare-func "^1.3.1"
+ lodash "^4.2.1"
+ q "^1.5.1"
+
+conventional-changelog-conventionalcommits@4.2.3, conventional-changelog-conventionalcommits@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz#22855b32d57d0328951c1c2dc01b172a5f24ea37"
+ integrity sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww==
+ dependencies:
+ compare-func "^1.3.1"
+ lodash "^4.17.15"
+ q "^1.5.1"
+
+conventional-changelog-core@^4.1.1:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.1.4.tgz#39be27fca6ef20a0f998d7a3a1e97cfa8a055cb6"
+ integrity sha512-LO58ZbEpp1Ul+y/vOI8rJRsWkovsYkCFbOCVgi6UnVfU8WC0F8K8VQQwaBZWWUpb6JvEiN4GBR5baRP2txZ+Vg==
+ dependencies:
+ add-stream "^1.0.0"
+ conventional-changelog-writer "^4.0.11"
+ conventional-commits-parser "^3.0.8"
dateformat "^3.0.0"
get-pkg-repo "^1.0.0"
git-raw-commits "2.0.0"
git-remote-origin-url "^2.0.0"
- git-semver-tags "^2.0.3"
- lodash "^4.2.1"
+ git-semver-tags "^3.0.1"
+ lodash "^4.17.15"
normalize-package-data "^2.3.5"
q "^1.5.1"
read-pkg "^3.0.0"
read-pkg-up "^3.0.0"
through2 "^3.0.0"
-conventional-changelog-preset-loader@^2.1.1:
+conventional-changelog-ember@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz#c29b78e4af7825cbecb6c3fd6086ca5c09471ac1"
+ integrity sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA==
+ dependencies:
+ q "^1.5.1"
+
+conventional-changelog-eslint@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz#8f4736a23e0cd97e890e76fccc287db2f205f2ff"
+ integrity sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg==
+ dependencies:
+ q "^1.5.1"
+
+conventional-changelog-express@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz#fea2231d99a5381b4e6badb0c1c40a41fcacb755"
+ integrity sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==
+ dependencies:
+ q "^1.5.1"
+
+conventional-changelog-jquery@^3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz#460236ad8fb1d29ff932a14fe4e3a45379b63c5e"
+ integrity sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA==
+ dependencies:
+ q "^1.5.1"
+
+conventional-changelog-jshint@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz#ef6e2caf2ee6ffdfda78fcdf7ce87cf6c512d728"
+ integrity sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw==
+ dependencies:
+ compare-func "^1.3.1"
+ q "^1.5.1"
+
+conventional-changelog-preset-loader@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz#580fa8ab02cef22c24294d25e52d7ccd247a9a6a"
integrity sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ==
-conventional-changelog-writer@^4.0.6:
+conventional-changelog-writer@^4.0.11:
version "4.0.11"
resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz#9f56d2122d20c96eb48baae0bf1deffaed1edba4"
integrity sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw==
@@ -6568,6 +5081,23 @@ conventional-changelog-writer@^4.0.6:
split "^1.0.0"
through2 "^3.0.0"
+conventional-changelog@3.1.15:
+ version "3.1.15"
+ resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-3.1.15.tgz#103d0b550436cf83e8a59ba88be82ece2613cd9f"
+ integrity sha512-CoWM+Z9bYyF00QzNpTnxkCLiuLAeRocJz3C/foFjvhsdltdtkJgMChp7GytQNjm4pT7JFBVJTpqLHTpxNtOzaA==
+ dependencies:
+ conventional-changelog-angular "^5.0.6"
+ conventional-changelog-atom "^2.0.3"
+ conventional-changelog-codemirror "^2.0.3"
+ conventional-changelog-conventionalcommits "^4.2.3"
+ conventional-changelog-core "^4.1.1"
+ conventional-changelog-ember "^2.0.4"
+ conventional-changelog-eslint "^3.0.4"
+ conventional-changelog-express "^2.0.1"
+ conventional-changelog-jquery "^3.0.6"
+ conventional-changelog-jshint "^2.0.3"
+ conventional-changelog-preset-loader "^2.3.0"
+
conventional-commits-filter@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz#f122f89fbcd5bb81e2af2fcac0254d062d1039c1"
@@ -6576,7 +5106,7 @@ conventional-commits-filter@^2.0.2:
lodash.ismatch "^4.4.0"
modify-values "^1.0.0"
-conventional-commits-parser@^3.0.3:
+conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.0.8:
version "3.0.8"
resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz#23310a9bda6c93c874224375e72b09fb275fe710"
integrity sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ==
@@ -6589,21 +5119,21 @@ conventional-commits-parser@^3.0.3:
through2 "^3.0.0"
trim-off-newlines "^1.0.0"
-conventional-recommended-bump@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz#5af63903947b6e089e77767601cb592cabb106ba"
- integrity sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ==
+conventional-recommended-bump@6.0.5:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.0.5.tgz#be7ec24b43bef57108042ea1d49758b58beabc03"
+ integrity sha512-srkferrB4kACPEbKYltZwX1CQZAEqbQkabKN444mavLRVMetzwJFJf23/+pwvtMsWbd+cc4HaleV1nHke0f8Rw==
dependencies:
concat-stream "^2.0.0"
- conventional-changelog-preset-loader "^2.1.1"
+ conventional-changelog-preset-loader "^2.3.0"
conventional-commits-filter "^2.0.2"
- conventional-commits-parser "^3.0.3"
+ conventional-commits-parser "^3.0.8"
git-raw-commits "2.0.0"
- git-semver-tags "^2.0.3"
- meow "^4.0.0"
+ git-semver-tags "^3.0.1"
+ meow "^5.0.0"
q "^1.5.1"
-convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.7.0:
+convert-source-map@1.7.0, convert-source-map@^1.5.0, convert-source-map@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
@@ -6649,7 +5179,7 @@ copy-to-clipboard@^3, copy-to-clipboard@^3.0.8:
dependencies:
toggle-selection "^1.0.6"
-core-js-compat@^3.6.2:
+core-js-compat@^3.1.1:
version "3.6.4"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17"
integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==
@@ -6657,25 +5187,28 @@ core-js-compat@^3.6.2:
browserslist "^4.8.3"
semver "7.0.0"
-core-js-pure@^3.0.0, core-js-pure@^3.0.1:
- version "3.6.4"
- resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a"
- integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==
+core-js-compat@^3.6.2:
+ version "3.6.5"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c"
+ integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==
+ dependencies:
+ browserslist "^4.8.5"
+ semver "7.0.0"
-core-js@^1.0.0:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
- integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
+core-js-pure@^3.0.1:
+ version "3.6.5"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813"
+ integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==
-core-js@^2.4.0:
+core-js@^2.4.0, core-js@^2.5.0:
version "2.6.11"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==
-core-js@^3.0.1, core-js@^3.0.4, core-js@^3.2.0, core-js@^3.5.0:
- version "3.6.4"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647"
- integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==
+core-js@^3.0.1, core-js@^3.0.4:
+ version "3.6.5"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a"
+ integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
@@ -6690,7 +5223,7 @@ corejs-upgrade-webpack-plugin@^2.2.0:
resolve-from "^5.0.0"
webpack "^4.38.0"
-cors@2.8.5, cors@^2.8.4:
+cors@2.8.5:
version "2.8.5"
resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
@@ -6698,7 +5231,7 @@ cors@2.8.5, cors@^2.8.4:
object-assign "^4"
vary "^1"
-cosmiconfig@^5.0.0, cosmiconfig@^5.1.0, cosmiconfig@^5.2.1:
+cosmiconfig@^5.0.0, cosmiconfig@^5.2.0, cosmiconfig@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
@@ -6727,13 +5260,6 @@ create-ecdh@^4.0.0:
bn.js "^4.1.0"
elliptic "^6.0.0"
-create-error-class@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
- integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=
- dependencies:
- capture-stack-trace "^1.0.0"
-
create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
@@ -6765,7 +5291,22 @@ create-react-context@0.3.0, create-react-context@^0.3.0:
gud "^1.0.0"
warning "^4.0.3"
-cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+cross-env@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.2.tgz#bd5ed31339a93a3418ac4f3ca9ca3403082ae5f9"
+ integrity sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==
+ dependencies:
+ cross-spawn "^7.0.1"
+
+cross-fetch@3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.4.tgz#7bef7020207e684a7638ef5f2f698e24d9eb283c"
+ integrity sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw==
+ dependencies:
+ node-fetch "2.6.0"
+ whatwg-fetch "3.0.0"
+
+cross-spawn@6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
@@ -6776,33 +5317,7 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
shebang-command "^1.2.0"
which "^1.2.9"
-cross-spawn@7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14"
- integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-cross-spawn@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
- integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI=
- dependencies:
- lru-cache "^4.0.1"
- which "^1.2.9"
-
-cross-spawn@^5.0.1:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
- integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
- dependencies:
- lru-cache "^4.0.1"
- shebang-command "^1.2.0"
- which "^1.2.9"
-
-cross-spawn@^7.0.0:
+cross-spawn@^7.0.0, cross-spawn@^7.0.1:
version "7.0.2"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6"
integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==
@@ -6833,48 +5348,15 @@ crypto-js@^4.0.0:
resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.0.0.tgz#2904ab2677a9d042856a2ea2ef80de92e4a36dcc"
integrity sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==
-crypto-random-string@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
- integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
-
-css-blank-pseudo@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5"
- integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==
- dependencies:
- postcss "^7.0.5"
-
css-color-keywords@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=
-css-color-names@0.0.4, css-color-names@^0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
- integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
-
-css-declaration-sorter@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
- integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
- dependencies:
- postcss "^7.0.1"
- timsort "^0.3.0"
-
-css-has-pseudo@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee"
- integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==
- dependencies:
- postcss "^7.0.6"
- postcss-selector-parser "^5.0.0-rc.4"
-
-css-loader@3.4.2, css-loader@^3.0.0:
- version "3.4.2"
- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202"
- integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==
+css-loader@3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.3.0.tgz#65f889807baec3197313965d6cda9899f936734d"
+ integrity sha512-x9Y1vvHe5RR+4tzwFdWExPueK00uqFTCw7mZy+9aE/X1SKWOArm5luaOrtJ4d05IpOwJ6S86b/tVcIdhw1Bu4A==
dependencies:
camelcase "^5.3.1"
cssesc "^3.0.0"
@@ -6889,12 +5371,24 @@ css-loader@3.4.2, css-loader@^3.0.0:
postcss-value-parser "^4.0.2"
schema-utils "^2.6.0"
-css-prefers-color-scheme@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4"
- integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==
+css-loader@^3.0.0:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.2.tgz#6483ae56f48a7f901fbe07dde2fc96b01eafab3c"
+ integrity sha512-hDL0DPopg6zQQSRlZm0hyeaqIRnL0wbWjay9BZxoiJBpbfOW4WHfbaYQhwnDmEa0kZUc1CJ3IFo15ot1yULMIQ==
dependencies:
- postcss "^7.0.5"
+ camelcase "^5.3.1"
+ cssesc "^3.0.0"
+ icss-utils "^4.1.1"
+ loader-utils "^1.2.3"
+ normalize-path "^3.0.0"
+ postcss "^7.0.27"
+ postcss-modules-extract-imports "^2.0.0"
+ postcss-modules-local-by-default "^3.0.2"
+ postcss-modules-scope "^2.2.0"
+ postcss-modules-values "^3.0.0"
+ postcss-value-parser "^4.0.3"
+ schema-utils "^2.6.5"
+ semver "^6.3.0"
css-select-base-adapter@^0.1.1:
version "0.1.1"
@@ -6956,7 +5450,7 @@ css-what@^3.2.1:
resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1"
integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==
-css@^2.0.0:
+css@2.2.4, css@^2.0.0:
version "2.2.4"
resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
@@ -6966,89 +5460,11 @@ css@^2.0.0:
source-map-resolve "^0.5.2"
urix "^0.1.0"
-cssdb@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0"
- integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==
-
-cssesc@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703"
- integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==
-
cssesc@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
-cssnano-preset-default@^4.0.7:
- version "4.0.7"
- resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76"
- integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==
- dependencies:
- css-declaration-sorter "^4.0.1"
- cssnano-util-raw-cache "^4.0.1"
- postcss "^7.0.0"
- postcss-calc "^7.0.1"
- postcss-colormin "^4.0.3"
- postcss-convert-values "^4.0.1"
- postcss-discard-comments "^4.0.2"
- postcss-discard-duplicates "^4.0.2"
- postcss-discard-empty "^4.0.1"
- postcss-discard-overridden "^4.0.1"
- postcss-merge-longhand "^4.0.11"
- postcss-merge-rules "^4.0.3"
- postcss-minify-font-values "^4.0.2"
- postcss-minify-gradients "^4.0.2"
- postcss-minify-params "^4.0.2"
- postcss-minify-selectors "^4.0.2"
- postcss-normalize-charset "^4.0.1"
- postcss-normalize-display-values "^4.0.2"
- postcss-normalize-positions "^4.0.2"
- postcss-normalize-repeat-style "^4.0.2"
- postcss-normalize-string "^4.0.2"
- postcss-normalize-timing-functions "^4.0.2"
- postcss-normalize-unicode "^4.0.1"
- postcss-normalize-url "^4.0.1"
- postcss-normalize-whitespace "^4.0.2"
- postcss-ordered-values "^4.1.2"
- postcss-reduce-initial "^4.0.3"
- postcss-reduce-transforms "^4.0.2"
- postcss-svgo "^4.0.2"
- postcss-unique-selectors "^4.0.1"
-
-cssnano-util-get-arguments@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
- integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=
-
-cssnano-util-get-match@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
- integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=
-
-cssnano-util-raw-cache@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
- integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
- dependencies:
- postcss "^7.0.0"
-
-cssnano-util-same-parent@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
- integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
-
-cssnano@^4.1.10:
- version "4.1.10"
- resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2"
- integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==
- dependencies:
- cosmiconfig "^5.0.0"
- cssnano-preset-default "^4.0.7"
- is-resolvable "^1.0.0"
- postcss "^7.0.0"
-
csso@^4.0.2:
version "4.0.3"
resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903"
@@ -7056,17 +5472,13 @@ csso@^4.0.2:
dependencies:
css-tree "1.0.0-alpha.39"
-cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4:
- version "0.3.8"
- resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
- integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
-
-cssstyle@^1.0.0, cssstyle@^1.1.1:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1"
- integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==
+csso@~2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+ integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=
dependencies:
- cssom "0.3.x"
+ clap "^1.0.9"
+ source-map "^0.5.3"
csstype@^2.2.0, csstype@^2.5.7, csstype@^2.6.7:
version "2.6.10"
@@ -7172,11 +5584,6 @@ d@1, d@^1.0.1:
es5-ext "^0.10.50"
type "^1.0.1"
-damerau-levenshtein@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791"
- integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==
-
dargs@^4.0.1:
version "4.1.0"
resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17"
@@ -7191,62 +5598,41 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
-data-uri-to-buffer@1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835"
- integrity sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==
+date-fns@^1.27.2:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
+ integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
-data-urls@^1.0.0, data-urls@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
- integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==
- dependencies:
- abab "^2.0.0"
- whatwg-mimetype "^2.2.0"
- whatwg-url "^7.0.0"
-
-date-fns@^2.0.0-beta.5:
- version "2.0.0-beta.5"
- resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.0.0-beta.5.tgz#90885db3772802d55519cd12acd49de56aca1059"
- integrity sha512-GS5yi964NDFNoja9yOdWFj9T97T67yLrUeJZgddHaVfc/6tHWtX7RXocuubmZkNzrZUZ9BqBOW7jTR5OoWjJ1w==
+date-fns@^2.12.0:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.12.0.tgz#01754c8a2f3368fc1119cf4625c3dad8c1845ee6"
+ integrity sha512-qJgn99xxKnFgB1qL4jpxU7Q2t0LOn1p8KMIveef3UZD7kqjT3tpFNNdXJelEHhE+rUgffriXriw/sOSU+cS1Hw==
dateformat@^3.0.0:
version "3.0.3"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
-debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9:
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
-debug@3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
- integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
- dependencies:
- ms "2.0.0"
-
-debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
- integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
- dependencies:
- ms "^2.1.1"
-
-debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6:
+debug@^3.0.0, debug@^3.2.5, debug@^3.2.6:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
dependencies:
ms "^2.1.1"
-debuglog@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
- integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
+debug@^4.1.0, debug@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+ dependencies:
+ ms "^2.1.1"
decamelize-keys@^1.0.0:
version "1.1.0"
@@ -7271,7 +5657,7 @@ dedent@^0.7.0:
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
-deep-equal@^1.0.1, deep-equal@^1.1.1:
+deep-equal@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
@@ -7288,31 +5674,11 @@ deep-extend@^0.6.0:
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
-deep-is@~0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
- integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
-
deep-object-diff@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a"
integrity sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==
-default-gateway@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
- integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==
- dependencies:
- execa "^1.0.0"
- ip-regex "^2.1.0"
-
-defaults@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
- integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
- dependencies:
- clone "^1.0.2"
-
define-properties@^1.1.2, define-properties@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@@ -7342,28 +5708,6 @@ define-property@^2.0.2:
is-descriptor "^1.0.2"
isobject "^3.0.1"
-degenerator@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095"
- integrity sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=
- dependencies:
- ast-types "0.x.x"
- escodegen "1.x.x"
- esprima "3.x.x"
-
-del@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4"
- integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==
- dependencies:
- "@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"
-
delaunator@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-4.0.1.tgz#3d779687f57919a7a418f8ab947d3bddb6846957"
@@ -7391,6 +5735,11 @@ delegates@^1.0.0:
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+depd@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+ integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=
+
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
@@ -7406,11 +5755,6 @@ deprecated-decorator@^0.1.6:
resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37"
integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=
-deprecation@^2.0.0, deprecation@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
- integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
-
des.js@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
@@ -7424,25 +5768,20 @@ destroy@~1.0.4:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
-detect-file@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
- integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
-
-detect-indent@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
- integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
+detect-indent@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd"
+ integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==
detect-libc@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
-detect-newline@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
- integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
+detect-newline@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
+ integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
detect-node@^2.0.4:
version "2.0.4"
@@ -7465,14 +5804,6 @@ detect-port@^1.3.0:
address "^1.0.1"
debug "^2.6.0"
-dezalgo@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
- integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=
- dependencies:
- asap "^2.0.0"
- wrappy "1"
-
diagnostics@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a"
@@ -7489,16 +5820,6 @@ dicer@0.3.0:
dependencies:
streamsearch "0.1.2"
-diff-sequences@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
- integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==
-
-diff-sequences@^25.1.0:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd"
- integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==
-
diff@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
@@ -7521,54 +5842,13 @@ dir-glob@2.0.0:
arrify "^1.0.1"
path-type "^3.0.0"
-dir-glob@^2.2.2:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
- integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
+doctrine@0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523"
+ integrity sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=
dependencies:
- path-type "^3.0.0"
-
-dns-equal@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
- integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
-
-dns-packet@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a"
- integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==
- dependencies:
- ip "^1.1.0"
- safe-buffer "^5.0.1"
-
-dns-txt@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
- integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=
- dependencies:
- buffer-indexof "^1.0.0"
-
-dockerfile-ast@0.0.19:
- version "0.0.19"
- resolved "https://registry.yarnpkg.com/dockerfile-ast/-/dockerfile-ast-0.0.19.tgz#b1e21138eba995d7bf5576dc30ba1130c15995c3"
- integrity sha512-iDRNFeAB2j4rh/Ecc2gh3fjciVifCMsszfCfHlYF5Wv8yybjZLiRDZUBt/pS3xrAz8uWT8fCHLq4pOQMmwCDwA==
- dependencies:
- vscode-languageserver-types "^3.5.0"
-
-doctrine@1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
- integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
- dependencies:
- esutils "^2.0.2"
- isarray "^1.0.0"
-
-doctrine@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
- integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
- dependencies:
- esutils "^2.0.2"
+ esutils "^1.1.6"
+ isarray "0.0.1"
doctrine@^3.0.0:
version "3.0.0"
@@ -7592,7 +5872,7 @@ dom-helpers@^5.0.1:
"@babel/runtime" "^7.8.7"
csstype "^2.6.7"
-dom-serializer@0:
+dom-serializer@0, dom-serializer@^0.2.1:
version "0.2.2"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
@@ -7620,12 +5900,12 @@ domelementtype@^2.0.1:
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
-domexception@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
- integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
+domhandler@3.0.0, domhandler@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9"
+ integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==
dependencies:
- webidl-conversions "^4.0.2"
+ domelementtype "^2.0.1"
domhandler@^2.3.0:
version "2.4.2"
@@ -7642,6 +5922,15 @@ domutils@1.5.1:
dom-serializer "0"
domelementtype "1"
+domutils@2.0.0, domutils@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.0.0.tgz#15b8278e37bfa8468d157478c58c367718133c08"
+ integrity sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg==
+ dependencies:
+ dom-serializer "^0.2.1"
+ domelementtype "^2.0.1"
+ domhandler "^3.0.0"
+
domutils@^1.5.1, domutils@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
@@ -7665,20 +5954,6 @@ dot-prop@^3.0.0:
dependencies:
is-obj "^1.0.0"
-dot-prop@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
- integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==
- dependencies:
- is-obj "^1.0.0"
-
-dot-prop@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
- integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==
- dependencies:
- is-obj "^2.0.0"
-
dotenv-defaults@^1.0.2:
version "1.1.1"
resolved "https://registry.yarnpkg.com/dotenv-defaults/-/dotenv-defaults-1.1.1.tgz#032c024f4b5906d9990eb06d722dc74cc60ec1bd"
@@ -7686,7 +5961,7 @@ dotenv-defaults@^1.0.2:
dependencies:
dotenv "^6.2.0"
-dotenv-expand@5.1.0, dotenv-expand@^5.1.0:
+dotenv-expand@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==
@@ -7708,21 +5983,13 @@ dotenv@^6.2.0:
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064"
integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==
-dotnet-deps-parser@4.9.0:
- version "4.9.0"
- resolved "https://registry.yarnpkg.com/dotnet-deps-parser/-/dotnet-deps-parser-4.9.0.tgz#d14f9f92ae9a64062cd215c8863d1e77e80236f0"
- integrity sha512-V0O+7pI7Ei+iL5Kgy6nYq1UTwzrpqci5K/zf8cXyP5RWBSQBUl/JOE9I67zLUkKiwOdfPhbMQgcRj/yGA+NL1A==
+dotgitignore@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/dotgitignore/-/dotgitignore-2.1.0.tgz#a4b15a4e4ef3cf383598aaf1dfa4a04bcc089b7b"
+ integrity sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==
dependencies:
- "@types/xml2js" "0.4.3"
- lodash "^4.17.11"
- source-map-support "^0.5.7"
- tslib "^1.10.0"
- xml2js "0.4.19"
-
-duplexer3@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
- integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+ find-up "^3.0.0"
+ minimatch "^3.0.4"
duplexer@^0.1.1:
version "0.1.1"
@@ -7752,15 +6019,25 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-ejs@^2.7.4:
+ejs@^2.6.1, ejs@^2.7.4:
version "2.7.4"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
-electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.390:
- version "1.3.397"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.397.tgz#db640c2e67b08d590a504c20b56904537aa2bafa"
- integrity sha512-zcUd1p/7yzTSdWkCTrqGvbnEOASy96d0RJL/lc5BDJoO23Z3G/VHd0yIPbguDU9n8QNUTCigLO7oEdtOb7fp2A==
+electron-to-chromium@^1.3.247:
+ version "1.3.403"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.403.tgz#c8bab4e2e72bf78bc28bad1cc355c061f9cc1918"
+ integrity sha512-JaoxV4RzdBAZOnsF4dAlZ2ijJW72MbqO5lNfOBHUWiBQl3Rwe+mk2RCUMrRI3rSClLJ8HSNQNqcry12H+0ZjFw==
+
+electron-to-chromium@^1.3.322, electron-to-chromium@^1.3.390:
+ version "1.3.402"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.402.tgz#9ad93c0c8ea2e571431739e0d76bd6bc9788a846"
+ integrity sha512-gaCDfX7IUH0s3JmBiHCDPrvVcdnTTP1r4WLJc2dHkYYbLmXZ2XHiJCcGQ9Balf91aKTvuCKCyu2JjJYRykoI1w==
+
+elegant-spinner@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
+ integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=
element-resize-detector@^1.2.1:
version "1.2.1"
@@ -7782,12 +6059,7 @@ elliptic@^6.0.0, elliptic@^6.4.0, elliptic@^6.5.2:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.0"
-email-validator@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed"
- integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==
-
-emoji-regex@^7.0.1, emoji-regex@^7.0.2:
+emoji-regex@^7.0.1:
version "7.0.3"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
@@ -7828,30 +6100,14 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
-encoding@^0.1.11:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
- integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=
- dependencies:
- iconv-lite "~0.4.13"
-
-end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
dependencies:
once "^1.4.0"
-enhanced-resolve@4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
- integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==
- dependencies:
- graceful-fs "^4.1.2"
- memory-fs "^0.4.0"
- tapable "^1.0.0"
-
-enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
+enhanced-resolve@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66"
integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==
@@ -7870,26 +6126,11 @@ entities@^2.0.0:
resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
-env-paths@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43"
- integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==
-
env-variable@0.0.x:
version "0.0.6"
resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.6.tgz#74ab20b3786c545b62b4a4813ab8cf22726c9808"
integrity sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==
-envinfo@^7.3.1:
- version "7.5.0"
- resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.5.0.tgz#91410bb6db262fb4f1409bd506e9ff57e91023f4"
- integrity sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ==
-
-err-code@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
- integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=
-
errno@^0.1.3, errno@~0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
@@ -7971,18 +6212,6 @@ es6-iterator@2.0.3, es6-iterator@~2.0.3:
es5-ext "^0.10.35"
es6-symbol "^3.1.1"
-es6-promise@^4.0.3:
- version "4.2.8"
- resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
- integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
-
-es6-promisify@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
- integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
- dependencies:
- es6-promise "^4.0.3"
-
es6-shim@^0.35.5:
version "0.35.5"
resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.5.tgz#46f59dc0a84a1c5029e8ff1166ca0a902077a9ab"
@@ -8006,120 +6235,6 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-escape-string-regexp@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
- integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
-
-escodegen@1.x.x, escodegen@^1.11.0, escodegen@^1.9.1:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457"
- integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==
- dependencies:
- esprima "^4.0.1"
- estraverse "^4.2.0"
- esutils "^2.0.2"
- optionator "^0.8.1"
- optionalDependencies:
- source-map "~0.6.1"
-
-eslint-config-react-app@^5.2.1:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df"
- integrity sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==
- dependencies:
- confusing-browser-globals "^1.0.9"
-
-eslint-import-resolver-node@^0.3.2:
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404"
- integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==
- dependencies:
- debug "^2.6.9"
- resolve "^1.13.1"
-
-eslint-loader@3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-3.0.3.tgz#e018e3d2722381d982b1201adb56819c73b480ca"
- integrity sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==
- dependencies:
- fs-extra "^8.1.0"
- loader-fs-cache "^1.0.2"
- loader-utils "^1.2.3"
- object-hash "^2.0.1"
- schema-utils "^2.6.1"
-
-eslint-module-utils@^2.4.1:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
- integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
- dependencies:
- debug "^2.6.9"
- pkg-dir "^2.0.0"
-
-eslint-plugin-flowtype@4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz#82b2bd6f21770e0e5deede0228e456cb35308451"
- integrity sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==
- dependencies:
- lodash "^4.17.15"
-
-eslint-plugin-import@2.20.1:
- version "2.20.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3"
- integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==
- dependencies:
- array-includes "^3.0.3"
- array.prototype.flat "^1.2.1"
- contains-path "^0.1.0"
- debug "^2.6.9"
- doctrine "1.5.0"
- eslint-import-resolver-node "^0.3.2"
- eslint-module-utils "^2.4.1"
- has "^1.0.3"
- minimatch "^3.0.4"
- object.values "^1.1.0"
- read-pkg-up "^2.0.0"
- resolve "^1.12.0"
-
-eslint-plugin-jsx-a11y@6.2.3:
- version "6.2.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa"
- integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==
- dependencies:
- "@babel/runtime" "^7.4.5"
- aria-query "^3.0.0"
- array-includes "^3.0.3"
- ast-types-flow "^0.0.7"
- axobject-query "^2.0.2"
- damerau-levenshtein "^1.0.4"
- emoji-regex "^7.0.2"
- has "^1.0.3"
- jsx-ast-utils "^2.2.1"
-
-eslint-plugin-react-hooks@^1.6.1:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04"
- integrity sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==
-
-eslint-plugin-react@7.19.0:
- version "7.19.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666"
- integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==
- dependencies:
- array-includes "^3.1.1"
- doctrine "^2.1.0"
- has "^1.0.3"
- jsx-ast-utils "^2.2.3"
- object.entries "^1.1.1"
- object.fromentries "^2.0.2"
- object.values "^1.1.1"
- prop-types "^15.7.2"
- resolve "^1.15.1"
- semver "^6.3.0"
- string.prototype.matchall "^4.0.2"
- xregexp "^4.3.0"
-
eslint-scope@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
@@ -8128,102 +6243,16 @@ eslint-scope@^4.0.3:
esrecurse "^4.1.0"
estraverse "^4.1.1"
-eslint-scope@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9"
- integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==
- dependencies:
- esrecurse "^4.1.0"
- estraverse "^4.1.1"
+esprima@^2.6.0:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+ integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=
-eslint-utils@^1.4.3:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
- integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
- dependencies:
- eslint-visitor-keys "^1.1.0"
-
-eslint-utils@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd"
- integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==
- dependencies:
- eslint-visitor-keys "^1.1.0"
-
-eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
- integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
-
-eslint@^6.6.0:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
- integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- ajv "^6.10.0"
- chalk "^2.1.0"
- cross-spawn "^6.0.5"
- debug "^4.0.1"
- doctrine "^3.0.0"
- eslint-scope "^5.0.0"
- eslint-utils "^1.4.3"
- eslint-visitor-keys "^1.1.0"
- espree "^6.1.2"
- esquery "^1.0.1"
- esutils "^2.0.2"
- file-entry-cache "^5.0.1"
- functional-red-black-tree "^1.0.1"
- glob-parent "^5.0.0"
- globals "^12.1.0"
- ignore "^4.0.6"
- import-fresh "^3.0.0"
- imurmurhash "^0.1.4"
- inquirer "^7.0.0"
- is-glob "^4.0.0"
- js-yaml "^3.13.1"
- json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.3.0"
- lodash "^4.17.14"
- minimatch "^3.0.4"
- mkdirp "^0.5.1"
- natural-compare "^1.4.0"
- optionator "^0.8.3"
- progress "^2.0.0"
- regexpp "^2.0.1"
- semver "^6.1.2"
- strip-ansi "^5.2.0"
- strip-json-comments "^3.0.1"
- table "^5.2.3"
- text-table "^0.2.0"
- v8-compile-cache "^2.0.3"
-
-espree@^6.1.2:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a"
- integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
- dependencies:
- acorn "^7.1.1"
- acorn-jsx "^5.2.0"
- eslint-visitor-keys "^1.1.0"
-
-esprima@3.x.x:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
- integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
-
-esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
+esprima@^4.0.0, esprima@~4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-esquery@^1.0.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe"
- integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==
- dependencies:
- estraverse "^5.0.0"
-
esrecurse@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
@@ -8231,15 +6260,15 @@ esrecurse@^4.1.0:
dependencies:
estraverse "^4.1.0"
-estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+estraverse@^4.1.0, estraverse@^4.1.1:
version "4.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-estraverse@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22"
- integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==
+esutils@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375"
+ integrity sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=
esutils@^2.0.2:
version "2.0.3"
@@ -8251,13 +6280,6 @@ etag@~1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
-event-loop-spinner@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/event-loop-spinner/-/event-loop-spinner-1.1.0.tgz#96de9c70e6e2b0b3e257b0901e25e792e3c9c8d0"
- integrity sha512-YVFs6dPpZIgH665kKckDktEVvSBccSYJmoZUfhNUdv5d3Xv+Q+SKF4Xis1jolq9aBzuW1ZZhQh/m/zU/TPdDhw==
- dependencies:
- tslib "^1.10.0"
-
eventemitter3@^3.1.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
@@ -8288,57 +6310,22 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
md5.js "^1.3.4"
safe-buffer "^5.1.1"
-exec-sh@^0.3.2:
- version "0.3.4"
- resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5"
- integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==
-
-execa@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
- integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
- dependencies:
- cross-spawn "^5.0.1"
- get-stream "^3.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"
-
-execa@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
- integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
- dependencies:
- 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"
-
-execa@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99"
- integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==
+execa@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89"
+ integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==
dependencies:
cross-spawn "^7.0.0"
get-stream "^5.0.0"
+ human-signals "^1.1.1"
is-stream "^2.0.0"
merge-stream "^2.0.0"
- npm-run-path "^3.0.0"
+ npm-run-path "^4.0.0"
onetime "^5.1.0"
p-finally "^2.0.0"
signal-exit "^3.0.2"
strip-final-newline "^2.0.0"
-exit@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
- integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
-
expand-brackets@^2.1.4:
version "2.1.4"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
@@ -8352,26 +6339,7 @@ expand-brackets@^2.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
-expand-tilde@^2.0.0, expand-tilde@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
- integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
- dependencies:
- homedir-polyfill "^1.0.1"
-
-expect@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca"
- integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==
- dependencies:
- "@jest/types" "^24.9.0"
- ansi-styles "^3.2.0"
- jest-get-type "^24.9.0"
- jest-matcher-utils "^24.9.0"
- jest-message-util "^24.9.0"
- jest-regex-util "^24.9.0"
-
-express@4.17.1, express@^4.0.0, express@^4.17.0, express@^4.17.1:
+express@4.17.1, express@^4.16.3, express@^4.17.0:
version "4.17.1"
resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
@@ -8429,7 +6397,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
assign-symbols "^1.0.0"
is-extendable "^1.0.1"
-extend@3.0.2, extend@~3.0.2:
+extend@3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
@@ -8477,7 +6445,7 @@ fast-deep-equal@^3.1.1:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
-fast-glob@^2.0.2, fast-glob@^2.2.6:
+fast-glob@^2.0.2:
version "2.2.7"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==
@@ -8494,11 +6462,6 @@ fast-json-stable-stringify@^2.0.0:
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-fast-levenshtein@~2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
- integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
-
fast-safe-stringify@^2.0.4:
version "2.0.7"
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
@@ -8511,13 +6474,6 @@ fault@^1.0.2:
dependencies:
format "^0.2.0"
-faye-websocket@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
- integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=
- dependencies:
- websocket-driver ">=0.5.1"
-
faye-websocket@~0.11.1:
version "0.11.3"
resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e"
@@ -8525,36 +6481,31 @@ faye-websocket@~0.11.1:
dependencies:
websocket-driver ">=0.5.1"
-fb-watchman@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
- integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
- dependencies:
- bser "2.1.1"
-
-fbjs@^0.8.4:
- version "0.8.17"
- resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
- integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=
- dependencies:
- core-js "^1.0.0"
- isomorphic-fetch "^2.1.1"
- loose-envify "^1.0.0"
- object-assign "^4.1.0"
- promise "^7.1.1"
- setimmediate "^1.0.5"
- ua-parser-js "^0.7.18"
-
fecha@^2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd"
integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==
-figgy-pudding@^3.4.1, figgy-pudding@^3.5.1:
+figgy-pudding@^3.5.1:
version "3.5.2"
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
+figures@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec"
+ integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+figures@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+ integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=
+ dependencies:
+ escape-string-regexp "^1.0.5"
+ object-assign "^4.1.0"
+
figures@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
@@ -8569,14 +6520,7 @@ figures@^3.0.0:
dependencies:
escape-string-regexp "^1.0.5"
-file-entry-cache@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
- integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
- dependencies:
- flat-cache "^2.0.1"
-
-file-loader@4.3.0, file-loader@^4.2.0:
+file-loader@^4.2.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af"
integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==
@@ -8593,21 +6537,16 @@ file-system-cache@^1.0.5:
fs-extra "^0.30.0"
ramda "^0.21.0"
-file-uri-to-path@1, file-uri-to-path@1.0.0:
+file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
-filesize@3.6.1:
+filesize@3.6.1, filesize@^3.6.1:
version "3.6.1"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
-filesize@6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f"
- integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==
-
fill-range@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
@@ -8638,15 +6577,6 @@ finalhandler@~1.1.2:
statuses "~1.5.0"
unpipe "~1.0.0"
-find-cache-dir@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
- integrity sha1-yN765XyKUqinhPnjHFfHQumToLk=
- dependencies:
- commondir "^1.0.1"
- mkdirp "^0.5.1"
- pkg-dir "^1.0.0"
-
find-cache-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
@@ -8707,35 +6637,6 @@ find-versions@^3.2.0:
dependencies:
semver-regex "^2.0.0"
-findup-sync@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
- integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
- dependencies:
- detect-file "^1.0.0"
- is-glob "^4.0.0"
- micromatch "^3.0.4"
- resolve-dir "^1.0.1"
-
-flat-cache@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
- integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
- dependencies:
- flatted "^2.0.0"
- rimraf "2.6.3"
- write "1.0.3"
-
-flatted@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
- integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
-
-flatten@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b"
- integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==
-
flush-write-stream@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
@@ -8754,13 +6655,6 @@ focus-lock@^0.6.6:
resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.6.tgz#98119a755a38cfdbeda0280eaa77e307eee850c7"
integrity sha512-Dx69IXGCq1qsUExWuG+5wkiMqVM/zGx/reXSJSLogECwp3x6KeNQZ+NAetgxEFpnC41rD8U3+jRCW68+LNzdtw==
-follow-redirects@^1.0.0:
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb"
- integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==
- dependencies:
- debug "^3.0.0"
-
for-in@^0.1.3:
version "0.1.8"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
@@ -8778,7 +6672,7 @@ for-own@^0.1.3:
dependencies:
for-in "^1.0.1"
-forever-agent@0.6.1, forever-agent@~0.6.1:
+forever-agent@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
@@ -8820,15 +6714,6 @@ form-data@3.0.0, form-data@^3.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
-form-data@~2.3.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
- integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.6"
- mime-types "^2.1.12"
-
format@^0.2.0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
@@ -8859,16 +6744,18 @@ from2@^2.1.0:
inherits "^2.0.1"
readable-stream "^2.0.0"
+fs-access@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a"
+ integrity sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=
+ dependencies:
+ null-check "^1.0.0"
+
fs-capacitor@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c"
integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==
-fs-constants@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
- integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
-
fs-extra@^0.30.0:
version "0.30.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
@@ -8880,25 +6767,7 @@ fs-extra@^0.30.0:
path-is-absolute "^1.0.0"
rimraf "^2.2.8"
-fs-extra@^4.0.2:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
- integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
- dependencies:
- graceful-fs "^4.1.2"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
-fs-extra@^7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
- integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
- dependencies:
- graceful-fs "^4.1.2"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
-fs-extra@^8.0.1, fs-extra@^8.1.0:
+fs-extra@^8.0.1:
version "8.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
@@ -8936,11 +6805,6 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-fsevents@2.1.2, fsevents@~2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
- integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==
-
fsevents@^1.2.7:
version "1.2.12"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c"
@@ -8949,23 +6813,10 @@ fsevents@^1.2.7:
bindings "^1.5.0"
nan "^2.12.1"
-fstream@^1.0.0, fstream@^1.0.12:
- version "1.0.12"
- resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
- integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==
- dependencies:
- graceful-fs "^4.1.2"
- inherits "~2.0.0"
- mkdirp ">=0.5 0"
- rimraf "2"
-
-ftp@~0.3.10:
- version "0.3.10"
- resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d"
- integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=
- dependencies:
- readable-stream "1.1.x"
- xregexp "2.0.0"
+fsevents@~2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
+ integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==
function-bind@^1.1.1:
version "1.1.1"
@@ -8981,11 +6832,6 @@ function.prototype.name@^1.1.0:
es-abstract "^1.17.0-next.1"
functions-have-names "^1.2.0"
-functional-red-black-tree@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
- integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
-
functions-have-names@^1.2.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.1.tgz#a981ac397fa0c9964551402cdc5533d7a4d52f91"
@@ -9010,29 +6856,12 @@ gauge@~2.7.3:
strip-ansi "^3.0.1"
wide-align "^1.1.0"
-gaze@^1.0.0:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
- integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
- dependencies:
- globule "^1.0.0"
-
-genfun@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537"
- integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==
-
gensync@^1.0.0-beta.1:
version "1.0.0-beta.1"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
-get-caller-file@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
- integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
-
-get-caller-file@^2.0.1:
+get-caller-file@^2.0.0, get-caller-file@^2.0.1:
version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
@@ -9053,28 +6882,16 @@ get-pkg-repo@^1.0.0:
parse-github-repo-url "^1.3.0"
through2 "^2.0.0"
-get-port@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119"
- integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==
+get-stdin@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6"
+ integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==
get-stdin@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
-get-stream@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
- integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
-
-get-stream@^4.0.0, get-stream@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
- integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
- dependencies:
- pump "^3.0.0"
-
get-stream@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
@@ -9082,18 +6899,6 @@ get-stream@^5.0.0:
dependencies:
pump "^3.0.0"
-get-uri@^2.0.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.4.tgz#d4937ab819e218d4cb5ae18e4f5962bef169cc6a"
- integrity sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==
- dependencies:
- data-uri-to-buffer "1"
- debug "2"
- extend "~3.0.2"
- file-uri-to-path "1"
- ftp "~0.3.10"
- readable-stream "2"
-
get-value@^2.0.3, get-value@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@@ -9117,6 +6922,17 @@ git-raw-commits@2.0.0:
split2 "^2.0.0"
through2 "^2.0.0"
+git-raw-commits@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.3.tgz#f040e67b8445962d4d168903a9e84c4240c17655"
+ integrity sha512-SoSsFL5lnixVzctGEi2uykjA7B5I0AhO9x6kdzvGRHbxsa6JSEgrgy1esRKsfOKE1cgyOJ/KDR2Trxu157sb8w==
+ dependencies:
+ dargs "^4.0.1"
+ lodash.template "^4.0.2"
+ meow "^5.0.0"
+ split2 "^2.0.0"
+ through2 "^3.0.0"
+
git-remote-origin-url@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f"
@@ -9125,29 +6941,14 @@ git-remote-origin-url@^2.0.0:
gitconfiglocal "^1.0.0"
pify "^2.3.0"
-git-semver-tags@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-2.0.3.tgz#48988a718acf593800f99622a952a77c405bfa34"
- integrity sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==
+git-semver-tags@3.0.1, git-semver-tags@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-3.0.1.tgz#9cb9e4974437de1f71f32da3bfe74f4d35afb1b9"
+ integrity sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA==
dependencies:
- meow "^4.0.0"
+ meow "^5.0.0"
semver "^6.0.0"
-git-up@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0"
- integrity sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==
- dependencies:
- is-ssh "^1.3.0"
- parse-url "^5.0.0"
-
-git-url-parse@11.1.2, git-url-parse@^11.1.2:
- version "11.1.2"
- resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.1.2.tgz#aff1a897c36cc93699270587bea3dbcbbb95de67"
- integrity sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==
- dependencies:
- git-up "^4.0.0"
-
gitconfiglocal@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b"
@@ -9178,7 +6979,7 @@ glob-parent@^3.1.0:
is-glob "^3.1.0"
path-dirname "^1.0.0"
-glob-parent@^5.0.0, glob-parent@~5.1.0:
+glob-parent@~5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
@@ -9190,7 +6991,12 @@ glob-to-regexp@^0.3.0:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
-glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1:
+glob-to-regexp@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
+ integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+
+glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@@ -9202,7 +7008,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, gl
once "^1.3.0"
path-is-absolute "^1.0.0"
-global-dirs@^0.1.0:
+global-dirs@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
@@ -9216,26 +7022,6 @@ global-modules@2.0.0:
dependencies:
global-prefix "^3.0.0"
-global-modules@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
- integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
- dependencies:
- global-prefix "^1.0.1"
- is-windows "^1.0.1"
- resolve-dir "^1.0.0"
-
-global-prefix@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
- integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
- dependencies:
- expand-tilde "^2.0.2"
- homedir-polyfill "^1.0.1"
- ini "^1.3.4"
- is-windows "^1.0.1"
- which "^1.2.14"
-
global-prefix@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
@@ -9258,13 +7044,6 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^12.1.0:
- version "12.4.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
- integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
- dependencies:
- type-fest "^0.8.1"
-
globalthis@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9"
@@ -9285,40 +7064,6 @@ globby@8.0.2:
pify "^3.0.0"
slash "^1.0.0"
-globby@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
- integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=
- dependencies:
- array-union "^1.0.1"
- glob "^7.0.3"
- object-assign "^4.0.1"
- pify "^2.0.0"
- pinkie-promise "^2.0.0"
-
-globby@^9.2.0:
- version "9.2.0"
- resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d"
- integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==
- dependencies:
- "@types/glob" "^7.1.1"
- array-union "^1.0.2"
- dir-glob "^2.2.2"
- fast-glob "^2.2.6"
- glob "^7.1.3"
- ignore "^4.0.3"
- pify "^4.0.1"
- slash "^2.0.0"
-
-globule@^1.0.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz#90a25338f22b7fbeb527cee63c629aea754d33b9"
- integrity sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==
- dependencies:
- glob "~7.1.1"
- lodash "~4.17.12"
- minimatch "~3.0.2"
-
good-listener@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50"
@@ -9326,50 +7071,19 @@ good-listener@^1.2.2:
dependencies:
delegate "^3.1.2"
-got@^6.7.1:
- version "6.7.1"
- resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
- integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=
- dependencies:
- create-error-class "^3.0.0"
- duplexer3 "^0.1.4"
- get-stream "^3.0.0"
- is-redirect "^1.0.0"
- is-retry-allowed "^1.0.0"
- is-stream "^1.0.0"
- lowercase-keys "^1.0.0"
- safe-buffer "^5.0.1"
- timed-out "^4.0.0"
- unzip-response "^2.0.1"
- url-parse-lax "^1.0.0"
-
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
version "4.2.3"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
-graphlib@^2.1.1, graphlib@^2.1.5:
- version "2.1.8"
- resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da"
- integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==
- dependencies:
- lodash "^4.17.15"
-
-graphql-depth-limit@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/graphql-depth-limit/-/graphql-depth-limit-1.1.0.tgz#59fe6b2acea0ab30ee7344f4c75df39cc18244e8"
- integrity sha512-+3B2BaG8qQ8E18kzk9yiSdAa75i/hnnOwgSeAxVJctGQPvmeiLtqKOYF6HETCyRjiF7Xfsyal0HbLlxCQkgkrw==
- dependencies:
- arrify "^1.0.1"
-
-graphql-extensions@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.11.0.tgz#2923b06f7452dad186d835327974b6c3ebb9c58f"
- integrity sha512-zd4qfUiJoYBx2MwJusM36SEJ+YmJ1ki8YF8nlm9mgaPDUzsnmFq4lxULxUfhLAXFwZw7MbEN2vV4V6WiNgSJLg==
+graphql-extensions@^0.11.1:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.11.1.tgz#f543f544a047a7a4dd930123f662dfcc01527416"
+ integrity sha512-1bstq6YKaC579PTw9gchw2VlXqjPo3vn8NjRMaUqF2SxyYTjVSgXaCAbaeNa0B7xlLVigxi3DV1zh4A+ss+Lwg==
dependencies:
"@apollographql/apollo-tools" "^0.4.3"
apollo-server-env "^2.4.3"
- apollo-server-types "^0.3.0"
+ apollo-server-types "^0.3.1"
graphql-iso-date@^3.6.1:
version "3.6.1"
@@ -9405,14 +7119,7 @@ graphql-shield@^6.0.2:
object-hash "^1.3.1"
yup "^0.27.0"
-graphql-subscriptions@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz#5f2fa4233eda44cf7570526adfcf3c16937aef11"
- integrity sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==
- dependencies:
- iterall "^1.2.1"
-
-graphql-tag@^2.4.2, graphql-tag@^2.9.2:
+graphql-tag@^2.10.3, graphql-tag@^2.4.2, graphql-tag@^2.9.2:
version "2.10.3"
resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03"
integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA==
@@ -9438,17 +7145,17 @@ graphql-upload@^8.0.2:
http-errors "^1.7.3"
object-path "^0.11.4"
-graphql@^14.5.3, graphql@^14.6.0:
+graphql@^14.5.3:
version "14.6.0"
resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.6.0.tgz#57822297111e874ea12f5cd4419616930cd83e49"
integrity sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg==
dependencies:
iterall "^1.2.2"
-growly@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
- integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
+graphql@^15.0.0:
+ version "15.0.0"
+ resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.0.0.tgz#042a5eb5e2506a2e2111ce41eb446a8e570b8be9"
+ integrity sha512-ZyVO1xIF9F+4cxfkdhOJINM+51B06Friuv4M66W7HzUOeFd+vNzUn4vtswYINPi6sysjf1M2Ri/rwZALqgwbaQ==
grpc@1.24.2:
version "1.24.2"
@@ -9467,7 +7174,7 @@ gud@^1.0.0:
resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==
-gzip-size@5.1.1:
+gzip-size@5.1.1, gzip-size@^5.0.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==
@@ -9475,11 +7182,6 @@ gzip-size@5.1.1:
duplexer "^0.1.1"
pify "^4.0.1"
-handle-thing@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
- integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==
-
handlebars@^4.4.0:
version "4.7.6"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e"
@@ -9497,7 +7199,7 @@ har-schema@^2.0.0:
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
-har-validator@5.1.3, har-validator@~5.1.3:
+har-validator@5.1.3:
version "5.1.3"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
@@ -9505,11 +7207,6 @@ har-validator@5.1.3, har-validator@~5.1.3:
ajv "^6.5.5"
har-schema "^2.0.0"
-harmony-reflect@^1.4.6:
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9"
- integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==
-
has-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
@@ -9532,7 +7229,7 @@ has-symbols@^1.0.0, has-symbols@^1.0.1:
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
-has-unicode@^2.0.0, has-unicode@^2.0.1:
+has-unicode@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
@@ -9568,7 +7265,7 @@ has-values@^1.0.0:
is-number "^3.0.0"
kind-of "^4.0.0"
-has@^1.0.0, has@^1.0.3:
+has@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
@@ -9611,28 +7308,11 @@ he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
-hex-color-regex@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
- integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
-
highlight.js@~9.13.0:
version "9.13.1"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e"
integrity sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A==
-history@^4.9.0:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3"
- integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==
- dependencies:
- "@babel/runtime" "^7.1.2"
- loose-envify "^1.2.0"
- resolve-pathname "^3.0.0"
- tiny-invariant "^1.0.2"
- tiny-warning "^1.0.0"
- value-equal "^1.0.1"
-
hmac-drbg@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@@ -9642,66 +7322,32 @@ hmac-drbg@^1.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
-hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0:
+hoek@6.x.x:
+ version "6.1.3"
+ resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c"
+ integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==
+
+hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
dependencies:
react-is "^16.7.0"
-homedir-polyfill@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
- integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
- dependencies:
- parse-passwd "^1.0.0"
+hoopy@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
+ integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
-hosted-git-info@^2.1.4, hosted-git-info@^2.7.1:
+hosted-git-info@^2.1.4:
version "2.8.8"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
-hpack.js@^2.1.6:
- version "2.1.6"
- resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
- integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=
- dependencies:
- inherits "^2.0.1"
- obuf "^1.0.0"
- readable-stream "^2.0.1"
- wbuf "^1.1.0"
-
-hsl-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
- integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=
-
-hsla-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
- integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
-
-html-comment-regex@^1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
- integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
-
-html-encoding-sniffer@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
- integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
- dependencies:
- whatwg-encoding "^1.0.1"
-
-html-entities@^1.2.0, html-entities@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
- integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=
-
-html-escaper@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
- integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+html-entities@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44"
+ integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==
html-minifier-terser@^5.0.1:
version "5.0.5"
@@ -9716,22 +7362,10 @@ html-minifier-terser@^5.0.1:
relateurl "^0.2.7"
terser "^4.6.3"
-html-webpack-plugin@4.0.0-beta.11:
- version "4.0.0-beta.11"
- resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715"
- integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==
- dependencies:
- html-minifier-terser "^5.0.1"
- loader-utils "^1.2.3"
- lodash "^4.17.15"
- pretty-error "^2.1.1"
- tapable "^1.1.3"
- util.promisify "1.0.0"
-
html-webpack-plugin@^4.0.0-beta.2:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.4.tgz#90cdfb168094e93e047174d9baca098ec5540636"
- integrity sha512-BREQzUbFfIQS39KqxkT2L1Ot0tuu1isako1CaCQLrgEQ43zi2ScHAe3SMTnVBWsStnIsGtl8jprDdxwZkNhrwQ==
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.2.0.tgz#ea46f15b620d4c1c8c73ea399395c81208e9f823"
+ integrity sha512-zL7LYTuq/fcJX6vV6tmmvFR508Bd9e6kvVGbS76YAjZ2CPVRzsjkvDYs/SshPevpolSdTWgaDV39D6k6oQoVFw==
dependencies:
"@types/html-minifier-terser" "^5.0.0"
"@types/tapable" "^1.0.5"
@@ -9743,6 +7377,16 @@ html-webpack-plugin@^4.0.0-beta.2:
tapable "^1.1.3"
util.promisify "1.0.0"
+htmlparser2@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78"
+ integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^3.0.0"
+ domutils "^2.0.0"
+ entities "^2.0.0"
+
htmlparser2@^3.3.0:
version "3.10.1"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
@@ -9755,15 +7399,15 @@ htmlparser2@^3.3.0:
inherits "^2.0.1"
readable-stream "^3.1.1"
-http-cache-semantics@^3.8.1:
- version "3.8.1"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
- integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
-
-http-deceiver@^1.2.7:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
- integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=
+http-errors@1.6.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
+ integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=
+ dependencies:
+ depd "1.1.1"
+ inherits "2.0.3"
+ setprototypeof "1.0.3"
+ statuses ">= 1.3.1 < 2"
http-errors@1.7.2:
version "1.7.2"
@@ -9776,7 +7420,7 @@ http-errors@1.7.2:
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
-http-errors@1.7.3, http-errors@^1.7.3, http-errors@~1.7.2:
+http-errors@^1.7.3, http-errors@~1.7.2:
version "1.7.3"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
@@ -9787,48 +7431,11 @@ http-errors@1.7.3, http-errors@^1.7.3, http-errors@~1.7.2:
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
-http-errors@~1.6.2:
- version "1.6.3"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
- integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
- dependencies:
- depd "~1.1.2"
- inherits "2.0.3"
- setprototypeof "1.1.0"
- statuses ">= 1.4.0 < 2"
-
"http-parser-js@>=0.4.0 <0.4.11":
version "0.4.10"
resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4"
integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=
-http-proxy-agent@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
- integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
- dependencies:
- agent-base "4"
- debug "3.1.0"
-
-http-proxy-middleware@0.19.1:
- version "0.19.1"
- resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a"
- integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==
- dependencies:
- http-proxy "^1.17.0"
- is-glob "^4.0.0"
- lodash "^4.17.11"
- micromatch "^3.1.10"
-
-http-proxy@^1.17.0:
- version "1.18.0"
- resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a"
- integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==
- dependencies:
- eventemitter3 "^4.0.0"
- follow-redirects "^1.0.0"
- requires-port "^1.0.0"
-
http-signature@1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.1.tgz#739fe2f8897ba84798e3e54b699a9008a8724ff9"
@@ -9838,51 +7445,24 @@ http-signature@1.3.1:
jsprim "^1.2.2"
sshpk "^1.14.1"
-http-signature@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
- integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
- dependencies:
- assert-plus "^1.0.0"
- jsprim "^1.2.2"
- sshpk "^1.7.0"
-
https-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
-https-proxy-agent@^2.2.3:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
- integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
- dependencies:
- agent-base "^4.3.0"
- debug "^3.1.0"
+human-signals@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+ integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
-https-proxy-agent@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81"
- integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==
+husky@^4.2.5:
+ version "4.2.5"
+ resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.5.tgz#2b4f7622673a71579f901d9885ed448394b5fa36"
+ integrity sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==
dependencies:
- agent-base "^4.3.0"
- debug "^3.1.0"
-
-humanize-ms@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
- integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=
- dependencies:
- ms "^2.0.0"
-
-husky@^4.2.3:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.3.tgz#3b18d2ee5febe99e27f2983500202daffbc3151e"
- integrity sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==
- dependencies:
- chalk "^3.0.0"
+ chalk "^4.0.0"
ci-info "^2.0.0"
- compare-versions "^3.5.1"
+ compare-versions "^3.6.0"
cosmiconfig "^6.0.0"
find-versions "^3.2.0"
opencollective-postinstall "^2.0.2"
@@ -9891,7 +7471,12 @@ husky@^4.2.3:
slash "^3.0.0"
which-pm-runs "^1.0.0"
-iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
+iconv-lite@0.4.19:
+ version "0.4.19"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+ integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==
+
+iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -9905,13 +7490,6 @@ icss-utils@^4.0.0, icss-utils@^4.1.1:
dependencies:
postcss "^7.0.14"
-identity-obj-proxy@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14"
- integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=
- dependencies:
- harmony-reflect "^1.4.6"
-
ieee754@^1.1.4:
version "1.1.13"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
@@ -9934,21 +7512,6 @@ ignore@^3.3.5:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
-ignore@^4.0.3, ignore@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
- integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-
-ignore@^5.1.4:
- version "5.1.4"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
- integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
-
-immediate@~3.0.5:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
- integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
-
immer@1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d"
@@ -9984,29 +7547,11 @@ import-from@^2.1.0:
dependencies:
resolve-from "^3.0.0"
-import-lazy@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
- integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
-
-import-local@2.0.0, import-local@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
- integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
- dependencies:
- pkg-dir "^3.0.0"
- resolve-cwd "^2.0.0"
-
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
-in-publish@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c"
- integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==
-
indent-string@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
@@ -10042,7 +7587,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -10057,25 +7602,11 @@ inherits@2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
-ini@^1.3.0, ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
+ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
-init-package-json@^1.10.3:
- version "1.10.3"
- resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe"
- integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==
- dependencies:
- glob "^7.1.1"
- npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0"
- promzard "^0.3.0"
- read "~1.0.1"
- read-package-json "1 || 2"
- semver "2.x || 3.x || 4 || 5"
- validate-npm-package-license "^3.0.1"
- validate-npm-package-name "^3.0.0"
-
inquirer@6.5.0:
version "6.5.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42"
@@ -10095,44 +7626,6 @@ inquirer@6.5.0:
strip-ansi "^5.1.0"
through "^2.3.6"
-inquirer@7.0.4:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703"
- integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==
- dependencies:
- ansi-escapes "^4.2.1"
- chalk "^2.4.2"
- cli-cursor "^3.1.0"
- cli-width "^2.0.0"
- external-editor "^3.0.3"
- figures "^3.0.0"
- lodash "^4.17.15"
- mute-stream "0.0.8"
- run-async "^2.2.0"
- rxjs "^6.5.3"
- string-width "^4.1.0"
- strip-ansi "^5.1.0"
- through "^2.3.6"
-
-inquirer@^6.2.0, inquirer@^6.2.2:
- version "6.5.2"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca"
- integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==
- dependencies:
- ansi-escapes "^3.2.0"
- chalk "^2.4.2"
- cli-cursor "^2.1.0"
- cli-width "^2.0.0"
- external-editor "^3.0.3"
- figures "^2.0.0"
- lodash "^4.17.12"
- mute-stream "0.0.7"
- run-async "^2.2.0"
- rxjs "^6.4.0"
- string-width "^2.1.0"
- strip-ansi "^5.1.0"
- through "^2.3.6"
-
inquirer@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29"
@@ -10152,14 +7645,6 @@ inquirer@^7.0.0:
strip-ansi "^6.0.0"
through "^2.3.6"
-internal-ip@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907"
- integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==
- dependencies:
- default-gateway "^4.2.0"
- ipaddr.js "^1.9.0"
-
internal-slot@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3"
@@ -10169,7 +7654,7 @@ internal-slot@^1.0.2:
has "^1.0.3"
side-channel "^1.0.2"
-interpret@1.2.0, interpret@^1.0.0:
+interpret@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
@@ -10191,16 +7676,16 @@ invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4:
dependencies:
loose-envify "^1.0.0"
+inversify@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.0.1.tgz#500d709b1434896ce5a0d58915c4a4210e34fb6e"
+ integrity sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==
+
invert-kv@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
-invert-kv@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
- integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
-
invoices@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/invoices/-/invoices-1.0.1.tgz#79501d77154f7bf313cc5dfb0309c077476e795e"
@@ -10218,26 +7703,16 @@ ip-regex@^2.1.0:
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
-ip@1.1.5, ip@^1.1.0, ip@^1.1.5:
+ip@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
-ipaddr.js@1.9.1, ipaddr.js@^1.9.0:
+ipaddr.js@1.9.1:
version "1.9.1"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
-is-absolute-url@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
- integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
-
-is-absolute-url@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
- integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
-
is-accessor-descriptor@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
@@ -10309,32 +7784,6 @@ is-callable@^1.1.4, is-callable@^1.1.5:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
-is-ci@^1.0.10:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
- integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
- dependencies:
- ci-info "^1.5.0"
-
-is-ci@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
- integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
- dependencies:
- ci-info "^2.0.0"
-
-is-color-stop@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
- integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=
- dependencies:
- css-color-names "^0.0.4"
- hex-color-regex "^1.1.0"
- hsl-regex "^1.0.0"
- hsla-regex "^1.0.0"
- rgb-regex "^1.0.1"
- rgba-regex "^1.0.0"
-
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -10444,11 +7893,6 @@ is-function@^1.0.1:
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
-is-generator-fn@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
- integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
-
is-glob@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@@ -10475,24 +7919,11 @@ is-hexadecimal@^1.0.0:
resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
-is-installed-globally@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
- integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
- dependencies:
- global-dirs "^0.1.0"
- is-path-inside "^1.0.0"
-
is-map@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1"
integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==
-is-npm@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
- integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
-
is-number@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
@@ -10510,54 +7941,23 @@ is-obj@^1.0.0, is-obj@^1.0.1:
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
-is-obj@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
- integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
-
is-object@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA=
-is-path-cwd@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
- integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
-
-is-path-in-cwd@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb"
- integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==
+is-observable@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e"
+ integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==
dependencies:
- is-path-inside "^2.1.0"
-
-is-path-inside@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
- integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
- dependencies:
- path-is-inside "^1.0.1"
-
-is-path-inside@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2"
- integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==
- dependencies:
- path-is-inside "^1.0.2"
+ symbol-observable "^1.1.0"
is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
-is-plain-object@3.0.0, is-plain-object@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928"
- integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==
- dependencies:
- isobject "^4.0.0"
-
is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
@@ -10565,16 +7965,18 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
+is-plain-object@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928"
+ integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==
+ dependencies:
+ isobject "^4.0.0"
+
is-promise@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
-is-redirect@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
- integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
-
is-regex@^1.0.4, is-regex@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
@@ -10587,16 +7989,6 @@ is-regexp@^1.0.0:
resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk=
-is-resolvable@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
- integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
-
-is-retry-allowed@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
- integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
-
is-root@2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c"
@@ -10607,14 +7999,7 @@ is-set@^2.0.1:
resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43"
integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==
-is-ssh@^1.3.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.1.tgz#f349a8cadd24e65298037a522cf7520f2e81a0f3"
- integrity sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==
- dependencies:
- protocols "^1.1.0"
-
-is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
+is-stream@1.1.0, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
@@ -10629,13 +8014,6 @@ is-string@^1.0.4, is-string@^1.0.5:
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
-is-svg@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
- integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==
- dependencies:
- html-comment-regex "^1.1.0"
-
is-symbol@^1.0.2, is-symbol@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
@@ -10650,7 +8028,7 @@ is-text-path@^1.0.1:
dependencies:
text-extensions "^1.0.0"
-is-typedarray@1.0.0, is-typedarray@~1.0.0:
+is-typedarray@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
@@ -10665,7 +8043,7 @@ is-window@^1.0.2:
resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d"
integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0=
-is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2:
+is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
@@ -10717,64 +8095,19 @@ isobject@^4.0.0:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0"
integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==
-isomorphic-fetch@^2.1.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
- integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=
+isomorphic-unfetch@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.0.0.tgz#de6d80abde487b17de2c400a7ef9e5ecc2efb362"
+ integrity sha512-V0tmJSYfkKokZ5mgl0cmfQMTb7MLHsBMngTkbLY0eXvKqiVRRoZP04Ly+KhKrJfKtzC9E6Pp15Jo+bwh7Vi2XQ==
dependencies:
- node-fetch "^1.0.1"
- whatwg-fetch ">=0.10.0"
+ node-fetch "^2.2.0"
+ unfetch "^4.0.0"
-isstream@0.1.2, isstream@~0.1.2:
+isstream@0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
-istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49"
- integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==
-
-istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630"
- integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==
- dependencies:
- "@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"
-
-istanbul-lib-report@^2.0.4:
- version "2.0.8"
- resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33"
- integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==
- dependencies:
- istanbul-lib-coverage "^2.0.5"
- make-dir "^2.1.0"
- supports-color "^6.1.0"
-
-istanbul-lib-source-maps@^3.0.1:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8"
- integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==
- dependencies:
- debug "^4.1.1"
- istanbul-lib-coverage "^2.0.5"
- make-dir "^2.1.0"
- rimraf "^2.6.3"
- source-map "^0.6.1"
-
-istanbul-reports@^2.2.6:
- version "2.2.7"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931"
- integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==
- dependencies:
- html-escaper "^2.0.0"
-
iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2:
version "1.3.0"
resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea"
@@ -10793,385 +8126,7 @@ iterate-value@^1.0.0:
es-get-iterator "^1.0.2"
iterate-iterator "^1.0.1"
-jest-changed-files@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039"
- integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==
- dependencies:
- "@jest/types" "^24.9.0"
- execa "^1.0.0"
- throat "^4.0.0"
-
-jest-cli@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af"
- integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==
- dependencies:
- "@jest/core" "^24.9.0"
- "@jest/test-result" "^24.9.0"
- "@jest/types" "^24.9.0"
- chalk "^2.0.1"
- exit "^0.1.2"
- import-local "^2.0.0"
- is-ci "^2.0.0"
- jest-config "^24.9.0"
- jest-util "^24.9.0"
- jest-validate "^24.9.0"
- prompts "^2.0.1"
- realpath-native "^1.1.0"
- yargs "^13.3.0"
-
-jest-config@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5"
- integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==
- dependencies:
- "@babel/core" "^7.1.0"
- "@jest/test-sequencer" "^24.9.0"
- "@jest/types" "^24.9.0"
- babel-jest "^24.9.0"
- chalk "^2.0.1"
- glob "^7.1.1"
- jest-environment-jsdom "^24.9.0"
- jest-environment-node "^24.9.0"
- jest-get-type "^24.9.0"
- jest-jasmine2 "^24.9.0"
- jest-regex-util "^24.3.0"
- jest-resolve "^24.9.0"
- jest-util "^24.9.0"
- jest-validate "^24.9.0"
- micromatch "^3.1.10"
- pretty-format "^24.9.0"
- realpath-native "^1.1.0"
-
-jest-diff@25.1.0:
- version "25.1.0"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.1.0.tgz#58b827e63edea1bc80c1de952b80cec9ac50e1ad"
- integrity sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==
- dependencies:
- chalk "^3.0.0"
- diff-sequences "^25.1.0"
- jest-get-type "^25.1.0"
- pretty-format "^25.1.0"
-
-jest-diff@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da"
- integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==
- dependencies:
- chalk "^2.0.1"
- diff-sequences "^24.9.0"
- jest-get-type "^24.9.0"
- pretty-format "^24.9.0"
-
-jest-docblock@^24.3.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2"
- integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==
- dependencies:
- detect-newline "^2.1.0"
-
-jest-each@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05"
- integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==
- dependencies:
- "@jest/types" "^24.9.0"
- chalk "^2.0.1"
- jest-get-type "^24.9.0"
- jest-util "^24.9.0"
- pretty-format "^24.9.0"
-
-jest-environment-jsdom-fourteen@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz#4cd0042f58b4ab666950d96532ecb2fc188f96fb"
- integrity sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==
- dependencies:
- "@jest/environment" "^24.3.0"
- "@jest/fake-timers" "^24.3.0"
- "@jest/types" "^24.3.0"
- jest-mock "^24.0.0"
- jest-util "^24.0.0"
- jsdom "^14.1.0"
-
-jest-environment-jsdom@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b"
- integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==
- dependencies:
- "@jest/environment" "^24.9.0"
- "@jest/fake-timers" "^24.9.0"
- "@jest/types" "^24.9.0"
- jest-mock "^24.9.0"
- jest-util "^24.9.0"
- jsdom "^11.5.1"
-
-jest-environment-node@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3"
- integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==
- dependencies:
- "@jest/environment" "^24.9.0"
- "@jest/fake-timers" "^24.9.0"
- "@jest/types" "^24.9.0"
- jest-mock "^24.9.0"
- jest-util "^24.9.0"
-
-jest-get-type@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e"
- integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==
-
-jest-get-type@^25.1.0:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877"
- integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==
-
-jest-haste-map@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d"
- integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==
- dependencies:
- "@jest/types" "^24.9.0"
- anymatch "^2.0.0"
- fb-watchman "^2.0.0"
- graceful-fs "^4.1.15"
- invariant "^2.2.4"
- jest-serializer "^24.9.0"
- jest-util "^24.9.0"
- jest-worker "^24.9.0"
- micromatch "^3.1.10"
- sane "^4.0.3"
- walker "^1.0.7"
- optionalDependencies:
- fsevents "^1.2.7"
-
-jest-jasmine2@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0"
- integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==
- dependencies:
- "@babel/traverse" "^7.1.0"
- "@jest/environment" "^24.9.0"
- "@jest/test-result" "^24.9.0"
- "@jest/types" "^24.9.0"
- chalk "^2.0.1"
- co "^4.6.0"
- expect "^24.9.0"
- is-generator-fn "^2.0.0"
- jest-each "^24.9.0"
- jest-matcher-utils "^24.9.0"
- jest-message-util "^24.9.0"
- jest-runtime "^24.9.0"
- jest-snapshot "^24.9.0"
- jest-util "^24.9.0"
- pretty-format "^24.9.0"
- throat "^4.0.0"
-
-jest-leak-detector@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a"
- integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==
- dependencies:
- jest-get-type "^24.9.0"
- pretty-format "^24.9.0"
-
-jest-matcher-utils@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073"
- integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==
- dependencies:
- chalk "^2.0.1"
- jest-diff "^24.9.0"
- jest-get-type "^24.9.0"
- pretty-format "^24.9.0"
-
-jest-message-util@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3"
- integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- "@jest/test-result" "^24.9.0"
- "@jest/types" "^24.9.0"
- "@types/stack-utils" "^1.0.1"
- chalk "^2.0.1"
- micromatch "^3.1.10"
- slash "^2.0.0"
- stack-utils "^1.0.1"
-
-jest-mock@^24.0.0, jest-mock@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6"
- integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==
- dependencies:
- "@jest/types" "^24.9.0"
-
-jest-pnp-resolver@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a"
- integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==
-
-jest-regex-util@^24.3.0, jest-regex-util@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636"
- integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==
-
-jest-resolve-dependencies@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab"
- integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==
- dependencies:
- "@jest/types" "^24.9.0"
- jest-regex-util "^24.3.0"
- jest-snapshot "^24.9.0"
-
-jest-resolve@24.9.0, jest-resolve@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321"
- integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==
- dependencies:
- "@jest/types" "^24.9.0"
- browser-resolve "^1.11.3"
- chalk "^2.0.1"
- jest-pnp-resolver "^1.2.1"
- realpath-native "^1.1.0"
-
-jest-runner@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42"
- integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==
- dependencies:
- "@jest/console" "^24.7.1"
- "@jest/environment" "^24.9.0"
- "@jest/test-result" "^24.9.0"
- "@jest/types" "^24.9.0"
- chalk "^2.4.2"
- exit "^0.1.2"
- graceful-fs "^4.1.15"
- jest-config "^24.9.0"
- jest-docblock "^24.3.0"
- jest-haste-map "^24.9.0"
- jest-jasmine2 "^24.9.0"
- jest-leak-detector "^24.9.0"
- jest-message-util "^24.9.0"
- jest-resolve "^24.9.0"
- jest-runtime "^24.9.0"
- jest-util "^24.9.0"
- jest-worker "^24.6.0"
- source-map-support "^0.5.6"
- throat "^4.0.0"
-
-jest-runtime@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac"
- integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==
- dependencies:
- "@jest/console" "^24.7.1"
- "@jest/environment" "^24.9.0"
- "@jest/source-map" "^24.3.0"
- "@jest/transform" "^24.9.0"
- "@jest/types" "^24.9.0"
- "@types/yargs" "^13.0.0"
- chalk "^2.0.1"
- exit "^0.1.2"
- glob "^7.1.3"
- graceful-fs "^4.1.15"
- jest-config "^24.9.0"
- jest-haste-map "^24.9.0"
- jest-message-util "^24.9.0"
- jest-mock "^24.9.0"
- jest-regex-util "^24.3.0"
- jest-resolve "^24.9.0"
- jest-snapshot "^24.9.0"
- jest-util "^24.9.0"
- jest-validate "^24.9.0"
- realpath-native "^1.1.0"
- slash "^2.0.0"
- strip-bom "^3.0.0"
- yargs "^13.3.0"
-
-jest-serializer@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73"
- integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==
-
-jest-snapshot@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba"
- integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==
- dependencies:
- "@babel/types" "^7.0.0"
- "@jest/types" "^24.9.0"
- chalk "^2.0.1"
- expect "^24.9.0"
- jest-diff "^24.9.0"
- jest-get-type "^24.9.0"
- jest-matcher-utils "^24.9.0"
- jest-message-util "^24.9.0"
- jest-resolve "^24.9.0"
- mkdirp "^0.5.1"
- natural-compare "^1.4.0"
- pretty-format "^24.9.0"
- semver "^6.2.0"
-
-jest-util@^24.0.0, jest-util@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162"
- integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==
- dependencies:
- "@jest/console" "^24.9.0"
- "@jest/fake-timers" "^24.9.0"
- "@jest/source-map" "^24.9.0"
- "@jest/test-result" "^24.9.0"
- "@jest/types" "^24.9.0"
- callsites "^3.0.0"
- chalk "^2.0.1"
- graceful-fs "^4.1.15"
- is-ci "^2.0.0"
- mkdirp "^0.5.1"
- slash "^2.0.0"
- source-map "^0.6.0"
-
-jest-validate@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab"
- integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==
- dependencies:
- "@jest/types" "^24.9.0"
- camelcase "^5.3.1"
- chalk "^2.0.1"
- jest-get-type "^24.9.0"
- leven "^3.1.0"
- pretty-format "^24.9.0"
-
-jest-watch-typeahead@0.4.2:
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz#e5be959698a7fa2302229a5082c488c3c8780a4a"
- integrity sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==
- dependencies:
- ansi-escapes "^4.2.1"
- chalk "^2.4.1"
- jest-regex-util "^24.9.0"
- jest-watcher "^24.3.0"
- slash "^3.0.0"
- string-length "^3.1.0"
- strip-ansi "^5.0.0"
-
-jest-watcher@^24.3.0, jest-watcher@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b"
- integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==
- dependencies:
- "@jest/test-result" "^24.9.0"
- "@jest/types" "^24.9.0"
- "@types/yargs" "^13.0.0"
- ansi-escapes "^3.0.0"
- chalk "^2.0.1"
- jest-util "^24.9.0"
- string-length "^2.0.0"
-
-jest-worker@^24.6.0, jest-worker@^24.9.0:
+jest-worker@24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5"
integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==
@@ -11187,18 +8142,10 @@ jest-worker@^25.1.0:
merge-stream "^2.0.0"
supports-color "^7.0.0"
-jest@24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171"
- integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==
- dependencies:
- import-local "^2.0.0"
- jest-cli "^24.9.0"
-
-js-base64@^2.1.8:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209"
- integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==
+js-levenshtein@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
+ integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
@@ -11218,75 +8165,19 @@ js-yaml@^3.13.1:
argparse "^1.0.7"
esprima "^4.0.0"
+js-yaml@~3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
+ integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^2.6.0"
+
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
-jsdom@^11.5.1:
- version "11.12.0"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8"
- integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==
- dependencies:
- abab "^2.0.0"
- acorn "^5.5.3"
- acorn-globals "^4.1.0"
- array-equal "^1.0.0"
- cssom ">= 0.3.2 < 0.4.0"
- cssstyle "^1.0.0"
- data-urls "^1.0.0"
- domexception "^1.0.1"
- escodegen "^1.9.1"
- html-encoding-sniffer "^1.0.2"
- left-pad "^1.3.0"
- nwsapi "^2.0.7"
- parse5 "4.0.0"
- pn "^1.1.0"
- request "^2.87.0"
- request-promise-native "^1.0.5"
- sax "^1.2.4"
- symbol-tree "^3.2.2"
- tough-cookie "^2.3.4"
- w3c-hr-time "^1.0.1"
- webidl-conversions "^4.0.2"
- whatwg-encoding "^1.0.3"
- whatwg-mimetype "^2.1.0"
- whatwg-url "^6.4.1"
- ws "^5.2.0"
- xml-name-validator "^3.0.0"
-
-jsdom@^14.1.0:
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b"
- integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==
- dependencies:
- abab "^2.0.0"
- acorn "^6.0.4"
- acorn-globals "^4.3.0"
- array-equal "^1.0.0"
- cssom "^0.3.4"
- cssstyle "^1.1.1"
- data-urls "^1.1.0"
- domexception "^1.0.1"
- escodegen "^1.11.0"
- html-encoding-sniffer "^1.0.2"
- nwsapi "^2.1.3"
- parse5 "5.1.0"
- pn "^1.1.0"
- request "^2.88.0"
- request-promise-native "^1.0.5"
- saxes "^3.1.9"
- symbol-tree "^3.2.2"
- tough-cookie "^2.5.0"
- w3c-hr-time "^1.0.1"
- w3c-xmlserializer "^1.1.2"
- webidl-conversions "^4.0.2"
- whatwg-encoding "^1.0.5"
- whatwg-mimetype "^2.3.0"
- whatwg-url "^7.0.0"
- ws "^6.1.2"
- xml-name-validator "^3.0.0"
-
jsesc@^2.5.1:
version "2.5.2"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
@@ -11297,7 +8188,7 @@ jsesc@~0.5.0:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
-json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
@@ -11312,19 +8203,7 @@ json-schema@0.2.3:
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
-json-stable-stringify-without-jsonify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
- integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
-
-json-stable-stringify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
- integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
- dependencies:
- jsonify "~0.0.0"
-
-json-stringify-safe@5.0.1, json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
+json-stringify-safe@5.0.1, json-stringify-safe@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
@@ -11341,10 +8220,10 @@ json5@^1.0.1:
dependencies:
minimist "^1.2.0"
-json5@^2.1.1, json5@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e"
- integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==
+json5@^2.1.0, json5@^2.1.1, json5@^2.1.2:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
+ integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
dependencies:
minimist "^1.2.5"
@@ -11362,11 +8241,6 @@ jsonfile@^4.0.0:
optionalDependencies:
graceful-fs "^4.1.6"
-jsonify@~0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
- integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
-
jsonparse@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
@@ -11387,29 +8261,6 @@ jsqr@^1.2.0:
resolved "https://registry.yarnpkg.com/jsqr/-/jsqr-1.2.0.tgz#f93fc65fa7d1ded78b1bcb020fa044352b04261a"
integrity sha512-wKcQS9QC2VHGk7aphWCp1RrFyC0CM6fMgC5prZZ2KV/Lk6OKNoCod9IR6bao+yx3KPY0gZFC5dc+h+KFzCI0Wg==
-jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f"
- integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==
- dependencies:
- array-includes "^3.0.3"
- object.assign "^4.1.0"
-
-jszip@^3.1.5:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.3.0.tgz#29d72c21a54990fa885b11fc843db320640d5271"
- integrity sha512-EJ9k766htB1ZWnsV5ZMDkKLgA+201r/ouFF8R2OigVjVdcm2rurcBrrdXaeqBJbqnUVMko512PYmlncBKE1Huw==
- dependencies:
- lie "~3.3.0"
- pako "~1.0.2"
- readable-stream "~2.3.6"
- set-immediate-shim "~1.0.1"
-
-killable@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
- integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==
-
kind-of@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5"
@@ -11448,11 +8299,6 @@ klaw@^1.0.0:
optionalDependencies:
graceful-fs "^4.1.9"
-kleur@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
- integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
-
kuler@1.0.x:
version "1.0.1"
resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6"
@@ -11460,21 +8306,6 @@ kuler@1.0.x:
dependencies:
colornames "^1.1.1"
-last-call-webpack-plugin@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555"
- integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==
- dependencies:
- lodash "^4.17.5"
- webpack-sources "^1.1.0"
-
-latest-version@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
- integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=
- dependencies:
- package-json "^4.0.0"
-
lazy-cache@^0.2.3:
version "0.2.7"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65"
@@ -11503,42 +8334,6 @@ lcid@^1.0.0:
dependencies:
invert-kv "^1.0.0"
-lcid@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
- integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
- dependencies:
- invert-kv "^2.0.0"
-
-left-pad@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
- integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==
-
-lerna@^3.20.2:
- version "3.20.2"
- resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.20.2.tgz#abf84e73055fe84ee21b46e64baf37b496c24864"
- integrity sha512-bjdL7hPLpU3Y8CBnw/1ys3ynQMUjiK6l9iDWnEGwFtDy48Xh5JboR9ZJwmKGCz9A/sarVVIGwf1tlRNKUG9etA==
- dependencies:
- "@lerna/add" "3.20.0"
- "@lerna/bootstrap" "3.20.0"
- "@lerna/changed" "3.20.0"
- "@lerna/clean" "3.20.0"
- "@lerna/cli" "3.18.5"
- "@lerna/create" "3.18.5"
- "@lerna/diff" "3.18.5"
- "@lerna/exec" "3.20.0"
- "@lerna/import" "3.18.5"
- "@lerna/info" "3.20.0"
- "@lerna/init" "3.18.5"
- "@lerna/link" "3.18.5"
- "@lerna/list" "3.20.0"
- "@lerna/publish" "3.20.2"
- "@lerna/run" "3.20.0"
- "@lerna/version" "3.20.2"
- import-local "^2.0.0"
- npmlog "^4.1.2"
-
leven@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
@@ -11551,21 +8346,6 @@ levenary@^1.1.1:
dependencies:
leven "^3.1.0"
-levn@^0.3.0, levn@~0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
- integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
- dependencies:
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
-
-lie@~3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
- integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
- dependencies:
- immediate "~3.0.5"
-
lightercollective@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.3.0.tgz#1f07638642ec645d70bdb69ab2777676f35a28f0"
@@ -11594,6 +8374,69 @@ lines-and-columns@^1.1.6:
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+lint-staged@^10.1.3:
+ version "10.1.3"
+ resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.1.3.tgz#da27713d3ac519da305381b4de87d5f866b1d2f1"
+ integrity sha512-o2OkLxgVns5RwSC5QF7waeAjJA5nz5gnUfqL311LkZcFipKV7TztrSlhNUK5nQX9H0E5NELAdduMQ+M/JPT7RQ==
+ dependencies:
+ chalk "^3.0.0"
+ commander "^4.0.1"
+ cosmiconfig "^6.0.0"
+ debug "^4.1.1"
+ dedent "^0.7.0"
+ execa "^3.4.0"
+ listr "^0.14.3"
+ log-symbols "^3.0.0"
+ micromatch "^4.0.2"
+ normalize-path "^3.0.0"
+ please-upgrade-node "^3.2.0"
+ string-argv "0.3.1"
+ stringify-object "^3.3.0"
+
+listr-silent-renderer@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
+ integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=
+
+listr-update-renderer@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2"
+ integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==
+ dependencies:
+ chalk "^1.1.3"
+ cli-truncate "^0.2.1"
+ elegant-spinner "^1.0.1"
+ figures "^1.7.0"
+ indent-string "^3.0.0"
+ log-symbols "^1.0.2"
+ log-update "^2.3.0"
+ strip-ansi "^3.0.1"
+
+listr-verbose-renderer@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db"
+ integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==
+ dependencies:
+ chalk "^2.4.1"
+ cli-cursor "^2.1.0"
+ date-fns "^1.27.2"
+ figures "^2.0.0"
+
+listr@^0.14.3:
+ version "0.14.3"
+ resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586"
+ integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==
+ dependencies:
+ "@samverschueren/stream-to-observable" "^0.3.0"
+ is-observable "^1.1.0"
+ is-promise "^2.1.0"
+ is-stream "^1.1.0"
+ listr-silent-renderer "^1.1.1"
+ listr-update-renderer "^0.5.0"
+ listr-verbose-renderer "^0.5.0"
+ p-map "^2.0.0"
+ rxjs "^6.3.3"
+
ln-service@^47.16.0:
version "47.16.0"
resolved "https://registry.yarnpkg.com/ln-service/-/ln-service-47.16.0.tgz#567e41c9e49d9e02e66130459fca59ccb2a2bb6f"
@@ -11637,16 +8480,6 @@ load-json-file@^1.0.0:
pinkie-promise "^2.0.0"
strip-bom "^2.0.0"
-load-json-file@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
- integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- strip-bom "^3.0.0"
-
load-json-file@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
@@ -11657,25 +8490,6 @@ load-json-file@^4.0.0:
pify "^3.0.0"
strip-bom "^3.0.0"
-load-json-file@^5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3"
- integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==
- dependencies:
- graceful-fs "^4.1.15"
- parse-json "^4.0.0"
- pify "^4.0.1"
- strip-bom "^3.0.0"
- type-fest "^0.3.0"
-
-loader-fs-cache@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9"
- integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==
- dependencies:
- find-cache-dir "^0.1.1"
- mkdirp "^0.5.1"
-
loader-runner@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
@@ -11690,7 +8504,16 @@ loader-utils@1.2.3:
emojis-list "^2.0.0"
json5 "^1.0.1"
-loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
+loader-utils@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
+ integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^2.1.2"
+
+loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
@@ -11727,16 +8550,6 @@ lodash._reinterpolate@^3.0.0:
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
-lodash.assign@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
- integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
-
-lodash.assignin@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
- integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI=
-
lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
@@ -11747,21 +8560,11 @@ lodash.clone@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=
-lodash.clonedeep@^4.3.0, lodash.clonedeep@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
- integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
-
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
-lodash.flatten@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
- integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
-
lodash.get@^4.4.2:
version "4.4.2"
resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
@@ -11772,6 +8575,11 @@ lodash.ismatch@^4.4.0:
resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37"
integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=
+lodash.isplainobject@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+ integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
+
lodash.memoize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
@@ -11782,17 +8590,12 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash.set@^4.3.2:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
- integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=
-
lodash.sortby@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
-lodash.template@^4.0.2, lodash.template@^4.4.0, lodash.template@^4.5.0:
+lodash.template@^4.0.2:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab"
integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==
@@ -11812,22 +8615,33 @@ lodash.throttle@^4.1.1:
resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
-lodash.uniq@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
- integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
-
-lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.7.14, lodash@~4.17.12:
+lodash@4.17.15, lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.2.1:
version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
-log-symbols@^2.1.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
- integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
+log-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
+ integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=
dependencies:
- chalk "^2.0.1"
+ chalk "^1.0.0"
+
+log-symbols@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
+ integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+ dependencies:
+ chalk "^2.4.2"
+
+log-update@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708"
+ integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg=
+ dependencies:
+ ansi-escapes "^3.0.0"
+ cli-cursor "^2.0.0"
+ wrap-ansi "^3.0.1"
logform@^2.1.1:
version "2.1.2"
@@ -11840,19 +8654,11 @@ logform@^2.1.1:
ms "^2.1.1"
triple-beam "^1.3.0"
-loglevel@^1.6.6:
+loglevel@^1.6.7:
version "1.6.7"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56"
integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==
-loglevelnext@^1.0.1:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2"
- integrity sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==
- dependencies:
- es6-symbol "^3.1.1"
- object.assign "^4.1.0"
-
long@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
@@ -11863,7 +8669,7 @@ long@~3:
resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=
-loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
@@ -11885,11 +8691,6 @@ lower-case@^2.0.1:
dependencies:
tslib "^1.10.0"
-lowercase-keys@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
- integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
-
lowlight@~1.11.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.11.0.tgz#1304d83005126d4e8b1dc0f07981e9b689ec2efc"
@@ -11898,14 +8699,6 @@ lowlight@~1.11.0:
fault "^1.0.2"
highlight.js "~9.13.0"
-lru-cache@^4.0.0, lru-cache@^4.0.1:
- version "4.1.5"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
- integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
- dependencies:
- pseudomap "^1.0.2"
- yallist "^2.1.2"
-
lru-cache@^5.0.0, lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
@@ -11922,19 +8715,7 @@ macaroon@3.0.4:
tweetnacl "^1.0.0"
tweetnacl-util "^0.15.0"
-macos-release@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f"
- integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==
-
-make-dir@^1.0.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
- integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
- dependencies:
- pify "^3.0.0"
-
-make-dir@^2.0.0, make-dir@^2.1.0:
+make-dir@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
@@ -11949,42 +8730,11 @@ make-dir@^3.0.2:
dependencies:
semver "^6.0.0"
-make-fetch-happen@^5.0.0:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd"
- integrity sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==
- dependencies:
- agentkeepalive "^3.4.1"
- cacache "^12.0.0"
- http-cache-semantics "^3.8.1"
- http-proxy-agent "^2.1.0"
- https-proxy-agent "^2.2.3"
- lru-cache "^5.1.1"
- mississippi "^3.0.0"
- node-fetch-npm "^2.0.2"
- promise-retry "^1.1.1"
- socks-proxy-agent "^4.0.0"
- ssri "^6.0.0"
-
-makeerror@1.0.x:
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
- integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=
- dependencies:
- tmpl "1.0.x"
-
mamacro@^0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==
-map-age-cleaner@^0.1.1:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
- integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
- dependencies:
- p-defer "^1.0.0"
-
map-cache@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
@@ -12013,27 +8763,13 @@ map-visit@^1.0.0:
object-visit "^1.0.0"
markdown-to-jsx@^6.9.1, markdown-to-jsx@^6.9.3:
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.0.tgz#a2e3f2bc781c3402d8bb0f8e0a12a186474623b0"
- integrity sha512-RH7LCJQ4RFmPqVeZEesKaO1biRzB/k4utoofmTCp3Eiw6D7qfvK8fzZq/2bjEJAtVkfPrM5SMt5APGf2rnaKMg==
+ version "6.11.1"
+ resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.1.tgz#3931612cfffaa5fd6610ecf2a4055eccccb98fa8"
+ integrity sha512-FdtDAv8d9/tjyHxdCvWZxxOgK2icwzBkTq/dPk+XlQ2B+DYDcwE89FWGzT92erXQ0CQR/bQbpNK3loNYhYL70g==
dependencies:
prop-types "^15.6.2"
unquote "^1.1.0"
-marked@^0.3.12:
- version "0.3.19"
- resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790"
- integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==
-
-marksy@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/marksy/-/marksy-8.0.0.tgz#b595f121fd47058df9dda1448f6ee156ab48810a"
- integrity sha512-mmHcKZojCQAGuKTuu3153viXdCuxUmsSxomFaSOBTkOlfWFOZBmDhmJkOp0CsPMNRQ7m6oN2wflvAHLpBNZVPw==
- dependencies:
- "@babel/standalone" "^7.4.5"
- he "^1.2.0"
- marked "^0.3.12"
-
material-colors@^1.2.1:
version "1.2.6"
resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46"
@@ -12063,15 +8799,6 @@ media-typer@0.3.0:
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
-mem@^4.0.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
- integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
- dependencies:
- map-age-cleaner "^0.1.1"
- mimic-fn "^2.0.0"
- p-is-promise "^2.0.0"
-
memoize-one@^5.0.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0"
@@ -12084,7 +8811,7 @@ memoizerific@^1.11.3:
dependencies:
map-or-similar "^1.5.0"
-memory-fs@^0.4.0, memory-fs@^0.4.1:
+memory-fs@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
@@ -12100,7 +8827,22 @@ memory-fs@^0.5.0:
errno "^0.1.3"
readable-stream "^2.0.1"
-meow@^3.3.0, meow@^3.7.0:
+meow@5.0.0, meow@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4"
+ integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==
+ dependencies:
+ camelcase-keys "^4.0.0"
+ decamelize-keys "^1.0.0"
+ loud-rejection "^1.0.0"
+ minimist-options "^3.0.1"
+ normalize-package-data "^2.3.4"
+ read-pkg-up "^3.0.0"
+ redent "^2.0.0"
+ trim-newlines "^2.0.0"
+ yargs-parser "^10.0.0"
+
+meow@^3.3.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
@@ -12131,21 +8873,6 @@ meow@^4.0.0:
redent "^2.0.0"
trim-newlines "^2.0.0"
-meow@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4"
- integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==
- dependencies:
- camelcase-keys "^4.0.0"
- decamelize-keys "^1.0.0"
- loud-rejection "^1.0.0"
- minimist-options "^3.0.1"
- normalize-package-data "^2.3.4"
- read-pkg-up "^3.0.0"
- redent "^2.0.0"
- trim-newlines "^2.0.0"
- yargs-parser "^10.0.0"
-
merge-deep@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2"
@@ -12180,12 +8907,27 @@ methods@~1.1.2:
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+micro-cors@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/micro-cors/-/micro-cors-0.1.1.tgz#af7a480182c114ffd1ada84ad9dffc52bb4f4054"
+ integrity sha512-6WqIahA5sbQR1Gjexp1VuWGFDKbZZleJb/gy1khNGk18a6iN1FdTcr3Q8twaxkV5H94RjxIBjirYbWCehpMBFw==
+
+micro@^9.3.2:
+ version "9.3.4"
+ resolved "https://registry.yarnpkg.com/micro/-/micro-9.3.4.tgz#745a494e53c8916f64fb6a729f8cbf2a506b35ad"
+ integrity sha512-smz9naZwTG7qaFnEZ2vn248YZq9XR+XoOH3auieZbkhDL4xLOxiE+KqG8qqnBeKfXA9c1uEFGCxPN1D+nT6N7w==
+ dependencies:
+ arg "4.1.0"
+ content-type "1.0.4"
+ is-stream "1.1.0"
+ raw-body "2.3.2"
+
microevent.ts@~0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0"
integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==
-micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.9:
+micromatch@^3.1.10, micromatch@^3.1.4:
version "3.1.10"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
@@ -12204,7 +8946,7 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.9:
snapdragon "^0.8.1"
to-regex "^3.0.2"
-micromatch@^4.0.0, micromatch@^4.0.2:
+micromatch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
@@ -12225,7 +8967,7 @@ mime-db@1.43.0, "mime-db@>= 1.43.0 < 2":
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58"
integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==
-mime-types@2.1.26, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
+mime-types@2.1.26, mime-types@^2.1.12, mime-types@~2.1.24:
version "2.1.26"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06"
integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==
@@ -12247,7 +8989,7 @@ mimic-fn@^1.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
-mimic-fn@^2.0.0, mimic-fn@^2.1.0:
+mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
@@ -12264,19 +9006,10 @@ min-indent@^1.0.0:
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256"
integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=
-mini-create-react-context@^0.3.0:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189"
- integrity sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==
- dependencies:
- "@babel/runtime" "^7.4.0"
- gud "^1.0.0"
- tiny-warning "^1.0.2"
-
-mini-css-extract-plugin@0.9.0:
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e"
- integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==
+mini-css-extract-plugin@0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz#81d41ec4fe58c713a96ad7c723cdb2d0bd4d70e1"
+ integrity sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==
dependencies:
loader-utils "^1.1.0"
normalize-url "1.9.1"
@@ -12303,7 +9036,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
-minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
+minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -12318,7 +9051,7 @@ minimist-options@^3.0.1:
arrify "^1.0.1"
is-plain-obj "^1.1.0"
-minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
+minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@@ -12344,7 +9077,7 @@ minipass-pipeline@^1.2.2:
dependencies:
minipass "^3.0.0"
-minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
+minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
@@ -12398,19 +9131,7 @@ mixin-object@^2.0.1:
for-in "^0.1.3"
is-extendable "^0.1.1"
-mkdirp-promise@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
- integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=
- dependencies:
- mkdirp "*"
-
-mkdirp@*:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
- integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-
-"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1:
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
@@ -12445,11 +9166,6 @@ move-concurrently@^1.0.1:
rimraf "^2.5.4"
run-queue "^1.0.3"
-mri@^1.1.4:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.5.tgz#ce21dba2c69f74a9b7cf8a1ec62307e089e223e0"
- integrity sha512-d2RKzMD4JNyHMbnbWnznPaa8vbdlq/4pNZ3IgdaGrVbBhebBsGUUE/6qorTMYNS6TwuH3ilfOlD2bf4Igh8CKg==
-
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -12460,45 +9176,11 @@ ms@2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
-ms@^2.0.0, ms@^2.1.1:
+ms@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-multicast-dns-service-types@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
- integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=
-
-multicast-dns@^6.0.1:
- version "6.2.3"
- resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229"
- integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==
- dependencies:
- dns-packet "^1.3.1"
- thunky "^1.0.2"
-
-multimatch@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b"
- integrity sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==
- dependencies:
- array-differ "^2.0.3"
- array-union "^1.0.2"
- arrify "^1.0.1"
- minimatch "^3.0.4"
-
-multimatch@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3"
- integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==
- dependencies:
- "@types/minimatch" "^3.0.3"
- array-differ "^3.0.0"
- array-union "^2.1.0"
- arrify "^2.0.1"
- minimatch "^3.0.4"
-
mute-stream@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
@@ -12509,15 +9191,6 @@ mute-stream@0.0.8, mute-stream@~0.0.4:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
-mz@^2.5.0:
- version "2.7.0"
- resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
- integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
- dependencies:
- any-promise "^1.0.0"
- object-assign "^4.0.1"
- thenify-all "^1.0.0"
-
nan@^2.12.1, nan@^2.13.2:
version "2.14.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
@@ -12540,22 +9213,14 @@ nanomatch@^1.2.9:
snapdragon "^0.8.1"
to-regex "^3.0.1"
-natural-compare@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
- integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-
-nconf@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.10.0.tgz#da1285ee95d0a922ca6cee75adcf861f48205ad2"
- integrity sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==
+native-url@0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae"
+ integrity sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==
dependencies:
- async "^1.4.0"
- ini "^1.3.0"
- secure-keys "^1.0.0"
- yargs "^3.19.0"
+ querystring "^0.2.0"
-needle@^2.2.1, needle@^2.2.4, needle@^2.4.0:
+needle@^2.2.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.1.tgz#14af48732463d7475696f937626b1b993247a56a"
integrity sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g==
@@ -12574,21 +9239,64 @@ neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
-nested-object-assign@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/nested-object-assign/-/nested-object-assign-1.0.3.tgz#5aca69390d9affe5a612152b5f0843ae399ac597"
- integrity sha512-kgq1CuvLyUcbcIuTiCA93cQ2IJFSlRwXcN+hLcb2qLJwC2qrePHGZZa7IipyWqaWF6tQjdax2pQnVxdq19Zzwg==
-
-netmask@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35"
- integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=
-
next-tick@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
+next-with-apollo@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/next-with-apollo/-/next-with-apollo-5.0.0.tgz#022e58c1a5c2117a6190534271e297a7fa039319"
+ integrity sha512-JcMecKv6XtzsLf1hPKrbxM6g9sygnGdQugglmCDkfWhHZt1yziPa+g515qtw7in8A7Ed5W9PdaaaUn7CWWQ71w==
+ dependencies:
+ isomorphic-unfetch "^3.0.0"
+
+next@^9.3.4:
+ version "9.3.4"
+ resolved "https://registry.yarnpkg.com/next/-/next-9.3.4.tgz#7860d414ae01e2425bf8038277f1573f9d121b57"
+ integrity sha512-sEJ3G6AOdgVYKAsIjpwLEd6uVYKvy1C3JmeydCE1ugrHU14WDRQiklRcr7Syu/aSOfB9/GRU80RPWk2c+xfh0Q==
+ dependencies:
+ "@ampproject/toolbox-optimizer" "2.0.1"
+ "@babel/core" "7.7.2"
+ "@babel/plugin-proposal-class-properties" "7.7.0"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "7.7.4"
+ "@babel/plugin-proposal-numeric-separator" "7.8.3"
+ "@babel/plugin-proposal-object-rest-spread" "7.6.2"
+ "@babel/plugin-proposal-optional-chaining" "7.7.4"
+ "@babel/plugin-syntax-bigint" "7.8.3"
+ "@babel/plugin-syntax-dynamic-import" "7.2.0"
+ "@babel/plugin-transform-modules-commonjs" "7.7.0"
+ "@babel/plugin-transform-runtime" "7.6.2"
+ "@babel/preset-env" "7.7.1"
+ "@babel/preset-modules" "0.1.1"
+ "@babel/preset-react" "7.7.0"
+ "@babel/preset-typescript" "7.7.2"
+ "@babel/runtime" "7.7.2"
+ "@babel/types" "7.7.4"
+ babel-plugin-syntax-jsx "6.18.0"
+ babel-plugin-transform-define "2.0.0"
+ babel-plugin-transform-react-remove-prop-types "0.4.24"
+ browserslist "4.8.3"
+ css-loader "3.3.0"
+ fork-ts-checker-webpack-plugin "3.1.1"
+ jest-worker "24.9.0"
+ loader-utils "2.0.0"
+ mini-css-extract-plugin "0.8.0"
+ native-url "0.2.6"
+ pnp-webpack-plugin "1.5.0"
+ postcss "7.0.27"
+ prop-types "15.7.2"
+ prop-types-exact "1.2.0"
+ react-is "16.8.6"
+ resolve-url-loader "3.1.1"
+ sass-loader "8.0.2"
+ style-loader "1.0.0"
+ styled-jsx "3.2.5"
+ use-subscription "1.1.1"
+ watchpack "2.0.0-beta.13"
+ webpack "4.42.0"
+ webpack-sources "1.4.3"
+
nice-try@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
@@ -12614,78 +9322,16 @@ node-dir@^0.1.10:
dependencies:
minimatch "^3.0.2"
-node-fetch-npm@^2.0.2:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4"
- integrity sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==
- dependencies:
- encoding "^0.1.11"
- json-parse-better-errors "^1.0.0"
- safe-buffer "^5.1.1"
-
-node-fetch@^1.0.1:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
- integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
- dependencies:
- encoding "^0.1.11"
- is-stream "^1.0.1"
-
-node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@^2.3.0, node-fetch@^2.5.0, node-fetch@^2.6.0:
+node-fetch@2.6.0, node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
-node-forge@0.9.0:
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
- integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==
-
node-gyp-build@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.1.tgz#f28f0d3d3ab268d48ab76c6f446f19bc3d0db9dc"
integrity sha512-XyCKXsqZfLqHep1hhsMncoXuUNt/cXCjg1+8CLbu69V1TKuPiOeSGbL9n+k/ByKH8UT0p4rdIX8XkTRZV0i7Sw==
-node-gyp@^3.8.0:
- version "3.8.0"
- resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
- integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
- dependencies:
- fstream "^1.0.0"
- glob "^7.0.3"
- graceful-fs "^4.1.2"
- mkdirp "^0.5.0"
- nopt "2 || 3"
- npmlog "0 || 1 || 2 || 3 || 4"
- osenv "0"
- request "^2.87.0"
- rimraf "2"
- semver "~5.3.0"
- tar "^2.0.0"
- which "1"
-
-node-gyp@^5.0.2:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.0.tgz#8e31260a7af4a2e2f994b0673d4e0b3866156332"
- integrity sha512-OUTryc5bt/P8zVgNUmC6xdXiDJxLMAW8cF5tLQOT9E5sOQj+UeQxnnPy74K3CLCa/SOjjBlbuzDLR8ANwA+wmw==
- dependencies:
- env-paths "^2.2.0"
- glob "^7.1.4"
- graceful-fs "^4.2.2"
- mkdirp "^0.5.1"
- nopt "^4.0.1"
- npmlog "^4.1.2"
- request "^2.88.0"
- rimraf "^2.6.3"
- semver "^5.7.1"
- tar "^4.4.12"
- which "^1.3.1"
-
-node-int64@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
- integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
-
node-libs-browser@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
@@ -12715,22 +9361,6 @@ node-libs-browser@^2.2.1:
util "^0.11.0"
vm-browserify "^1.0.1"
-node-modules-regexp@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
- integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
-
-node-notifier@^5.4.2:
- version "5.4.3"
- resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50"
- integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==
- dependencies:
- growly "^1.3.0"
- is-wsl "^1.1.0"
- semver "^5.5.0"
- shellwords "^0.1.1"
- which "^1.3.0"
-
node-pre-gyp@^0.14.0:
version "0.14.0"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
@@ -12747,46 +9377,16 @@ node-pre-gyp@^0.14.0:
semver "^5.3.0"
tar "^4.4.2"
-node-releases@^1.1.29, node-releases@^1.1.52, node-releases@^1.1.53:
+node-releases@^1.1.29, node-releases@^1.1.44, node-releases@^1.1.53:
version "1.1.53"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4"
integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==
-node-sass@^4.13.0:
- version "4.13.1"
- resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz#9db5689696bb2eec2c32b98bfea4c7a2e992d0a3"
- integrity sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==
- dependencies:
- async-foreach "^0.1.3"
- chalk "^1.1.1"
- cross-spawn "^3.0.0"
- gaze "^1.0.0"
- get-stdin "^4.0.1"
- glob "^7.0.3"
- in-publish "^2.0.0"
- lodash "^4.17.15"
- meow "^3.7.0"
- mkdirp "^0.5.1"
- nan "^2.13.2"
- node-gyp "^3.8.0"
- npmlog "^4.0.0"
- request "^2.88.0"
- sass-graph "^2.2.4"
- stdout-stream "^1.4.0"
- "true-case-path" "^1.0.2"
-
nofilter@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.3.tgz#34e54b4cc9757de0cad38cc0d19462489b1b7f5d"
integrity sha512-FlUlqwRK6reQCaFLAhMcF+6VkVG2caYjKQY3YsRDTl4/SEch595Qb3oLjJRDr8dkHAAOVj2pOx3VknfnSgkE5g==
-"nopt@2 || 3":
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
- integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
- dependencies:
- abbrev "1"
-
nopt@^4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
@@ -12795,7 +9395,12 @@ nopt@^4.0.1:
abbrev "1"
osenv "^0.1.4"
-normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0:
+normalize-html-whitespace@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz#5e3c8e192f1b06c3b9eee4b7e7f28854c7601e34"
+ integrity sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==
+
+normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
@@ -12832,11 +9437,6 @@ normalize-url@1.9.1:
query-string "^4.1.0"
sort-keys "^1.0.0"
-normalize-url@^3.0.0, normalize-url@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
- integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
-
npm-bundled@^1.0.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
@@ -12844,36 +9444,12 @@ npm-bundled@^1.0.1:
dependencies:
npm-normalize-package-bin "^1.0.1"
-npm-lifecycle@^3.1.2:
- version "3.1.5"
- resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309"
- integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==
- dependencies:
- byline "^5.0.0"
- graceful-fs "^4.1.15"
- node-gyp "^5.0.2"
- resolve-from "^4.0.0"
- slide "^1.1.6"
- uid-number "0.0.6"
- umask "^1.1.0"
- which "^1.3.1"
-
-npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1:
+npm-normalize-package-bin@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
-"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0:
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7"
- integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==
- dependencies:
- hosted-git-info "^2.7.1"
- osenv "^0.1.5"
- semver "^5.6.0"
- validate-npm-package-name "^3.0.0"
-
-npm-packlist@^1.1.6, npm-packlist@^1.4.4:
+npm-packlist@^1.1.6:
version "1.4.8"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
@@ -12882,30 +9458,14 @@ npm-packlist@^1.1.6, npm-packlist@^1.4.4:
npm-bundled "^1.0.1"
npm-normalize-package-bin "^1.0.1"
-npm-pick-manifest@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7"
- integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==
- dependencies:
- figgy-pudding "^3.5.1"
- npm-package-arg "^6.0.0"
- semver "^5.4.1"
-
-npm-run-path@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
- integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
- dependencies:
- path-key "^2.0.0"
-
-npm-run-path@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5"
- integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==
+npm-run-path@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
dependencies:
path-key "^3.0.0"
-"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2, npmlog@^4.1.2:
+npmlog@^4.0.2, npmlog@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@@ -12922,6 +9482,11 @@ nth-check@^1.0.2, nth-check@~1.0.1:
dependencies:
boolbase "~1.0.0"
+null-check@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd"
+ integrity sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=
+
num2fraction@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
@@ -12937,12 +9502,7 @@ numeral@^2.0.6:
resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506"
integrity sha1-StCAk21EPCVhrtnyGX7//iX05QY=
-nwsapi@^2.0.7, nwsapi@^2.1.3:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
- integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
-
-oauth-sign@0.9.0, oauth-sign@~0.9.0:
+oauth-sign@0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
@@ -12966,11 +9526,6 @@ object-hash@^1.3.1:
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==
-object-hash@^2.0.1:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea"
- integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==
-
object-inspect@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
@@ -13008,7 +9563,7 @@ object.assign@^4.1.0:
has-symbols "^1.0.0"
object-keys "^1.0.11"
-object.entries@^1.1.0, object.entries@^1.1.1:
+object.entries@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b"
integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==
@@ -13018,7 +9573,7 @@ object.entries@^1.1.0, object.entries@^1.1.1:
function-bind "^1.1.1"
has "^1.0.3"
-"object.fromentries@^2.0.0 || ^1.0.0", object.fromentries@^2.0.2:
+"object.fromentries@^2.0.0 || ^1.0.0":
version "2.0.2"
resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9"
integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==
@@ -13043,7 +9598,7 @@ object.pick@^1.3.0:
dependencies:
isobject "^3.0.1"
-object.values@^1.1.0, object.values@^1.1.1:
+object.values@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
@@ -13053,16 +9608,6 @@ object.values@^1.1.0, object.values@^1.1.1:
function-bind "^1.1.1"
has "^1.0.3"
-obuf@^1.0.0, obuf@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
- integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
-
-octokit-pagination-methods@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4"
- integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==
-
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@@ -13108,7 +9653,7 @@ open@^6.3.0:
dependencies:
is-wsl "^1.1.0"
-open@^7.0.0, open@^7.0.2:
+open@^7.0.0:
version "7.0.3"
resolved "https://registry.yarnpkg.com/open/-/open-7.0.3.tgz#db551a1af9c7ab4c7af664139930826138531c48"
integrity sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==
@@ -13121,12 +9666,10 @@ opencollective-postinstall@^2.0.2:
resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89"
integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==
-opn@^5.5.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
- integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==
- dependencies:
- is-wsl "^1.1.0"
+opener@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
+ integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
optimism@^0.10.0:
version "0.10.3"
@@ -13135,26 +9678,6 @@ optimism@^0.10.0:
dependencies:
"@wry/context" "^0.4.0"
-optimize-css-assets-webpack-plugin@5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572"
- integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==
- dependencies:
- cssnano "^4.1.10"
- last-call-webpack-plugin "^3.0.0"
-
-optionator@^0.8.1, optionator@^0.8.3:
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
- integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
- dependencies:
- deep-is "~0.1.3"
- fast-levenshtein "~2.0.6"
- levn "~0.3.0"
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
- word-wrap "~1.2.3"
-
optjs@~3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee"
@@ -13184,29 +9707,12 @@ os-locale@^1.4.0:
dependencies:
lcid "^1.0.0"
-os-locale@^3.0.0, os-locale@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
- integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
- dependencies:
- execa "^1.0.0"
- lcid "^2.0.0"
- mem "^4.0.0"
-
-os-name@^3.0.0, os-name@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801"
- integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==
- dependencies:
- macos-release "^2.2.0"
- windows-release "^3.1.0"
-
os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
-osenv@0, osenv@^0.1.4, osenv@^0.1.5:
+osenv@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
@@ -13214,33 +9720,11 @@ osenv@0, osenv@^0.1.4, osenv@^0.1.5:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
-p-defer@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
- integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
-
-p-each-series@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71"
- integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=
- dependencies:
- p-reduce "^1.0.0"
-
-p-finally@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
- integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
-
p-finally@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561"
integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==
-p-is-promise@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
- integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
-
p-limit@^1.1.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
@@ -13249,9 +9733,9 @@ p-limit@^1.1.0:
p-try "^1.0.0"
p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e"
- integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
dependencies:
p-try "^2.0.0"
@@ -13276,14 +9760,7 @@ p-locate@^4.1.0:
dependencies:
p-limit "^2.2.0"
-p-map-series@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca"
- integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=
- dependencies:
- p-reduce "^1.0.0"
-
-p-map@2.1.0, p-map@^2.0.0, p-map@^2.1.0:
+p-map@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
@@ -13295,30 +9772,6 @@ p-map@^3.0.0:
dependencies:
aggregate-error "^3.0.0"
-p-pipe@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9"
- integrity sha1-SxoROZoRUgpneQ7loMHViB1r7+k=
-
-p-queue@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-4.0.0.tgz#ed0eee8798927ed6f2c2f5f5b77fdb2061a5d346"
- integrity sha512-3cRXXn3/O0o3+eVmUroJPSj/esxoEFIm0ZOno/T+NzG/VZgPOqQ8WKmlNqubSEpZmCIngEy34unkHGg83ZIBmg==
- dependencies:
- eventemitter3 "^3.1.0"
-
-p-reduce@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
- integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=
-
-p-retry@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
- integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==
- dependencies:
- retry "^0.12.0"
-
p-try@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
@@ -13329,49 +9782,7 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
-p-waterfall@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-1.0.0.tgz#7ed94b3ceb3332782353af6aae11aa9fc235bb00"
- integrity sha1-ftlLPOszMngjU69qrhGqn8I1uwA=
- dependencies:
- p-reduce "^1.0.0"
-
-pac-proxy-agent@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz#115b1e58f92576cac2eba718593ca7b0e37de2ad"
- integrity sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==
- dependencies:
- agent-base "^4.2.0"
- debug "^4.1.1"
- get-uri "^2.0.0"
- http-proxy-agent "^2.1.0"
- https-proxy-agent "^3.0.0"
- pac-resolver "^3.0.0"
- raw-body "^2.2.0"
- socks-proxy-agent "^4.0.1"
-
-pac-resolver@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-3.0.0.tgz#6aea30787db0a891704deb7800a722a7615a6f26"
- integrity sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==
- dependencies:
- co "^4.6.0"
- degenerator "^1.0.4"
- ip "^1.1.5"
- netmask "^1.0.6"
- thunkify "^2.1.2"
-
-package-json@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
- integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=
- dependencies:
- got "^6.7.1"
- registry-auth-token "^3.0.1"
- registry-url "^3.0.3"
- semver "^5.1.0"
-
-pako@~1.0.2, pako@~1.0.5:
+pako@~1.0.5:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
@@ -13454,40 +9865,7 @@ parse-json@^5.0.0:
json-parse-better-errors "^1.0.1"
lines-and-columns "^1.1.6"
-parse-passwd@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
- integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
-
-parse-path@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.1.tgz#0ec769704949778cb3b8eda5e994c32073a1adff"
- integrity sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==
- dependencies:
- is-ssh "^1.3.0"
- protocols "^1.4.0"
-
-parse-url@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.1.tgz#99c4084fc11be14141efa41b3d117a96fcb9527f"
- integrity sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==
- dependencies:
- is-ssh "^1.3.0"
- normalize-url "^3.3.0"
- parse-path "^4.0.0"
- protocols "^1.4.0"
-
-parse5@4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
- integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==
-
-parse5@5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
- integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==
-
-parseurl@^1.3.2, parseurl@~1.3.2, parseurl@~1.3.3:
+parseurl@~1.3.2, parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
@@ -13537,12 +9915,7 @@ path-is-absolute@^1.0.0:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-path-is-inside@^1.0.1, path-is-inside@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
- integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
-
-path-key@^2.0.0, path-key@^2.0.1:
+path-key@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
@@ -13562,13 +9935,6 @@ path-to-regexp@0.1.7:
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
-path-to-regexp@^1.7.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
- integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==
- dependencies:
- isarray "0.0.1"
-
path-type@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
@@ -13578,13 +9944,6 @@ path-type@^1.0.0:
pify "^2.0.0"
pinkie-promise "^2.0.0"
-path-type@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
- integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
- dependencies:
- pify "^2.0.0"
-
path-type@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
@@ -13608,7 +9967,7 @@ pbkdf2@^3.0.3:
safe-buffer "^5.0.1"
sha.js "^2.4.8"
-performance-now@2.1.0, performance-now@^2.1.0:
+performance-now@2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
@@ -13645,27 +10004,6 @@ pinkie@^2.0.0:
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
-pirates@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
- integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
- dependencies:
- node-modules-regexp "^1.0.0"
-
-pkg-dir@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
- integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q=
- dependencies:
- find-up "^1.0.0"
-
-pkg-dir@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
- integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
- dependencies:
- find-up "^2.1.0"
-
pkg-dir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
@@ -13687,13 +10025,6 @@ pkg-up@2.0.0, pkg-up@^2.0.0:
dependencies:
find-up "^2.1.0"
-pkg-up@3.1.0, pkg-up@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
- integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
- dependencies:
- find-up "^3.0.0"
-
please-upgrade-node@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942"
@@ -13701,11 +10032,6 @@ please-upgrade-node@^3.2.0:
dependencies:
semver-compare "^1.0.0"
-pn@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
- integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
-
pnp-webpack-plugin@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz#62a1cd3068f46d564bb33c56eb250e4d586676eb"
@@ -13713,13 +10039,6 @@ pnp-webpack-plugin@1.5.0:
dependencies:
ts-pnp "^1.1.2"
-pnp-webpack-plugin@1.6.4, pnp-webpack-plugin@^1.6.4:
- version "1.6.4"
- resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149"
- integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==
- dependencies:
- ts-pnp "^1.1.6"
-
polished@^3.3.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/polished/-/polished-3.5.1.tgz#657b6faf4c2308f3e0b1951196803a5e5d67b122"
@@ -13732,187 +10051,11 @@ popper.js@^1.14.4, popper.js@^1.14.7:
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b"
integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==
-portfinder@^1.0.25:
- version "1.0.25"
- resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca"
- integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==
- dependencies:
- async "^2.6.2"
- debug "^3.1.1"
- mkdirp "^0.5.1"
-
posix-character-classes@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
-postcss-attribute-case-insensitive@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880"
- integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==
- dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^6.0.2"
-
-postcss-browser-comments@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9"
- integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==
- dependencies:
- postcss "^7"
-
-postcss-calc@^7.0.1:
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1"
- integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==
- dependencies:
- postcss "^7.0.27"
- postcss-selector-parser "^6.0.2"
- postcss-value-parser "^4.0.2"
-
-postcss-color-functional-notation@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0"
- integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==
- dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-color-gray@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547"
- integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==
- dependencies:
- "@csstools/convert-colors" "^1.4.0"
- postcss "^7.0.5"
- postcss-values-parser "^2.0.0"
-
-postcss-color-hex-alpha@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388"
- integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==
- dependencies:
- postcss "^7.0.14"
- postcss-values-parser "^2.0.1"
-
-postcss-color-mod-function@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d"
- integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==
- dependencies:
- "@csstools/convert-colors" "^1.4.0"
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-color-rebeccapurple@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77"
- integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==
- dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-colormin@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
- integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
- dependencies:
- browserslist "^4.0.0"
- color "^3.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-convert-values@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
- integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
- dependencies:
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-custom-media@^7.0.8:
- version "7.0.8"
- resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c"
- integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==
- dependencies:
- postcss "^7.0.14"
-
-postcss-custom-properties@^8.0.11:
- version "8.0.11"
- resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97"
- integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==
- dependencies:
- postcss "^7.0.17"
- postcss-values-parser "^2.0.1"
-
-postcss-custom-selectors@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba"
- integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==
- dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^5.0.0-rc.3"
-
-postcss-dir-pseudo-class@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2"
- integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==
- dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^5.0.0-rc.3"
-
-postcss-discard-comments@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
- integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
- dependencies:
- postcss "^7.0.0"
-
-postcss-discard-duplicates@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
- integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
- dependencies:
- postcss "^7.0.0"
-
-postcss-discard-empty@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
- integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
- dependencies:
- postcss "^7.0.0"
-
-postcss-discard-overridden@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
- integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
- dependencies:
- postcss "^7.0.0"
-
-postcss-double-position-gradients@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e"
- integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==
- dependencies:
- postcss "^7.0.5"
- postcss-values-parser "^2.0.0"
-
-postcss-env-function@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7"
- integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==
- dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-flexbugs-fixes@4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20"
- integrity sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==
- dependencies:
- postcss "^7.0.0"
-
postcss-flexbugs-fixes@^4.1.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.0.tgz#662b3dcb6354638b9213a55eed8913bcdc8d004a"
@@ -13920,59 +10063,6 @@ postcss-flexbugs-fixes@^4.1.0:
dependencies:
postcss "^7.0.26"
-postcss-focus-visible@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e"
- integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==
- dependencies:
- postcss "^7.0.2"
-
-postcss-focus-within@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680"
- integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==
- dependencies:
- postcss "^7.0.2"
-
-postcss-font-variant@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc"
- integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==
- dependencies:
- postcss "^7.0.2"
-
-postcss-gap-properties@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715"
- integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==
- dependencies:
- postcss "^7.0.2"
-
-postcss-image-set-function@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288"
- integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==
- dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-initial@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d"
- integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==
- dependencies:
- lodash.template "^4.5.0"
- postcss "^7.0.2"
-
-postcss-lab-function@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e"
- integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==
- dependencies:
- "@csstools/convert-colors" "^1.4.0"
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
postcss-load-config@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003"
@@ -13981,7 +10071,7 @@ postcss-load-config@^2.0.0:
cosmiconfig "^5.0.0"
import-cwd "^2.0.0"
-postcss-loader@3.0.0, postcss-loader@^3.0.0:
+postcss-loader@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d"
integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==
@@ -13991,82 +10081,6 @@ postcss-loader@3.0.0, postcss-loader@^3.0.0:
postcss-load-config "^2.0.0"
schema-utils "^1.0.0"
-postcss-logical@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5"
- integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==
- dependencies:
- postcss "^7.0.2"
-
-postcss-media-minmax@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5"
- integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==
- dependencies:
- postcss "^7.0.2"
-
-postcss-merge-longhand@^4.0.11:
- version "4.0.11"
- resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
- integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
- dependencies:
- css-color-names "0.0.4"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
- stylehacks "^4.0.0"
-
-postcss-merge-rules@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
- integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
- dependencies:
- browserslist "^4.0.0"
- caniuse-api "^3.0.0"
- cssnano-util-same-parent "^4.0.0"
- postcss "^7.0.0"
- postcss-selector-parser "^3.0.0"
- vendors "^1.0.0"
-
-postcss-minify-font-values@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
- integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
- dependencies:
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-minify-gradients@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
- integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- is-color-stop "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-minify-params@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
- integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
- dependencies:
- alphanum-sort "^1.0.0"
- browserslist "^4.0.0"
- cssnano-util-get-arguments "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
- uniqs "^2.0.0"
-
-postcss-minify-selectors@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
- integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
- dependencies:
- alphanum-sort "^1.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-selector-parser "^3.0.0"
-
postcss-modules-extract-imports@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
@@ -14084,7 +10098,7 @@ postcss-modules-local-by-default@^3.0.2:
postcss-selector-parser "^6.0.2"
postcss-value-parser "^4.0.0"
-postcss-modules-scope@^2.1.1:
+postcss-modules-scope@^2.1.1, postcss-modules-scope@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee"
integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==
@@ -14100,255 +10114,6 @@ postcss-modules-values@^3.0.0:
icss-utils "^4.0.0"
postcss "^7.0.6"
-postcss-nesting@^7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052"
- integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==
- dependencies:
- postcss "^7.0.2"
-
-postcss-normalize-charset@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
- integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
- dependencies:
- postcss "^7.0.0"
-
-postcss-normalize-display-values@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
- integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
- dependencies:
- cssnano-util-get-match "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-positions@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
- integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-repeat-style@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
- integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- cssnano-util-get-match "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-string@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
- integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
- dependencies:
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-timing-functions@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
- integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
- dependencies:
- cssnano-util-get-match "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-unicode@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
- integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
- dependencies:
- browserslist "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-url@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
- integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
- dependencies:
- is-absolute-url "^2.0.0"
- normalize-url "^3.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize-whitespace@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
- integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
- dependencies:
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-normalize@8.0.1:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776"
- integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==
- dependencies:
- "@csstools/normalize.css" "^10.1.0"
- browserslist "^4.6.2"
- postcss "^7.0.17"
- postcss-browser-comments "^3.0.0"
- sanitize.css "^10.0.0"
-
-postcss-ordered-values@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
- integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
- dependencies:
- cssnano-util-get-arguments "^4.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-overflow-shorthand@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30"
- integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==
- dependencies:
- postcss "^7.0.2"
-
-postcss-page-break@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf"
- integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==
- dependencies:
- postcss "^7.0.2"
-
-postcss-place@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62"
- integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==
- dependencies:
- postcss "^7.0.2"
- postcss-values-parser "^2.0.0"
-
-postcss-preset-env@6.7.0:
- version "6.7.0"
- resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5"
- integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==
- dependencies:
- autoprefixer "^9.6.1"
- browserslist "^4.6.4"
- caniuse-lite "^1.0.30000981"
- css-blank-pseudo "^0.1.4"
- css-has-pseudo "^0.10.0"
- css-prefers-color-scheme "^3.1.1"
- cssdb "^4.4.0"
- postcss "^7.0.17"
- postcss-attribute-case-insensitive "^4.0.1"
- postcss-color-functional-notation "^2.0.1"
- postcss-color-gray "^5.0.0"
- postcss-color-hex-alpha "^5.0.3"
- postcss-color-mod-function "^3.0.3"
- postcss-color-rebeccapurple "^4.0.1"
- postcss-custom-media "^7.0.8"
- postcss-custom-properties "^8.0.11"
- postcss-custom-selectors "^5.1.2"
- postcss-dir-pseudo-class "^5.0.0"
- postcss-double-position-gradients "^1.0.0"
- postcss-env-function "^2.0.2"
- postcss-focus-visible "^4.0.0"
- postcss-focus-within "^3.0.0"
- postcss-font-variant "^4.0.0"
- postcss-gap-properties "^2.0.0"
- postcss-image-set-function "^3.0.1"
- postcss-initial "^3.0.0"
- postcss-lab-function "^2.0.1"
- postcss-logical "^3.0.0"
- postcss-media-minmax "^4.0.0"
- postcss-nesting "^7.0.0"
- postcss-overflow-shorthand "^2.0.0"
- postcss-page-break "^2.0.0"
- postcss-place "^4.0.1"
- postcss-pseudo-class-any-link "^6.0.0"
- postcss-replace-overflow-wrap "^3.0.0"
- postcss-selector-matches "^4.0.0"
- postcss-selector-not "^4.0.0"
-
-postcss-pseudo-class-any-link@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1"
- integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==
- dependencies:
- postcss "^7.0.2"
- postcss-selector-parser "^5.0.0-rc.3"
-
-postcss-reduce-initial@^4.0.3:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
- integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
- dependencies:
- browserslist "^4.0.0"
- caniuse-api "^3.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
-
-postcss-reduce-transforms@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
- integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
- dependencies:
- cssnano-util-get-match "^4.0.0"
- has "^1.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
-
-postcss-replace-overflow-wrap@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c"
- integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==
- dependencies:
- postcss "^7.0.2"
-
-postcss-safe-parser@4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea"
- integrity sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==
- dependencies:
- postcss "^7.0.0"
-
-postcss-selector-matches@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff"
- integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==
- dependencies:
- balanced-match "^1.0.0"
- postcss "^7.0.2"
-
-postcss-selector-not@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0"
- integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==
- dependencies:
- balanced-match "^1.0.0"
- postcss "^7.0.2"
-
-postcss-selector-parser@^3.0.0:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270"
- integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==
- dependencies:
- dot-prop "^5.2.0"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
-
-postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c"
- integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==
- dependencies:
- cssesc "^2.0.0"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
-
postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
@@ -14358,44 +10123,11 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
indexes-of "^1.0.1"
uniq "^1.0.1"
-postcss-svgo@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258"
- integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==
- dependencies:
- is-svg "^3.0.0"
- postcss "^7.0.0"
- postcss-value-parser "^3.0.0"
- svgo "^1.0.0"
-
-postcss-unique-selectors@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
- integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
- dependencies:
- alphanum-sort "^1.0.0"
- postcss "^7.0.0"
- uniqs "^2.0.0"
-
-postcss-value-parser@^3.0.0:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
- integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
-
postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d"
integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==
-postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f"
- integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==
- dependencies:
- flatten "^1.0.2"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
-
postcss@7.0.21:
version "7.0.21"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17"
@@ -14405,7 +10137,7 @@ postcss@7.0.21:
source-map "^0.6.1"
supports-color "^6.1.0"
-postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6:
+postcss@7.0.27, postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6:
version "7.0.27"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9"
integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==
@@ -14414,25 +10146,15 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, po
source-map "^0.6.1"
supports-color "^6.1.0"
-prelude-ls@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
- integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
-
-prepend-http@^1.0.0, prepend-http@^1.0.1:
+prepend-http@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
-prettier@2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.2.tgz#1ba8f3eb92231e769b7fcd7cb73ae1b6b74ade08"
- integrity sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg==
-
-pretty-bytes@^5.1.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2"
- integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==
+prettier@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.4.tgz#2d1bae173e355996ee355ec9830a7a1ee05457ef"
+ integrity sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w==
pretty-error@^2.1.1:
version "2.1.1"
@@ -14442,53 +10164,11 @@ pretty-error@^2.1.1:
renderkid "^2.0.1"
utila "~0.4"
-pretty-format@25.1.0:
- version "25.1.0"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.1.0.tgz#ed869bdaec1356fc5ae45de045e2c8ec7b07b0c8"
- integrity sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==
- dependencies:
- "@jest/types" "^25.1.0"
- ansi-regex "^5.0.0"
- ansi-styles "^4.0.0"
- react-is "^16.12.0"
-
-pretty-format@^24.9.0:
- version "24.9.0"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9"
- integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==
- dependencies:
- "@jest/types" "^24.9.0"
- ansi-regex "^4.0.0"
- ansi-styles "^3.2.0"
- react-is "^16.8.4"
-
-pretty-format@^25.1.0:
- version "25.2.6"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.2.6.tgz#542a1c418d019bbf1cca2e3620443bc1323cb8d7"
- integrity sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==
- dependencies:
- "@jest/types" "^25.2.6"
- ansi-regex "^5.0.0"
- ansi-styles "^4.0.0"
- react-is "^16.12.0"
-
pretty-hrtime@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
-pretty-quick@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-2.0.1.tgz#417ee605ade98ecc686e72f63b5d28a2c35b43e9"
- integrity sha512-y7bJt77XadjUr+P1uKqZxFWLddvj3SKY6EU4BuQtMxmmEFSMpbN132pUWdSG1g1mtUfO0noBvn7wBf0BVeomHg==
- dependencies:
- chalk "^2.4.2"
- execa "^2.1.0"
- find-up "^4.1.0"
- ignore "^5.1.4"
- mri "^1.1.4"
- multimatch "^4.0.0"
-
prismjs@^1.8.4:
version "1.20.0"
resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.20.0.tgz#9b685fc480a3514ee7198eac6a3bf5024319ff03"
@@ -14518,24 +10198,11 @@ process@^0.11.10:
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
-progress@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
promise-inflight@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
-promise-retry@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d"
- integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=
- dependencies:
- err-code "^1.0.0"
- retry "^0.10.0"
-
promise.allsettled@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9"
@@ -14556,20 +10223,6 @@ promise.prototype.finally@^3.1.0:
es-abstract "^1.17.0-next.0"
function-bind "^1.1.1"
-"promise@>=3.2 <8", promise@^7.1.1:
- version "7.3.1"
- resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
- integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
- dependencies:
- asap "~2.0.3"
-
-promise@^8.0.3:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e"
- integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==
- dependencies:
- asap "~2.0.6"
-
promptly@3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/promptly/-/promptly-3.0.3.tgz#e178f722e73d82c60d019462044bccfdd9872f42"
@@ -14578,22 +10231,16 @@ promptly@3.0.3:
pify "^3.0.0"
read "^1.0.4"
-prompts@^2.0.1:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068"
- integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==
+prop-types-exact@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869"
+ integrity sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==
dependencies:
- kleur "^3.0.3"
- sisteransi "^1.0.4"
+ has "^1.0.3"
+ object.assign "^4.1.0"
+ reflect.ownkeys "^0.2.0"
-promzard@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee"
- integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=
- dependencies:
- read "1"
-
-prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
+prop-types@15.7.2, prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@@ -14614,11 +10261,6 @@ property-information@^5.0.0:
dependencies:
xtend "^4.0.0"
-proto-list@~1.2.1:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
- integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
-
protobufjs@^5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-5.0.3.tgz#e4dfe9fb67c90b2630d15868249bcc4961467a17"
@@ -14648,18 +10290,6 @@ protobufjs@^6.8.6:
"@types/node" "^10.1.0"
long "^4.0.0"
-protocols@^1.1.0, protocols@^1.4.0:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32"
- integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==
-
-protoduck@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f"
- integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==
- dependencies:
- genfun "^5.0.0"
-
proxy-addr@~2.0.5:
version "2.0.6"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
@@ -14668,35 +10298,11 @@ proxy-addr@~2.0.5:
forwarded "~0.1.2"
ipaddr.js "1.9.1"
-proxy-agent@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-3.1.1.tgz#7e04e06bf36afa624a1540be247b47c970bd3014"
- integrity sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==
- dependencies:
- agent-base "^4.2.0"
- debug "4"
- http-proxy-agent "^2.1.0"
- https-proxy-agent "^3.0.0"
- lru-cache "^5.1.1"
- pac-proxy-agent "^3.0.1"
- proxy-from-env "^1.0.0"
- socks-proxy-agent "^4.0.1"
-
-proxy-from-env@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
- integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
-
prr@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
-pseudomap@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
- integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
-
psl@^1.1.28:
version "1.8.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
@@ -14790,16 +10396,11 @@ qs@6.9.1:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9"
integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==
-qs@^6.6.0, qs@^6.9.3:
+qs@^6.6.0:
version "6.9.3"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e"
integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==
-qs@~6.5.2:
- version "6.5.2"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
- integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
-
query-string@^4.1.0:
version "4.3.4"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
@@ -14828,13 +10429,6 @@ quick-lru@^1.0.0:
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=
-raf@^3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
- integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
- dependencies:
- performance-now "^2.1.0"
-
ramda@^0.21.0:
version "0.21.0"
resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35"
@@ -14860,6 +10454,16 @@ range-parser@^1.2.1, range-parser@~1.2.1:
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+raw-body@2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
+ integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=
+ dependencies:
+ bytes "3.0.0"
+ http-errors "1.6.2"
+ iconv-lite "0.4.19"
+ unpipe "1.0.0"
+
raw-body@2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
@@ -14870,16 +10474,6 @@ raw-body@2.4.0:
iconv-lite "0.4.24"
unpipe "1.0.0"
-raw-body@^2.2.0:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
- integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
- dependencies:
- bytes "3.1.0"
- http-errors "1.7.3"
- iconv-lite "0.4.24"
- unpipe "1.0.0"
-
raw-loader@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-3.1.0.tgz#5e9d399a5a222cc0de18f42c3bc5e49677532b3f"
@@ -14888,7 +10482,7 @@ raw-loader@^3.1.0:
loader-utils "^1.1.0"
schema-utils "^2.0.1"
-rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
+rc@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
@@ -14898,27 +10492,6 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-react-addons-create-fragment@^15.6.2:
- version "15.6.2"
- resolved "https://registry.yarnpkg.com/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz#a394de7c2c7becd6b5475ba1b97ac472ce7c74f8"
- integrity sha1-o5TefCx77Na1R1uhuXrEcs58dPg=
- dependencies:
- fbjs "^0.8.4"
- loose-envify "^1.3.1"
- object-assign "^4.1.0"
-
-react-app-polyfill@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz#890f8d7f2842ce6073f030b117de9130a5f385f0"
- integrity sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==
- dependencies:
- core-js "^3.5.0"
- object-assign "^4.1.1"
- promise "^8.0.3"
- raf "^3.4.1"
- regenerator-runtime "^0.13.3"
- whatwg-fetch "^3.0.0"
-
react-clientside-effect@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.2.tgz#6212fb0e07b204e714581dd51992603d1accc837"
@@ -14946,36 +10519,6 @@ react-copy-to-clipboard@^5.0.2:
copy-to-clipboard "^3"
prop-types "^15.5.8"
-react-dev-utils@^10.2.1:
- version "10.2.1"
- resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19"
- integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ==
- dependencies:
- "@babel/code-frame" "7.8.3"
- address "1.1.2"
- browserslist "4.10.0"
- chalk "2.4.2"
- cross-spawn "7.0.1"
- detect-port-alt "1.1.6"
- escape-string-regexp "2.0.0"
- filesize "6.0.1"
- find-up "4.1.0"
- fork-ts-checker-webpack-plugin "3.1.1"
- global-modules "2.0.0"
- globby "8.0.2"
- gzip-size "5.1.1"
- immer "1.10.0"
- inquirer "7.0.4"
- is-root "2.1.0"
- loader-utils "1.2.3"
- open "^7.0.2"
- pkg-up "3.1.0"
- react-error-overlay "^6.0.7"
- recursive-readdir "2.2.2"
- shell-quote "1.7.2"
- strip-ansi "6.0.0"
- text-table "0.2.0"
-
react-dev-utils@^9.0.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-9.1.0.tgz#3ad2bb8848a32319d760d0a84c56c14bdaae5e81"
@@ -15007,20 +10550,6 @@ react-dev-utils@^9.0.0:
strip-ansi "5.2.0"
text-table "0.2.0"
-react-docgen-typescript-loader@^3.7.2:
- version "3.7.2"
- resolved "https://registry.yarnpkg.com/react-docgen-typescript-loader/-/react-docgen-typescript-loader-3.7.2.tgz#45cb2305652c0602767242a8700ad1ebd66bbbbd"
- integrity sha512-fNzUayyUGzSyoOl7E89VaPKJk9dpvdSgyXg81cUkwy0u+NBvkzQG3FC5WBIlXda0k/iaxS+PWi+OC+tUiGxzPA==
- dependencies:
- "@webpack-contrib/schema-utils" "^1.0.0-beta.0"
- loader-utils "^1.2.3"
- react-docgen-typescript "^1.15.0"
-
-react-docgen-typescript@^1.15.0:
- version "1.16.3"
- resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-1.16.3.tgz#f18ba336e51a71b7e4dc17fab39aaaf400114c0c"
- integrity sha512-xYISCr8mFKfV15talgpicOF/e0DudTucf1BXzu/HteMF4RM3KsfxXkhWybZC3LTVbYrdbammDV26Z4Yuk+MoWg==
-
react-docgen@^5.0.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-5.3.0.tgz#9aabde5e69f1993c8ba839fd9a86696504654589"
@@ -15035,7 +10564,7 @@ react-docgen@^5.0.0:
node-dir "^0.1.10"
strip-indent "^3.0.0"
-react-dom@^16.13.0, react-dom@^16.8.3:
+react-dom@^16.13.1, react-dom@^16.8.3:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f"
integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==
@@ -15046,22 +10575,14 @@ react-dom@^16.13.0, react-dom@^16.8.3:
scheduler "^0.19.1"
react-draggable@^4.0.3:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.2.0.tgz#40cc5209082ca7d613104bf6daf31372cc0e1114"
- integrity sha512-5wFq//gEoeTYprnd4ze8GrFc+Rbnx+9RkOMR3vk4EbWxj02U6L6T3yrlKeiw4X5CtjD2ma2+b3WujghcXNRzkw==
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.3.0.tgz#ece20e489af95a7bb93c14c6701b272c25a8dd67"
+ integrity sha512-er6mpn/F/8qLdhGJ21XSzcQl7hTWGsb/af9NaOhSH1M/aivhwf8WHfopmRAF7iRL3x7guLC5TF9HJaouIGHVvw==
dependencies:
classnames "^2.2.5"
prop-types "^15.6.0"
-react-element-to-jsx-string@^14.0.2:
- version "14.3.1"
- resolved "https://registry.yarnpkg.com/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.1.tgz#a08fa6e46eb76061aca7eabc2e70f433583cb203"
- integrity sha512-LRdQWRB+xcVPOL4PU4RYuTg6dUJ/FNmaQ8ls6w38YbzkbV6Yr5tFNESroub9GiSghtnMq8dQg2LcNN5aMIDzVg==
- dependencies:
- "@base2/pretty-print-object" "1.0.0"
- is-plain-object "3.0.0"
-
-react-error-overlay@^6.0.3, react-error-overlay@^6.0.7:
+react-error-overlay@^6.0.3:
version "6.0.7"
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108"
integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==
@@ -15124,7 +10645,12 @@ react-intersection-observer@^8.26.1:
dependencies:
tiny-invariant "^1.1.0"
-react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.3, react-is@^16.8.4:
+react-is@16.8.6:
+ version "16.8.6"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16"
+ integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==
+
+react-is@^16.7.0, react-is@^16.8.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -15164,95 +10690,6 @@ react-qr-reader@^2.2.1:
prop-types "^15.7.2"
webrtc-adapter "^7.2.1"
-react-router-dom@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.1.2.tgz#06701b834352f44d37fbb6311f870f84c76b9c18"
- integrity sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==
- dependencies:
- "@babel/runtime" "^7.1.2"
- history "^4.9.0"
- loose-envify "^1.3.1"
- prop-types "^15.6.2"
- react-router "5.1.2"
- tiny-invariant "^1.0.2"
- tiny-warning "^1.0.0"
-
-react-router@5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418"
- integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==
- dependencies:
- "@babel/runtime" "^7.1.2"
- history "^4.9.0"
- hoist-non-react-statics "^3.1.0"
- loose-envify "^1.3.1"
- mini-create-react-context "^0.3.0"
- path-to-regexp "^1.7.0"
- prop-types "^15.6.2"
- react-is "^16.6.0"
- tiny-invariant "^1.0.2"
- tiny-warning "^1.0.0"
-
-react-scripts@3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a"
- integrity sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ==
- dependencies:
- "@babel/core" "7.9.0"
- "@svgr/webpack" "4.3.3"
- "@typescript-eslint/eslint-plugin" "^2.10.0"
- "@typescript-eslint/parser" "^2.10.0"
- babel-eslint "10.1.0"
- babel-jest "^24.9.0"
- babel-loader "8.1.0"
- babel-plugin-named-asset-import "^0.3.6"
- babel-preset-react-app "^9.1.2"
- camelcase "^5.3.1"
- case-sensitive-paths-webpack-plugin "2.3.0"
- css-loader "3.4.2"
- dotenv "8.2.0"
- dotenv-expand "5.1.0"
- eslint "^6.6.0"
- eslint-config-react-app "^5.2.1"
- eslint-loader "3.0.3"
- eslint-plugin-flowtype "4.6.0"
- eslint-plugin-import "2.20.1"
- eslint-plugin-jsx-a11y "6.2.3"
- eslint-plugin-react "7.19.0"
- eslint-plugin-react-hooks "^1.6.1"
- file-loader "4.3.0"
- fs-extra "^8.1.0"
- html-webpack-plugin "4.0.0-beta.11"
- identity-obj-proxy "3.0.0"
- jest "24.9.0"
- jest-environment-jsdom-fourteen "1.0.1"
- jest-resolve "24.9.0"
- jest-watch-typeahead "0.4.2"
- mini-css-extract-plugin "0.9.0"
- optimize-css-assets-webpack-plugin "5.0.3"
- pnp-webpack-plugin "1.6.4"
- postcss-flexbugs-fixes "4.1.0"
- postcss-loader "3.0.0"
- postcss-normalize "8.0.1"
- postcss-preset-env "6.7.0"
- postcss-safe-parser "4.0.1"
- react-app-polyfill "^1.0.6"
- react-dev-utils "^10.2.1"
- resolve "1.15.0"
- resolve-url-loader "3.1.1"
- sass-loader "8.0.2"
- semver "6.3.0"
- style-loader "0.23.1"
- terser-webpack-plugin "2.3.5"
- ts-pnp "1.1.6"
- url-loader "2.3.0"
- webpack "4.42.0"
- webpack-dev-server "3.10.3"
- webpack-manifest-plugin "2.2.0"
- workbox-webpack-plugin "4.3.1"
- optionalDependencies:
- fsevents "2.1.2"
-
react-select@^3.0.8:
version "3.1.0"
resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.1.0.tgz#ab098720b2e9fe275047c993f0d0caf5ded17c27"
@@ -15311,7 +10748,7 @@ react-textarea-autosize@^7.1.0:
"@babel/runtime" "^7.1.2"
prop-types "^15.6.0"
-react-toastify@^5.4.1:
+react-toastify@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-5.5.0.tgz#f55de44f6b5e3ce3b13b69e5bb4427f2c9404822"
integrity sha512-jsVme7jALIFGRyQsri/g4YTsRuaaGI70T6/ikjwZMB4mwTZaCWqj5NqxhGrRStKlJc5npXKKvKeqTiRGQl78LQ==
@@ -15321,10 +10758,10 @@ react-toastify@^5.4.1:
prop-types "^15.7.2"
react-transition-group "^4"
-react-tooltip@^4.1.3:
- version "4.1.5"
- resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-4.1.5.tgz#d1e9eac42b699b45b298e5ddb073f111c8981ad4"
- integrity sha512-KOlsNxhUEgXcyM6Y2KPijBXhcCTnum7uO017ORnwB4M/rWnwyz/JpCx9+E/2CLTSZCqTmRdeEHryhuVhU2HIkA==
+react-tooltip@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-4.2.2.tgz#326ec757d966303d3b62cc1a551b54b2c0242ab0"
+ integrity sha512-bd/nQQFQByzqNz1W1Lni3qzvMHqZCuKUNvhApk29WZ5JlEFEsitFp2SxugVM53JQ6hNaocdGwwtCEzk5wQo64g==
dependencies:
prop-types "^15.7.2"
uuid "^7.0.3"
@@ -15339,7 +10776,7 @@ react-transition-group@^4, react-transition-group@^4.3.0:
loose-envify "^1.4.0"
prop-types "^15.6.2"
-react@^16.13.0, react@^16.8.3:
+react@^16.13.1, react@^16.8.3:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e"
integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==
@@ -15355,34 +10792,6 @@ reactcss@^1.2.0:
dependencies:
lodash "^4.0.1"
-read-cmd-shim@^1.0.1:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16"
- integrity sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==
- dependencies:
- graceful-fs "^4.1.2"
-
-"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1"
- integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==
- dependencies:
- glob "^7.1.1"
- json-parse-better-errors "^1.0.1"
- normalize-package-data "^2.0.0"
- npm-normalize-package-bin "^1.0.0"
- optionalDependencies:
- graceful-fs "^4.1.2"
-
-read-package-tree@^5.1.6:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636"
- integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==
- dependencies:
- read-package-json "^2.0.0"
- readdir-scoped-modules "^1.0.0"
- util-promisify "^2.1.0"
-
read-pkg-up@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
@@ -15391,14 +10800,6 @@ read-pkg-up@^1.0.1:
find-up "^1.0.0"
read-pkg "^1.0.0"
-read-pkg-up@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
- integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
- dependencies:
- find-up "^2.0.0"
- read-pkg "^2.0.0"
-
read-pkg-up@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
@@ -15407,14 +10808,6 @@ read-pkg-up@^3.0.0:
find-up "^2.0.0"
read-pkg "^3.0.0"
-read-pkg-up@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978"
- integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==
- dependencies:
- find-up "^3.0.0"
- read-pkg "^3.0.0"
-
read-pkg@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
@@ -15424,15 +10817,6 @@ read-pkg@^1.0.0:
normalize-package-data "^2.3.2"
path-type "^1.0.0"
-read-pkg@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
- integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
- dependencies:
- load-json-file "^2.0.0"
- normalize-package-data "^2.3.2"
- path-type "^2.0.0"
-
read-pkg@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
@@ -15442,14 +10826,14 @@ read-pkg@^3.0.0:
normalize-package-data "^2.3.2"
path-type "^3.0.0"
-read@1, read@^1.0.4, read@~1.0.1:
+read@^1.0.4:
version "1.0.7"
resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
dependencies:
mute-stream "~0.0.4"
-"readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@@ -15462,17 +10846,7 @@ read@1, read@^1.0.4, read@~1.0.1:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-readable-stream@1.1.x:
- version "1.1.14"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
- integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.1"
- isarray "0.0.1"
- string_decoder "~0.10.x"
-
-"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0:
+"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.1.1:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -15481,16 +10855,6 @@ readable-stream@1.1.x:
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
-readdir-scoped-modules@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309"
- integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==
- dependencies:
- debuglog "^1.0.1"
- dezalgo "^1.0.0"
- graceful-fs "^4.1.2"
- once "^1.3.0"
-
readdirp@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
@@ -15507,13 +10871,6 @@ readdirp@~3.3.0:
dependencies:
picomatch "^2.0.7"
-realpath-native@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c"
- integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==
- dependencies:
- util.promisify "^1.0.0"
-
recast@^0.14.7:
version "0.14.7"
resolved "https://registry.yarnpkg.com/recast/-/recast-0.14.7.tgz#4f1497c2b5826d42a66e8e3c9d80c512983ff61d"
@@ -15554,6 +10911,16 @@ redent@^2.0.0:
indent-string "^3.0.0"
strip-indent "^2.0.0"
+reflect-metadata@^0.1.12:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
+ integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
+
+reflect.ownkeys@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460"
+ integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=
+
refractor@^2.4.1:
version "2.10.1"
resolved "https://registry.yarnpkg.com/refractor/-/refractor-2.10.1.tgz#166c32f114ed16fd96190ad21d5193d3afc7d34e"
@@ -15575,6 +10942,11 @@ regenerate@^1.4.0:
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
+regenerator-runtime@^0.10.5:
+ version "0.10.5"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+ integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=
+
regenerator-runtime@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
@@ -15614,16 +10986,6 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0:
define-properties "^1.1.3"
es-abstract "^1.17.0-next.1"
-regexpp@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
- integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
-
-regexpp@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e"
- integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==
-
regexpu-core@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938"
@@ -15636,21 +10998,6 @@ regexpu-core@^4.7.0:
unicode-match-property-ecmascript "^1.0.4"
unicode-match-property-value-ecmascript "^1.2.0"
-registry-auth-token@^3.0.1:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e"
- integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==
- dependencies:
- rc "^1.1.6"
- safe-buffer "^5.0.1"
-
-registry-url@^3.0.3:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
- integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI=
- dependencies:
- rc "^1.0.1"
-
regjsgen@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c"
@@ -15701,58 +11048,11 @@ repeating@^2.0.0:
dependencies:
is-finite "^1.0.0"
-request-promise-core@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9"
- integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==
- dependencies:
- lodash "^4.17.15"
-
-request-promise-native@^1.0.5:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36"
- integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==
- dependencies:
- request-promise-core "1.1.3"
- stealthy-require "^1.1.1"
- tough-cookie "^2.3.3"
-
-request@^2.87.0, request@^2.88.0:
- version "2.88.2"
- resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
- integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
- dependencies:
- aws-sign2 "~0.7.0"
- aws4 "^1.8.0"
- caseless "~0.12.0"
- combined-stream "~1.0.6"
- extend "~3.0.2"
- forever-agent "~0.6.1"
- form-data "~2.3.2"
- har-validator "~5.1.3"
- http-signature "~1.2.0"
- is-typedarray "~1.0.0"
- isstream "~0.1.2"
- json-stringify-safe "~5.0.1"
- mime-types "~2.1.19"
- oauth-sign "~0.9.0"
- performance-now "^2.1.0"
- qs "~6.5.2"
- safe-buffer "^5.1.2"
- tough-cookie "~2.5.0"
- tunnel-agent "^0.6.0"
- uuid "^3.3.2"
-
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-require-main-filename@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
- integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
-
require-main-filename@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
@@ -15768,20 +11068,10 @@ resize-observer-polyfill@^1.5.1:
resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
-resolve-cwd@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
- integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
- dependencies:
- resolve-from "^3.0.0"
-
-resolve-dir@^1.0.0, resolve-dir@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
- integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
- dependencies:
- expand-tilde "^2.0.0"
- global-modules "^1.0.0"
+resolve-from@5.0.0, resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
resolve-from@^3.0.0:
version "3.0.0"
@@ -15793,15 +11083,12 @@ resolve-from@^4.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-resolve-from@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
- integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-
-resolve-pathname@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd"
- integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==
+resolve-global@1.0.0, resolve-global@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255"
+ integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==
+ dependencies:
+ global-dirs "^0.1.1"
resolve-url-loader@3.1.1:
version "3.1.1"
@@ -15824,19 +11111,7 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
-resolve@1.1.7:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
- integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
-
-resolve@1.15.0:
- version "1.15.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5"
- integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==
- dependencies:
- path-parse "^1.0.6"
-
-resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1:
+resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.8.1:
version "1.15.1"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8"
integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==
@@ -15864,16 +11139,11 @@ ret@~0.1.10:
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
-retry@0.12.0, retry@^0.12.0:
+retry@0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
-retry@^0.10.0:
- version "0.10.1"
- resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
- integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=
-
rework-visit@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a"
@@ -15887,30 +11157,13 @@ rework@1.0.1:
convert-source-map "^0.3.3"
css "^2.0.0"
-rgb-regex@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
- integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE=
-
-rgba-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
- integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=
-
-rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1:
+rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
dependencies:
glob "^7.1.3"
-rimraf@2.6.3:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
- integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
- dependencies:
- glob "^7.1.3"
-
ripemd160@^2.0.0, ripemd160@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
@@ -15919,11 +11172,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
inherits "^2.0.1"
-rsvp@^4.8.4:
- version "4.8.5"
- resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
- integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
-
rtcpeerconnection-shim@^1.2.15:
version "1.2.15"
resolved "https://registry.yarnpkg.com/rtcpeerconnection-shim/-/rtcpeerconnection-shim-1.2.15.tgz#e7cc189a81b435324c4949aa3dfb51888684b243"
@@ -15945,7 +11193,7 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
-rxjs@^6.4.0, rxjs@^6.5.3:
+rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.3:
version "6.5.5"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
@@ -15962,7 +11210,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-safe-buffer@5.2.0, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+safe-buffer@5.2.0, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
@@ -15986,36 +11234,6 @@ safe-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-sane@^4.0.3:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded"
- integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==
- dependencies:
- "@cnakazawa/watch" "^1.0.3"
- anymatch "^2.0.0"
- capture-exit "^2.0.0"
- exec-sh "^0.3.2"
- execa "^1.0.0"
- fb-watchman "^2.0.0"
- micromatch "^3.1.4"
- minimist "^1.1.1"
- walker "~1.0.5"
-
-sanitize.css@^10.0.0:
- version "10.0.0"
- resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a"
- integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==
-
-sass-graph@^2.2.4:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
- integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=
- dependencies:
- glob "^7.0.0"
- lodash "^4.0.0"
- scss-tokenizer "^0.2.3"
- yargs "^7.0.0"
-
sass-loader@8.0.2:
version "8.0.2"
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d"
@@ -16027,18 +11245,11 @@ sass-loader@8.0.2:
schema-utils "^2.6.1"
semver "^6.3.0"
-sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4:
+sax@^1.2.4, sax@~1.2.1, sax@~1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-saxes@^3.1.9:
- version "3.1.11"
- resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b"
- integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==
- dependencies:
- xmlchars "^2.1.1"
-
scheduler@^0.19.1:
version "0.19.1"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
@@ -16064,14 +11275,6 @@ schema-utils@^2.0.1, schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6
ajv "^6.12.0"
ajv-keywords "^3.4.1"
-scss-tokenizer@^0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
- integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE=
- dependencies:
- js-base64 "^2.1.8"
- source-map "^0.4.2"
-
sdp@^2.12.0, sdp@^2.6.0:
version "2.12.0"
resolved "https://registry.yarnpkg.com/sdp/-/sdp-2.12.0.tgz#338a106af7560c86e4523f858349680350d53b22"
@@ -16086,51 +11289,27 @@ secp256k1@4.0.0:
node-addon-api "^2.0.0"
node-gyp-build "^4.2.0"
-secure-keys@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca"
- integrity sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=
-
-select-hose@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
- integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
-
select@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=
-selfsigned@^1.10.7:
- version "1.10.7"
- resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b"
- integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==
- dependencies:
- node-forge "0.9.0"
-
semver-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
-semver-diff@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
- integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=
- dependencies:
- semver "^5.0.3"
-
semver-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
-"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-semver@6.3.0, semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
+semver@6.3.0, semver@^6.0.0, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@@ -16140,16 +11319,6 @@ semver@7.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
-semver@^7.1.3:
- version "7.1.3"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6"
- integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==
-
-semver@~5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
- integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
-
send@0.17.1:
version "0.17.1"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
@@ -16185,19 +11354,6 @@ serve-favicon@^2.5.0:
parseurl "~1.3.2"
safe-buffer "5.1.1"
-serve-index@^1.9.1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
- integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=
- dependencies:
- accepts "~1.3.4"
- batch "0.6.1"
- debug "2.6.9"
- escape-html "~1.0.3"
- http-errors "~1.6.2"
- mime-types "~2.1.17"
- parseurl "~1.3.2"
-
serve-static@1.14.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
@@ -16213,11 +11369,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0:
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
-set-immediate-shim@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
- integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
-
set-value@^2.0.0, set-value@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
@@ -16228,15 +11379,15 @@ set-value@^2.0.0, set-value@^2.0.1:
is-plain-object "^2.0.3"
split-string "^3.0.1"
-setimmediate@^1.0.4, setimmediate@^1.0.5:
+setimmediate@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
-setprototypeof@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
- integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
+setprototypeof@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+ integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=
setprototypeof@1.1.1:
version "1.1.1"
@@ -16316,11 +11467,6 @@ shelljs@^0.8.3:
interpret "^1.0.0"
rechoir "^0.6.2"
-shellwords@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
- integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
-
side-channel@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947"
@@ -16361,11 +11507,6 @@ simplebar@^4.2.3:
lodash.throttle "^4.1.1"
resize-observer-polyfill "^1.5.1"
-sisteransi@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
- integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
-
sjcl@^1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/sjcl/-/sjcl-1.0.8.tgz#f2ec8d7dc1f0f21b069b8914a41a8f236b0e252a"
@@ -16376,34 +11517,15 @@ slash@^1.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
-slash@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
- integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
-
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-slice-ansi@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
- integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
- dependencies:
- ansi-styles "^3.2.0"
- astral-regex "^1.0.0"
- is-fullwidth-code-point "^2.0.0"
-
-slide@^1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
- integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=
-
-smart-buffer@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba"
- integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==
+slice-ansi@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+ integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=
snapdragon-node@^2.0.1:
version "2.1.1"
@@ -16435,254 +11557,6 @@ snapdragon@^0.8.1:
source-map-resolve "^0.5.0"
use "^3.1.0"
-snyk-config@^2.2.1:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/snyk-config/-/snyk-config-2.2.3.tgz#8e09bb98602ad044954d30a9fc1695ab5b6042fa"
- integrity sha512-9NjxHVMd1U1LFw66Lya4LXgrsFUiuRiL4opxfTFo0LmMNzUoU5Bk/p0zDdg3FE5Wg61r4fP2D8w+QTl6M8CGiw==
- dependencies:
- debug "^3.1.0"
- lodash "^4.17.15"
- nconf "^0.10.0"
-
-snyk-docker-plugin@2.6.1:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/snyk-docker-plugin/-/snyk-docker-plugin-2.6.1.tgz#f57984c9aec8fb6d557da2c88db9aa52a601d428"
- integrity sha512-v3LIPILRL5faZ+qiIhF9on0rAxuFaQku3UwaiGumoTrfXywLkv7x8PJgdMnrsWUxDwB8EZFc1k2qvI6V6rTF5g==
- dependencies:
- debug "^4.1.1"
- dockerfile-ast "0.0.19"
- event-loop-spinner "^1.1.0"
- semver "^6.1.0"
- tar-stream "^2.1.0"
- tslib "^1"
-
-snyk-go-parser@1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/snyk-go-parser/-/snyk-go-parser-1.4.0.tgz#0fa7e4b9f2cf14c95dbc09206416ac4676436c70"
- integrity sha512-zcLA8u/WreycCjFKBblYfxszg7Fmnemuu9Ug/CE/jqF0yBXsI5DCWMteUvFkoa8DRntfGTlgf98TRl2aTSc2MQ==
- dependencies:
- toml "^3.0.0"
- tslib "^1.10.0"
-
-snyk-go-plugin@1.13.0:
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/snyk-go-plugin/-/snyk-go-plugin-1.13.0.tgz#7d0c7efa3151a893f6744939285f318a9a242c1e"
- integrity sha512-6lN9S8uO6LE1Y6ZJMZm3EZ8kvvI/vZh8r+JJGAPfVO2C265xymEpFBJ4Nn2or0Q0LlqZ8W8lWi1HUMXXid6k+w==
- dependencies:
- debug "^4.1.1"
- graphlib "^2.1.1"
- snyk-go-parser "1.4.0"
- tmp "0.1.0"
- tslib "^1.10.0"
-
-snyk-gradle-plugin@3.2.5:
- version "3.2.5"
- resolved "https://registry.yarnpkg.com/snyk-gradle-plugin/-/snyk-gradle-plugin-3.2.5.tgz#a0be7ddec568bfec62e7ebf7a6431aa74eec1d27"
- integrity sha512-XxPi/B16dGkV1USoyFbpn6LlSJ9SUC6Y6z/4lWuF4spLnKtWwpEb1bwTdBFsxnkUfqzIRtPr0+wcxxXvv9Rvcw==
- dependencies:
- "@snyk/cli-interface" "2.3.0"
- "@types/debug" "^4.1.4"
- chalk "^2.4.2"
- debug "^4.1.1"
- tmp "0.0.33"
- tslib "^1.9.3"
-
-snyk-module@1.9.1, snyk-module@^1.6.0, snyk-module@^1.9.1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/snyk-module/-/snyk-module-1.9.1.tgz#b2a78f736600b0ab680f1703466ed7309c980804"
- integrity sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA==
- dependencies:
- debug "^3.1.0"
- hosted-git-info "^2.7.1"
-
-snyk-mvn-plugin@2.9.0:
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/snyk-mvn-plugin/-/snyk-mvn-plugin-2.9.0.tgz#f5839c0d01756b9268dae3142f5b0639555a65de"
- integrity sha512-FBl78wCHNm0P/QOlipvOxzN2LrXlS6NBN0zXWYZ09P0hG65rmA3gKTg0QsHUjIBh1Pg9bw5aG4r/AHle6a6g6w==
- dependencies:
- "@snyk/cli-interface" "2.3.1"
- debug "^4.1.1"
- lodash "^4.17.15"
- needle "^2.4.0"
- tmp "^0.1.0"
- tslib "1.9.3"
-
-snyk-nodejs-lockfile-parser@1.17.0:
- version "1.17.0"
- resolved "https://registry.yarnpkg.com/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.17.0.tgz#709e1d8c83faccae3bfdac5c10620dcedbf8c4ac"
- integrity sha512-i4GAYFj9TJLOQ8F+FbIJuJWdGymi8w/XcrEX0FzXk7DpYUCY3mWibyKhw8RasfYBx5vLwUzEvRMaQuc2EwlyfA==
- dependencies:
- "@yarnpkg/lockfile" "^1.0.2"
- graphlib "^2.1.5"
- lodash "^4.17.14"
- p-map "2.1.0"
- source-map-support "^0.5.7"
- tslib "^1.9.3"
- uuid "^3.3.2"
-
-snyk-nuget-plugin@1.16.0:
- version "1.16.0"
- resolved "https://registry.yarnpkg.com/snyk-nuget-plugin/-/snyk-nuget-plugin-1.16.0.tgz#241c6c8a417429c124c3ebf6db314a14eb8eed89"
- integrity sha512-OEusK3JKKpR4Yto5KwuqjQGgb9wAhmDqBWSQomWdtKQVFrzn5B6BMzOFikUzmeMTnUGGON7gurQBLXeZZLhRqg==
- dependencies:
- debug "^3.1.0"
- dotnet-deps-parser "4.9.0"
- jszip "^3.1.5"
- lodash "^4.17.14"
- snyk-paket-parser "1.5.0"
- tslib "^1.9.3"
- xml2js "^0.4.17"
-
-snyk-paket-parser@1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/snyk-paket-parser/-/snyk-paket-parser-1.5.0.tgz#a0e96888d9d304b1ae6203a0369971575f099548"
- integrity sha512-1CYMPChJ9D9LBy3NLqHyv8TY7pR/LMISSr08LhfFw/FpfRZ+gTH8W6bbxCmybAYrOFNCqZkRprqOYDqZQFHipA==
- dependencies:
- tslib "^1.9.3"
-
-snyk-php-plugin@1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/snyk-php-plugin/-/snyk-php-plugin-1.7.0.tgz#cf1906ed8a10db134c803be3d6e4be0cbdc5fe33"
- integrity sha512-mDe90xkqSEVrpx1ZC7ItqCOc6fZCySbE+pHVI+dAPUmf1C1LSWZrZVmAVeo/Dw9sJzJfzmcdAFQl+jZP8/uV0A==
- dependencies:
- "@snyk/cli-interface" "2.2.0"
- "@snyk/composer-lockfile-parser" "1.2.0"
- tslib "1.9.3"
-
-snyk-policy@1.13.5:
- version "1.13.5"
- resolved "https://registry.yarnpkg.com/snyk-policy/-/snyk-policy-1.13.5.tgz#c5cf262f759879a65ab0810dd58d59c8ec7e9e47"
- integrity sha512-KI6GHt+Oj4fYKiCp7duhseUj5YhyL/zJOrrJg0u6r59Ux9w8gmkUYT92FHW27ihwuT6IPzdGNEuy06Yv2C9WaQ==
- dependencies:
- debug "^3.1.0"
- email-validator "^2.0.4"
- js-yaml "^3.13.1"
- lodash.clonedeep "^4.5.0"
- semver "^6.0.0"
- snyk-module "^1.9.1"
- snyk-resolve "^1.0.1"
- snyk-try-require "^1.3.1"
- then-fs "^2.0.0"
-
-snyk-python-plugin@1.17.0:
- version "1.17.0"
- resolved "https://registry.yarnpkg.com/snyk-python-plugin/-/snyk-python-plugin-1.17.0.tgz#9bc38ba3c799c3cbef7676a1081f52608690d254"
- integrity sha512-EKdVOUlvhiVpXA5TeW8vyxYVqbITAfT+2AbL2ZRiiUNLP5ae+WiNYaPy7aB5HAS9IKBKih+IH8Ag65Xu1IYSYA==
- dependencies:
- "@snyk/cli-interface" "^2.0.3"
- tmp "0.0.33"
-
-snyk-resolve-deps@4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/snyk-resolve-deps/-/snyk-resolve-deps-4.4.0.tgz#ef20fb578a4c920cc262fb73dd292ff21215f52d"
- integrity sha512-aFPtN8WLqIk4E1ulMyzvV5reY1Iksz+3oPnUVib1jKdyTHymmOIYF7z8QZ4UUr52UsgmrD9EA/dq7jpytwFoOQ==
- dependencies:
- "@types/node" "^6.14.4"
- "@types/semver" "^5.5.0"
- ansicolors "^0.3.2"
- debug "^3.2.5"
- lodash.assign "^4.2.0"
- lodash.assignin "^4.2.0"
- lodash.clone "^4.5.0"
- lodash.flatten "^4.4.0"
- lodash.get "^4.4.2"
- lodash.set "^4.3.2"
- lru-cache "^4.0.0"
- semver "^5.5.1"
- snyk-module "^1.6.0"
- snyk-resolve "^1.0.0"
- snyk-tree "^1.0.0"
- snyk-try-require "^1.1.1"
- then-fs "^2.0.0"
-
-snyk-resolve@1.0.1, snyk-resolve@^1.0.0, snyk-resolve@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/snyk-resolve/-/snyk-resolve-1.0.1.tgz#eaa4a275cf7e2b579f18da5b188fe601b8eed9ab"
- integrity sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw==
- dependencies:
- debug "^3.1.0"
- then-fs "^2.0.0"
-
-snyk-sbt-plugin@2.11.0:
- version "2.11.0"
- resolved "https://registry.yarnpkg.com/snyk-sbt-plugin/-/snyk-sbt-plugin-2.11.0.tgz#f5469dcf5589e34575fc901e2064475582cc3e48"
- integrity sha512-wUqHLAa3MzV6sVO+05MnV+lwc+T6o87FZZaY+43tQPytBI2Wq23O3j4POREM4fa2iFfiQJoEYD6c7xmhiEUsSA==
- dependencies:
- debug "^4.1.1"
- semver "^6.1.2"
- tmp "^0.1.0"
- tree-kill "^1.2.2"
- tslib "^1.10.0"
-
-snyk-tree@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/snyk-tree/-/snyk-tree-1.0.0.tgz#0fb73176dbf32e782f19100294160448f9111cc8"
- integrity sha1-D7cxdtvzLngvGRAClBYESPkRHMg=
- dependencies:
- archy "^1.0.0"
-
-snyk-try-require@1.3.1, snyk-try-require@^1.1.1, snyk-try-require@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/snyk-try-require/-/snyk-try-require-1.3.1.tgz#6e026f92e64af7fcccea1ee53d524841e418a212"
- integrity sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI=
- dependencies:
- debug "^3.1.0"
- lodash.clonedeep "^4.3.0"
- lru-cache "^4.0.0"
- then-fs "^2.0.0"
-
-snyk@^1.305.0:
- version "1.305.0"
- resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.305.0.tgz#051bd49677ce58f08f17bba5e57cf4d61b1a8466"
- integrity sha512-/0UWzTABCu9FBd+4CL49CAW1CN4qloAeio+eB8FWOKal2EVG9LRrrkmknxOe6uFptT6wd9SBczM2EYo2EQA0bw==
- dependencies:
- "@snyk/cli-interface" "2.3.2"
- "@snyk/configstore" "^3.2.0-rc1"
- "@snyk/dep-graph" "1.16.1"
- "@snyk/gemfile" "1.2.0"
- "@snyk/snyk-cocoapods-plugin" "2.0.1"
- "@snyk/update-notifier" "^2.5.1-rc2"
- "@types/agent-base" "^4.2.0"
- "@types/restify" "^4.3.6"
- abbrev "^1.1.1"
- ansi-escapes "3.2.0"
- chalk "^2.4.2"
- cli-spinner "0.2.10"
- debug "^3.1.0"
- diff "^4.0.1"
- git-url-parse "11.1.2"
- glob "^7.1.3"
- inquirer "^6.2.2"
- lodash "^4.17.14"
- needle "^2.2.4"
- opn "^5.5.0"
- os-name "^3.0.0"
- proxy-agent "^3.1.1"
- proxy-from-env "^1.0.0"
- semver "^6.0.0"
- snyk-config "^2.2.1"
- snyk-docker-plugin "2.6.1"
- snyk-go-plugin "1.13.0"
- snyk-gradle-plugin "3.2.5"
- snyk-module "1.9.1"
- snyk-mvn-plugin "2.9.0"
- snyk-nodejs-lockfile-parser "1.17.0"
- snyk-nuget-plugin "1.16.0"
- snyk-php-plugin "1.7.0"
- snyk-policy "1.13.5"
- snyk-python-plugin "1.17.0"
- snyk-resolve "1.0.1"
- snyk-resolve-deps "4.4.0"
- snyk-sbt-plugin "2.11.0"
- snyk-tree "^1.0.0"
- snyk-try-require "1.3.1"
- source-map-support "^0.5.11"
- strip-ansi "^5.2.0"
- tempfile "^2.0.0"
- then-fs "^2.0.0"
- uuid "^3.3.2"
- wrap-ansi "^5.1.0"
-
sockjs-client@1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5"
@@ -16695,30 +11569,6 @@ sockjs-client@1.4.0:
json3 "^3.3.2"
url-parse "^1.4.3"
-sockjs@0.3.19:
- version "0.3.19"
- resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d"
- integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==
- dependencies:
- faye-websocket "^0.10.0"
- uuid "^3.0.1"
-
-socks-proxy-agent@^4.0.0, socks-proxy-agent@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386"
- integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==
- dependencies:
- agent-base "~4.2.1"
- socks "~2.3.2"
-
-socks@~2.3.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3"
- integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==
- dependencies:
- ip "1.1.5"
- smart-buffer "^4.1.0"
-
sort-keys@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
@@ -16726,13 +11576,6 @@ sort-keys@^1.0.0:
dependencies:
is-plain-obj "^1.0.0"
-sort-keys@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
- integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=
- dependencies:
- is-plain-obj "^1.0.0"
-
source-list-map@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
@@ -16749,7 +11592,7 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
source-map-url "^0.4.0"
urix "^0.1.0"
-source-map-support@^0.5.11, source-map-support@^0.5.3, source-map-support@^0.5.6, source-map-support@^0.5.7, source-map-support@~0.5.12:
+source-map-support@~0.5.12:
version "0.5.16"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042"
integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==
@@ -16767,14 +11610,12 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-source-map@^0.4.2:
- version "0.4.4"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
- integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
- dependencies:
- amdefine ">=0.0.4"
+source-map@0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
-source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
+source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -16810,29 +11651,6 @@ spdx-license-ids@^3.0.0:
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
-spdy-transport@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
- integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
- dependencies:
- debug "^4.1.0"
- detect-node "^2.0.4"
- hpack.js "^2.1.6"
- obuf "^1.1.2"
- readable-stream "^3.0.6"
- wbuf "^1.7.3"
-
-spdy@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b"
- integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==
- dependencies:
- debug "^4.1.0"
- handle-thing "^2.0.0"
- http-deceiver "^1.2.7"
- select-hose "^2.0.0"
- spdy-transport "^3.0.0"
-
split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
@@ -16859,7 +11677,7 @@ sprintf-js@~1.0.2:
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-sshpk@^1.14.1, sshpk@^1.7.0:
+sshpk@^1.14.1:
version "1.16.1"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
@@ -16874,7 +11692,7 @@ sshpk@^1.14.1, sshpk@^1.7.0:
safer-buffer "^2.0.2"
tweetnacl "~0.14.0"
-ssri@^6.0.0, ssri@^6.0.1:
+ssri@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
@@ -16899,10 +11717,26 @@ stack-trace@0.0.x:
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
-stack-utils@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
- integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
+standard-version@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-7.1.0.tgz#021dd79eac749548677c876d5a94791df50f1f36"
+ integrity sha512-bHY2E/1tYGeVl+0XSXFivb+54h2fA4pWJocXAd6FGbtSFUvGsnfmMbIXYDxrYErpq7oEqoKreV8xTAp78WoATA==
+ dependencies:
+ chalk "2.4.2"
+ conventional-changelog "3.1.15"
+ conventional-changelog-config-spec "2.1.0"
+ conventional-changelog-conventionalcommits "4.2.3"
+ conventional-recommended-bump "6.0.5"
+ detect-indent "6.0.0"
+ detect-newline "3.1.0"
+ dotgitignore "2.1.0"
+ figures "3.1.0"
+ find-up "4.1.0"
+ fs-access "1.0.1"
+ git-semver-tags "3.0.1"
+ semver "6.3.0"
+ stringify-package "1.0.1"
+ yargs "15.0.2"
static-extend@^0.1.1:
version "0.1.2"
@@ -16912,23 +11746,11 @@ static-extend@^0.1.1:
define-property "^0.2.5"
object-copy "^0.1.0"
-"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+"statuses@>= 1.3.1 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
-stdout-stream@^1.4.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de"
- integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==
- dependencies:
- readable-stream "^2.0.1"
-
-stealthy-require@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
- integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
-
store2@^2.7.1:
version "2.11.0"
resolved "https://registry.yarnpkg.com/store2/-/store2-2.11.0.tgz#307636a239014ef4d8f1c8b47afe903509484fc8"
@@ -16976,23 +11798,17 @@ strict-uri-encode@^1.0.0:
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
-string-length@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
- integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=
- dependencies:
- astral-regex "^1.0.0"
- strip-ansi "^4.0.0"
+string-argv@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da"
+ integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==
-string-length@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837"
- integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==
- dependencies:
- astral-regex "^1.0.0"
- strip-ansi "^5.2.0"
+string-hash@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b"
+ integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=
-string-width@^1.0.1, string-width@^1.0.2:
+string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
@@ -17001,7 +11817,7 @@ string-width@^1.0.1, string-width@^1.0.2:
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
-"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
+"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
@@ -17009,7 +11825,7 @@ string-width@^1.0.1, string-width@^1.0.2:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
-string-width@^3.0.0, string-width@^3.1.0:
+string-width@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
@@ -17018,7 +11834,7 @@ string-width@^3.0.0, string-width@^3.1.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
-string-width@^4.0.0, string-width@^4.1.0:
+string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
@@ -17027,7 +11843,7 @@ string-width@^4.0.0, string-width@^4.1.0:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.0"
-"string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.2:
+"string.prototype.matchall@^4.0.0 || ^3.0.1":
version "4.0.2"
resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e"
integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==
@@ -17056,9 +11872,9 @@ string.prototype.padstart@^3.0.0:
es-abstract "^1.17.0-next.1"
string.prototype.trimend@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz#ee497fd29768646d84be2c9b819e292439614373"
- integrity sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
+ integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
dependencies:
define-properties "^1.1.3"
es-abstract "^1.17.5"
@@ -17082,9 +11898,9 @@ string.prototype.trimright@^2.1.1:
string.prototype.trimend "^1.0.0"
string.prototype.trimstart@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz#afe596a7ce9de905496919406c9734845f01a2f2"
- integrity sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
+ integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
dependencies:
define-properties "^1.1.3"
es-abstract "^1.17.5"
@@ -17096,11 +11912,6 @@ string_decoder@^1.0.0, string_decoder@^1.1.1:
dependencies:
safe-buffer "~5.2.0"
-string_decoder@~0.10.x:
- version "0.10.31"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
- integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
-
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
@@ -17117,20 +11928,18 @@ stringify-object@^3.3.0:
is-obj "^1.0.1"
is-regexp "^1.0.0"
-strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+stringify-package@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85"
+ integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
+
+strip-ansi@5.2.0, strip-ansi@^5.1.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
dependencies:
ansi-regex "^4.1.0"
-strip-ansi@6.0.0, strip-ansi@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
- integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
- dependencies:
- ansi-regex "^5.0.0"
-
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
@@ -17145,6 +11954,13 @@ strip-ansi@^4.0.0:
dependencies:
ansi-regex "^3.0.0"
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
strip-bom@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
@@ -17157,19 +11973,6 @@ strip-bom@^3.0.0:
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
-strip-comments@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d"
- integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==
- dependencies:
- babel-extract-comments "^1.0.0"
- babel-plugin-transform-object-rest-spread "^6.26.0"
-
-strip-eof@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
- integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
-
strip-final-newline@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
@@ -17194,32 +11997,18 @@ strip-indent@^3.0.0:
dependencies:
min-indent "^1.0.0"
-strip-json-comments@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
- integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
-
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
-strong-log-transformer@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10"
- integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==
+style-loader@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.0.0.tgz#1d5296f9165e8e2c85d24eee0b7caf9ec8ca1f82"
+ integrity sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==
dependencies:
- duplexer "^0.1.1"
- minimist "^1.2.0"
- through "^2.3.4"
-
-style-loader@0.23.1:
- version "0.23.1"
- resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925"
- integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==
- dependencies:
- loader-utils "^1.1.0"
- schema-utils "^1.0.0"
+ loader-utils "^1.2.3"
+ schema-utils "^2.0.1"
style-loader@^1.0.0:
version "1.1.3"
@@ -17229,14 +12018,14 @@ style-loader@^1.0.0:
loader-utils "^1.2.3"
schema-utils "^2.6.4"
-styled-components@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.0.1.tgz#57782a6471031abefb2db5820a1876ae853bc619"
- integrity sha512-E0xKTRIjTs4DyvC1MHu/EcCXIj6+ENCP8hP01koyoADF++WdBUOrSGwU1scJRw7/YaYOhDvvoad6VlMG+0j53A==
+styled-components@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.1.0.tgz#2e3985b54f461027e1c91af3229e1c2530872a4e"
+ integrity sha512-0Qs2wEkFBXHFlysz6CV831VG6HedcrFUwChjnWylNivsx14MtmqQsohi21rMHZxzuTba063dEyoe/SR6VGJI7Q==
dependencies:
"@babel/helper-module-imports" "^7.0.0"
"@babel/traverse" "^7.4.5"
- "@emotion/is-prop-valid" "^0.8.3"
+ "@emotion/is-prop-valid" "^0.8.8"
"@emotion/stylis" "^0.8.4"
"@emotion/unitless" "^0.7.4"
babel-plugin-styled-components ">= 1"
@@ -17245,26 +12034,41 @@ styled-components@^5.0.1:
shallowequal "^1.1.0"
supports-color "^5.5.0"
-styled-react-modal@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/styled-react-modal/-/styled-react-modal-2.0.0.tgz#b42eec58c76b4c91afb4af925f2ab39e43b57263"
- integrity sha512-WVsYpmdfWBgN51yEnIoLlqirhaWYizXFy+/p9Of75OBIiccMzT7gLVUZXPrV3xZDrLJNW/85orYuNOEcaBaKeA==
+styled-jsx@3.2.5:
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.2.5.tgz#0172a3e13a0d6d8bf09167dcaf32cf7102d932ca"
+ integrity sha512-prEahkYwQHomUljJzXzrFnBmQrSMtWOBbXn8QeEkpfFkqMZQGshxzzp4H8ebBIsbVlHF/3+GSXMnmK/fp7qVYQ==
+ dependencies:
+ "@babel/types" "7.8.3"
+ babel-plugin-syntax-jsx "6.18.0"
+ convert-source-map "1.7.0"
+ loader-utils "1.2.3"
+ source-map "0.7.3"
+ string-hash "1.1.3"
+ stylis "3.5.4"
+ stylis-rule-sheet "0.0.10"
+
+styled-react-modal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/styled-react-modal/-/styled-react-modal-2.0.1.tgz#513d47bdbdba67f474a8a4dfeb13d072a172c7fc"
+ integrity sha512-uoyPlwdM8FLmdOE8dvA3iv2IOnlqMsygPxLAZy8WaK0pEcon67+SWJY/osAWZuBvRKtSo/VXn1fRCYVgbD0KUQ==
styled-theming@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/styled-theming/-/styled-theming-2.2.0.tgz#3084e43d40eaab4bc11ebafd3de04e3622fee37e"
integrity sha1-MITkPUDqq0vBHrr9PeBONiL+434=
-stylehacks@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
- integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
- dependencies:
- browserslist "^4.0.0"
- postcss "^7.0.0"
- postcss-selector-parser "^3.0.0"
+stylis-rule-sheet@0.0.10:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430"
+ integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==
-subscriptions-transport-ws@^0.9.11, subscriptions-transport-ws@^0.9.16:
+stylis@3.5.4:
+ version "3.5.4"
+ resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe"
+ integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==
+
+subscriptions-transport-ws@^0.9.11:
version "0.9.16"
resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.16.tgz#90a422f0771d9c32069294c08608af2d47f596ec"
integrity sha512-pQdoU7nC+EpStXnCfh/+ho0zE0Z+ma+i7xvj7bkXKb1dvYHSZxgRPaU6spRP+Bjzow67c/rRDoix5RT0uU9omw==
@@ -17275,13 +12079,6 @@ subscriptions-transport-ws@^0.9.11, subscriptions-transport-ws@^0.9.16:
symbol-observable "^1.0.4"
ws "^5.2.0"
-supports-color@6.1.0, supports-color@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
- integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
- dependencies:
- has-flag "^3.0.0"
-
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -17294,6 +12091,13 @@ supports-color@^5.3.0, supports-color@^5.5.0:
dependencies:
has-flag "^3.0.0"
+supports-color@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ dependencies:
+ has-flag "^3.0.0"
+
supports-color@^7.0.0, supports-color@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
@@ -17306,7 +12110,20 @@ svg-parser@^2.0.0:
resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5"
integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==
-svgo@^1.0.0, svgo@^1.2.2:
+svgo@^0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
+ integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=
+ dependencies:
+ 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"
+
+svgo@^1.2.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==
@@ -17325,16 +12142,11 @@ svgo@^1.0.0, svgo@^1.2.2:
unquote "~1.1.1"
util.promisify "~1.0.0"
-symbol-observable@^1.0.2, symbol-observable@^1.0.4:
+symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
-symbol-tree@^3.2.2:
- version "3.2.4"
- resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
- integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
-
symbol.prototype.description@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.2.tgz#f325e1e6ad534b3b29c9c3ca73c136c9ce03c5e2"
@@ -17348,42 +12160,12 @@ synchronous-promise@^2.0.6:
resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.10.tgz#e64c6fd3afd25f423963353043f4a68ebd397fd8"
integrity sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A==
-table@^5.2.3:
- version "5.4.6"
- resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
- integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
- dependencies:
- ajv "^6.10.2"
- lodash "^4.17.14"
- slice-ansi "^2.1.0"
- string-width "^3.0.0"
-
tapable@^1.0.0, tapable@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
-tar-stream@^2.1.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.2.tgz#6d5ef1a7e5783a95ff70b69b97455a5968dc1325"
- integrity sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==
- dependencies:
- bl "^4.0.1"
- end-of-stream "^1.4.1"
- fs-constants "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^3.1.1"
-
-tar@^2.0.0:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
- integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==
- dependencies:
- block-stream "*"
- fstream "^1.0.12"
- inherits "2"
-
-tar@^4.4.10, tar@^4.4.12, tar@^4.4.2, tar@^4.4.8:
+tar@^4.4.2:
version "4.4.13"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
@@ -17410,58 +12192,11 @@ telejson@^3.2.0:
lodash "^4.17.15"
memoizerific "^1.11.3"
-temp-dir@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
- integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=
-
-temp-write@^3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492"
- integrity sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI=
- dependencies:
- graceful-fs "^4.1.2"
- is-stream "^1.1.0"
- make-dir "^1.0.0"
- pify "^3.0.0"
- temp-dir "^1.0.0"
- uuid "^3.0.1"
-
-tempfile@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265"
- integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU=
- dependencies:
- temp-dir "^1.0.0"
- uuid "^3.0.1"
-
-term-size@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
- integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=
- dependencies:
- execa "^0.7.0"
-
term-size@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753"
integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==
-terser-webpack-plugin@2.3.5, terser-webpack-plugin@^2.1.2:
- version "2.3.5"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81"
- integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==
- dependencies:
- cacache "^13.0.1"
- find-cache-dir "^3.2.0"
- jest-worker "^25.1.0"
- p-limit "^2.2.2"
- schema-utils "^2.6.4"
- serialize-javascript "^2.1.2"
- source-map "^0.6.1"
- terser "^4.4.3"
- webpack-sources "^1.4.3"
-
terser-webpack-plugin@^1.4.3:
version "1.4.3"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c"
@@ -17477,24 +12212,38 @@ terser-webpack-plugin@^1.4.3:
webpack-sources "^1.4.0"
worker-farm "^1.7.0"
-terser@^4.1.2, terser@^4.4.3, terser@^4.6.3:
- version "4.6.10"
- resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.10.tgz#90f5bd069ff456ddbc9503b18e52f9c493d3b7c2"
- integrity sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==
+terser-webpack-plugin@^2.1.2:
+ version "2.3.5"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81"
+ integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==
+ dependencies:
+ cacache "^13.0.1"
+ find-cache-dir "^3.2.0"
+ jest-worker "^25.1.0"
+ p-limit "^2.2.2"
+ schema-utils "^2.6.4"
+ serialize-javascript "^2.1.2"
+ source-map "^0.6.1"
+ terser "^4.4.3"
+ webpack-sources "^1.4.3"
+
+terser@4.6.7:
+ version "4.6.7"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72"
+ integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==
dependencies:
commander "^2.20.0"
source-map "~0.6.1"
source-map-support "~0.5.12"
-test-exclude@^5.2.3:
- version "5.2.3"
- resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0"
- integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==
+terser@^4.1.2, terser@^4.4.3, terser@^4.6.3:
+ version "4.6.11"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.11.tgz#12ff99fdd62a26de2a82f508515407eb6ccd8a9f"
+ integrity sha512-76Ynm7OXUG5xhOpblhytE7X58oeNSmC8xnNhjWVo8CksHit0U0kO4hfNbPrrYwowLWFgM2n9L176VNx2QaHmtA==
dependencies:
- glob "^7.1.3"
- minimatch "^3.0.4"
- read-pkg-up "^4.0.0"
- require-main-filename "^2.0.0"
+ commander "^2.20.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.12"
text-extensions@^1.0.0:
version "1.9.0"
@@ -17506,37 +12255,11 @@ text-hex@1.0.x:
resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==
-text-table@0.2.0, text-table@^0.2.0:
+text-table@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
-then-fs@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/then-fs/-/then-fs-2.0.0.tgz#72f792dd9d31705a91ae19ebfcf8b3f968c81da2"
- integrity sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=
- dependencies:
- promise ">=3.2 <8"
-
-thenify-all@^1.0.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
- integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=
- dependencies:
- thenify ">= 3.1.0 < 4"
-
-"thenify@>= 3.1.0 < 4":
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839"
- integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=
- dependencies:
- any-promise "^1.0.0"
-
-throat@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
- integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=
-
throttle-debounce@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.1.0.tgz#257e648f0a56bd9e54fe0f132c4ab8611df4e1d5"
@@ -17557,26 +12280,11 @@ through2@^3.0.0:
dependencies:
readable-stream "2 || 3"
-through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6:
+through@2, "through@>=2.2.7 <3", through@^2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
-thunkify@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d"
- integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=
-
-thunky@^1.0.2:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
- integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
-
-timed-out@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
- integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
-
timers-browserify@^2.0.4:
version "2.0.11"
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
@@ -17584,25 +12292,20 @@ timers-browserify@^2.0.4:
dependencies:
setimmediate "^1.0.4"
-timsort@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
- integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
-
tiny-emitter@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
-tiny-invariant@^1.0.2, tiny-invariant@^1.1.0:
+tiny-invariant@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875"
integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==
tiny-secp256k1@^1.1.1, tiny-secp256k1@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.3.tgz#e93b1e1bf62e9bd1ad3ab24af27ff6127ce0e077"
- integrity sha512-ZpobrhOtHP98VYEN51IYQH1YcrbFpnxFhI6ceWa3OEbJn7eHvSd8YFjGPxbedGCy7PNYU1v/+BRsdvyr5uRd4g==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.4.tgz#772a7711baaa9e2bffa92708cafadc9d372907a3"
+ integrity sha512-O7NfGzBdBy/jamehZ1ptutZsh2c+9pq2Pu+KPv75+yzk5/Q/6lppQGMUJucHdRGdkeBcAUeLAOdJInEAZgZ53A==
dependencies:
bindings "^1.3.0"
bn.js "^4.11.8"
@@ -17610,35 +12313,18 @@ tiny-secp256k1@^1.1.1, tiny-secp256k1@^1.1.3:
elliptic "^6.4.0"
nan "^2.13.2"
-tiny-warning@^1.0.0, tiny-warning@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
- integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
-
tinycolor2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"
integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=
-tmp@0.0.33, tmp@^0.0.33:
+tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
dependencies:
os-tmpdir "~1.0.2"
-tmp@0.1.0, tmp@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
- integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
- dependencies:
- rimraf "^2.6.3"
-
-tmpl@1.0.x:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
- integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
-
to-arraybuffer@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
@@ -17691,11 +12377,6 @@ toidentifier@1.0.0:
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
-toml@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee"
- integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==
-
toposort@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330"
@@ -17710,25 +12391,10 @@ tough-cookie@3.0.1:
psl "^1.1.28"
punycode "^2.1.1"
-tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
- integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
- dependencies:
- psl "^1.1.28"
- punycode "^2.1.1"
-
-tr46@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
- integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=
- dependencies:
- punycode "^2.1.0"
-
-tree-kill@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
- integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
+traverse@0.6.6:
+ version "0.6.6"
+ resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137"
+ integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=
trim-newlines@^1.0.0:
version "1.0.0"
@@ -17750,12 +12416,10 @@ triple-beam@^1.2.0, triple-beam@^1.3.0:
resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"
integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==
-"true-case-path@^1.0.2":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
- integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==
- dependencies:
- glob "^7.1.2"
+tryer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
+ integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
ts-dedent@^1.1.0:
version "1.1.1"
@@ -17769,38 +12433,94 @@ ts-invariant@^0.4.0, ts-invariant@^0.4.4:
dependencies:
tslib "^1.9.3"
-ts-loader@^6.2.2:
- version "6.2.2"
- resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.2.tgz#dffa3879b01a1a1e0a4b85e2b8421dc0dfff1c58"
- integrity sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ==
- dependencies:
- chalk "^2.3.0"
- enhanced-resolve "^4.0.0"
- loader-utils "^1.0.2"
- micromatch "^4.0.0"
- semver "^6.0.0"
-
-ts-pnp@1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a"
- integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ==
-
-ts-pnp@^1.1.2, ts-pnp@^1.1.6:
+ts-pnp@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
-tslib@1.9.3:
- version "1.9.3"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
- integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
+tslib@1.9.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
+ integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==
-tslib@^1, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
+tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
version "1.11.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
-tsutils@^3.17.1:
+tslint-config-airbnb@^5.11.2:
+ version "5.11.2"
+ resolved "https://registry.yarnpkg.com/tslint-config-airbnb/-/tslint-config-airbnb-5.11.2.tgz#2f3d239fa3923be8e7a4372217a7ed552671528f"
+ integrity sha512-mUpHPTeeCFx8XARGG/kzYP4dPSOgoCqNiYbGHh09qTH8q+Y1ghsOgaeZKYYQT7IyxMos523z/QBaiv2zKNBcow==
+ dependencies:
+ tslint-consistent-codestyle "^1.14.1"
+ tslint-eslint-rules "^5.4.0"
+ tslint-microsoft-contrib "~5.2.1"
+
+tslint-consistent-codestyle@^1.14.1:
+ version "1.16.0"
+ resolved "https://registry.yarnpkg.com/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.16.0.tgz#52348ea899a7e025b37cc6545751c6a566a19077"
+ integrity sha512-ebR/xHyMEuU36hGNOgCfjGBNYxBPixf0yU1Yoo6s3BrpBRFccjPOmIVaVvQsWAUAMdmfzHOCihVkcaMfimqvHw==
+ dependencies:
+ "@fimbul/bifrost" "^0.21.0"
+ tslib "^1.7.1"
+ tsutils "^2.29.0"
+
+tslint-eslint-rules@^5.4.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5"
+ integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==
+ dependencies:
+ doctrine "0.7.2"
+ tslib "1.9.0"
+ tsutils "^3.0.0"
+
+tslint-microsoft-contrib@~5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz#a6286839f800e2591d041ea2800c77487844ad81"
+ integrity sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==
+ dependencies:
+ tsutils "^2.27.2 <2.29.0"
+
+tslint-react-hooks@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/tslint-react-hooks/-/tslint-react-hooks-2.2.2.tgz#4dc9b3986196802d45c11cc0bf6319a8116fe2ed"
+ integrity sha512-gtwA14+WevNUtlBhvAD5Ukpxt2qMegYI7IDD8zN/3JXLksdLdEuU/T/oqlI1CtZhMJffqyNn+aqq2oUqUFXiNA==
+
+tslint@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.1.tgz#ac03fbd17f85bfefaae348b353b25a88efe10cde"
+ integrity sha512-kd6AQ/IgPRpLn6g5TozqzPdGNZ0q0jtXW4//hRcj10qLYBaa3mTUU2y2MCG+RXZm8Zx+KZi0eA+YCrMyNlF4UA==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ builtin-modules "^1.1.1"
+ chalk "^2.3.0"
+ commander "^2.12.1"
+ diff "^4.0.1"
+ glob "^7.1.1"
+ js-yaml "^3.13.1"
+ minimatch "^3.0.4"
+ mkdirp "^0.5.3"
+ resolve "^1.3.2"
+ semver "^5.3.0"
+ tslib "^1.10.0"
+ tsutils "^2.29.0"
+
+"tsutils@^2.27.2 <2.29.0":
+ version "2.28.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1"
+ integrity sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==
+ dependencies:
+ tslib "^1.8.1"
+
+tsutils@^2.29.0:
+ version "2.29.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
+ integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
+ dependencies:
+ tslib "^1.8.1"
+
+tsutils@^3.0.0, tsutils@^3.5.0:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
@@ -17812,7 +12532,7 @@ tty-browserify@0.0.0:
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
-tunnel-agent@0.6.0, tunnel-agent@^0.6.0:
+tunnel-agent@0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
@@ -17834,29 +12554,17 @@ tweetnacl@^1.0.0:
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
-type-check@~0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
- integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
- dependencies:
- prelude-ls "~1.1.2"
-
type-fest@^0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
-type-fest@^0.3.0:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1"
- integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==
-
type-fest@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
-type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18:
+type-is@~1.6.17, type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
@@ -17894,11 +12602,6 @@ typescript@^3.8.3:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061"
integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==
-ua-parser-js@^0.7.18:
- version "0.7.21"
- resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777"
- integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==
-
uglify-js@^3.1.4:
version "3.8.1"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.8.1.tgz#43bb15ce6f545eaa0a64c49fd29375ea09fa0f93"
@@ -17907,22 +12610,12 @@ uglify-js@^3.1.4:
commander "~2.20.3"
source-map "~0.6.1"
-uid-number@0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
- integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=
-
-umask@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
- integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=
-
underscore@^1.10.2:
version "1.10.2"
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf"
integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==
-unfetch@^4.1.0:
+unfetch@^4.0.0, unfetch@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.1.0.tgz#6ec2dd0de887e58a4dee83a050ded80ffc4137db"
integrity sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg==
@@ -17965,11 +12658,6 @@ uniq@^1.0.1:
resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
-uniqs@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
- integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
-
unique-filename@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
@@ -17984,27 +12672,6 @@ unique-slug@^2.0.0:
dependencies:
imurmurhash "^0.1.4"
-unique-string@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
- integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
- dependencies:
- crypto-random-string "^1.0.0"
-
-universal-user-agent@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.1.tgz#fd8d6cb773a679a709e967ef8288a31fcc03e557"
- integrity sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==
- dependencies:
- os-name "^3.1.0"
-
-universal-user-agent@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-5.0.0.tgz#a3182aa758069bf0e79952570ca757de3579c1d9"
- integrity sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==
- dependencies:
- os-name "^3.1.0"
-
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
@@ -18028,12 +12695,7 @@ unset-value@^1.0.0:
has-value "^0.3.1"
isobject "^3.0.0"
-unzip-response@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
- integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
-
-upath@^1.1.1, upath@^1.2.0:
+upath@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
@@ -18050,7 +12712,7 @@ urix@^0.1.0:
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
-url-loader@2.3.0, url-loader@^2.0.1:
+url-loader@^2.0.1:
version "2.3.0"
resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b"
integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==
@@ -18059,13 +12721,6 @@ url-loader@2.3.0, url-loader@^2.0.1:
mime "^2.4.4"
schema-utils "^2.5.0"
-url-parse-lax@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
- integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
- dependencies:
- prepend-http "^1.0.1"
-
url-parse@^1.4.3:
version "1.4.7"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278"
@@ -18095,6 +12750,11 @@ use-sidecar@^1.0.1:
detect-node "^2.0.4"
tslib "^1.9.3"
+use-subscription@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.1.1.tgz#5509363e9bb152c4fb334151d4dceb943beaa7bb"
+ integrity sha512-gk4fPTYvNhs6Ia7u8/+K7bM7sZ7O7AMfWtS+zPO8luH+zWuiGgGcrW0hL4MRWZSzXo+4ofNorf87wZwBKz2YdQ==
+
use@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
@@ -18105,13 +12765,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-util-promisify@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53"
- integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=
- dependencies:
- object.getownpropertydescriptors "^2.0.3"
-
util.promisify@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
@@ -18154,7 +12807,7 @@ utils-merge@1.0.1:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
-uuid@3.4.0, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2:
+uuid@3.4.0, uuid@^3.1.0, uuid@^3.3.2:
version "3.4.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
@@ -18164,17 +12817,7 @@ uuid@^7.0.3:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==
-v8-compile-cache@2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe"
- integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==
-
-v8-compile-cache@^2.0.3:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
- integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
-
-validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3:
+validate-npm-package-license@^3.0.1:
version "3.0.4"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
@@ -18182,18 +12825,6 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
-validate-npm-package-name@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
- integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34=
- dependencies:
- builtins "^1.0.3"
-
-value-equal@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c"
- integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==
-
varuint-bitcoin@^1.0.4:
version "1.1.2"
resolved "https://registry.yarnpkg.com/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz#e76c138249d06138b480d4c5b40ef53693e24e92"
@@ -18206,11 +12837,6 @@ vary@^1, vary@~1.1.2:
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
-vendors@^1.0.0:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
- integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
-
verror@1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
@@ -18510,34 +13136,6 @@ vm-browserify@^1.0.1:
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
-vscode-languageserver-types@^3.5.0:
- version "3.15.1"
- resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de"
- integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==
-
-w3c-hr-time@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
- integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
- dependencies:
- browser-process-hrtime "^1.0.0"
-
-w3c-xmlserializer@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794"
- integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==
- dependencies:
- domexception "^1.0.1"
- webidl-conversions "^4.0.2"
- xml-name-validator "^3.0.0"
-
-walker@^1.0.7, walker@~1.0.5:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
- integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=
- dependencies:
- makeerror "1.0.x"
-
warning@^4.0.2, warning@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
@@ -18545,6 +13143,14 @@ warning@^4.0.2, warning@^4.0.3:
dependencies:
loose-envify "^1.0.0"
+watchpack@2.0.0-beta.13:
+ version "2.0.0-beta.13"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0-beta.13.tgz#9d9b0c094b8402139333e04eb6194643c8384f55"
+ integrity sha512-ZEFq2mx/k5qgQwgi6NOm+2ImICb8ngAkA/rZ6oyXZ7SgPn3pncf+nfhYTCrs3lmHwOxnPtGLTOuFLfpSMh1VMA==
+ dependencies:
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.1.2"
+
watchpack@^1.6.0:
version "1.6.1"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2"
@@ -18554,43 +13160,26 @@ watchpack@^1.6.0:
graceful-fs "^4.1.2"
neo-async "^2.5.0"
-wbuf@^1.1.0, wbuf@^1.7.3:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
- integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
+webpack-bundle-analyzer@3.6.1:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.1.tgz#bdb637c2304424f2fbff9a950c7be42a839ae73b"
+ integrity sha512-Nfd8HDwfSx1xBwC+P8QMGvHAOITxNBSvu/J/mCJvOwv+G4VWkU7zir9SSenTtyCi0LnVtmsc7G5SZo1uV+bxRw==
dependencies:
- minimalistic-assert "^1.0.0"
+ acorn "^7.1.1"
+ acorn-walk "^7.1.1"
+ bfj "^6.1.1"
+ chalk "^2.4.1"
+ commander "^2.18.0"
+ ejs "^2.6.1"
+ express "^4.16.3"
+ filesize "^3.6.1"
+ gzip-size "^5.0.0"
+ lodash "^4.17.15"
+ mkdirp "^0.5.1"
+ opener "^1.5.1"
+ ws "^6.0.0"
-wcwidth@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
- integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
- dependencies:
- defaults "^1.0.3"
-
-webidl-conversions@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
- integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
-
-webpack-cli@^3.3.11:
- version "3.3.11"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631"
- integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==
- dependencies:
- chalk "2.4.2"
- cross-spawn "6.0.5"
- enhanced-resolve "4.1.0"
- findup-sync "3.0.0"
- global-modules "2.0.0"
- import-local "2.0.0"
- interpret "1.2.0"
- loader-utils "1.2.3"
- supports-color "6.1.0"
- v8-compile-cache "2.0.3"
- yargs "13.2.4"
-
-webpack-dev-middleware@^3.7.0, webpack-dev-middleware@^3.7.2:
+webpack-dev-middleware@^3.7.0:
version "3.7.2"
resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3"
integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==
@@ -18601,45 +13190,6 @@ webpack-dev-middleware@^3.7.0, webpack-dev-middleware@^3.7.2:
range-parser "^1.2.1"
webpack-log "^2.0.0"
-webpack-dev-server@3.10.3:
- version "3.10.3"
- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0"
- integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==
- dependencies:
- ansi-html "0.0.7"
- bonjour "^3.5.0"
- chokidar "^2.1.8"
- compression "^1.7.4"
- connect-history-api-fallback "^1.6.0"
- debug "^4.1.1"
- del "^4.1.1"
- express "^4.17.1"
- html-entities "^1.2.1"
- http-proxy-middleware "0.19.1"
- import-local "^2.0.0"
- internal-ip "^4.3.0"
- ip "^1.1.5"
- is-absolute-url "^3.0.3"
- killable "^1.0.1"
- loglevel "^1.6.6"
- opn "^5.5.0"
- p-retry "^3.0.1"
- portfinder "^1.0.25"
- schema-utils "^1.0.0"
- selfsigned "^1.10.7"
- semver "^6.3.0"
- serve-index "^1.9.1"
- sockjs "0.3.19"
- sockjs-client "1.4.0"
- spdy "^4.0.1"
- strip-ansi "^3.0.1"
- supports-color "^6.1.0"
- url "^0.11.0"
- webpack-dev-middleware "^3.7.2"
- webpack-log "^2.0.0"
- ws "^6.2.1"
- yargs "12.0.5"
-
webpack-hot-middleware@^2.25.0:
version "2.25.0"
resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz#4528a0a63ec37f8f8ef565cf9e534d57d09fe706"
@@ -18650,16 +13200,6 @@ webpack-hot-middleware@^2.25.0:
querystring "^0.2.0"
strip-ansi "^3.0.0"
-webpack-log@^1.1.2, webpack-log@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d"
- integrity sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==
- dependencies:
- chalk "^2.1.0"
- log-symbols "^2.1.0"
- loglevelnext "^1.0.1"
- uuid "^3.1.0"
-
webpack-log@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"
@@ -18668,34 +13208,7 @@ webpack-log@^2.0.0:
ansi-colors "^3.0.0"
uuid "^3.3.2"
-webpack-manifest-plugin@2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16"
- integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==
- dependencies:
- fs-extra "^7.0.0"
- lodash ">=3.5 <5"
- object.entries "^1.1.0"
- tapable "^1.0.0"
-
-webpack-merge@^4.2.2:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d"
- integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==
- dependencies:
- lodash "^4.17.15"
-
-webpack-node-externals@^1.7.2:
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz#6e1ee79ac67c070402ba700ef033a9b8d52ac4e3"
- integrity sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg==
-
-webpack-shell-plugin@^0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/webpack-shell-plugin/-/webpack-shell-plugin-0.5.0.tgz#29b8a1d80ddeae0ddb10e729667f728653c2c742"
- integrity sha1-Kbih2A3erg3bEOcpZn9yhlPCx0I=
-
-webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
+webpack-sources@1.4.3, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
version "1.4.3"
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
@@ -18739,7 +13252,7 @@ webpack@4.42.0:
watchpack "^1.6.0"
webpack-sources "^1.4.1"
-webpack@^4.33.0, webpack@^4.38.0, webpack@^4.42.1:
+webpack@^4.33.0, webpack@^4.38.0:
version "4.42.1"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.1.tgz#ae707baf091f5ca3ef9c38b884287cfe8f1983ef"
integrity sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==
@@ -18790,45 +13303,15 @@ websocket-extensions@>=0.1.1:
resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
-whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
- integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
- dependencies:
- iconv-lite "0.4.24"
-
-whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0:
+whatwg-fetch@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==
-whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
- integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
-
-whatwg-url@^6.4.1:
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8"
- integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==
- dependencies:
- lodash.sortby "^4.7.0"
- tr46 "^1.0.1"
- webidl-conversions "^4.0.2"
-
-whatwg-url@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"
- integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==
- dependencies:
- lodash.sortby "^4.7.0"
- tr46 "^1.0.1"
- webidl-conversions "^4.0.2"
-
-which-module@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
- integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
+whet.extend@~0.9.9:
+ version "0.9.9"
+ resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
+ integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=
which-module@^2.0.0:
version "2.0.0"
@@ -18840,7 +13323,7 @@ which-pm-runs@^1.0.0:
resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=
-which@1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1:
+which@^1.2.9, which@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
@@ -18861,13 +13344,6 @@ wide-align@^1.1.0:
dependencies:
string-width "^1.0.2 || 2"
-widest-line@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc"
- integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==
- dependencies:
- string-width "^2.1.1"
-
widest-line@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
@@ -18887,13 +13363,6 @@ window-size@^0.1.4:
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876"
integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=
-windows-release@^3.1.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f"
- integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==
- dependencies:
- execa "^1.0.0"
-
winston-transport@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66"
@@ -18917,151 +13386,11 @@ winston@^3.2.1:
triple-beam "^1.3.0"
winston-transport "^4.3.0"
-word-wrap@~1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
- integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
-
wordwrap@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
-workbox-background-sync@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950"
- integrity sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-broadcast-update@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b"
- integrity sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-build@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64"
- integrity sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==
- dependencies:
- "@babel/runtime" "^7.3.4"
- "@hapi/joi" "^15.0.0"
- common-tags "^1.8.0"
- fs-extra "^4.0.2"
- glob "^7.1.3"
- lodash.template "^4.4.0"
- pretty-bytes "^5.1.0"
- stringify-object "^3.3.0"
- strip-comments "^1.0.2"
- workbox-background-sync "^4.3.1"
- workbox-broadcast-update "^4.3.1"
- workbox-cacheable-response "^4.3.1"
- workbox-core "^4.3.1"
- workbox-expiration "^4.3.1"
- workbox-google-analytics "^4.3.1"
- workbox-navigation-preload "^4.3.1"
- workbox-precaching "^4.3.1"
- workbox-range-requests "^4.3.1"
- workbox-routing "^4.3.1"
- workbox-strategies "^4.3.1"
- workbox-streams "^4.3.1"
- workbox-sw "^4.3.1"
- workbox-window "^4.3.1"
-
-workbox-cacheable-response@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91"
- integrity sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-core@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6"
- integrity sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==
-
-workbox-expiration@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921"
- integrity sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-google-analytics@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a"
- integrity sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==
- dependencies:
- workbox-background-sync "^4.3.1"
- workbox-core "^4.3.1"
- workbox-routing "^4.3.1"
- workbox-strategies "^4.3.1"
-
-workbox-navigation-preload@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d"
- integrity sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-precaching@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba"
- integrity sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-range-requests@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74"
- integrity sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-routing@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda"
- integrity sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-strategies@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646"
- integrity sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-streams@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3"
- integrity sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==
- dependencies:
- workbox-core "^4.3.1"
-
-workbox-sw@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164"
- integrity sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==
-
-workbox-webpack-plugin@4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd"
- integrity sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==
- dependencies:
- "@babel/runtime" "^7.0.0"
- json-stable-stringify "^1.0.1"
- workbox-build "^4.3.1"
-
-workbox-window@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3"
- integrity sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==
- dependencies:
- workbox-core "^4.3.1"
-
worker-farm@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
@@ -19084,77 +13413,28 @@ wrap-ansi@^2.0.0:
string-width "^1.0.1"
strip-ansi "^3.0.1"
-wrap-ansi@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
- integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+wrap-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba"
+ integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=
dependencies:
- ansi-styles "^3.2.0"
- string-width "^3.0.0"
- strip-ansi "^5.0.0"
+ string-width "^2.1.1"
+ strip-ansi "^4.0.0"
+
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-write-file-atomic@2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529"
- integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==
- dependencies:
- graceful-fs "^4.1.11"
- imurmurhash "^0.1.4"
- signal-exit "^3.0.2"
-
-write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2:
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481"
- integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
- dependencies:
- graceful-fs "^4.1.11"
- imurmurhash "^0.1.4"
- signal-exit "^3.0.2"
-
-write-json-file@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f"
- integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=
- dependencies:
- detect-indent "^5.0.0"
- graceful-fs "^4.1.2"
- make-dir "^1.0.0"
- pify "^3.0.0"
- sort-keys "^2.0.0"
- write-file-atomic "^2.0.0"
-
-write-json-file@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a"
- integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==
- dependencies:
- detect-indent "^5.0.0"
- graceful-fs "^4.1.15"
- make-dir "^2.1.0"
- pify "^4.0.1"
- sort-keys "^2.0.0"
- write-file-atomic "^2.4.2"
-
-write-pkg@^3.1.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.2.0.tgz#0e178fe97820d389a8928bc79535dbe68c2cff21"
- integrity sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==
- dependencies:
- sort-keys "^2.0.0"
- write-json-file "^2.2.0"
-
-write@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
- integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
- dependencies:
- mkdirp "^0.5.1"
-
ws@7.2.3:
version "7.2.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46"
@@ -19167,86 +13447,28 @@ ws@^5.2.0:
dependencies:
async-limiter "~1.0.0"
-ws@^6.0.0, ws@^6.1.2, ws@^6.2.1:
+ws@^6.0.0:
version "6.2.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
dependencies:
async-limiter "~1.0.0"
-xdg-basedir@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
- integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
-
-xml-name-validator@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
- integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
-
-xml2js@0.4.19:
- version "0.4.19"
- resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
- integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==
- dependencies:
- sax ">=0.6.0"
- xmlbuilder "~9.0.1"
-
-xml2js@^0.4.17:
- version "0.4.23"
- resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66"
- integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==
- dependencies:
- sax ">=0.6.0"
- xmlbuilder "~11.0.0"
-
-xmlbuilder@~11.0.0:
- version "11.0.1"
- resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
- integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
-
-xmlbuilder@~9.0.1:
- version "9.0.7"
- resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
- integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
-
-xmlchars@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
- integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
-
-xregexp@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
- integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=
-
-xregexp@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50"
- integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==
- dependencies:
- "@babel/runtime-corejs3" "^7.8.3"
-
xtend@^4.0.0, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
-y18n@^3.2.0, y18n@^3.2.1:
+y18n@^3.2.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
-"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
+y18n@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
-yallist@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
- integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
-
yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
@@ -19271,106 +13493,32 @@ yargs-parser@^10.0.0:
dependencies:
camelcase "^4.1.0"
-yargs-parser@^11.1.1:
- version "11.1.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
- integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
+yargs-parser@^16.1.0:
+ version "16.1.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1"
+ integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
-yargs-parser@^13.1.0, yargs-parser@^13.1.2:
- version "13.1.2"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
- integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+yargs@15.0.2:
+ version "15.0.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.0.2.tgz#4248bf218ef050385c4f7e14ebdf425653d13bd3"
+ integrity sha512-GH/X/hYt+x5hOat4LMnCqMd8r5Cv78heOMIJn1hr7QPPBqfeC6p89Y78+WB9yGDvfpCvgasfmWLzNzEioOUD9Q==
dependencies:
- camelcase "^5.0.0"
+ cliui "^6.0.0"
decamelize "^1.2.0"
-
-yargs-parser@^15.0.1:
- version "15.0.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3"
- integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==
- dependencies:
- camelcase "^5.0.0"
- decamelize "^1.2.0"
-
-yargs-parser@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
- integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=
- dependencies:
- camelcase "^3.0.0"
-
-yargs@12.0.5:
- version "12.0.5"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
- integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==
- dependencies:
- cliui "^4.0.0"
- decamelize "^1.2.0"
- find-up "^3.0.0"
- get-caller-file "^1.0.1"
- os-locale "^3.0.0"
- require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^2.0.0"
- which-module "^2.0.0"
- y18n "^3.2.1 || ^4.0.0"
- yargs-parser "^11.1.1"
-
-yargs@13.2.4:
- version "13.2.4"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83"
- integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==
- dependencies:
- cliui "^5.0.0"
- find-up "^3.0.0"
- get-caller-file "^2.0.1"
- os-locale "^3.1.0"
- require-directory "^2.1.1"
- require-main-filename "^2.0.0"
- set-blocking "^2.0.0"
- string-width "^3.0.0"
- which-module "^2.0.0"
- y18n "^4.0.0"
- yargs-parser "^13.1.0"
-
-yargs@^13.3.0:
- version "13.3.2"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
- integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
- dependencies:
- cliui "^5.0.0"
- find-up "^3.0.0"
+ find-up "^4.1.0"
get-caller-file "^2.0.1"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
- string-width "^3.0.0"
+ string-width "^4.2.0"
which-module "^2.0.0"
y18n "^4.0.0"
- yargs-parser "^13.1.2"
+ yargs-parser "^16.1.0"
-yargs@^14.2.2:
- version "14.2.3"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414"
- integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==
- dependencies:
- cliui "^5.0.0"
- decamelize "^1.2.0"
- find-up "^3.0.0"
- get-caller-file "^2.0.1"
- require-directory "^2.1.1"
- require-main-filename "^2.0.0"
- set-blocking "^2.0.0"
- string-width "^3.0.0"
- which-module "^2.0.0"
- y18n "^4.0.0"
- yargs-parser "^15.0.1"
-
-yargs@^3.10.0, yargs@^3.19.0:
+yargs@^3.10.0:
version "3.32.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"
integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=
@@ -19383,25 +13531,6 @@ yargs@^3.10.0, yargs@^3.19.0:
window-size "^0.1.4"
y18n "^3.2.0"
-yargs@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
- integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=
- dependencies:
- camelcase "^3.0.0"
- cliui "^3.2.0"
- decamelize "^1.1.1"
- get-caller-file "^1.0.1"
- os-locale "^1.4.0"
- read-pkg-up "^1.0.1"
- require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^1.0.2"
- which-module "^1.0.0"
- y18n "^3.2.1"
- yargs-parser "^5.0.0"
-
yup@^0.27.0:
version "0.27.0"
resolved "https://registry.yarnpkg.com/yup/-/yup-0.27.0.tgz#f8cb198c8e7dd2124beddc2457571329096b06e7"
@@ -19414,10 +13543,10 @@ yup@^0.27.0:
synchronous-promise "^2.0.6"
toposort "^2.0.2"
-zen-observable-ts@^0.8.20:
- version "0.8.20"
- resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.20.tgz#44091e335d3fcbc97f6497e63e7f57d5b516b163"
- integrity sha512-2rkjiPALhOtRaDX6pWyNqK1fnP5KkJJybYebopNSn6wDG1lxBoFs2+nwwXKoA6glHIrtwrfBBy6da0stkKtTAA==
+zen-observable-ts@^0.8.21:
+ version "0.8.21"
+ resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d"
+ integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==
dependencies:
tslib "^1.9.3"
zen-observable "^0.8.0"