diff --git a/apps/root/package.json b/apps/root/package.json index b69cf6e98..0ee66bc91 100644 --- a/apps/root/package.json +++ b/apps/root/package.json @@ -34,7 +34,6 @@ "@types/lodash": "^4.14.170", "@types/luxon": "^1.27.0", "@types/md5": "^2.3.2", - "@types/mixpanel-browser": "2.38.1", "@types/node": "^22.1.0", "@types/qrcode": "^1.5.5", "@types/react": "^18.2.21", @@ -114,7 +113,6 @@ "lodash": "^4.17.21", "luxon": "^2.1.1", "md5": "^2.3.0", - "mixpanel-browser": "2.47.0", "os-browserify": "^0.3.0", "qrcode": "^1.5.4", "react": "^18.2.0", diff --git a/apps/root/src/hooks/useAnalytics.ts b/apps/root/src/hooks/useAnalytics.ts index 24b48fb5e..81a187157 100644 --- a/apps/root/src/hooks/useAnalytics.ts +++ b/apps/root/src/hooks/useAnalytics.ts @@ -15,92 +15,114 @@ function useAnalytics() { ); const trackPositionModified = React.useCallback( - (props: Parameters[0]) => { - analyticsService.trackPositionModified(props); - }, + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (props: Parameters[0]) => {}, [analyticsService] ); const trackPositionTerminated = React.useCallback( - (props: Parameters[0]) => { - analyticsService.trackPositionTerminated(props); - }, + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (props: Parameters[0]) => {}, [analyticsService] ); const trackSlippageChanged = React.useCallback( + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars (props: Parameters[0]) => { - analyticsService.trackSlippageChanged(props); + // analyticsService.trackSlippageChanged(props); }, [analyticsService] ); const trackGasSpeedChanged = React.useCallback( + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars (props: Parameters[0]) => { - analyticsService.trackGasSpeedChanged(props); + // analyticsService.trackGasSpeedChanged(props); }, [analyticsService] ); const trackSourceTimeoutChanged = React.useCallback( + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars (props: Parameters[0]) => { - analyticsService.trackSourceTimeoutChanged(props); + // analyticsService.trackSourceTimeoutChanged(props); }, [analyticsService] ); const trackQuoteSortingChanged = React.useCallback( + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars (props: Parameters[0]) => { - analyticsService.trackQuoteSortingChanged(props); + // analyticsService.trackQuoteSortingChanged(props); }, [analyticsService] ); const trackPermit2Enabled = React.useCallback( + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars (props: Parameters[0]) => { - analyticsService.trackPermit2Enabled(props); + // analyticsService.trackPermit2Enabled(props); }, [analyticsService] ); const trackDefaultSettingsChanged = React.useCallback( + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars (props: Parameters[0]) => { - analyticsService.trackDefaultSettingsChanged(props); + // analyticsService.trackDefaultSettingsChanged(props); }, [analyticsService] ); const trackSwap = React.useCallback( + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars (props: Parameters[0]) => { - analyticsService.trackSwap(props); + // analyticsService.trackSwap(props); }, [analyticsService] ); const trackDcaCreatePosition = React.useCallback( + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars (props: Parameters[0]) => { - analyticsService.trackDcaCreatePosition(props); + // analyticsService.trackDcaCreatePosition(props); }, [analyticsService] ); const trackEarnDeposit = React.useCallback( + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars (props: Parameters[0]) => { - analyticsService.trackEarnDeposit(props); + // analyticsService.trackEarnDeposit(props); }, [analyticsService] ); const trackEarnWithdraw = React.useCallback( + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars (props: Parameters[0]) => { - analyticsService.trackEarnWithdraw(props); + // analyticsService.trackEarnWithdraw(props); }, [analyticsService] ); const trackTransfer = React.useCallback( + // @ts-expect-error - this is a mock + // eslint-disable-next-line @typescript-eslint/no-unused-vars (props: Parameters[0]) => { - analyticsService.trackTransfer(props); + // analyticsService.trackTransfer(props); }, [analyticsService] ); diff --git a/apps/root/src/services/analyticsService.spec.ts b/apps/root/src/services/analyticsService.spec.ts deleted file mode 100644 index a5fb1203b..000000000 --- a/apps/root/src/services/analyticsService.spec.ts +++ /dev/null @@ -1,280 +0,0 @@ -import { createMockInstance } from '@common/utils/tests'; -import md5 from 'md5'; -import { MEAN_PROXY_PANEL_URL } from '@constants'; -import mixpanel from 'mixpanel-browser'; -import AnalyticsService from './analyticsService'; -import ProviderService from './providerService'; -import AccountService from './accountService'; -import { NetworkStruct, UserStatus, WalletStatus, WalletType } from '@types'; - -// eslint-disable-next-line @typescript-eslint/no-unsafe-return -jest.mock('mixpanel-browser'); -jest.mock('./providerService'); -jest.mock('md5'); - -const MockedProviderService = jest.mocked(ProviderService, { shallow: true }); -const MockedAccountService = jest.mocked(AccountService, { shallow: true }); -const MockedMd5 = jest.mocked(md5, { shallow: true }); -const MockedMixpanelBrowser = jest.mocked(mixpanel, { shallow: true }); - -describe('Analytics Service', () => { - let analyticsService: AnalyticsService; - let providerService: jest.MockedObject; - let accountService: jest.MockedObject; - let setConfigMock: jest.Mock; - let trackMock: jest.Mock; - let peopleSetMock: jest.Mock; - let peopleSetOnceMock: jest.Mock; - let peopleUnsetMock: jest.Mock; - let peopleIncrementMock: jest.Mock; - let peopleAppendMock: jest.Mock; - let peopleUnionMock: jest.Mock; - let identifyMock: jest.Mock; - - beforeEach(() => { - MockedMd5.mockImplementation((value: string) => `md5-${value}`); - providerService = createMockInstance(MockedProviderService); - accountService = createMockInstance(MockedAccountService); - providerService.getNetwork.mockResolvedValue({ chainId: 10 } as NetworkStruct); - accountService.getUser.mockReturnValue({ - id: 'wallet:userId', - label: 'userId', - status: UserStatus.loggedIn, - wallets: [], - signature: { message: '0x', signer: '0xuserId' }, - }); - accountService.getActiveWallet.mockReturnValue({ - address: '0xactive', - status: WalletStatus.disconnected, - isAuth: false, - type: WalletType.external, - isOwner: false, - }); - setConfigMock = jest.fn(); - trackMock = jest.fn(); - peopleSetMock = jest.fn(); - peopleSetOnceMock = jest.fn(); - peopleUnsetMock = jest.fn(); - peopleIncrementMock = jest.fn(); - peopleAppendMock = jest.fn(); - peopleUnionMock = jest.fn(); - identifyMock = jest.fn(); - - MockedMixpanelBrowser.init.mockReturnValue({ - set_config: setConfigMock, - track: trackMock, - identify: identifyMock, - people: { - set: peopleSetMock, - set_once: peopleSetOnceMock, - unset: peopleUnsetMock, - increment: peopleIncrementMock, - append: peopleAppendMock, - union: peopleUnionMock, - }, - } as unknown as ReturnType); - process.env = { - MIXPANEL_TOKEN: 'MIXPANEL_TOKEN', - }; - analyticsService = new AnalyticsService(providerService, accountService); - }); - - afterEach(() => { - jest.resetAllMocks(); - jest.restoreAllMocks(); - }); - - describe('constructor', () => { - test('it should init mixpanel browser and set config', () => { - expect(MockedMixpanelBrowser.init).toHaveBeenCalledTimes(1); - expect(MockedMixpanelBrowser.init).toHaveBeenCalledWith( - 'MIXPANEL_TOKEN', - { api_host: MEAN_PROXY_PANEL_URL }, - ' ' - ); - expect(setConfigMock).toHaveBeenCalledTimes(1); - expect(setConfigMock).toHaveBeenCalledWith({ persistence: 'localStorage', ignore_dnt: true }); - }); - }); - - describe('trackEvent', () => { - test('it should call mixpanel to track the event and expand all data', async () => { - await analyticsService.trackEvent('Action to track', { someProp: 'someValue' }); - expect(trackMock).toHaveBeenCalledTimes(1); - expect(trackMock).toHaveBeenCalledWith('Action to track', { - chainId: 10, - chainName: 'Optimism', - someProp: 'someValue', - distinct_id: 'wallet:userId', - activeWallet: '0xactive', - }); - }); - - test('it should fail gracefully when track fails', async () => { - trackMock.mockImplementation(() => { - throw new Error('error tracking'); - }); - await analyticsService.trackEvent('Action to track', { someProp: 'someValue' }); - expect(trackMock).toHaveBeenCalledTimes(1); - expect(trackMock).toHaveBeenCalledWith('Action to track', { - chainId: 10, - chainName: 'Optimism', - someProp: 'someValue', - distinct_id: 'wallet:userId', - activeWallet: '0xactive', - }); - }); - }); - - describe('identifyUser', () => { - test('should identify user in mixpanel and hotjar when userId is provided', () => { - analyticsService.identifyUser('testUser'); - expect(identifyMock).toHaveBeenCalledWith('testUser'); - }); - - test('should not identify user when userId is not provided', () => { - analyticsService.identifyUser(); - expect(identifyMock).not.toHaveBeenCalled(); - }); - }); - - describe('setPeopleProperty', () => { - test('should flatten and set people properties in mixpanel', () => { - const properties = { - user: { - details: { name: 'John' }, - active: true, - }, - }; - analyticsService.setPeopleProperty(properties); - expect(peopleSetMock).toHaveBeenCalledWith({ - 'user.details.name': 'John', - 'user.active': true, - }); - }); - - test('should handle errors gracefully', () => { - peopleSetMock.mockImplementation(() => { - throw new Error('error setting property'); - }); - analyticsService.setPeopleProperty({ prop1: 'value1' }); - expect(peopleSetMock).toHaveBeenCalled(); - }); - }); - - describe('setOnceProperty', () => { - test('should flatten and set one-time properties in mixpanel', () => { - const properties = { - profile: { - info: { age: 25 }, - verified: true, - }, - }; - analyticsService.setOnceProperty(properties); - expect(peopleSetOnceMock).toHaveBeenCalledWith({ - 'profile.info.age': 25, - 'profile.verified': true, - }); - }); - - test('should handle errors gracefully', () => { - peopleSetOnceMock.mockImplementation(() => { - throw new Error('error setting property'); - }); - analyticsService.setOnceProperty({ prop1: 'value1' }); - expect(peopleSetOnceMock).toHaveBeenCalled(); - }); - }); - - describe('unsetProperty', () => { - test('should unset single property in mixpanel', () => { - analyticsService.unsetProperty('prop1'); - expect(peopleUnsetMock).toHaveBeenCalledWith('prop1'); - }); - - test('should unset multiple properties in mixpanel', () => { - analyticsService.unsetProperty(['prop1', 'prop2']); - expect(peopleUnsetMock).toHaveBeenCalledWith(['prop1', 'prop2']); - }); - - test('should handle errors gracefully', () => { - peopleUnsetMock.mockImplementation(() => { - throw new Error('error unsetting property'); - }); - analyticsService.unsetProperty('prop1'); - expect(peopleUnsetMock).toHaveBeenCalled(); - }); - }); - - describe('incrementProperty', () => { - test('should flatten and increment properties in mixpanel', () => { - const properties = { - stats: { - visits: 1, - actions: 5, - }, - }; - analyticsService.incrementProperty(properties); - expect(peopleIncrementMock).toHaveBeenCalledWith({ - 'stats.visits': 1, - 'stats.actions': 5, - }); - }); - - test('should handle errors gracefully', () => { - peopleIncrementMock.mockImplementation(() => { - throw new Error('error incrementing property'); - }); - analyticsService.incrementProperty({ prop1: 1 }); - expect(peopleIncrementMock).toHaveBeenCalled(); - }); - }); - - describe('appendProperty', () => { - test('should flatten and append to properties in mixpanel', () => { - const properties = { - history: { - actions: 'login', - details: { timestamp: '2024-01-01' }, - }, - }; - analyticsService.appendProperty(properties); - expect(peopleAppendMock).toHaveBeenCalledWith({ - 'history.actions': 'login', - 'history.details.timestamp': '2024-01-01', - }); - }); - - test('should handle errors gracefully', () => { - peopleAppendMock.mockImplementation(() => { - throw new Error('error appending property'); - }); - analyticsService.appendProperty({ prop1: 'value1' }); - expect(peopleAppendMock).toHaveBeenCalled(); - }); - }); - - describe('unionProperty', () => { - test('should flatten and union properties in mixpanel', () => { - const properties = { - tags: { - categories: ['A', 'B'], - labels: { primary: ['main'] }, - }, - }; - analyticsService.unionProperty(properties); - expect(peopleUnionMock).toHaveBeenCalledWith({ - 'tags.categories': ['A', 'B'], - 'tags.labels.primary': ['main'], - }); - }); - - test('should handle errors gracefully', () => { - peopleUnionMock.mockImplementation(() => { - throw new Error('error union-ing property'); - }); - analyticsService.unionProperty({ prop1: ['value1'] }); - expect(peopleUnionMock).toHaveBeenCalled(); - }); - }); -}); diff --git a/apps/root/src/services/analyticsService.ts b/apps/root/src/services/analyticsService.ts index 50675abe7..9573181d6 100644 --- a/apps/root/src/services/analyticsService.ts +++ b/apps/root/src/services/analyticsService.ts @@ -1,11 +1,6 @@ import Hotjar from '@hotjar/browser'; -import MixpanelLibray, { Mixpanel } from 'mixpanel-browser'; -import { MEAN_PROXY_PANEL_URL, NETWORKS } from '@constants/addresses'; -import find from 'lodash/find'; import ProviderService from './providerService'; import AccountService from './accountService'; -import { formatUnits } from 'viem'; -import { DisplayStrategy, Token } from '@types'; interface FlattenedRecord { [key: string]: string | number | boolean | string[] | number[]; @@ -20,14 +15,12 @@ export default class AnalyticsService { accountService: AccountService; - mixpanel: Mixpanel; - constructor(providerService: ProviderService, accountService: AccountService) { this.providerService = providerService; this.accountService = accountService; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.mixpanel = MixpanelLibray.init(process.env.MIXPANEL_TOKEN!, { api_host: MEAN_PROXY_PANEL_URL }, ' '); - this.mixpanel.set_config({ persistence: 'localStorage', ignore_dnt: true }); + // this.mixpanel = MixpanelLibray.init(process.env.MIXPANEL_TOKEN!, { api_host: MEAN_PROXY_PANEL_URL }, ' '); + // this.mixpanel.set_config({ persistence: 'localStorage', ignore_dnt: true }); if (process.env.HOTJAR_PAGE_ID) { try { Hotjar.init(Number(process.env.HOTJAR_PAGE_ID), 6); @@ -41,7 +34,7 @@ export default class AnalyticsService { if (!userId) { return; } - this.mixpanel.identify(userId); + // this.mixpanel.identify(userId); try { Hotjar.identify(userId, {}); } catch (error) { @@ -49,29 +42,8 @@ export default class AnalyticsService { } } + // eslint-disable-next-line @typescript-eslint/no-unused-vars async trackEvent(action: string, extraData?: Record) { - let network; - - try { - network = await this.providerService.getNetwork(); - } catch (error) {} - - const foundNetwork = find(NETWORKS, { chainId: network?.chainId }); - const userId = this.accountService.getUser()?.id; - const activeWallet = this.accountService.getActiveWallet()?.address; - - this.mixpanel.identify(userId); - - try { - this.mixpanel.track(action, { - chainId: network?.chainId, - chainName: foundNetwork?.name, - distinct_id: userId, - activeWallet, - ...(extraData || {}), - }); - } catch (error) {} - return Promise.resolve(); } @@ -86,336 +58,4 @@ export default class AnalyticsService { return { ...acc, [`${pre}${key}`]: obj[key] as FlattenedRecord[string] }; }, {}); } - - setPeopleProperty(properties: AnalyticsData) { - try { - this.mixpanel.people.set(this.flattenObject(properties)); - } catch (error) {} - } - - setOnceProperty(properties: AnalyticsData) { - try { - this.mixpanel.people.set_once(this.flattenObject(properties)); - } catch (error) {} - } - - unsetProperty(propertyName: string | string[]) { - try { - this.mixpanel.people.unset(propertyName); - } catch (error) {} - } - - incrementProperty(properties: AnalyticsData) { - try { - this.mixpanel.people.increment(this.flattenObject(properties)); - } catch (error) {} - } - - appendProperty(properties: AnalyticsData) { - try { - this.mixpanel.people.append(this.flattenObject(properties)); - } catch (error) {} - } - - unionProperty(properties: AnalyticsData) { - try { - this.mixpanel.people.union(this.flattenObject(properties)); - } catch (error) {} - } - - trackPositionModified({ - chainId, - remainingLiquidityDifference, - usdPrice, - isIncreasingPosition, - token, - }: { - chainId: number; - remainingLiquidityDifference: bigint; - usdPrice: bigint; - isIncreasingPosition: boolean; - token: Token; - }) { - this.setPeopleProperty({ - general: { - last_product_used: 'dca', - last_network_used: find(NETWORKS, { chainId })?.name || 'unknown', - }, - }); - const usdValueDiff = formatUnits(remainingLiquidityDifference * usdPrice, token.decimals + 18); - - this.incrementProperty({ - general: { - total_volume_all_time_usd: isIncreasingPosition ? Number(usdValueDiff) : -Number(usdValueDiff), - }, - dca: { - total_invested_usd: isIncreasingPosition ? Number(usdValueDiff) : -Number(usdValueDiff), - }, - }); - } - - trackPositionTerminated({ chainId, usdValueDiff }: { chainId: number; usdValueDiff: string }) { - this.setPeopleProperty({ - general: { - last_product_used: 'dca', - last_network_used: find(NETWORKS, { chainId })?.name || 'unknown', - }, - }); - this.incrementProperty({ - general: { - total_volume_all_time_usd: -Number(usdValueDiff), - }, - dca: { - total_invested_usd: -Number(usdValueDiff), - }, - }); - } - - trackSlippageChanged({ slippage }: { slippage: string }) { - this.setPeopleProperty({ - swap: { - settings: { - default_settings: false, - slippage, - }, - }, - }); - } - - trackGasSpeedChanged({ gasSpeed }: { gasSpeed: string }) { - this.setPeopleProperty({ - swap: { - settings: { - default_settings: false, - transaction_speed: gasSpeed, - }, - }, - }); - } - - trackSourceTimeoutChanged({ sourceTimeout }: { sourceTimeout: string }) { - this.setPeopleProperty({ - swap: { - settings: { - default_settings: false, - quote_waiting_time: sourceTimeout, - }, - }, - }); - } - - trackQuoteSortingChanged({ quoteSorting }: { quoteSorting: string }) { - this.setPeopleProperty({ - swap: { - settings: { - default_settings: false, - quote_sorting: quoteSorting, - }, - }, - }); - } - - trackPermit2Enabled({ permit2Enabled }: { permit2Enabled: boolean }) { - this.setPeopleProperty({ - swap: { - settings: { - default_settings: false, - universal_approval: permit2Enabled, - }, - }, - }); - } - - trackDefaultSettingsChanged({ defaultSettings }: { defaultSettings: boolean }) { - this.setPeopleProperty({ - swap: { - settings: { - default_settings: defaultSettings, - }, - }, - }); - } - - trackSwap({ - chainId, - from, - to, - fromUsdValueToUse, - }: { - chainId: number; - from: Token; - to: Token; - fromUsdValueToUse?: number; - }) { - const networkUsed = find(NETWORKS, { chainId })?.name || 'unknown'; - - this.setPeopleProperty({ - general: { - last_product_used: 'swap', - last_network_used: networkUsed, - }, - }); - this.incrementProperty({ - general: { - total_volume_all_time_usd: fromUsdValueToUse, - }, - swap: { - total_volume_usd: fromUsdValueToUse, - count: 1, - }, - }); - this.unionProperty({ - general: { - networks_used: networkUsed, - products_used: 'swap', - tokens_used: [from.symbol, to.symbol], - pair_used: `${from.symbol}-${to.symbol}`, - }, - swap: { - networks_used: networkUsed, - tokens_used: [from.symbol, to.symbol], - pair_used: `${from.symbol}-${to.symbol}`, - }, - }); - } - - trackDcaCreatePosition({ - chainId, - from, - to, - parsedAmountInUSD, - }: { - chainId: number; - from: Token; - to: Token; - parsedAmountInUSD: number; - }) { - const networkUsed = find(NETWORKS, { chainId: chainId })?.name || 'unknown'; - this.setPeopleProperty({ - general: { - last_product_used: 'dca', - last_network_used: networkUsed, - }, - }); - this.incrementProperty({ - general: { - total_volume_all_time_usd: parsedAmountInUSD, - }, - dca: { - total_invested_usd: parsedAmountInUSD, - total_positions: 1, - }, - }); - this.unionProperty({ - general: { - networks_used: networkUsed, - products_used: 'dca', - tokens_used: [from.symbol, to.symbol], - pair_used: `${from.symbol}-${to.symbol}`, - }, - dca: { - networks_used: networkUsed, - tokens_used: [from.symbol, to.symbol], - pair_used: `${from.symbol}-${to.symbol}`, - }, - }); - } - - trackEarnDeposit({ - chainId, - asset, - strategy, - parsedAmountInUSD, - hasPosition, - }: { - chainId: number; - asset: Token; - strategy: DisplayStrategy; - parsedAmountInUSD: number; - hasPosition: boolean; - }) { - const networkUsed = find(NETWORKS, { chainId: chainId })?.name || 'unknown'; - - this.setPeopleProperty({ - general: { - last_product_used: 'earn', - last_network_used: networkUsed, - }, - }); - this.incrementProperty({ - general: { - total_volume_all_time_usd: parsedAmountInUSD, - }, - earn: { - total_deposits_usd: parsedAmountInUSD, - current_deposits_usd: parsedAmountInUSD, - deposits_count: !hasPosition ? 1 : 0, - increase_count: hasPosition ? 1 : 0, - }, - }); - this.unionProperty({ - general: { - networks_used: strategy.network.name, - products_used: 'earn', - tokens_used: asset.symbol, - }, - earn: { - networks_used: strategy.network.name, - protocols_used: [strategy.farm.protocol], - tokens_used: [asset.symbol], - }, - }); - } - - trackEarnWithdraw({ chainId, amountInUsd }: { chainId: number; amountInUsd: number }) { - const networkUsed = find(NETWORKS, { chainId: chainId })?.name || 'unknown'; - - this.setPeopleProperty({ - general: { - last_product_used: 'earn', - last_network_used: networkUsed, - }, - }); - - this.incrementProperty({ - earn: { - current_deposits_usd: -amountInUsd, - withdraw_counts: 1, - }, - general: { - total_volume_all_time_usd: -amountInUsd, - }, - }); - } - - trackTransfer({ chainId, asset, amountInUsd }: { chainId: number; asset: Token; amountInUsd?: string }) { - const networkUsed = find(NETWORKS, { chainId: chainId })?.name || 'unknown'; - - this.setPeopleProperty({ - general: { - last_product_used: 'transfer', - last_network_used: networkUsed, - }, - }); - this.incrementProperty({ - general: { - total_volume_all_time_usd: Number(amountInUsd ?? 0), - }, - transfer: { - total_volume_usd: Number(amountInUsd ?? 0), - count: 1, - }, - }); - this.unionProperty({ - general: { - networks_used: networkUsed, - products_used: 'transfer', - tokens_used: [asset.symbol], - }, - transfer: { - networks_used: networkUsed, - tokens_used: [asset.symbol], - }, - }); - } } diff --git a/yarn.lock b/yarn.lock index ea68edcfa..d8af67711 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5355,11 +5355,6 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== -"@types/mixpanel-browser@2.38.1": - version "2.38.1" - resolved "https://registry.yarnpkg.com/@types/mixpanel-browser/-/mixpanel-browser-2.38.1.tgz#914cc726194cc0358129b6d84657f078e47f7697" - integrity sha512-XzQbwgiOPsFXUQnjz3vSwcwrvJDbQ35bCiwa/1VXGrHvU1ti9+eqO1GY91DShzkEzKkkEEkxfNshS5dbBZqd7w== - "@types/ms@*": version "0.7.34" resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" @@ -12790,11 +12785,6 @@ mipd@0.0.7: resolved "https://registry.yarnpkg.com/mipd/-/mipd-0.0.7.tgz#bb5559e21fa18dc3d9fe1c08902ef14b7ce32fd9" integrity sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg== -mixpanel-browser@2.47.0: - version "2.47.0" - resolved "https://registry.yarnpkg.com/mixpanel-browser/-/mixpanel-browser-2.47.0.tgz#4e7fd3bb660c6f63443efbd169d1cd327db71ed4" - integrity sha512-Ldrva0fRBEIFWmEibBQO1PulfpJVF3pf28Guk09lDirDaSQqqU/xs9zQLwN2rL5VwVtsP1aD3JaCgaa98EjojQ== - mkdirp-classic@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"