added: modal prompt to close previous connections when switch proxy

This commit is contained in:
Haishan 2020-06-07 17:09:23 +08:00
parent bbb9f55183
commit 201f6904c2
9 changed files with 414 additions and 228 deletions

View file

@ -34,7 +34,7 @@
"dependencies": {
"@babel/runtime": "^7.9.6",
"@hsjs/react-cache": "0.0.0-alpha.aa94237",
"@sentry/browser": "^5.15.0",
"@sentry/browser": "^5.16.1",
"chart.js": "^2.9.2",
"clsx": "^1.1.0",
"core-js": "^3.6.2",
@ -77,13 +77,13 @@
"@types/jest": "^25.2.1",
"@types/react": "^16.9.35",
"@types/react-dom": "^16.9.8",
"@typescript-eslint/eslint-plugin": "^3.0.0",
"@typescript-eslint/parser": "^3.0.0",
"@typescript-eslint/eslint-plugin": "^3.1.0",
"@typescript-eslint/parser": "^3.1.0",
"autoprefixer": "^9.7.3",
"babel-eslint": "10.x",
"babel-loader": "^8.0.5",
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^6.0.1",
"copy-webpack-plugin": "^6.0.2",
"css-loader": "^3.4.2",
"cssnano": "^4.1.7",
"eslint": "^7.0.0",
@ -103,7 +103,7 @@
"fork-ts-checker-webpack-plugin": "^4.1.5",
"html-webpack-plugin": "^4.3.0",
"husky": "^4.0.0",
"lint-staged": "^10.2.2",
"lint-staged": "^10.2.9",
"mini-css-extract-plugin": "^0.9.0",
"postcss-custom-media": "^7.0.8",
"postcss-extend-rule": "^3.0.0",
@ -115,9 +115,9 @@
"react-refresh": "^0.8.2",
"resize-observer-polyfill": "^1.5.1",
"style-loader": "^1.2.1",
"terser-webpack-plugin": "^3.0.1",
"terser-webpack-plugin": "^3.0.3",
"ts-loader": "^7.0.5",
"typescript": "^3.8.3",
"typescript": "^3.9.5",
"webpack": "^4.41.6",
"webpack-bundle-analyzer": "^3.6.0",
"webpack-cli": "^3.3.10",

View file

@ -82,4 +82,15 @@ async function closeAllConnections(apiConfig) {
return await fetch(url + endpoint, { ...init, method: 'DELETE' });
}
export async function fetchConns(apiConfig) {
const { url, init } = getURLAndInit(apiConfig);
return await fetch(url + endpoint, { ...init });
}
export async function closeConnById(apiConfig, id) {
const { url: baseURL, init } = getURLAndInit(apiConfig);
const url = `${baseURL}${endpoint}/${id}`;
return await fetch(url, { ...init, method: 'DELETE' });
}
export { fetchData, closeAllConnections };

View file

@ -0,0 +1,50 @@
import * as React from 'react';
import Button from '../Button';
import { FlexCenter } from '../shared/Styled';
const { useRef, useEffect } = React;
type Props = {
onClickPrimaryButton?: () => void;
onClickSecondaryButton?: () => void;
};
export function ClosePrevConns({
onClickPrimaryButton,
onClickSecondaryButton,
}: Props) {
const primaryButtonRef = useRef<HTMLButtonElement>(null);
const secondaryButtonRef = useRef<HTMLButtonElement>(null);
useEffect(() => {
primaryButtonRef.current.focus();
}, []);
const handleKeyDown = (e: React.KeyboardEvent) => {
if (e.keyCode === 39) {
secondaryButtonRef.current.focus();
} else if (e.keyCode === 37) {
primaryButtonRef.current.focus();
}
};
return (
<div onKeyDown={handleKeyDown}>
<h2>Close Connections?</h2>
<p>
Click "Yes" to close those connections that are still using the old
selected proxy in this group
</p>
<div style={{ height: 30 }} />
<FlexCenter>
<Button onClick={onClickPrimaryButton} ref={primaryButtonRef}>
Yes
</Button>
<div style={{ width: 20 }} />
<Button onClick={onClickSecondaryButton} ref={secondaryButtonRef}>
No
</Button>
</FlexCenter>
</div>
);
}

View file

@ -1,12 +1,13 @@
import * as React from 'react';
import { connect } from '../StateProvider';
import { connect, useStoreActions } from '../StateProvider';
import Button from '../Button';
import ContentHeader from '../ContentHeader';
import { ProxyGroup } from './ProxyGroup';
import BaseModal from '../shared/BaseModal';
import Settings from './Settings';
import { ClosePrevConns } from './ClosePrevConns';
import Equalizer from '../svg/Equalizer';
import { Zap } from 'react-feather';
@ -19,6 +20,7 @@ import {
getDelay,
getProxyGroupNames,
getProxyProviders,
getShowModalClosePrevConns,
fetchProxies,
requestDelayAll,
} from '../../store/proxies';
@ -26,7 +28,14 @@ import { getClashAPIConfig } from '../../store/app';
const { useState, useEffect, useCallback, useRef } = React;
function Proxies({ dispatch, groupNames, delay, proxyProviders, apiConfig }) {
function Proxies({
dispatch,
groupNames,
delay,
proxyProviders,
apiConfig,
showModalClosePrevConns,
}) {
const refFetchedTimestamp = useRef<{ startAt?: number; completeAt?: number }>(
{}
);
@ -69,6 +78,10 @@ function Proxies({ dispatch, groupNames, delay, proxyProviders, apiConfig }) {
setIsSettingsModalOpen(false);
}, []);
const {
proxies: { closeModalClosePrevConns, closePrevConnsAndTheModal },
} = useStoreActions();
return (
<>
<div className={s0.topBar}>
@ -84,7 +97,7 @@ function Proxies({ dispatch, groupNames, delay, proxyProviders, apiConfig }) {
</BaseModal>
<ContentHeader title="Proxies" />
<div>
{groupNames.map((groupName) => {
{groupNames.map((groupName: string) => {
return (
<div className={s0.group} key={groupName}>
<ProxyGroup
@ -105,6 +118,15 @@ function Proxies({ dispatch, groupNames, delay, proxyProviders, apiConfig }) {
text="Test Latency"
position={fabPosition}
/>
<BaseModal
isOpen={showModalClosePrevConns}
onRequestClose={closeModalClosePrevConns}
>
<ClosePrevConns
onClickPrimaryButton={() => closePrevConnsAndTheModal(apiConfig)}
onClickSecondaryButton={closeModalClosePrevConns}
/>
</BaseModal>
</>
);
}
@ -131,6 +153,7 @@ const mapState = (s) => ({
groupNames: getProxyGroupNames(s),
proxyProviders: getProxyProviders(s),
delay: getDelay(s),
showModalClosePrevConns: getShowModalClosePrevConns(s),
});
export default connect(mapState)(Proxies);

View file

@ -0,0 +1,5 @@
.FlexCenter {
display: flex;
justify-content: center;
align-items: center;
}

View file

@ -0,0 +1,6 @@
import * as React from 'react';
import s from './Styled.module.css';
export function FlexCenter({ children }: { children: React.ReactNode }) {
return <div className={s.FlexCenter}>{children}</div>;
}

View file

@ -1,20 +1,59 @@
import * as proxiesAPI from '../api/proxies';
import * as connAPI from '../api/connections';
import { getLatencyTestUrl } from './app';
// eslint-disable-next-line no-unused-vars
type ProxyProvider = {
name: string,
type: 'Proxy',
updatedAt: string,
vehicleType: 'HTTP' | 'File' | 'Compatible',
proxies: Array<{
history: Array<{ time: string, delay: number }>,
name: string,
// Shadowsocks, Http ...
type: string,
}>,
type PrimitiveProxyType = 'Shadowsocks' | 'Snell' | 'Socks5' | 'Http' | 'Vmess';
type LatencyHistory = Array<{ time: string; delay: number }>;
type ProxyItem = {
name: string;
type: PrimitiveProxyType;
history: LatencyHistory;
all?: string[];
now?: string;
};
type ProxyProvider = {
name: string;
type: 'Proxy';
updatedAt: string;
vehicleType: 'HTTP' | 'File' | 'Compatible';
proxies: Array<ProxyItem>;
};
type FormattedProxyProvider = Omit<ProxyProvider, 'proxies'> & {
proxies: string[];
};
type ProxiesDict = { [name: string]: ProxyItem };
type ProxiesState = {
proxies: ProxiesDict;
delay: { [key: string]: { number: number } };
groupNames: string[];
proxyProviders?: FormattedProxyProvider[];
dangleProxyNames?: string[];
showModalClosePrevConns: boolean;
switchProxyCtx?: {
to: { groupName: string; itemName: string };
};
};
type GlobalState = {
proxies: ProxiesState;
};
export const initialState: ProxiesState = {
proxies: {},
delay: {},
groupNames: [],
showModalClosePrevConns: false,
};
const noop = () => null;
// see all types:
// https://github.com/Dreamacro/clash/blob/master/constant/adapters.go
@ -32,22 +71,33 @@ const NonProxyTypes = [
'Unknown',
];
export const getProxies = (s) => s.proxies.proxies;
export const getDelay = (s) => s.proxies.delay;
export const getProxyGroupNames = (s) => s.proxies.groupNames;
export const getProxyProviders = (s) => s.proxies.proxyProviders || [];
export const getDangleProxyNames = (s) => s.proxies.dangleProxyNames;
export const getProxies = (s: GlobalState) => s.proxies.proxies;
export const getDelay = (s: GlobalState) => s.proxies.delay;
export const getProxyGroupNames = (s: GlobalState) => s.proxies.groupNames;
export const getProxyProviders = (s: GlobalState) =>
s.proxies.proxyProviders || [];
export const getDangleProxyNames = (s: GlobalState) =>
s.proxies.dangleProxyNames;
export const getShowModalClosePrevConns = (s: GlobalState) =>
s.proxies.showModalClosePrevConns;
export function fetchProxies(apiConfig) {
return async (dispatch, getState) => {
type APIConfig = {
hostname: string;
port: string;
secret?: string;
};
export function fetchProxies(apiConfig: APIConfig) {
return async (dispatch: any, getState: any) => {
const [proxiesData, providersData] = await Promise.all([
proxiesAPI.fetchProxies(apiConfig),
proxiesAPI.fetchProviderProxies(apiConfig),
]);
const [proxyProviders, providerProxies] = formatProxyProviders(
providersData.providers
);
const {
providers: proxyProviders,
proxies: providerProxies,
} = formatProxyProviders(providersData.providers);
const proxies = { ...providerProxies, ...proxiesData.proxies };
const [groupNames, proxyNames] = retrieveGroupNamesFrom(proxies);
@ -58,14 +108,8 @@ export function fetchProxies(apiConfig) {
const name = proxyNames[i];
const { history } = proxies[name] || { history: [] };
const h = history[history.length - 1];
if (h) {
const ret = { error: '' };
if (h.delay === 0) {
ret.error = 'LikelyTimeout';
} else {
ret.number = h.delay;
}
delayNext[name] = ret;
if (h && h.delay) {
delayNext[name] = { number: h.delay };
}
}
@ -75,7 +119,7 @@ export function fetchProxies(apiConfig) {
if (!providerProxies[v]) dangleProxyNames.push(v);
}
dispatch('store/proxies#fetchProxies', (s) => {
dispatch('store/proxies#fetchProxies', (s: GlobalState) => {
s.proxies.proxies = proxies;
s.proxies.groupNames = groupNames;
s.proxies.delay = delayNext;
@ -85,7 +129,7 @@ export function fetchProxies(apiConfig) {
};
}
export function updateProviderByName(apiConfig, name) {
export function updateProviderByName(apiConfig: APIConfig, name: string) {
return async (dispatch) => {
try {
await proxiesAPI.updateProviderByName(apiConfig, name);
@ -115,30 +159,119 @@ export function healthcheckProviderByName(apiConfig, name) {
};
}
export function switchProxy(apiConfig, name1, name2) {
async function closeGroupConns(
apiConfig: APIConfig,
groupName: string,
exceptionItemName: string
) {
const res = await connAPI.fetchConns(apiConfig);
if (!res.ok) {
console.log('unable to fetch all connections', res.statusText);
/* throw new Error(); */
}
const json = await res.json();
const connections = json.connections;
const idsToClose = [];
for (const conn of connections) {
if (
// include the groupName
conn.chains.indexOf(groupName) > -1 &&
// but not include the itemName
conn.chains.indexOf(exceptionItemName) < 0
) {
idsToClose.push(conn.id);
}
}
await Promise.all(
idsToClose.map((id) => connAPI.closeConnById(apiConfig, id).catch(noop))
);
}
function resolveChain(
proxies: ProxiesDict,
groupName: string,
itemName: string
) {
const chain = [itemName, groupName];
let child: ProxyItem;
let childKey = itemName;
while ((child = proxies[childKey]) && child.now) {
chain.unshift(child.now);
childKey = child.now;
}
return chain;
}
async function switchProxyImpl(
dispatch: any,
apiConfig: APIConfig,
groupName: string,
itemName: string
) {
try {
const res = await proxiesAPI.requestToSwitchProxy(
apiConfig,
groupName,
itemName
);
if (res.ok === false) {
throw new Error(`failed to switch proxy: res.statusText`);
}
} catch (err) {
// eslint-disable-next-line no-console
console.log(err, 'failed to swith proxy');
throw err;
}
dispatch(fetchProxies(apiConfig));
dispatch('showModalClosePrevConns', (s: GlobalState) => {
s.proxies.showModalClosePrevConns = true;
s.proxies.switchProxyCtx = { to: { groupName, itemName } };
});
}
function closeModalClosePrevConns() {
return (dispatch) => {
dispatch('closeModalClosePrevConns', (s: GlobalState) => {
s.proxies.showModalClosePrevConns = false;
});
};
}
function closePrevConnsAndTheModal(apiConfig: APIConfig) {
return async (dispatch, getState) => {
const s = getState();
const switchTo = s.proxies.switchProxyCtx?.to;
if (!switchTo) {
dispatch(closeModalClosePrevConns());
return;
}
// we must have fetched the proxies before
// so the proxies here is fresh
const proxies = s.proxies.proxies;
const chain = resolveChain(proxies, switchTo.groupName, switchTo.itemName);
closeGroupConns(apiConfig, switchTo.groupName, chain[0]);
dispatch('closePrevConnsAndTheModal', (s: GlobalState) => {
s.proxies.showModalClosePrevConns = false;
s.proxies.switchProxyCtx = undefined;
});
};
}
export function switchProxy(apiConfig, groupName, itemName) {
return async (dispatch) => {
proxiesAPI
.requestToSwitchProxy(apiConfig, name1, name2)
.then(
(res) => {
if (res.ok === false) {
// eslint-disable-next-line no-console
console.log('failed to swith proxy', res.statusText);
}
},
(err) => {
// eslint-disable-next-line no-console
console.log(err, 'failed to swith proxy');
}
)
.then(() => {
dispatch(fetchProxies(apiConfig));
});
// switch proxy asynchronously
switchProxyImpl(dispatch, apiConfig, groupName, itemName).catch(noop);
// optimistic UI update
dispatch('store/proxies#switchProxy', (s) => {
const proxies = s.proxies.proxies;
if (proxies[name1] && proxies[name1].now) {
proxies[name1].now = name2;
if (proxies[groupName] && proxies[groupName].now) {
proxies[groupName].now = itemName;
}
});
};
@ -234,14 +367,24 @@ function retrieveGroupNamesFrom(proxies) {
return [groupNames, proxyNames];
}
function formatProxyProviders(providersInput) {
type ProvidersRaw = {
[key: string]: ProxyProvider;
};
function formatProxyProviders(
providersInput: ProvidersRaw
): {
providers: Array<FormattedProxyProvider>;
proxies: { [key: string]: ProxyItem };
} {
const keys = Object.keys(providersInput);
const providers = [];
const proxies = {};
for (let i = 0; i < keys.length; i++) {
const provider = providersInput[keys[i]];
if (provider.name === 'default' || provider.vehicleType === 'Compatible')
const provider: ProxyProvider = providersInput[keys[i]];
if (provider.name === 'default' || provider.vehicleType === 'Compatible') {
continue;
}
const proxiesArr = provider.proxies;
const names = [];
for (let j = 0; j < proxiesArr.length; j++) {
@ -255,13 +398,14 @@ function formatProxyProviders(providersInput) {
providers.push(provider);
}
return [providers, proxies];
return {
providers,
proxies,
};
}
export const initialState = {
proxies: {},
delay: {},
groupNames: [],
export const actions = {
requestDelayForProxies,
closeModalClosePrevConns,
closePrevConnsAndTheModal,
};
export const actions = { requestDelayForProxies };

0
src/types.ts Normal file
View file

259
yarn.lock
View file

@ -1098,6 +1098,13 @@
"@nodelib/fs.scandir" "2.1.3"
fastq "^1.6.0"
"@npmcli/move-file@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464"
integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==
dependencies:
mkdirp "^1.0.4"
"@pmmmwh/react-refresh-webpack-plugin@^0.2.0":
version "0.2.0"
resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.2.0.tgz#e2a684d430f74ad6465680d9a5869f52f307ec1e"
@ -1125,68 +1132,61 @@
style-value-types "^3.1.7"
tslib "^1.10.0"
"@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:
any-observable "^0.3.0"
"@scarf/scarf@^1.0.4":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.0.5.tgz#accee0bce88a9047672f7c8faf3cada59c996b81"
integrity sha512-9WKaGVpQH905Aqkk+BczFEeLQxS07rl04afFRPUG9IcSlOwmo5EVVuuNu0d4M9LMYucObvK0LoAe+5HfMW2QhQ==
"@sentry/browser@^5.15.0":
version "5.15.5"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.15.5.tgz#d9a51f1388581067b50d30ed9b1aed2cbb333a36"
integrity sha512-rqDvjk/EvogfdbZ4TiEpxM/lwpPKmq23z9YKEO4q81+1SwJNua53H60dOk9HpRU8nOJ1g84TMKT2Ov8H7sqDWA==
"@sentry/browser@^5.16.1":
version "5.16.1"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.16.1.tgz#7a5ad85d9002de1495b1f63c3a4edb688a27f644"
integrity sha512-uXXKRGLWDqwaKO09K1GTTV0Yj+OfELVs+0cDDYqPDow+DlIXyx0gSnZPd0caCqFllUy8JSxb4S9OprYinvks2A==
dependencies:
"@sentry/core" "5.15.5"
"@sentry/types" "5.15.5"
"@sentry/utils" "5.15.5"
"@sentry/core" "5.16.1"
"@sentry/types" "5.16.1"
"@sentry/utils" "5.16.1"
tslib "^1.9.3"
"@sentry/core@5.15.5":
version "5.15.5"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.15.5.tgz#40ea79bff5272d3fbbeeb4a98cdc59e1adbd2c92"
integrity sha512-enxBLv5eibBMqcWyr+vApqeix8uqkfn0iGsD3piKvoMXCgKsrfMwlb/qo9Ox0lKr71qIlZVt+9/A2vZohdgnlg==
"@sentry/core@5.16.1":
version "5.16.1"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.16.1.tgz#c5c2f5d3391440f62b3e4dbefafc776449c45c35"
integrity sha512-CDKUAUWefZ+bx7tUGm7pgkuJbwn+onAlwzKkLGVg730IP+N/AWSpVtbvFTPiel2+NPiFhWX5/F0SpxDMLPRKfg==
dependencies:
"@sentry/hub" "5.15.5"
"@sentry/minimal" "5.15.5"
"@sentry/types" "5.15.5"
"@sentry/utils" "5.15.5"
"@sentry/hub" "5.16.1"
"@sentry/minimal" "5.16.1"
"@sentry/types" "5.16.1"
"@sentry/utils" "5.16.1"
tslib "^1.9.3"
"@sentry/hub@5.15.5":
version "5.15.5"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.15.5.tgz#f5abbcdbe656a70e2ff02c02a5a4cffa0f125935"
integrity sha512-zX9o49PcNIVMA4BZHe//GkbQ4Jx+nVofqU/Il32/IbwKhcpPlhGX3c1sOVQo4uag3cqd/JuQsk+DML9TKkN0Lw==
"@sentry/hub@5.16.1":
version "5.16.1"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.16.1.tgz#e35d507a134a6ab4c572304dc1143b6bccfa9b45"
integrity sha512-Og4zxp0lM9yS6TyKbZ5lQR94f/fNOalodm71Dk4qfBWi0OzfFCVpO4fPOhHtbXEsvMNg5xh0Pe8ezqX3CZ3hTw==
dependencies:
"@sentry/types" "5.15.5"
"@sentry/utils" "5.15.5"
"@sentry/types" "5.16.1"
"@sentry/utils" "5.16.1"
tslib "^1.9.3"
"@sentry/minimal@5.15.5":
version "5.15.5"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.15.5.tgz#a0e4e071f01d9c4d808094ae7203f6c4cca9348a"
integrity sha512-zQkkJ1l9AjmU/Us5IrOTzu7bic4sTPKCatptXvLSTfyKW7N6K9MPIIFeSpZf9o1yM2sRYdK7GV08wS2eCT3JYw==
"@sentry/minimal@5.16.1":
version "5.16.1"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.16.1.tgz#71d16c20a0a396ab3da07b19cb444b4459fd2b11"
integrity sha512-RCwEKLneV5BQlv1MEmsCR3I5jajHgVGusBgwGgnFv+4Cn4cNC7OHWH4QbuZ3IHOEHJl7YS074BeluM+7jn0+Tw==
dependencies:
"@sentry/hub" "5.15.5"
"@sentry/types" "5.15.5"
"@sentry/hub" "5.16.1"
"@sentry/types" "5.16.1"
tslib "^1.9.3"
"@sentry/types@5.15.5":
version "5.15.5"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.15.5.tgz#16c97e464cf09bbd1d2e8ce90d130e781709076e"
integrity sha512-F9A5W7ucgQLJUG4LXw1ZIy4iLevrYZzbeZ7GJ09aMlmXH9PqGThm1t5LSZlVpZvUfQ2rYA8NU6BdKJSt7B5LPw==
"@sentry/types@5.16.1":
version "5.16.1"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.16.1.tgz#ba69dbf096d121b4197fdd54c35ac941b53d0b6a"
integrity sha512-uERNhBdsiWvWG7qTC9QVsvFmOSL8rFfy8usEXeH3l4oCQao9TvGUvXJv6gRfiWmoiJZ1A0608Lj15CORygdbng==
"@sentry/utils@5.15.5":
version "5.15.5"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.15.5.tgz#dec1d4c79037c4da08b386f5d34409234dcbfb15"
integrity sha512-Nl9gl/MGnzSkuKeo3QaefoD/OJrFLB8HmwQ7HUbTXb6E7yyEzNKAQMHXGkwNAjbdYyYbd42iABP6Y5F/h39NtA==
"@sentry/utils@5.16.1":
version "5.16.1"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.16.1.tgz#c663858ab04bbb0cba6660fb37a4ccdb30cc2ec8"
integrity sha512-hn2jTc6ZH1lXGij7yqkV6cGhEYxsdjqB5P4MjfrRHB5bk5opY9R89bsAhs1rpanTdwv6Ul0ieR1z18gdIgUf0g==
dependencies:
"@sentry/types" "5.15.5"
"@sentry/types" "5.16.1"
tslib "^1.9.3"
"@types/anymatch@*":
@ -1363,24 +1363,24 @@
dependencies:
"@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@^3.0.0":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.0.2.tgz#4a114a066e2f9659b25682ee59d4866e15a17ec3"
integrity sha512-ER3bSS/A/pKQT/hjMGCK8UQzlL0yLjuCZ/G8CDFJFVTfl3X65fvq2lNYqOG8JPTfrPa2RULCdwfOyFjZEMNExQ==
"@typescript-eslint/eslint-plugin@^3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz#4ac00ecca3bbea740c577f1843bc54fa69c3def2"
integrity sha512-D52KwdgkjYc+fmTZKW7CZpH5ZBJREJKZXRrveMiRCmlzZ+Rw9wRVJ1JAmHQ9b/+Ehy1ZeaylofDB9wwXUt83wg==
dependencies:
"@typescript-eslint/experimental-utils" "3.0.2"
"@typescript-eslint/experimental-utils" "3.1.0"
functional-red-black-tree "^1.0.1"
regexpp "^3.0.0"
semver "^7.3.2"
tsutils "^3.17.1"
"@typescript-eslint/experimental-utils@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.0.2.tgz#bb2131baede8df28ec5eacfa540308ca895e5fee"
integrity sha512-4Wc4EczvoY183SSEnKgqAfkj1eLtRgBQ04AAeG+m4RhTVyaazxc1uI8IHf0qLmu7xXe9j1nn+UoDJjbmGmuqXQ==
"@typescript-eslint/experimental-utils@3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.1.0.tgz#2d5dba7c2ac2a3da3bfa3f461ff64de38587a872"
integrity sha512-Zf8JVC2K1svqPIk1CB/ehCiWPaERJBBokbMfNTNRczCbQSlQXaXtO/7OfYz9wZaecNvdSvVADt6/XQuIxhC79w==
dependencies:
"@types/json-schema" "^7.0.3"
"@typescript-eslint/typescript-estree" "3.0.2"
"@typescript-eslint/typescript-estree" "3.1.0"
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
@ -1394,14 +1394,14 @@
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
"@typescript-eslint/parser@^3.0.0":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.0.2.tgz#a92ef339added9bf7fb92605ac99c93ef243e834"
integrity sha512-80Z7s83e8QXHNUspqVlWwb4t5gdz/1bBBmafElbK1wwAwiD/yvJsFyHRxlEpNrt4rdK6eB3p+2WEFkEDHAKk9w==
"@typescript-eslint/parser@^3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.1.0.tgz#9c02ba5d88ad2355672f39e6cd4176f172dd47f8"
integrity sha512-NcDSJK8qTA2tPfyGiPes9HtVKLbksmuYjlgGAUs7Ld2K0swdWibnCq9IJx9kJN8JJdgUJSorFiGaPHBgH81F/Q==
dependencies:
"@types/eslint-visitor-keys" "^1.0.0"
"@typescript-eslint/experimental-utils" "3.0.2"
"@typescript-eslint/typescript-estree" "3.0.2"
"@typescript-eslint/experimental-utils" "3.1.0"
"@typescript-eslint/typescript-estree" "3.1.0"
eslint-visitor-keys "^1.1.0"
"@typescript-eslint/typescript-estree@2.34.0":
@ -1417,10 +1417,10 @@
semver "^7.3.2"
tsutils "^3.17.1"
"@typescript-eslint/typescript-estree@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.0.2.tgz#67a1ce4307ebaea43443fbf3f3be7e2627157293"
integrity sha512-cs84mxgC9zQ6viV8MEcigfIKQmKtBkZNDYf8Gru2M+MhnA6z9q0NFMZm2IEzKqAwN8lY5mFVd1Z8DiHj6zQ3Tw==
"@typescript-eslint/typescript-estree@3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.1.0.tgz#eaff52d31e615e05b894f8b9d2c3d8af152a5dd2"
integrity sha512-+4nfYauqeQvK55PgFrmBWFVYb6IskLyOosYEmhH3mSVhfBp9AIJnjExdgDmKWoOBHRcPM8Ihfm2BFpZf0euUZQ==
dependencies:
debug "^4.1.1"
eslint-visitor-keys "^1.1.0"
@ -1713,11 +1713,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
"@types/color-name" "^1.1.1"
color-convert "^2.0.1"
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"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@ -2180,11 +2175,12 @@ cacache@^12.0.2:
unique-filename "^1.1.1"
y18n "^4.0.0"
cacache@^15.0.3:
version "15.0.3"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.3.tgz#2225c2d1dd8e872339950d6a39c051e0e9334392"
integrity sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==
cacache@^15.0.4:
version "15.0.4"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.4.tgz#b2c23cf4ac4f5ead004fb15a0efb0a20340741f1"
integrity sha512-YlnKQqTbD/6iyoJvEY3KJftjrdBYroCbxxYXzhOzsFLWlp6KX4BOlEf4mTx0cMUfVaTS3ENL2QtDWeRYoGLkkw==
dependencies:
"@npmcli/move-file" "^1.0.1"
chownr "^2.0.0"
fs-minipass "^2.0.0"
glob "^7.1.4"
@ -2195,7 +2191,6 @@ cacache@^15.0.3:
minipass-flush "^1.0.5"
minipass-pipeline "^1.2.2"
mkdirp "^1.0.3"
move-file "^2.0.0"
p-map "^4.0.0"
promise-inflight "^1.0.1"
rimraf "^3.0.2"
@ -2479,11 +2474,6 @@ cliui@^5.0.0:
strip-ansi "^5.2.0"
wrap-ansi "^5.1.0"
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
clsx@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188"
@ -2657,21 +2647,21 @@ copy-descriptor@^0.1.0:
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
copy-webpack-plugin@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.1.tgz#2a9718898728e916623eccf48b9dfb06089d702d"
integrity sha512-tcbZnGtQ70b4vtYGUNg8uUYri/80H1On3AC+wPsVOKSj7xbDinYuxAZPAeI3/3hxjjuwoGTHN5BeSksQ4kGUTw==
copy-webpack-plugin@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.2.tgz#10efc6ad219a61acbf2f5fb50af83da38431bc34"
integrity sha512-9Gm8X0c6eXlKnmltMPFCBeGOKjtcRIyTt4VaO3k1TkNgVTe5Ov2lYsYVuyLp0kp8DItO3apewflM+1GYgh6V2Q==
dependencies:
cacache "^15.0.3"
cacache "^15.0.4"
fast-glob "^3.2.2"
find-cache-dir "^3.3.1"
glob-parent "^5.1.1"
globby "^11.0.0"
globby "^11.0.1"
loader-utils "^2.0.0"
normalize-path "^3.0.0"
p-limit "^2.3.0"
schema-utils "^2.6.6"
serialize-javascript "^3.0.0"
schema-utils "^2.7.0"
serialize-javascript "^3.1.0"
webpack-sources "^1.4.3"
core-js-compat@^3.6.2:
@ -3016,13 +3006,6 @@ deep-is@^0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
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"
@ -3255,11 +3238,6 @@ electron-to-chromium@^1.3.413:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.455.tgz#fd65a3f5db6ffa83eb7c84f16ea9b1b7396f537d"
integrity sha512-4lwnxp+ArqOX9hiLwLpwhfqvwzUHFuDgLz4NTiU3lhygUzWtocIJ/5Vix+mWVNE2HQ9aI1k2ncGe5H/0OktMvA==
elegant-spinner@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-2.0.0.tgz#f236378985ecd16da75488d166be4b688fd5af94"
integrity sha512-5YRYHhvhYzV/FC4AiMdeSIg3jAYGq9xFvbhZMpPlJoBsfYgrw2DSCYeXfat6tYBu45PWiyRr3+flaCPPmviPaA==
elliptic@^6.0.0:
version "6.5.2"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
@ -4300,10 +4278,10 @@ globby@8.0.2:
pify "^3.0.0"
slash "^1.0.0"
globby@^11.0.0:
version "11.0.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154"
integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==
globby@^11.0.1:
version "11.0.1"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
@ -5220,10 +5198,10 @@ 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.2.2:
version "10.2.7"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.7.tgz#6e47860af3d86a6a01849cbf8ba80f7754aae6eb"
integrity sha512-srod2bTpF8riaLz+Bgr6v0mI/nSntE8M9jbh4WwAhoosx0G7RKEUIG7mI5Nu5SMbTF9o8GROPgK0Lhf5cDnUUw==
lint-staged@^10.2.9:
version "10.2.9"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.9.tgz#6013ecfa80829cd422446b545fd30a96bca3098c"
integrity sha512-ziRAuXEqvJLSXg43ezBpHxRW8FOJCXISaXU//BWrxRrp5cBdRkIx7g5IsB3OI45xYGE0S6cOacfekSjDyDKF2g==
dependencies:
chalk "^4.0.0"
cli-truncate "2.1.0"
@ -5231,8 +5209,9 @@ lint-staged@^10.2.2:
cosmiconfig "^6.0.0"
debug "^4.1.1"
dedent "^0.7.0"
enquirer "^2.3.5"
execa "^4.0.1"
listr2 "^2.0.2"
listr2 "^2.1.0"
log-symbols "^4.0.0"
micromatch "^4.0.2"
normalize-path "^3.0.0"
@ -5240,25 +5219,19 @@ lint-staged@^10.2.2:
string-argv "0.3.1"
stringify-object "^3.3.0"
listr2@^2.0.2:
version "2.0.4"
resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.0.4.tgz#b39100b0a227ec5659dcf76ddc516211fc168d61"
integrity sha512-oJaAcplPsa72rKW0eg4P4LbEJjhH+UO2I8uqR/I2wzHrVg16ohSfUy0SlcHS21zfYXxtsUpL8YXGHjyfWMR0cg==
listr2@^2.1.0:
version "2.1.3"
resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.1.3.tgz#f527e197de12ad8c488c566921fa2da34cbc67f6"
integrity sha512-6oy3QhrZAlJGrG8oPcRp1hix1zUpb5AvyvZ5je979HCyf48tIj3Hn1TG5+rfyhz30t7HfySH/OIaVbwrI2kruA==
dependencies:
"@samverschueren/stream-to-observable" "^0.3.0"
chalk "^4.0.0"
cli-cursor "^3.1.0"
cli-truncate "^2.1.0"
elegant-spinner "^2.0.0"
enquirer "^2.3.5"
figures "^3.2.0"
indent-string "^4.0.0"
log-update "^4.0.0"
p-map "^4.0.0"
pad "^3.2.0"
rxjs "^6.5.5"
through "^2.3.8"
uuid "^7.0.2"
load-json-file@^2.0.0:
version "2.0.0"
@ -5672,7 +5645,7 @@ mkdirp@^0.5.1, mkdirp@^0.5.3:
dependencies:
minimist "^1.2.5"
mkdirp@^1.0.3:
mkdirp@^1.0.3, mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
@ -5706,13 +5679,6 @@ move-concurrently@^1.0.1:
rimraf "^2.5.4"
run-queue "^1.0.3"
move-file@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/move-file/-/move-file-2.0.0.tgz#83ffa309b5d7f69d518b28e1333e2ffadf331e3e"
integrity sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==
dependencies:
path-exists "^4.0.0"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@ -6156,13 +6122,6 @@ 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==
pad@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/pad/-/pad-3.2.0.tgz#be7a1d1cb6757049b4ad5b70e71977158fea95d1"
integrity sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==
dependencies:
wcwidth "^1.0.1"
pako@~1.0.5:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
@ -7562,7 +7521,7 @@ schema-utils@^2.6.5:
ajv "^6.12.0"
ajv-keywords "^3.4.1"
schema-utils@^2.6.6:
schema-utils@^2.6.6, schema-utils@^2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7"
integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
@ -7625,7 +7584,7 @@ serialize-javascript@^2.1.2:
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61"
integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==
serialize-javascript@^3.0.0:
serialize-javascript@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea"
integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==
@ -8268,17 +8227,17 @@ terser-webpack-plugin@^1.4.3:
webpack-sources "^1.4.0"
worker-farm "^1.7.0"
terser-webpack-plugin@^3.0.1:
version "3.0.2"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.0.2.tgz#fdc501c73847d8904f6a80c5009b11ee2d11b8eb"
integrity sha512-QeBHLJzKJHCnrPNlZj5EmOF6wwvzpVGDHvTrySIH8+jZEXfcKKCiriRmF6945rKzuZDnkOEU/LDv7qtPiiyP/Q==
terser-webpack-plugin@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz#23bda2687b197f878a743373b9411d917adc2e45"
integrity sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==
dependencies:
cacache "^15.0.3"
cacache "^15.0.4"
find-cache-dir "^3.3.1"
jest-worker "^26.0.0"
p-limit "^2.3.0"
schema-utils "^2.6.6"
serialize-javascript "^3.0.0"
serialize-javascript "^3.1.0"
source-map "^0.6.1"
terser "^4.6.13"
webpack-sources "^1.4.3"
@ -8472,10 +8431,10 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typescript@^3.8.3:
version "3.9.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a"
integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==
typescript@^3.9.5:
version "3.9.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36"
integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==
unicode-canonical-property-names-ecmascript@^1.0.4:
version "1.0.4"
@ -8632,11 +8591,6 @@ uuid@^3.3.2:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866"
integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==
uuid@^7.0.2:
version "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"
@ -8691,13 +8645,6 @@ watchpack@^1.6.1:
graceful-fs "^4.1.2"
neo-async "^2.5.0"
wcwidth@^1.0.1:
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"
webpack-bundle-analyzer@^3.6.0:
version "3.8.0"
resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz#ce6b3f908daf069fd1f7266f692cbb3bded9ba16"