my fork of the bluesky client

Remove Segment (#5518)

authored by hailey.at and committed by

GitHub f68b1521 bcd096b8

+221 -1988
-15
jest/jestSetup.js
··· 54 54 SaveFormat: jest.requireActual('expo-image-manipulator').SaveFormat, 55 55 })) 56 56 57 - jest.mock('@segment/analytics-react-native', () => ({ 58 - createClient: () => ({ 59 - add: jest.fn(), 60 - }), 61 - useAnalytics: () => ({ 62 - track: jest.fn(), 63 - identify: jest.fn(), 64 - reset: jest.fn(), 65 - group: jest.fn(), 66 - screen: jest.fn(), 67 - alias: jest.fn(), 68 - flush: jest.fn(), 69 - }), 70 - })) 71 - 72 57 jest.mock('expo-camera', () => ({ 73 58 Camera: { 74 59 useCameraPermissions: jest.fn(() => [true]),
-4
package.json
··· 81 81 "@react-navigation/drawer": "^6.6.15", 82 82 "@react-navigation/native": "^6.1.17", 83 83 "@react-navigation/native-stack": "^6.9.26", 84 - "@segment/analytics-next": "^1.51.3", 85 - "@segment/analytics-react": "^1.0.0-rc1", 86 - "@segment/analytics-react-native": "^2.10.1", 87 - "@segment/sovran-react-native": "^0.4.5", 88 84 "@sentry/react-native": "5.32.0", 89 85 "@tamagui/focus-scope": "^1.84.1", 90 86 "@tanstack/query-async-storage-persister": "^5.25.0",
-3
src/Navigation.tsx
··· 15 15 StackActions, 16 16 } from '@react-navigation/native' 17 17 18 - import {init as initAnalytics} from '#/lib/analytics/analytics' 19 18 import {timeout} from '#/lib/async/timeout' 20 19 import {useColorSchemeStyle} from '#/lib/hooks/useColorSchemeStyle' 21 20 import {usePalette} from '#/lib/hooks/usePalette' ··· 647 646 648 647 function onReady() { 649 648 prevLoggedRouteName.current = getCurrentRouteName() 650 - initAnalytics(currentAccount) 651 - 652 649 if (currentAccount && shouldRequestEmailConfirmation(currentAccount)) { 653 650 openModal({name: 'verify-email', showReminder: true}) 654 651 snoozeEmailConfirmationPrompt()
-158
src/lib/analytics/analytics.tsx
··· 1 - import React from 'react' 2 - import {AppState, AppStateStatus} from 'react-native' 3 - import AsyncStorage from '@react-native-async-storage/async-storage' 4 - import {createClient, SegmentClient} from '@segment/analytics-react-native' 5 - import * as Sentry from '@sentry/react-native' 6 - import {sha256} from 'js-sha256' 7 - 8 - import {logger} from '#/logger' 9 - import {SessionAccount, useSession} from '#/state/session' 10 - import {ScreenPropertiesMap, TrackPropertiesMap} from './types' 11 - 12 - type AppInfo = { 13 - build?: string | undefined 14 - name?: string | undefined 15 - namespace?: string | undefined 16 - version?: string | undefined 17 - } 18 - 19 - // Delay creating until first actual use. 20 - let segmentClient: SegmentClient | null = null 21 - function getClient(): SegmentClient { 22 - if (!segmentClient) { 23 - segmentClient = createClient({ 24 - writeKey: '8I6DsgfiSLuoONyaunGoiQM7A6y2ybdI', 25 - trackAppLifecycleEvents: false, 26 - proxy: 'https://api.events.bsky.app/v1', 27 - }) 28 - } 29 - return segmentClient 30 - } 31 - 32 - export const track = async <E extends keyof TrackPropertiesMap>( 33 - event: E, 34 - properties?: TrackPropertiesMap[E], 35 - ) => { 36 - await getClient().track(event, properties) 37 - } 38 - 39 - export function useAnalytics() { 40 - const {hasSession} = useSession() 41 - 42 - return React.useMemo(() => { 43 - if (hasSession) { 44 - return { 45 - async screen<E extends keyof ScreenPropertiesMap>( 46 - event: E, 47 - properties?: ScreenPropertiesMap[E], 48 - ) { 49 - await getClient().screen(event, properties) 50 - }, 51 - async track<E extends keyof TrackPropertiesMap>( 52 - event: E, 53 - properties?: TrackPropertiesMap[E], 54 - ) { 55 - await getClient().track(event, properties) 56 - }, 57 - } 58 - } 59 - // dont send analytics pings for anonymous users 60 - return { 61 - screen: async () => {}, 62 - track: async () => {}, 63 - } 64 - }, [hasSession]) 65 - } 66 - 67 - export function init(account: SessionAccount | undefined) { 68 - setupListenersOnce() 69 - 70 - if (account) { 71 - const client = getClient() 72 - if (account.did) { 73 - const did_hashed = sha256(account.did) 74 - client.identify(did_hashed, {did_hashed}) 75 - Sentry.setUser({id: did_hashed}) 76 - logger.debug('Ping w/hash') 77 - } else { 78 - logger.debug('Ping w/o hash') 79 - client.identify() 80 - } 81 - } 82 - } 83 - 84 - let didSetupListeners = false 85 - function setupListenersOnce() { 86 - if (didSetupListeners) { 87 - return 88 - } 89 - didSetupListeners = true 90 - // NOTE 91 - // this is a copy of segment's own lifecycle event tracking 92 - // we handle it manually to ensure that it never fires while the app is backgrounded 93 - // -prf 94 - const client = getClient() 95 - client.isReady.onChange(async () => { 96 - if (AppState.currentState !== 'active') { 97 - logger.debug('Prevented a metrics ping while the app was backgrounded') 98 - return 99 - } 100 - const context = client.context.get() 101 - if (typeof context?.app === 'undefined') { 102 - logger.debug('Aborted metrics ping due to unavailable context') 103 - return 104 - } 105 - 106 - const oldAppInfo = await readAppInfo() 107 - const newAppInfo = context.app as AppInfo 108 - writeAppInfo(newAppInfo) 109 - logger.debug('Recording app info', {new: newAppInfo, old: oldAppInfo}) 110 - 111 - if (typeof oldAppInfo === 'undefined') { 112 - client.track('Application Installed', { 113 - version: newAppInfo.version, 114 - build: newAppInfo.build, 115 - }) 116 - } else if (newAppInfo.version !== oldAppInfo.version) { 117 - client.track('Application Updated', { 118 - version: newAppInfo.version, 119 - build: newAppInfo.build, 120 - previous_version: oldAppInfo.version, 121 - previous_build: oldAppInfo.build, 122 - }) 123 - } 124 - client.track('Application Opened', { 125 - from_background: false, 126 - version: newAppInfo.version, 127 - build: newAppInfo.build, 128 - }) 129 - }) 130 - 131 - let lastState: AppStateStatus = AppState.currentState 132 - AppState.addEventListener('change', (state: AppStateStatus) => { 133 - if (state === 'active' && lastState !== 'active') { 134 - const context = client.context.get() 135 - client.track('Application Opened', { 136 - from_background: true, 137 - version: context?.app?.version, 138 - build: context?.app?.build, 139 - }) 140 - } else if (state !== 'active' && lastState === 'active') { 141 - client.track('Application Backgrounded') 142 - } 143 - lastState = state 144 - }) 145 - } 146 - 147 - async function writeAppInfo(value: AppInfo) { 148 - await AsyncStorage.setItem('BSKY_APP_INFO', JSON.stringify(value)) 149 - } 150 - 151 - async function readAppInfo(): Promise<AppInfo | undefined> { 152 - const rawData = await AsyncStorage.getItem('BSKY_APP_INFO') 153 - const obj = rawData ? JSON.parse(rawData) : undefined 154 - if (!obj || typeof obj !== 'object') { 155 - return undefined 156 - } 157 - return obj 158 - }
-80
src/lib/analytics/analytics.web.tsx
··· 1 - import React from 'react' 2 - import {createClient} from '@segment/analytics-react' 3 - import * as Sentry from '@sentry/react-native' 4 - import {sha256} from 'js-sha256' 5 - 6 - import {logger} from '#/logger' 7 - import {SessionAccount, useSession} from '#/state/session' 8 - import {ScreenPropertiesMap, TrackPropertiesMap} from './types' 9 - 10 - type SegmentClient = ReturnType<typeof createClient> 11 - 12 - // Delay creating until first actual use. 13 - let segmentClient: SegmentClient | null = null 14 - function getClient(): SegmentClient { 15 - if (!segmentClient) { 16 - segmentClient = createClient( 17 - { 18 - writeKey: '8I6DsgfiSLuoONyaunGoiQM7A6y2ybdI', 19 - }, 20 - { 21 - integrations: { 22 - 'Segment.io': { 23 - apiHost: 'api.events.bsky.app/v1', 24 - }, 25 - }, 26 - }, 27 - ) 28 - } 29 - return segmentClient 30 - } 31 - 32 - export const track = async <E extends keyof TrackPropertiesMap>( 33 - event: E, 34 - properties?: TrackPropertiesMap[E], 35 - ) => { 36 - await getClient().track(event, properties) 37 - } 38 - 39 - export function useAnalytics() { 40 - const {hasSession} = useSession() 41 - 42 - return React.useMemo(() => { 43 - if (hasSession) { 44 - return { 45 - async screen<E extends keyof ScreenPropertiesMap>( 46 - event: E, 47 - properties?: ScreenPropertiesMap[E], 48 - ) { 49 - await getClient().screen(event, properties) 50 - }, 51 - async track<E extends keyof TrackPropertiesMap>( 52 - event: E, 53 - properties?: TrackPropertiesMap[E], 54 - ) { 55 - await getClient().track(event, properties) 56 - }, 57 - } 58 - } 59 - // dont send analytics pings for anonymous users 60 - return { 61 - screen: async () => {}, 62 - track: async () => {}, 63 - } 64 - }, [hasSession]) 65 - } 66 - 67 - export function init(account: SessionAccount | undefined) { 68 - if (account) { 69 - const client = getClient() 70 - if (account.did) { 71 - const did_hashed = sha256(account.did) 72 - client.identify(did_hashed, {did_hashed}) 73 - Sentry.setUser({id: did_hashed}) 74 - logger.debug('Ping w/hash') 75 - } else { 76 - logger.debug('Ping w/o hash') 77 - client.identify() 78 - } 79 - } 80 - }
-181
src/lib/analytics/types.ts
··· 1 - export type TrackPropertiesMap = { 2 - // LOGIN / SIGN UP events 3 - 'Sign In': {resumedSession: boolean} // CAN BE SERVER 4 - 'Create Account': {} // CAN BE SERVER 5 - 'Try Create Account': {} 6 - 'Signin:PressedForgotPassword': {} 7 - 'Signin:PressedSelectService': {} 8 - // COMPOSER / CREATE POST events 9 - 'Create Post': {imageCount: string | number} // CAN BE SERVER 10 - 'Composer:PastedPhotos': {} 11 - 'Composer:CameraOpened': {} 12 - 'Composer:GalleryOpened': {} 13 - 'Composer:ThreadgateOpened': {} 14 - 'HomeScreen:PressCompose': {} 15 - 'ProfileScreen:PressCompose': {} 16 - // EDIT PROFILE events 17 - 'EditHandle:ViewCustomForm': {} 18 - 'EditHandle:ViewProvidedForm': {} 19 - 'EditHandle:SetNewHandle': {} 20 - 'EditProfile:AvatarSelected': {} 21 - 'EditProfile:BannerSelected': {} 22 - 'EditProfile:Save': {} // CAN BE SERVER 23 - // FEED events 24 - 'Feed:onRefresh': {} 25 - 'Feed:onEndReached': {} 26 - // POST events 27 - 'Post:Like': {} // CAN BE SERVER 28 - 'Post:Unlike': {} // CAN BE SERVER 29 - 'Post:Repost': {} // CAN BE SERVER 30 - 'Post:Unrepost': {} // CAN BE SERVER 31 - 'Post:Delete': {} // CAN BE SERVER 32 - 'Post:ThreadMute': {} // CAN BE SERVER 33 - 'Post:ThreadUnmute': {} // CAN BE SERVER 34 - 'Post:Reply': {} // CAN BE SERVER 35 - 'Post:EditThreadgateOpened': {} 36 - 'Post:ThreadgateEdited': {} 37 - // PROFILE events 38 - 'Profile:Follow': { 39 - username: string 40 - } 41 - 'Profile:Unfollow': { 42 - username: string 43 - } 44 - // PROFILE HEADER events 45 - 'ProfileHeader:EditProfileButtonClicked': {} 46 - 'ProfileHeader:FollowersButtonClicked': { 47 - handle: string 48 - } 49 - 'ProfileHeader:FollowsButtonClicked': { 50 - handle: string 51 - } 52 - 'ProfileHeader:ShareButtonClicked': {} 53 - 'ProfileHeader:MuteAccountButtonClicked': {} 54 - 'ProfileHeader:UnmuteAccountButtonClicked': {} 55 - 'ProfileHeader:ReportAccountButtonClicked': {} 56 - 'ProfileHeader:AddToListsButtonClicked': {} 57 - 'ProfileHeader:BlockAccountButtonClicked': {} 58 - 'ProfileHeader:UnblockAccountButtonClicked': {} 59 - 'ProfileHeader:FollowButtonClicked': {} 60 - 'ProfileHeader:UnfollowButtonClicked': {} 61 - 'ProfileHeader:SuggestedFollowsOpened': {} 62 - 'ProfileHeader:SuggestedFollowFollowed': {} 63 - 'ViewHeader:MenuButtonClicked': {} 64 - // SETTINGS events 65 - 'Settings:SwitchAccountButtonClicked': {} 66 - 'Settings:AddAccountButtonClicked': {} 67 - 'Settings:ChangeHandleButtonClicked': {} 68 - 'Settings:InvitecodesButtonClicked': {} 69 - 'Settings:SignOutButtonClicked': {} 70 - 'Settings:ContentlanguagesButtonClicked': {} 71 - // MENU events 72 - 'Menu:ItemClicked': {url: string} 73 - 'Menu:FeedbackClicked': {} 74 - 'Menu:HelpClicked': {} 75 - // MOBILE SHELL events 76 - 'MobileShell:MyProfileButtonPressed': {} 77 - 'MobileShell:HomeButtonPressed': {} 78 - 'MobileShell:SearchButtonPressed': {} 79 - 'MobileShell:NotificationsButtonPressed': {} 80 - 'MobileShell:FeedsButtonPressed': {} 81 - 'MobileShell:MessagesButtonPressed': {} 82 - // NOTIFICATIONS events 83 - 'Notificatons:OpenApp': {} 84 - // LISTS events 85 - 'Lists:onRefresh': {} 86 - 'Lists:onEndReached': {} 87 - 'CreateList:AvatarSelected': {} 88 - 'CreateList:SaveCurateList': {} // CAN BE SERVER 89 - 'CreateList:SaveModList': {} // CAN BE SERVER 90 - 'Lists:Mute': {} // CAN BE SERVER 91 - 'Lists:Unmute': {} // CAN BE SERVER 92 - 'Lists:Block': {} // CAN BE SERVER 93 - 'Lists:Unblock': {} // CAN BE SERVER 94 - 'Lists:Delete': {} // CAN BE SERVER 95 - 'Lists:Share': {} // CAN BE SERVER 96 - // CUSTOM FEED events 97 - 'CustomFeed:Save': {} 98 - 'CustomFeed:Unsave': {} 99 - 'CustomFeed:Like': {} 100 - 'CustomFeed:Unlike': {} 101 - 'CustomFeed:Share': {} 102 - 'CustomFeed:Pin': { 103 - uri: string 104 - name?: string 105 - } 106 - 'CustomFeed:Unpin': { 107 - uri: string 108 - name?: string 109 - } 110 - 'CustomFeed:Reorder': { 111 - uri: string 112 - name?: string 113 - index: number 114 - } 115 - 'CustomFeed:LoadMore': {} 116 - 'MultiFeed:onEndReached': {} 117 - 'MultiFeed:onRefresh': {} 118 - // MODERATION events 119 - 'Moderation:ContentfilteringButtonClicked': {} 120 - // ONBOARDING events 121 - 'Onboarding:Begin': {} 122 - 'Onboarding:Complete': {} 123 - 'Onboarding:Skipped': {} 124 - 'Onboarding:Reset': {} 125 - 'Onboarding:SuggestedFollowFollowed': {} 126 - 'Onboarding:CustomFeedAdded': {} 127 - // Onboarding v2 128 - 'OnboardingV2:Begin': {} 129 - 'OnboardingV2:StepInterests:Start': {} 130 - 'OnboardingV2:StepInterests:End': { 131 - selectedInterests: string[] 132 - selectedInterestsLength: number 133 - } 134 - 'OnboardingV2:StepInterests:Error': {} 135 - 'OnboardingV2:StepSuggestedAccounts:Start': {} 136 - 'OnboardingV2:StepSuggestedAccounts:End': { 137 - selectedAccountsLength: number 138 - } 139 - 'OnboardingV2:StepFollowingFeed:Start': {} 140 - 'OnboardingV2:StepFollowingFeed:End': {} 141 - 'OnboardingV2:StepAlgoFeeds:Start': {} 142 - 'OnboardingV2:StepAlgoFeeds:End': { 143 - selectedPrimaryFeeds: string[] 144 - selectedPrimaryFeedsLength: number 145 - selectedSecondaryFeeds: string[] 146 - selectedSecondaryFeedsLength: number 147 - } 148 - 'OnboardingV2:StepTopicalFeeds:Start': {} 149 - 'OnboardingV2:StepTopicalFeeds:End': { 150 - selectedFeeds: string[] 151 - selectedFeedsLength: number 152 - } 153 - 'OnboardingV2:StepModeration:Start': {} 154 - 'OnboardingV2:StepModeration:End': {} 155 - 'OnboardingV2:StepProfile:Start': {} 156 - 'OnboardingV2:StepProfile:End': {} 157 - 'OnboardingV2:StepFinished:Start': {} 158 - 'OnboardingV2:StepFinished:End': {} 159 - 'OnboardingV2:Complete': {} 160 - 'OnboardingV2:Skip': {} 161 - } 162 - 163 - export type ScreenPropertiesMap = { 164 - Login: {} 165 - CreateAccount: {} 166 - 'Choose Account': {} 167 - 'Signin:ForgotPassword': {} 168 - 'Signin:SetNewPasswordForm': {} 169 - 'Signin:PasswordUpdatedForm': {} 170 - Feed: {} 171 - Notifications: {} 172 - Profile: {} 173 - 'Profile:Preview': {} 174 - Settings: {} 175 - AppPasswords: {} 176 - Moderation: {} 177 - PreferencesExternalEmbeds: {} 178 - BlockedAccounts: {} 179 - MutedAccounts: {} 180 - SavedFeeds: {} 181 - }
+1 -4
src/lib/hooks/useAccountSwitcher.ts
··· 2 2 import {msg} from '@lingui/macro' 3 3 import {useLingui} from '@lingui/react' 4 4 5 - import {useAnalytics} from '#/lib/analytics/analytics' 6 5 import {logger} from '#/logger' 7 6 import {isWeb} from '#/platform/detection' 8 7 import {SessionAccount, useSessionApi} from '#/state/session' ··· 14 13 export function useAccountSwitcher() { 15 14 const [pendingDid, setPendingDid] = useState<string | null>(null) 16 15 const {_} = useLingui() 17 - const {track} = useAnalytics() 18 16 const {resumeSession} = useSessionApi() 19 17 const {requestSwitchToAccount} = useLoggedOutViewControls() 20 18 ··· 23 21 account: SessionAccount, 24 22 logContext: LogEvents['account:loggedIn']['logContext'], 25 23 ) => { 26 - track('Settings:SwitchAccountButtonClicked') 27 24 if (pendingDid) { 28 25 // The session API isn't resilient to race conditions so let's just ignore this. 29 26 return ··· 62 59 setPendingDid(null) 63 60 } 64 61 }, 65 - [_, track, resumeSession, requestSwitchToAccount, pendingDid], 62 + [_, resumeSession, requestSwitchToAccount, pendingDid], 66 63 ) 67 64 68 65 return {onPressSwitchAccount, pendingDid}
+11 -13
src/lib/hooks/useNotificationHandler.ts
··· 3 3 import {CommonActions, useNavigation} from '@react-navigation/native' 4 4 import {useQueryClient} from '@tanstack/react-query' 5 5 6 + import {useAccountSwitcher} from '#/lib/hooks/useAccountSwitcher' 7 + import {NavigationProp} from '#/lib/routes/types' 8 + import {logEvent} from '#/lib/statsig/statsig' 6 9 import {logger} from '#/logger' 7 - import {track} from 'lib/analytics/analytics' 8 - import {useAccountSwitcher} from 'lib/hooks/useAccountSwitcher' 9 - import {NavigationProp} from 'lib/routes/types' 10 - import {logEvent} from 'lib/statsig/statsig' 11 - import {isAndroid} from 'platform/detection' 12 - import {useCurrentConvoId} from 'state/messages/current-convo-id' 13 - import {RQKEY as RQKEY_NOTIFS} from 'state/queries/notifications/feed' 14 - import {invalidateCachedUnreadPage} from 'state/queries/notifications/unread' 15 - import {truncateAndInvalidate} from 'state/queries/util' 16 - import {useSession} from 'state/session' 17 - import {useLoggedOutViewControls} from 'state/shell/logged-out' 18 - import {useCloseAllActiveElements} from 'state/util' 10 + import {isAndroid} from '#/platform/detection' 11 + import {useCurrentConvoId} from '#/state/messages/current-convo-id' 12 + import {RQKEY as RQKEY_NOTIFS} from '#/state/queries/notifications/feed' 13 + import {invalidateCachedUnreadPage} from '#/state/queries/notifications/unread' 14 + import {truncateAndInvalidate} from '#/state/queries/util' 15 + import {useSession} from '#/state/session' 16 + import {useLoggedOutViewControls} from '#/state/shell/logged-out' 17 + import {useCloseAllActiveElements} from '#/state/util' 19 18 import {resetToTab} from '#/Navigation' 20 19 21 20 type NotificationReason = ··· 228 227 {}, 229 228 logger.DebugContext.notifications, 230 229 ) 231 - track('Notificatons:OpenApp') 232 230 logEvent('notifications:openApp', {}) 233 231 invalidateCachedUnreadPage() 234 232 truncateAndInvalidate(queryClient, RQKEY_NOTIFS())
-8
src/screens/Login/ChooseAccountForm.tsx
··· 3 3 import {msg, Trans} from '@lingui/macro' 4 4 import {useLingui} from '@lingui/react' 5 5 6 - import {useAnalytics} from '#/lib/analytics/analytics' 7 6 import {logEvent} from '#/lib/statsig/statsig' 8 7 import {logger} from '#/logger' 9 8 import {SessionAccount, useSession, useSessionApi} from '#/state/session' ··· 23 22 onPressBack: () => void 24 23 }) => { 25 24 const [pendingDid, setPendingDid] = React.useState<string | null>(null) 26 - const {track, screen} = useAnalytics() 27 25 const {_} = useLingui() 28 26 const {currentAccount} = useSession() 29 27 const {resumeSession} = useSessionApi() 30 28 const {setShowLoggedOut} = useLoggedOutViewControls() 31 29 32 - React.useEffect(() => { 33 - screen('Choose Account') 34 - }, [screen]) 35 - 36 30 const onSelect = React.useCallback( 37 31 async (account: SessionAccount) => { 38 32 if (pendingDid) { ··· 56 50 logContext: 'ChooseAccountForm', 57 51 withPassword: false, 58 52 }) 59 - track('Sign In', {resumedSession: true}) 60 53 Toast.show(_(msg`Signed in as @${account.handle}`)) 61 54 } catch (e: any) { 62 55 logger.error('choose account: initSession failed', { ··· 70 63 }, 71 64 [ 72 65 currentAccount, 73 - track, 74 66 resumeSession, 75 67 pendingDid, 76 68 onSelectAccount,
+1 -7
src/screens/Login/ForgotPasswordForm.tsx
··· 1 - import React, {useEffect, useState} from 'react' 1 + import React, {useState} from 'react' 2 2 import {ActivityIndicator, Keyboard, View} from 'react-native' 3 3 import {ComAtprotoServerDescribeServer} from '@atproto/api' 4 4 import {BskyAgent} from '@atproto/api' ··· 6 6 import {useLingui} from '@lingui/react' 7 7 import * as EmailValidator from 'email-validator' 8 8 9 - import {useAnalytics} from '#/lib/analytics/analytics' 10 9 import {isNetworkError} from '#/lib/strings/errors' 11 10 import {cleanError} from '#/lib/strings/errors' 12 11 import {logger} from '#/logger' ··· 41 40 const t = useTheme() 42 41 const [isProcessing, setIsProcessing] = useState<boolean>(false) 43 42 const [email, setEmail] = useState<string>('') 44 - const {screen} = useAnalytics() 45 43 const {_} = useLingui() 46 - 47 - useEffect(() => { 48 - screen('Signin:ForgotPassword') 49 - }, [screen]) 50 44 51 45 const onPressSelectService = React.useCallback(() => { 52 46 Keyboard.dismiss()
+3 -6
src/screens/Login/LoginForm.tsx
··· 13 13 import {msg, Trans} from '@lingui/macro' 14 14 import {useLingui} from '@lingui/react' 15 15 16 - import {useAnalytics} from '#/lib/analytics/analytics' 16 + import {useRequestNotificationsPermission} from '#/lib/notifications/notifications' 17 17 import {isNetworkError} from '#/lib/strings/errors' 18 18 import {cleanError} from '#/lib/strings/errors' 19 19 import {createFullHandle} from '#/lib/strings/handles' 20 20 import {logger} from '#/logger' 21 + import {useSetHasCheckedForStarterPack} from '#/state/preferences/used-starter-packs' 21 22 import {useSessionApi} from '#/state/session' 22 23 import {useLoggedOutViewControls} from '#/state/shell/logged-out' 23 - import {useRequestNotificationsPermission} from 'lib/notifications/notifications' 24 - import {useSetHasCheckedForStarterPack} from 'state/preferences/used-starter-packs' 25 24 import {atoms as a, useTheme} from '#/alf' 26 25 import {Button, ButtonIcon, ButtonText} from '#/components/Button' 27 26 import {FormError} from '#/components/forms/FormError' ··· 57 56 onPressBack: () => void 58 57 onPressForgotPassword: () => void 59 58 }) => { 60 - const {track} = useAnalytics() 61 59 const t = useTheme() 62 60 const [isProcessing, setIsProcessing] = useState<boolean>(false) 63 61 const [isAuthFactorTokenNeeded, setIsAuthFactorTokenNeeded] = ··· 74 72 75 73 const onPressSelectService = React.useCallback(() => { 76 74 Keyboard.dismiss() 77 - track('Signin:PressedSelectService') 78 - }, [track]) 75 + }, []) 79 76 80 77 const onPressNext = async () => { 81 78 if (isProcessing) return
+1 -7
src/screens/Login/PasswordUpdatedForm.tsx
··· 1 - import React, {useEffect} from 'react' 1 + import React from 'react' 2 2 import {View} from 'react-native' 3 3 import {msg, Trans} from '@lingui/macro' 4 4 import {useLingui} from '@lingui/react' 5 5 6 - import {useAnalytics} from '#/lib/analytics/analytics' 7 6 import {atoms as a, useBreakpoints} from '#/alf' 8 7 import {Button, ButtonText} from '#/components/Button' 9 8 import {Text} from '#/components/Typography' ··· 14 13 }: { 15 14 onPressNext: () => void 16 15 }) => { 17 - const {screen} = useAnalytics() 18 16 const {_} = useLingui() 19 17 const {gtMobile} = useBreakpoints() 20 - 21 - useEffect(() => { 22 - screen('Signin:PasswordUpdatedForm') 23 - }, [screen]) 24 18 25 19 return ( 26 20 <FormContainer
+1 -7
src/screens/Login/SetNewPasswordForm.tsx
··· 1 - import React, {useEffect, useState} from 'react' 1 + import React, {useState} from 'react' 2 2 import {ActivityIndicator, View} from 'react-native' 3 3 import {BskyAgent} from '@atproto/api' 4 4 import {msg, Trans} from '@lingui/macro' 5 5 import {useLingui} from '@lingui/react' 6 6 7 - import {useAnalytics} from '#/lib/analytics/analytics' 8 7 import {isNetworkError} from '#/lib/strings/errors' 9 8 import {cleanError} from '#/lib/strings/errors' 10 9 import {checkAndFormatResetCode} from '#/lib/strings/password' ··· 31 30 onPressBack: () => void 32 31 onPasswordSet: () => void 33 32 }) => { 34 - const {screen} = useAnalytics() 35 33 const {_} = useLingui() 36 34 const t = useTheme() 37 - 38 - useEffect(() => { 39 - screen('Signin:SetNewPasswordForm') 40 - }, [screen]) 41 35 42 36 const [isProcessing, setIsProcessing] = useState<boolean>(false) 43 37 const [resetCode, setResetCode] = useState<string>('')
-3
src/screens/Login/index.tsx
··· 4 4 import {msg} from '@lingui/macro' 5 5 import {useLingui} from '@lingui/react' 6 6 7 - import {useAnalytics} from '#/lib/analytics/analytics' 8 7 import {DEFAULT_SERVICE} from '#/lib/constants' 9 8 import {logger} from '#/logger' 10 9 import {useServiceQuery} from '#/state/queries/service' ··· 31 30 const {_} = useLingui() 32 31 33 32 const {accounts} = useSession() 34 - const {track} = useAnalytics() 35 33 const {requestedAccountSwitchTo} = useLoggedOutView() 36 34 const requestedAccount = accounts.find( 37 35 acc => acc.did === requestedAccountSwitchTo, ··· 87 85 }, [serviceError, serviceUrl, _]) 88 86 89 87 const onPressForgotPassword = () => { 90 - track('Signin:PressedForgotPassword') 91 88 setCurrentForm(Forms.ForgotPassword) 92 89 } 93 90
+1 -4
src/screens/Moderation/index.tsx
··· 7 7 import {useLingui} from '@lingui/react' 8 8 import {useFocusEffect} from '@react-navigation/native' 9 9 10 - import {useAnalytics} from '#/lib/analytics/analytics' 11 10 import {getLabelingServiceTitle} from '#/lib/moderation' 12 11 import {CommonNavigatorParams, NativeStackScreenProps} from '#/lib/routes/types' 13 12 import {logger} from '#/logger' ··· 163 162 const {_} = useLingui() 164 163 const t = useTheme() 165 164 const setMinimalShellMode = useSetMinimalShellMode() 166 - const {screen} = useAnalytics() 167 165 const {gtMobile} = useBreakpoints() 168 166 const {mutedWordsDialogControl} = useGlobalDialogsControlContext() 169 167 const birthdateDialogControl = Dialog.useDialogControl() ··· 175 173 176 174 useFocusEffect( 177 175 React.useCallback(() => { 178 - screen('Moderation') 179 176 setMinimalShellMode(false) 180 - }, [screen, setMinimalShellMode]), 177 + }, [setMinimalShellMode]), 181 178 ) 182 179 183 180 const {mutateAsync: setAdultContentPref, variables: optimisticAdultContent} =
+5 -14
src/screens/Onboarding/StepFinished.tsx
··· 7 7 import {useLingui} from '@lingui/react' 8 8 import {useQueryClient} from '@tanstack/react-query' 9 9 10 - import {useAnalytics} from '#/lib/analytics/analytics' 10 + import {uploadBlob} from '#/lib/api' 11 11 import { 12 12 BSKY_APP_ACCOUNT_DID, 13 13 DISCOVER_SAVED_FEED, 14 14 TIMELINE_SAVED_FEED, 15 15 } from '#/lib/constants' 16 + import {useRequestNotificationsPermission} from '#/lib/notifications/notifications' 16 17 import {logEvent} from '#/lib/statsig/statsig' 17 18 import {logger} from '#/logger' 19 + import {useSetHasCheckedForStarterPack} from '#/state/preferences/used-starter-packs' 20 + import {getAllListMembers} from '#/state/queries/list-members' 18 21 import {preferencesQueryKey} from '#/state/queries/preferences' 19 22 import {RQKEY as profileRQKey} from '#/state/queries/profile' 20 23 import {useAgent} from '#/state/session' 21 24 import {useOnboardingDispatch} from '#/state/shell' 22 25 import {useProgressGuideControls} from '#/state/shell/progress-guide' 23 - import {uploadBlob} from 'lib/api' 24 - import {useRequestNotificationsPermission} from 'lib/notifications/notifications' 25 - import {useSetHasCheckedForStarterPack} from 'state/preferences/used-starter-packs' 26 - import {getAllListMembers} from 'state/queries/list-members' 27 26 import { 28 27 useActiveStarterPack, 29 28 useSetActiveStarterPack, 30 - } from 'state/shell/starter-pack' 29 + } from '#/state/shell/starter-pack' 31 30 import { 32 31 DescriptionText, 33 32 OnboardingControls, ··· 48 47 export function StepFinished() { 49 48 const {_} = useLingui() 50 49 const t = useTheme() 51 - const {track} = useAnalytics() 52 50 const {state, dispatch} = React.useContext(Context) 53 51 const onboardDispatch = useOnboardingDispatch() 54 52 const [saving, setSaving] = React.useState(false) ··· 190 188 startProgressGuide('like-10-and-follow-7') 191 189 dispatch({type: 'finish'}) 192 190 onboardDispatch({type: 'finish'}) 193 - track('OnboardingV2:StepFinished:End') 194 - track('OnboardingV2:Complete') 195 191 logEvent('onboarding:finished:nextPressed', { 196 192 usedStarterPack: Boolean(starterPack), 197 193 starterPackName: AppBskyGraphStarterpack.isRecord(starterPack?.record) ··· 214 210 agent, 215 211 dispatch, 216 212 onboardDispatch, 217 - track, 218 213 activeStarterPack, 219 214 state, 220 215 requestNotificationsPermission, ··· 222 217 setHasCheckedForStarterPack, 223 218 startProgressGuide, 224 219 ]) 225 - 226 - React.useEffect(() => { 227 - track('OnboardingV2:StepFinished:Start') 228 - }, [track]) 229 220 230 221 return ( 231 222 <View style={[a.align_start]}>
+2 -16
src/screens/Onboarding/StepInterests/index.tsx
··· 4 4 import {useLingui} from '@lingui/react' 5 5 import {useQuery} from '@tanstack/react-query' 6 6 7 - import {useAnalytics} from '#/lib/analytics/analytics' 8 7 import {logEvent} from '#/lib/statsig/statsig' 9 8 import {capitalize} from '#/lib/strings/capitalize' 10 9 import {logger} from '#/logger' ··· 36 35 const {_} = useLingui() 37 36 const t = useTheme() 38 37 const {gtMobile} = useBreakpoints() 39 - const {track} = useAnalytics() 40 38 const interestsDisplayNames = useInterestsDisplayNames() 41 39 42 40 const {state, dispatch} = React.useContext(Context) ··· 90 88 `onboarding: getTaggedSuggestions fetch or processing failed`, 91 89 ) 92 90 logger.error(e) 93 - track('OnboardingV2:StepInterests:Error') 94 91 95 92 throw new Error(`a network error occurred`) 96 93 } ··· 108 105 selectedInterests: interests, 109 106 }) 110 107 dispatch({type: 'next'}) 111 - 112 - track('OnboardingV2:StepInterests:End', { 113 - selectedInterests: interests, 114 - selectedInterestsLength: interests.length, 115 - }) 116 108 logEvent('onboarding:interests:nextPressed', { 117 109 selectedInterests: interests, 118 110 selectedInterestsLength: interests.length, ··· 121 113 logger.info(`onboading: error saving interests`) 122 114 logger.error(e) 123 115 } 124 - }, [interests, data, setSaving, dispatch, track]) 116 + }, [interests, data, setSaving, dispatch]) 125 117 126 118 const skipOnboarding = React.useCallback(() => { 127 119 onboardDispatch({type: 'finish'}) 128 120 dispatch({type: 'finish'}) 129 - track('OnboardingV2:Skip') 130 - }, [onboardDispatch, dispatch, track]) 131 - 132 - React.useEffect(() => { 133 - track('OnboardingV2:Begin') 134 - track('OnboardingV2:StepInterests:Start') 135 - }, [track]) 121 + }, [onboardDispatch, dispatch]) 136 122 137 123 const title = isError ? ( 138 124 <Trans>Oh no! Something went wrong.</Trans>
+1 -8
src/screens/Onboarding/StepProfile/index.tsx
··· 9 9 import {msg, Trans} from '@lingui/macro' 10 10 import {useLingui} from '@lingui/react' 11 11 12 - import {useAnalytics} from '#/lib/analytics/analytics' 13 12 import {usePhotoLibraryPermission} from '#/lib/hooks/usePermissions' 14 13 import {compressIfNeeded} from '#/lib/media/manip' 15 14 import {openCropper} from '#/lib/media/picker' ··· 68 67 const {_} = useLingui() 69 68 const t = useTheme() 70 69 const {gtMobile} = useBreakpoints() 71 - const {track} = useAnalytics() 72 70 const {requestPhotoAccessIfNeeded} = usePhotoLibraryPermission() 73 71 const gate = useGate() 74 72 const requestNotificationsPermission = useRequestNotificationsPermission() ··· 88 86 const canvasRef = React.useRef<PlaceholderCanvasRef>(null) 89 87 90 88 React.useEffect(() => { 91 - track('OnboardingV2:StepProfile:Start') 92 - }, [track]) 93 - 94 - React.useEffect(() => { 95 89 requestNotificationsPermission('StartOnboarding') 96 90 }, [gate, requestNotificationsPermission]) 97 91 ··· 155 149 } 156 150 157 151 dispatch({type: 'next'}) 158 - track('OnboardingV2:StepProfile:End') 159 152 logEvent('onboarding:profile:nextPressed', {}) 160 - }, [avatar, dispatch, track]) 153 + }, [avatar, dispatch]) 161 154 162 155 const onDoneCreating = React.useCallback(() => { 163 156 setAvatar(prev => ({
+5 -10
src/screens/Profile/Header/ProfileHeaderLabeler.tsx
··· 12 12 13 13 // eslint-disable-next-line @typescript-eslint/no-unused-vars 14 14 import {MAX_LABELERS} from '#/lib/constants' 15 + import {useHaptics} from '#/lib/haptics' 15 16 import {isAppLabeler} from '#/lib/moderation' 16 17 import {logger} from '#/logger' 18 + import {isIOS} from '#/platform/detection' 19 + import {useProfileShadow} from '#/state/cache/profile-shadow' 17 20 import {Shadow} from '#/state/cache/types' 18 21 import {useModalControls} from '#/state/modals' 19 22 import {useLabelerSubscriptionMutation} from '#/state/queries/labeler' 20 23 import {useLikeMutation, useUnlikeMutation} from '#/state/queries/like' 21 24 import {usePreferencesQuery} from '#/state/queries/preferences' 22 25 import {useRequireAuth, useSession} from '#/state/session' 23 - import {useAnalytics} from 'lib/analytics/analytics' 24 - import {useHaptics} from 'lib/haptics' 25 - import {isIOS} from 'platform/detection' 26 - import {useProfileShadow} from 'state/cache/profile-shadow' 27 26 import {ProfileMenu} from '#/view/com/profile/ProfileMenu' 28 27 import * as Toast from '#/view/com/util/Toast' 29 28 import {atoms as a, tokens, useBreakpoints, useTheme} from '#/alf' ··· 66 65 const {_} = useLingui() 67 66 const {currentAccount, hasSession} = useSession() 68 67 const {openModal} = useModalControls() 69 - const {track} = useAnalytics() 70 68 const requireAuth = useRequireAuth() 71 69 const playHaptic = useHaptics() 72 70 const cantSubscribePrompt = Prompt.usePromptControl() ··· 102 100 103 101 if (likeUri) { 104 102 await unlikeMod({uri: likeUri}) 105 - track('CustomFeed:Unlike') 106 103 setLikeCount(c => c - 1) 107 104 setLikeUri('') 108 105 } else { 109 106 const res = await likeMod({uri: labeler.uri, cid: labeler.cid}) 110 - track('CustomFeed:Like') 111 107 setLikeCount(c => c + 1) 112 108 setLikeUri(res.uri) 113 109 } ··· 120 116 ) 121 117 logger.error(`Failed to toggle labeler like`, {message: e.message}) 122 118 } 123 - }, [labeler, playHaptic, likeUri, unlikeMod, track, likeMod, _]) 119 + }, [labeler, playHaptic, likeUri, unlikeMod, likeMod, _]) 124 120 125 121 const onPressEditProfile = React.useCallback(() => { 126 - track('ProfileHeader:EditProfileButtonClicked') 127 122 openModal({ 128 123 name: 'edit-profile', 129 124 profile, 130 125 }) 131 - }, [track, openModal, profile]) 126 + }, [openModal, profile]) 132 127 133 128 const onPressSubscribe = React.useCallback( 134 129 () =>
+4 -10
src/screens/Profile/Header/ProfileHeaderStandard.tsx
··· 9 9 import {msg, Trans} from '@lingui/macro' 10 10 import {useLingui} from '@lingui/react' 11 11 12 + import {sanitizeDisplayName} from '#/lib/strings/display-names' 12 13 import {logger} from '#/logger' 13 14 import {isIOS} from '#/platform/detection' 15 + import {useProfileShadow} from '#/state/cache/profile-shadow' 14 16 import {Shadow} from '#/state/cache/types' 15 17 import {useModalControls} from '#/state/modals' 16 18 import { ··· 18 20 useProfileFollowMutationQueue, 19 21 } from '#/state/queries/profile' 20 22 import {useRequireAuth, useSession} from '#/state/session' 21 - import {useAnalytics} from 'lib/analytics/analytics' 22 - import {sanitizeDisplayName} from 'lib/strings/display-names' 23 - import {useProfileShadow} from 'state/cache/profile-shadow' 24 23 import {ProfileMenu} from '#/view/com/profile/ProfileMenu' 25 24 import * as Toast from '#/view/com/util/Toast' 26 25 import {atoms as a} from '#/alf' ··· 59 58 const {currentAccount, hasSession} = useSession() 60 59 const {_} = useLingui() 61 60 const {openModal} = useModalControls() 62 - const {track} = useAnalytics() 63 61 const moderation = useMemo( 64 62 () => moderateProfile(profile, moderationOpts), 65 63 [profile, moderationOpts], ··· 77 75 profile.viewer?.blockingByList 78 76 79 77 const onPressEditProfile = React.useCallback(() => { 80 - track('ProfileHeader:EditProfileButtonClicked') 81 78 openModal({ 82 79 name: 'edit-profile', 83 80 profile, 84 81 }) 85 - }, [track, openModal, profile]) 82 + }, [openModal, profile]) 86 83 87 84 const onPressFollow = () => { 88 85 requireAuth(async () => { 89 86 try { 90 - track('ProfileHeader:FollowButtonClicked') 91 87 await queueFollow() 92 88 Toast.show( 93 89 _( ··· 109 105 const onPressUnfollow = () => { 110 106 requireAuth(async () => { 111 107 try { 112 - track('ProfileHeader:UnfollowButtonClicked') 113 108 await queueUnfollow() 114 109 Toast.show( 115 110 _( ··· 129 124 } 130 125 131 126 const unblockAccount = React.useCallback(async () => { 132 - track('ProfileHeader:UnblockAccountButtonClicked') 133 127 try { 134 128 await queueUnblock() 135 129 Toast.show(_(msg`Account unblocked`)) ··· 139 133 Toast.show(_(msg`There was an issue! ${e.toString()}`), 'xmark') 140 134 } 141 135 } 142 - }, [_, queueUnblock, track]) 136 + }, [_, queueUnblock]) 143 137 144 138 const isMe = React.useMemo( 145 139 () => currentAccount?.did === profile.did,
-6
src/screens/Signup/index.tsx
··· 5 5 import {msg, Trans} from '@lingui/macro' 6 6 import {useLingui} from '@lingui/react' 7 7 8 - import {useAnalytics} from '#/lib/analytics/analytics' 9 8 import {FEEDBACK_FORM_URL} from '#/lib/constants' 10 9 import {useServiceQuery} from '#/state/queries/service' 11 10 import {useStarterPackQuery} from '#/state/queries/starter-packs' ··· 31 30 export function Signup({onPressBack}: {onPressBack: () => void}) { 32 31 const {_} = useLingui() 33 32 const t = useTheme() 34 - const {screen} = useAnalytics() 35 33 const [state, dispatch] = React.useReducer(reducer, initialState) 36 34 const {gtMobile} = useBreakpoints() 37 35 const submit = useSubmitSignup() ··· 55 53 isError, 56 54 refetch, 57 55 } = useServiceQuery(state.serviceUrl) 58 - 59 - React.useEffect(() => { 60 - screen('CreateAccount') 61 - }, [screen]) 62 56 63 57 React.useEffect(() => { 64 58 if (isFetching) {
+1 -15
src/state/queries/post.ts
··· 2 2 import {AppBskyActorDefs, AppBskyFeedDefs, AtUri} from '@atproto/api' 3 3 import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' 4 4 5 - import {track} from '#/lib/analytics/analytics' 6 5 import {useToggleMutationQueue} from '#/lib/hooks/useToggleMutationQueue' 7 6 import {logEvent, LogEvents, toClout} from '#/lib/statsig/statsig' 8 7 import {updatePostShadow} from '#/state/cache/post-shadow' ··· 193 192 }) 194 193 return agent.like(uri, cid) 195 194 }, 196 - onSuccess() { 197 - track('Post:Like') 198 - }, 199 195 }) 200 196 } 201 197 ··· 207 203 mutationFn: ({likeUri}) => { 208 204 logEvent('post:unlike:sampled', {logContext}) 209 205 return agent.deleteLike(likeUri) 210 - }, 211 - onSuccess() { 212 - track('Post:Unlike') 213 206 }, 214 207 }) 215 208 } ··· 285 278 logEvent('post:repost:sampled', {logContext}) 286 279 return agent.repost(post.uri, post.cid) 287 280 }, 288 - onSuccess() { 289 - track('Post:Repost') 290 - }, 291 281 }) 292 282 } 293 283 ··· 300 290 logEvent('post:unrepost:sampled', {logContext}) 301 291 return agent.deleteRepost(repostUri) 302 292 }, 303 - onSuccess() { 304 - track('Post:Unrepost') 305 - }, 306 293 }) 307 294 } 308 295 ··· 313 300 mutationFn: async ({uri}) => { 314 301 await agent.deletePost(uri) 315 302 }, 316 - onSuccess(data, variables) { 303 + onSuccess(_, variables) { 317 304 updatePostShadow(queryClient, variables.uri, {isDeleted: true}) 318 - track('Post:Delete') 319 305 }, 320 306 }) 321 307 }
-3
src/state/queries/preferences/index.ts
··· 5 5 } from '@atproto/api' 6 6 import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' 7 7 8 - import {track} from '#/lib/analytics/analytics' 9 8 import {PROD_DEFAULT_FEED} from '#/lib/constants' 10 9 import {replaceEqualDeep} from '#/lib/functions' 11 10 import {getAge} from '#/lib/strings/time' ··· 218 217 >({ 219 218 mutationFn: async savedFeeds => { 220 219 await agent.addSavedFeeds(savedFeeds) 221 - track('CustomFeed:Save') 222 220 // triggers a refetch 223 221 await queryClient.invalidateQueries({ 224 222 queryKey: preferencesQueryKey, ··· 234 232 return useMutation<void, unknown, Pick<AppBskyActorDefs.SavedFeed, 'id'>>({ 235 233 mutationFn: async savedFeed => { 236 234 await agent.removeSavedFeeds([savedFeed.id]) 237 - track('CustomFeed:Unsave') 238 235 // triggers a refetch 239 236 await queryClient.invalidateQueries({ 240 237 queryKey: preferencesQueryKey,
-5
src/state/queries/profile.ts
··· 16 16 useQueryClient, 17 17 } from '@tanstack/react-query' 18 18 19 - import {track} from '#/lib/analytics/analytics' 20 19 import {uploadBlob} from '#/lib/api' 21 20 import {until} from '#/lib/async/until' 22 21 import {useToggleMutationQueue} from '#/lib/hooks/useToggleMutationQueue' ··· 316 315 }) 317 316 return await agent.follow(did) 318 317 }, 319 - onSuccess(data, variables) { 320 - track('Profile:Follow', {username: variables.did}) 321 - }, 322 318 }) 323 319 } 324 320 ··· 329 325 return useMutation<void, Error, {did: string; followUri: string}>({ 330 326 mutationFn: async ({followUri}) => { 331 327 logEvent('profile:unfollow:sampled', {logContext}) 332 - track('Profile:Unfollow', {username: followUri}) 333 328 return await agent.deleteFollow(followUri) 334 329 }, 335 330 })
-4
src/state/session/index.tsx
··· 1 1 import React from 'react' 2 2 import {AtpSessionEvent, BskyAgent} from '@atproto/api' 3 3 4 - import {track} from '#/lib/analytics/analytics' 5 4 import {logEvent} from '#/lib/statsig/statsig' 6 5 import {isWeb} from '#/platform/detection' 7 6 import * as persisted from '#/state/persisted' ··· 70 69 async params => { 71 70 addSessionDebugLog({type: 'method:start', method: 'createAccount'}) 72 71 const signal = cancelPendingTask() 73 - track('Try Create Account') 74 72 logEvent('account:create:begin', {}) 75 73 const {agent, account} = await createAgentAndCreateAccount( 76 74 params, ··· 85 83 newAgent: agent, 86 84 newAccount: account, 87 85 }) 88 - track('Create Account') 89 86 logEvent('account:create:success', {}) 90 87 addSessionDebugLog({type: 'method:end', method: 'createAccount', account}) 91 88 }, ··· 109 106 newAgent: agent, 110 107 newAccount: account, 111 108 }) 112 - track('Sign In', {resumedSession: false}) 113 109 logEvent('account:loggedIn', {logContext, withPassword: true}) 114 110 addSessionDebugLog({type: 'method:end', method: 'login', account}) 115 111 },
-4
src/state/shell/onboarding.tsx
··· 1 1 import React from 'react' 2 2 3 - import {track} from '#/lib/analytics/analytics' 4 3 import * as persisted from '#/state/persisted' 5 4 6 5 export const OnboardingScreenSteps = { ··· 55 54 return compute({...state, step: nextStep}) 56 55 } 57 56 case 'start': { 58 - track('Onboarding:Begin') 59 57 persisted.write('onboarding', {step: 'Welcome'}) 60 58 return compute({...state, step: 'Welcome'}) 61 59 } 62 60 case 'finish': { 63 - track('Onboarding:Complete') 64 61 persisted.write('onboarding', {step: 'Home'}) 65 62 return compute({...state, step: 'Home'}) 66 63 } 67 64 case 'skip': { 68 - track('Onboarding:Skipped') 69 65 persisted.write('onboarding', {step: 'Home'}) 70 66 return compute({...state, step: 'Home'}) 71 67 }
+1 -4
src/view/com/auth/LoggedOut.tsx
··· 4 4 import {msg} from '@lingui/macro' 5 5 import {useLingui} from '@lingui/react' 6 6 7 - import {useAnalytics} from '#/lib/analytics/analytics' 8 7 import {usePalette} from '#/lib/hooks/usePalette' 9 8 import {logEvent} from '#/lib/statsig/statsig' 10 9 import {s} from '#/lib/styles' ··· 32 31 const {_} = useLingui() 33 32 const pal = usePalette('default') 34 33 const setMinimalShellMode = useSetMinimalShellMode() 35 - const {screen} = useAnalytics() 36 34 const {requestedAccountSwitchTo} = useLoggedOutView() 37 35 const [screenState, setScreenState] = React.useState<ScreenState>(() => { 38 36 if (requestedAccountSwitchTo === 'new') { ··· 48 46 const {clearRequestedAccount} = useLoggedOutViewControls() 49 47 50 48 React.useEffect(() => { 51 - screen('Login') 52 49 setMinimalShellMode(true) 53 - }, [screen, setMinimalShellMode]) 50 + }, [setMinimalShellMode]) 54 51 55 52 const onPressDismiss = React.useCallback(() => { 56 53 if (onDismiss) {
+1 -9
src/view/com/composer/Composer.tsx
··· 45 45 import {msg, Trans} from '@lingui/macro' 46 46 import {useLingui} from '@lingui/react' 47 47 48 - import {useAnalytics} from '#/lib/analytics/analytics' 49 48 import * as apilib from '#/lib/api/index' 50 49 import {until} from '#/lib/async/until' 51 50 import {MAX_GRAPHEME_LENGTH} from '#/lib/constants' ··· 147 146 const {data: currentProfile} = useProfileQuery({did: currentAccount!.did}) 148 147 const {isModalActive} = useModals() 149 148 const {closeComposer} = useComposerControls() 150 - const {track} = useAnalytics() 151 149 const pal = usePalette('default') 152 150 const {isMobile} = useWebMediaQueries() 153 151 const {_} = useLingui() ··· 310 308 311 309 const onPhotoPasted = useCallback( 312 310 async (uri: string) => { 313 - track('Composer:PastedPhotos') 314 311 if (uri.startsWith('data:video/')) { 315 312 selectVideo({uri, type: 'video', height: 0, width: 0}) 316 313 } else { ··· 318 315 onImageAdd([res]) 319 316 } 320 317 }, 321 - [track, selectVideo, onImageAdd], 318 + [selectVideo, onImageAdd], 322 319 ) 323 320 324 321 const isAltTextRequiredAndMissing = useMemo(() => { ··· 446 443 logContext: 'Composer', 447 444 }) 448 445 } 449 - track('Create Post', { 450 - imageCount: images.length, 451 - }) 452 - if (replyTo && replyTo.uri) track('Post:Reply') 453 446 } 454 447 if (postUri && !replyTo) { 455 448 emitPostCreated() ··· 499 492 setExtLink, 500 493 setLangPrefs, 501 494 threadgateAllowUISettings, 502 - track, 503 495 videoAltText, 504 496 videoUploadState.asset, 505 497 videoUploadState.pendingPublish,
-4
src/view/com/composer/photos/OpenCameraBtn.tsx
··· 3 3 import {msg} from '@lingui/macro' 4 4 import {useLingui} from '@lingui/react' 5 5 6 - import {useAnalytics} from '#/lib/analytics/analytics' 7 6 import {POST_IMG_MAX} from '#/lib/constants' 8 7 import {useCameraPermission} from '#/lib/hooks/usePermissions' 9 8 import {openCamera} from '#/lib/media/picker' ··· 20 19 } 21 20 22 21 export function OpenCameraBtn({disabled, onAdd}: Props) { 23 - const {track} = useAnalytics() 24 22 const {_} = useLingui() 25 23 const {requestCameraAccessIfNeeded} = useCameraPermission() 26 24 const [mediaPermissionRes, requestMediaPermission] = ··· 28 26 const t = useTheme() 29 27 30 28 const onPressTakePicture = useCallback(async () => { 31 - track('Composer:CameraOpened') 32 29 try { 33 30 if (!(await requestCameraAccessIfNeeded())) { 34 31 return ··· 58 55 } 59 56 }, [ 60 57 onAdd, 61 - track, 62 58 requestCameraAccessIfNeeded, 63 59 mediaPermissionRes, 64 60 requestMediaPermission,
+1 -5
src/view/com/composer/photos/SelectPhotoBtn.tsx
··· 3 3 import {msg} from '@lingui/macro' 4 4 import {useLingui} from '@lingui/react' 5 5 6 - import {useAnalytics} from '#/lib/analytics/analytics' 7 6 import {usePhotoLibraryPermission} from '#/lib/hooks/usePermissions' 8 7 import {openPicker} from '#/lib/media/picker' 9 8 import {isNative} from '#/platform/detection' ··· 19 18 } 20 19 21 20 export function SelectPhotoBtn({size, disabled, onAdd}: Props) { 22 - const {track} = useAnalytics() 23 21 const {_} = useLingui() 24 22 const {requestPhotoAccessIfNeeded} = usePhotoLibraryPermission() 25 23 const t = useTheme() 26 24 27 25 const onPressSelectPhotos = useCallback(async () => { 28 - track('Composer:GalleryOpened') 29 - 30 26 if (isNative && !(await requestPhotoAccessIfNeeded())) { 31 27 return 32 28 } ··· 41 37 ) 42 38 43 39 onAdd(results) 44 - }, [track, requestPhotoAccessIfNeeded, size, onAdd]) 40 + }, [requestPhotoAccessIfNeeded, size, onAdd]) 45 41 46 42 return ( 47 43 <Button
-3
src/view/com/composer/threadgate/ThreadgateBtn.tsx
··· 7 7 8 8 import {isNative} from '#/platform/detection' 9 9 import {ThreadgateAllowUISetting} from '#/state/queries/threadgate' 10 - import {useAnalytics} from 'lib/analytics/analytics' 11 10 import {atoms as a, useTheme} from '#/alf' 12 11 import {Button, ButtonIcon, ButtonText} from '#/components/Button' 13 12 import * as Dialog from '#/components/Dialog' ··· 30 29 31 30 style?: StyleProp<AnimatedStyle<ViewStyle>> 32 31 }) { 33 - const {track} = useAnalytics() 34 32 const {_} = useLingui() 35 33 const t = useTheme() 36 34 const control = Dialog.useDialogControl() 37 35 38 36 const onPress = () => { 39 - track('Composer:ThreadgateOpened') 40 37 if (isNative && Keyboard.isVisible()) { 41 38 Keyboard.dismiss() 42 39 }
+5 -9
src/view/com/feeds/FeedPage.tsx
··· 6 6 import {NavigationProp, useNavigation} from '@react-navigation/native' 7 7 import {useQueryClient} from '@tanstack/react-query' 8 8 9 + import {ComposeIcon2} from '#/lib/icons' 9 10 import {getRootNavigation, getTabState, TabState} from '#/lib/routes/helpers' 11 + import {AllNavigatorParams} from '#/lib/routes/types' 10 12 import {logEvent} from '#/lib/statsig/statsig' 13 + import {s} from '#/lib/styles' 11 14 import {isNative} from '#/platform/detection' 12 15 import {listenSoftReset} from '#/state/events' 13 16 import {FeedFeedbackProvider, useFeedFeedback} from '#/state/feed-feedback' ··· 17 20 import {useSession} from '#/state/session' 18 21 import {useSetMinimalShellMode} from '#/state/shell' 19 22 import {useComposerControls} from '#/state/shell/composer' 20 - import {useAnalytics} from 'lib/analytics/analytics' 21 - import {ComposeIcon2} from 'lib/icons' 22 - import {AllNavigatorParams} from 'lib/routes/types' 23 - import {s} from 'lib/styles' 24 23 import {useHeaderOffset} from '#/components/hooks/useHeaderOffset' 25 24 import {Feed} from '../posts/Feed' 26 25 import {FAB} from '../util/fab/FAB' ··· 54 53 const {openComposer} = useComposerControls() 55 54 const [isScrolledDown, setIsScrolledDown] = React.useState(false) 56 55 const setMinimalShellMode = useSetMinimalShellMode() 57 - const {screen, track} = useAnalytics() 58 56 const headerOffset = useHeaderOffset() 59 57 const feedFeedback = useFeedFeedback(feed, hasSession) 60 58 const scrollElRef = React.useRef<ListMethods>(null) ··· 89 87 if (!isPageFocused) { 90 88 return 91 89 } 92 - screen('Feed') 93 90 return listenSoftReset(onSoftReset) 94 - }, [onSoftReset, screen, isPageFocused]) 91 + }, [onSoftReset, isPageFocused]) 95 92 96 93 const onPressCompose = React.useCallback(() => { 97 - track('HomeScreen:PressCompose') 98 94 openComposer({}) 99 - }, [openComposer, track]) 95 + }, [openComposer]) 100 96 101 97 const onPressLoadLatest = React.useCallback(() => { 102 98 scrollToTop()
+14 -17
src/view/com/lists/ListMembers.tsx
··· 7 7 ViewStyle, 8 8 } from 'react-native' 9 9 import {AppBskyActorDefs, AppBskyGraphDefs} from '@atproto/api' 10 + import {msg} from '@lingui/macro' 11 + import {useLingui} from '@lingui/react' 12 + 13 + import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 14 + import {cleanError} from '#/lib/strings/errors' 15 + import {logger} from '#/logger' 16 + import {useModalControls} from '#/state/modals' 17 + import {useListMembersQuery} from '#/state/queries/list-members' 18 + import {useSession} from '#/state/session' 19 + import {ProfileCard} from '../profile/ProfileCard' 20 + import {ErrorMessage} from '../util/error/ErrorMessage' 21 + import {Button} from '../util/forms/Button' 10 22 import {List, ListRef} from '../util/List' 11 23 import {ProfileCardFeedLoadingPlaceholder} from '../util/LoadingPlaceholder' 12 - import {ErrorMessage} from '../util/error/ErrorMessage' 13 24 import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' 14 - import {ProfileCard} from '../profile/ProfileCard' 15 - import {Button} from '../util/forms/Button' 16 - import {useAnalytics} from 'lib/analytics/analytics' 17 - import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 18 - import {useListMembersQuery} from '#/state/queries/list-members' 19 - import {logger} from '#/logger' 20 - import {useModalControls} from '#/state/modals' 21 - import {useSession} from '#/state/session' 22 - import {cleanError} from '#/lib/strings/errors' 23 - import {useLingui} from '@lingui/react' 24 - import {msg} from '@lingui/macro' 25 25 26 26 const LOADING_ITEM = {_reactKey: '__loading__'} 27 27 const EMPTY_ITEM = {_reactKey: '__empty__'} ··· 51 51 headerOffset?: number 52 52 desktopFixedHeightOffset?: number 53 53 }) { 54 - const {track} = useAnalytics() 55 54 const {_} = useLingui() 56 55 const [isRefreshing, setIsRefreshing] = React.useState(false) 57 56 const {isMobile} = useWebMediaQueries() ··· 98 97 // = 99 98 100 99 const onRefresh = React.useCallback(async () => { 101 - track('Lists:onRefresh') 102 100 setIsRefreshing(true) 103 101 try { 104 102 await refetch() ··· 106 104 logger.error('Failed to refresh lists', {message: err}) 107 105 } 108 106 setIsRefreshing(false) 109 - }, [refetch, track, setIsRefreshing]) 107 + }, [refetch, setIsRefreshing]) 110 108 111 109 const onEndReached = React.useCallback(async () => { 112 110 if (isFetching || !hasNextPage || isError) return 113 - track('Lists:onEndReached') 114 111 try { 115 112 await fetchNextPage() 116 113 } catch (err) { 117 114 logger.error('Failed to load more lists', {message: err}) 118 115 } 119 - }, [isFetching, hasNextPage, isError, fetchNextPage, track]) 116 + }, [isFetching, hasNextPage, isError, fetchNextPage]) 120 117 121 118 const onPressRetryLoadMore = React.useCallback(() => { 122 119 fetchNextPage()
+6 -9
src/view/com/lists/MyLists.tsx
··· 11 11 import {msg} from '@lingui/macro' 12 12 import {useLingui} from '@lingui/react' 13 13 14 + import {usePalette} from '#/lib/hooks/usePalette' 14 15 import {cleanError} from '#/lib/strings/errors' 16 + import {s} from '#/lib/styles' 15 17 import {logger} from '#/logger' 18 + import {isWeb} from '#/platform/detection' 19 + import {useModerationOpts} from '#/state/preferences/moderation-opts' 16 20 import {MyListsFilter, useMyListsQuery} from '#/state/queries/my-lists' 17 - import {useAnalytics} from 'lib/analytics/analytics' 18 - import {usePalette} from 'lib/hooks/usePalette' 19 - import {s} from 'lib/styles' 20 - import {isWeb} from 'platform/detection' 21 - import {useModerationOpts} from 'state/preferences/moderation-opts' 22 - import {EmptyState} from 'view/com/util/EmptyState' 21 + import {EmptyState} from '#/view/com/util/EmptyState' 23 22 import {atoms as a, useTheme} from '#/alf' 24 23 import * as ListCard from '#/components/ListCard' 25 24 import {ErrorMessage} from '../util/error/ErrorMessage' ··· 44 43 }) { 45 44 const pal = usePalette('default') 46 45 const t = useTheme() 47 - const {track} = useAnalytics() 48 46 const {_} = useLingui() 49 47 const moderationOpts = useModerationOpts() 50 48 const [isPTRing, setIsPTRing] = React.useState(false) ··· 71 69 // = 72 70 73 71 const onRefresh = React.useCallback(async () => { 74 - track('Lists:onRefresh') 75 72 setIsPTRing(true) 76 73 try { 77 74 await refetch() ··· 79 76 logger.error('Failed to refresh lists', {message: err}) 80 77 } 81 78 setIsPTRing(false) 82 - }, [refetch, track, setIsPTRing]) 79 + }, [refetch, setIsPTRing]) 83 80 84 81 // rendering 85 82 // =
+2 -7
src/view/com/lists/ProfileLists.tsx
··· 10 10 import {useLingui} from '@lingui/react' 11 11 import {useQueryClient} from '@tanstack/react-query' 12 12 13 - import {useAnalytics} from '#/lib/analytics/analytics' 14 13 import {cleanError} from '#/lib/strings/errors' 15 14 import {logger} from '#/logger' 16 15 import {isNative, isWeb} from '#/platform/detection' ··· 48 47 ref, 49 48 ) { 50 49 const t = useTheme() 51 - const {track} = useAnalytics() 52 50 const {_} = useLingui() 53 51 const [isPTRing, setIsPTRing] = React.useState(false) 54 52 const opts = React.useMemo(() => ({enabled}), [enabled]) ··· 102 100 })) 103 101 104 102 const onRefresh = React.useCallback(async () => { 105 - track('Lists:onRefresh') 106 103 setIsPTRing(true) 107 104 try { 108 105 await refetch() ··· 110 107 logger.error('Failed to refresh lists', {message: err}) 111 108 } 112 109 setIsPTRing(false) 113 - }, [refetch, track, setIsPTRing]) 110 + }, [refetch, setIsPTRing]) 114 111 115 112 const onEndReached = React.useCallback(async () => { 116 113 if (isFetching || !hasNextPage || isError) return 117 - 118 - track('Lists:onEndReached') 119 114 try { 120 115 await fetchNextPage() 121 116 } catch (err) { 122 117 logger.error('Failed to load more lists', {message: err}) 123 118 } 124 - }, [isFetching, hasNextPage, isError, fetchNextPage, track]) 119 + }, [isFetching, hasNextPage, isError, fetchNextPage]) 125 120 126 121 const onPressRetryLoadMore = React.useCallback(() => { 127 122 fetchNextPage()
+6 -13
src/view/com/modals/ChangeHandle.tsx
··· 11 11 import {msg, Trans} from '@lingui/macro' 12 12 import {useLingui} from '@lingui/react' 13 13 14 + import {usePalette} from '#/lib/hooks/usePalette' 15 + import {cleanError} from '#/lib/strings/errors' 16 + import {createFullHandle, makeValidHandle} from '#/lib/strings/handles' 17 + import {s} from '#/lib/styles' 18 + import {useTheme} from '#/lib/ThemeContext' 14 19 import {logger} from '#/logger' 15 20 import {useModalControls} from '#/state/modals' 16 21 import {useFetchDid, useUpdateHandleMutation} from '#/state/queries/handle' 17 22 import {useServiceQuery} from '#/state/queries/service' 18 23 import {SessionAccount, useAgent, useSession} from '#/state/session' 19 - import {useAnalytics} from 'lib/analytics/analytics' 20 - import {usePalette} from 'lib/hooks/usePalette' 21 - import {cleanError} from 'lib/strings/errors' 22 - import {createFullHandle, makeValidHandle} from 'lib/strings/handles' 23 - import {s} from 'lib/styles' 24 - import {useTheme} from 'lib/ThemeContext' 25 24 import {ErrorMessage} from '../util/error/ErrorMessage' 26 25 import {Button} from '../util/forms/Button' 27 26 import {SelectableBtn} from '../util/forms/SelectableBtn' ··· 67 66 }) { 68 67 const {_} = useLingui() 69 68 const pal = usePalette('default') 70 - const {track} = useAnalytics() 71 69 const {closeModal} = useModalControls() 72 70 const {mutateAsync: updateHandle, isPending: isUpdateHandlePending} = 73 71 useUpdateHandleMutation() ··· 91 89 setHandle('') 92 90 setCanSave(false) 93 91 setCustom(!isCustom) 94 - track( 95 - isCustom ? 'EditHandle:ViewCustomForm' : 'EditHandle:ViewProvidedForm', 96 - ) 97 - }, [setCustom, isCustom, track]) 92 + }, [setCustom, isCustom]) 98 93 const onPressSave = React.useCallback(async () => { 99 94 if (!userDomain) { 100 95 logger.error(`ChangeHandle: userDomain is undefined`, { ··· 105 100 } 106 101 107 102 try { 108 - track('EditHandle:SetNewHandle') 109 103 const newHandle = isCustom ? handle : createFullHandle(handle, userDomain) 110 104 logger.debug(`Updating handle to ${newHandle}`) 111 105 await updateHandle({ ··· 125 119 userDomain, 126 120 isCustom, 127 121 onChanged, 128 - track, 129 122 closeModal, 130 123 updateHandle, 131 124 serviceInfo,
+1 -10
src/view/com/modals/CreateOrEditList.tsx
··· 14 14 import {msg, Trans} from '@lingui/macro' 15 15 import {useLingui} from '@lingui/react' 16 16 17 - import {useAnalytics} from '#/lib/analytics/analytics' 18 17 import {usePalette} from '#/lib/hooks/usePalette' 19 18 import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 20 19 import {compressIfNeeded} from '#/lib/media/manip' ··· 54 53 const [error, setError] = useState<string>('') 55 54 const pal = usePalette('default') 56 55 const theme = useTheme() 57 - const {track} = useAnalytics() 58 56 const {_} = useLingui() 59 57 const listCreateMutation = useListCreateMutation() 60 58 const listMetadataMutation = useListMetadataMutation() ··· 120 118 setAvatar(undefined) 121 119 return 122 120 } 123 - track('CreateList:AvatarSelected') 124 121 try { 125 122 const finalImg = await compressIfNeeded(img, 1000000) 126 123 setNewAvatar(finalImg) ··· 129 126 setError(cleanError(e)) 130 127 } 131 128 }, 132 - [track, setNewAvatar, setAvatar, setError], 129 + [setNewAvatar, setAvatar, setError], 133 130 ) 134 131 135 132 const onPressSave = useCallback(async () => { 136 - if (isCurateList) { 137 - track('CreateList:SaveCurateList') 138 - } else { 139 - track('CreateList:SaveModList') 140 - } 141 133 const nameTrimmed = name.trim() 142 134 if (!nameTrimmed) { 143 135 setError(_(msg`Name is required`)) ··· 200 192 } 201 193 setProcessing(false) 202 194 }, [ 203 - track, 204 195 setProcessing, 205 196 setError, 206 197 error,
+2 -8
src/view/com/modals/EditProfile.tsx
··· 15 15 import {msg, Trans} from '@lingui/macro' 16 16 import {useLingui} from '@lingui/react' 17 17 18 - import {useAnalytics} from '#/lib/analytics/analytics' 19 18 import {MAX_DESCRIPTION, MAX_DISPLAY_NAME} from '#/lib/constants' 20 19 import {usePalette} from '#/lib/hooks/usePalette' 21 20 import {compressIfNeeded} from '#/lib/media/manip' ··· 47 46 }) { 48 47 const pal = usePalette('default') 49 48 const theme = useTheme() 50 - const {track} = useAnalytics() 51 49 const {_} = useLingui() 52 50 const {closeModal} = useModalControls() 53 51 const updateMutation = useProfileUpdateMutation() ··· 81 79 setUserAvatar(null) 82 80 return 83 81 } 84 - track('EditProfile:AvatarSelected') 85 82 try { 86 83 const finalImg = await compressIfNeeded(img, 1000000) 87 84 setNewUserAvatar(finalImg) ··· 90 87 setImageError(cleanError(e)) 91 88 } 92 89 }, 93 - [track, setNewUserAvatar, setUserAvatar, setImageError], 90 + [setNewUserAvatar, setUserAvatar, setImageError], 94 91 ) 95 92 96 93 const onSelectNewBanner = useCallback( ··· 101 98 setUserBanner(null) 102 99 return 103 100 } 104 - track('EditProfile:BannerSelected') 105 101 try { 106 102 const finalImg = await compressIfNeeded(img, 1000000) 107 103 setNewUserBanner(finalImg) ··· 110 106 setImageError(cleanError(e)) 111 107 } 112 108 }, 113 - [track, setNewUserBanner, setUserBanner, setImageError], 109 + [setNewUserBanner, setUserBanner, setImageError], 114 110 ) 115 111 116 112 const onPressSave = useCallback(async () => { 117 - track('EditProfile:Save') 118 113 setImageError('') 119 114 try { 120 115 await updateMutation.mutateAsync({ ··· 133 128 logger.error('Failed to update user profile', {message: String(e)}) 134 129 } 135 130 }, [ 136 - track, 137 131 updateMutation, 138 132 profile, 139 133 onUpdate,
+8 -11
src/view/com/post-thread/PostThreadFollowBtn.tsx
··· 6 6 import {useLingui} from '@lingui/react' 7 7 import {useNavigation} from '@react-navigation/native' 8 8 9 + import {usePalette} from '#/lib/hooks/usePalette' 10 + import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 11 + import {s} from '#/lib/styles' 9 12 import {logger} from '#/logger' 10 - import {track} from 'lib/analytics/analytics' 11 - import {usePalette} from 'lib/hooks/usePalette' 12 - import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 13 - import {s} from 'lib/styles' 14 - import {Shadow, useProfileShadow} from 'state/cache/profile-shadow' 13 + import {Shadow, useProfileShadow} from '#/state/cache/profile-shadow' 15 14 import { 16 15 useProfileFollowMutationQueue, 17 16 useProfileQuery, 18 - } from 'state/queries/profile' 19 - import {useRequireAuth} from 'state/session' 20 - import {Text} from 'view/com/util/text/Text' 21 - import * as Toast from 'view/com/util/Toast' 17 + } from '#/state/queries/profile' 18 + import {useRequireAuth} from '#/state/session' 19 + import {Text} from '#/view/com/util/text/Text' 20 + import * as Toast from '#/view/com/util/Toast' 22 21 23 22 export function PostThreadFollowBtn({did}: {did: string}) { 24 23 const {data: profile, isLoading} = useProfileQuery({did}) ··· 89 88 if (!isFollowing) { 90 89 requireAuth(async () => { 91 90 try { 92 - track('ProfileHeader:FollowButtonClicked') 93 91 await queueFollow() 94 92 } catch (e: any) { 95 93 if (e?.name !== 'AbortError') { ··· 101 99 } else { 102 100 requireAuth(async () => { 103 101 try { 104 - track('ProfileHeader:UnfollowButtonClicked') 105 102 await queueUnfollow() 106 103 } catch (e: any) { 107 104 if (e?.name !== 'AbortError') {
+1 -6
src/view/com/posts/Feed.tsx
··· 14 14 import {useLingui} from '@lingui/react' 15 15 import {useQueryClient} from '@tanstack/react-query' 16 16 17 - import {useAnalytics} from '#/lib/analytics/analytics' 18 17 import {DISCOVER_FEED_URI, KNOWN_SHUTDOWN_FEEDS} from '#/lib/constants' 19 18 import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender' 20 19 import {logEvent, useGate} from '#/lib/statsig/statsig' ··· 196 195 initialNumToRender?: number 197 196 }): React.ReactNode => { 198 197 const theme = useTheme() 199 - const {track} = useAnalytics() 200 198 const {_} = useLingui() 201 199 const queryClient = useQueryClient() 202 200 const {currentAccount, hasSession} = useSession() ··· 405 403 // = 406 404 407 405 const onRefresh = React.useCallback(async () => { 408 - track('Feed:onRefresh') 409 406 logEvent('feed:refresh:sampled', { 410 407 feedType: feedType, 411 408 feedUrl: feed, ··· 419 416 logger.error('Failed to refresh posts feed', {message: err}) 420 417 } 421 418 setIsPTRing(false) 422 - }, [refetch, track, setIsPTRing, onHasNew, feed, feedType]) 419 + }, [refetch, setIsPTRing, onHasNew, feed, feedType]) 423 420 424 421 const onEndReached = React.useCallback(async () => { 425 422 if (isFetching || !hasNextPage || isError) return ··· 429 426 feedUrl: feed, 430 427 itemCount: feedItems.length, 431 428 }) 432 - track('Feed:onEndReached') 433 429 try { 434 430 await fetchNextPage() 435 431 } catch (err) { ··· 440 436 hasNextPage, 441 437 isError, 442 438 fetchNextPage, 443 - track, 444 439 feed, 445 440 feedType, 446 441 feedItems.length,
+17 -28
src/view/com/profile/ProfileMenu.tsx
··· 6 6 import {useLingui} from '@lingui/react' 7 7 import {useQueryClient} from '@tanstack/react-query' 8 8 9 + import {HITSLOP_10} from '#/lib/constants' 10 + import {makeProfileLink} from '#/lib/routes/links' 11 + import {shareUrl} from '#/lib/sharing' 12 + import {toShareUrl} from '#/lib/strings/url-helpers' 9 13 import {logger} from '#/logger' 10 - import {useAnalytics} from 'lib/analytics/analytics' 11 - import {HITSLOP_10} from 'lib/constants' 12 - import {makeProfileLink} from 'lib/routes/links' 13 - import {shareUrl} from 'lib/sharing' 14 - import {toShareUrl} from 'lib/strings/url-helpers' 15 - import {Shadow} from 'state/cache/types' 16 - import {useModalControls} from 'state/modals' 14 + import {Shadow} from '#/state/cache/types' 15 + import {useModalControls} from '#/state/modals' 17 16 import { 18 17 RQKEY as profileQueryKey, 19 18 useProfileBlockMutationQueue, 20 19 useProfileFollowMutationQueue, 21 20 useProfileMuteMutationQueue, 22 - } from 'state/queries/profile' 23 - import {useSession} from 'state/session' 24 - import {EventStopper} from 'view/com/util/EventStopper' 25 - import * as Toast from 'view/com/util/Toast' 21 + } from '#/state/queries/profile' 22 + import {useSession} from '#/state/session' 23 + import {EventStopper} from '#/view/com/util/EventStopper' 24 + import * as Toast from '#/view/com/util/Toast' 26 25 import {atoms as a, useTheme} from '#/alf' 27 26 import {ArrowOutOfBox_Stroke2_Corner0_Rounded as Share} from '#/components/icons/ArrowOutOfBox' 28 27 import {Flag_Stroke2_Corner0_Rounded as Flag} from '#/components/icons/Flag' ··· 49 48 const t = useTheme() 50 49 // TODO ALF this 51 50 const alf = useTheme() 52 - const {track} = useAnalytics() 53 51 const {openModal} = useModalControls() 54 52 const reportDialogControl = useReportDialogControl() 55 53 const queryClient = useQueryClient() ··· 83 81 }, [queryClient, profile.did]) 84 82 85 83 const onPressShare = React.useCallback(() => { 86 - track('ProfileHeader:ShareButtonClicked') 87 84 shareUrl(toShareUrl(makeProfileLink(profile))) 88 - }, [track, profile]) 85 + }, [profile]) 89 86 90 87 const onPressAddRemoveLists = React.useCallback(() => { 91 - track('ProfileHeader:AddToListsButtonClicked') 92 88 openModal({ 93 89 name: 'user-add-remove-lists', 94 90 subject: profile.did, ··· 97 93 onAdd: invalidateProfileQuery, 98 94 onRemove: invalidateProfileQuery, 99 95 }) 100 - }, [track, profile, openModal, invalidateProfileQuery]) 96 + }, [profile, openModal, invalidateProfileQuery]) 101 97 102 98 const onPressMuteAccount = React.useCallback(async () => { 103 99 if (profile.viewer?.muted) { 104 - track('ProfileHeader:UnmuteAccountButtonClicked') 105 100 try { 106 101 await queueUnmute() 107 102 Toast.show(_(msg`Account unmuted`)) ··· 112 107 } 113 108 } 114 109 } else { 115 - track('ProfileHeader:MuteAccountButtonClicked') 116 110 try { 117 111 await queueMute() 118 112 Toast.show(_(msg`Account muted`)) ··· 123 117 } 124 118 } 125 119 } 126 - }, [profile.viewer?.muted, track, queueUnmute, _, queueMute]) 120 + }, [profile.viewer?.muted, queueUnmute, _, queueMute]) 127 121 128 122 const blockAccount = React.useCallback(async () => { 129 123 if (profile.viewer?.blocking) { 130 - track('ProfileHeader:UnblockAccountButtonClicked') 131 124 try { 132 125 await queueUnblock() 133 126 Toast.show(_(msg`Account unblocked`)) ··· 138 131 } 139 132 } 140 133 } else { 141 - track('ProfileHeader:BlockAccountButtonClicked') 142 134 try { 143 135 await queueBlock() 144 136 Toast.show(_(msg`Account blocked`)) ··· 149 141 } 150 142 } 151 143 } 152 - }, [profile.viewer?.blocking, track, _, queueUnblock, queueBlock]) 144 + }, [profile.viewer?.blocking, _, queueUnblock, queueBlock]) 153 145 154 146 const onPressFollowAccount = React.useCallback(async () => { 155 - track('ProfileHeader:FollowButtonClicked') 156 147 try { 157 148 await queueFollow() 158 149 Toast.show(_(msg`Account followed`)) ··· 162 153 Toast.show(_(msg`There was an issue! ${e.toString()}`), 'xmark') 163 154 } 164 155 } 165 - }, [_, queueFollow, track]) 156 + }, [_, queueFollow]) 166 157 167 158 const onPressUnfollowAccount = React.useCallback(async () => { 168 - track('ProfileHeader:UnfollowButtonClicked') 169 159 try { 170 160 await queueUnfollow() 171 161 Toast.show(_(msg`Account unfollowed`)) ··· 175 165 Toast.show(_(msg`There was an issue! ${e.toString()}`), 'xmark') 176 166 } 177 167 } 178 - }, [_, queueUnfollow, track]) 168 + }, [_, queueUnfollow]) 179 169 180 170 const onPressReportAccount = React.useCallback(() => { 181 - track('ProfileHeader:ReportAccountButtonClicked') 182 171 reportDialogControl.open() 183 - }, [track, reportDialogControl]) 172 + }, [reportDialogControl]) 184 173 185 174 return ( 186 175 <EventStopper onKeyDown={false}>
+4 -7
src/view/com/util/SimpleViewHeader.tsx
··· 9 9 import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' 10 10 import {useNavigation} from '@react-navigation/native' 11 11 12 + import {usePalette} from '#/lib/hooks/usePalette' 13 + import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 14 + import {NavigationProp} from '#/lib/routes/types' 12 15 import {isWeb} from '#/platform/detection' 13 16 import {useSetDrawerOpen} from '#/state/shell' 14 - import {useAnalytics} from 'lib/analytics/analytics' 15 - import {usePalette} from 'lib/hooks/usePalette' 16 - import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 17 - import {NavigationProp} from 'lib/routes/types' 18 17 import {Menu_Stroke2_Corner0_Rounded as Menu} from '#/components/icons/Menu' 19 18 import {CenteredView} from './Views' 20 19 ··· 31 30 const pal = usePalette('default') 32 31 const setDrawerOpen = useSetDrawerOpen() 33 32 const navigation = useNavigation<NavigationProp>() 34 - const {track} = useAnalytics() 35 33 const {isMobile} = useWebMediaQueries() 36 34 const canGoBack = navigation.canGoBack() 37 35 ··· 44 42 }, [navigation]) 45 43 46 44 const onPressMenu = React.useCallback(() => { 47 - track('ViewHeader:MenuButtonClicked') 48 45 setDrawerOpen(true) 49 - }, [track, setDrawerOpen]) 46 + }, [setDrawerOpen]) 50 47 51 48 const Container = isMobile ? View : CenteredView 52 49 return (
+1 -4
src/view/com/util/ViewHeader.tsx
··· 6 6 import {useLingui} from '@lingui/react' 7 7 import {useNavigation} from '@react-navigation/native' 8 8 9 - import {useAnalytics} from '#/lib/analytics/analytics' 10 9 import {useMinimalShellHeaderTransform} from '#/lib/hooks/useMinimalShellTransform' 11 10 import {usePalette} from '#/lib/hooks/usePalette' 12 11 import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' ··· 42 41 const {_} = useLingui() 43 42 const setDrawerOpen = useSetDrawerOpen() 44 43 const navigation = useNavigation<NavigationProp>() 45 - const {track} = useAnalytics() 46 44 const {isDesktop, isTablet} = useWebMediaQueries() 47 45 const t = useTheme() 48 46 ··· 55 53 }, [navigation]) 56 54 57 55 const onPressMenu = React.useCallback(() => { 58 - track('ViewHeader:MenuButtonClicked') 59 56 setDrawerOpen(true) 60 - }, [track, setDrawerOpen]) 57 + }, [setDrawerOpen]) 61 58 62 59 if (isDesktop) { 63 60 if (showOnDesktop) {
+1 -4
src/view/screens/AccessibilitySettings.tsx
··· 4 4 import {useLingui} from '@lingui/react' 5 5 import {useFocusEffect} from '@react-navigation/native' 6 6 7 - import {useAnalytics} from '#/lib/analytics/analytics' 8 7 import {usePalette} from '#/lib/hooks/usePalette' 9 8 import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 10 9 import {CommonNavigatorParams, NativeStackScreenProps} from '#/lib/routes/types' ··· 36 35 export function AccessibilitySettingsScreen({}: Props) { 37 36 const pal = usePalette('default') 38 37 const setMinimalShellMode = useSetMinimalShellMode() 39 - const {screen} = useAnalytics() 40 38 const {isMobile, isTabletOrMobile} = useWebMediaQueries() 41 39 const {_} = useLingui() 42 40 ··· 51 49 52 50 useFocusEffect( 53 51 React.useCallback(() => { 54 - screen('PreferencesExternalEmbeds') 55 52 setMinimalShellMode(false) 56 - }, [screen, setMinimalShellMode]), 53 + }, [setMinimalShellMode]), 57 54 ) 58 55 59 56 return (
+2 -5
src/view/screens/AppPasswords.tsx
··· 12 12 import {useFocusEffect} from '@react-navigation/native' 13 13 import {NativeStackScreenProps} from '@react-navigation/native-stack' 14 14 15 - import {useAnalytics} from '#/lib/analytics/analytics' 16 15 import {usePalette} from '#/lib/hooks/usePalette' 17 16 import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 18 17 import {CommonNavigatorParams} from '#/lib/routes/types' ··· 28 27 import {Text} from '#/view/com/util/text/Text' 29 28 import * as Toast from '#/view/com/util/Toast' 30 29 import {ViewHeader} from '#/view/com/util/ViewHeader' 31 - import {CenteredView} from 'view/com/util/Views' 30 + import {CenteredView} from '#/view/com/util/Views' 32 31 import {atoms as a} from '#/alf' 33 32 import {useDialogControl} from '#/components/Dialog' 34 33 import * as Prompt from '#/components/Prompt' ··· 38 37 const pal = usePalette('default') 39 38 const {_} = useLingui() 40 39 const setMinimalShellMode = useSetMinimalShellMode() 41 - const {screen} = useAnalytics() 42 40 const {isTabletOrDesktop} = useWebMediaQueries() 43 41 const {openModal} = useModalControls() 44 42 const {data: appPasswords, error} = useAppPasswordsQuery() 45 43 46 44 useFocusEffect( 47 45 React.useCallback(() => { 48 - screen('AppPasswords') 49 46 setMinimalShellMode(false) 50 - }, [screen, setMinimalShellMode]), 47 + }, [setMinimalShellMode]), 51 48 ) 52 49 53 50 const onAdd = React.useCallback(async () => {
+2 -6
src/view/screens/LanguageSettings.tsx
··· 10 10 import {useFocusEffect} from '@react-navigation/native' 11 11 12 12 import {APP_LANGUAGES, LANGUAGES} from '#/lib/../locale/languages' 13 - import {useAnalytics} from '#/lib/analytics/analytics' 14 13 import {usePalette} from '#/lib/hooks/usePalette' 15 14 import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 16 15 import {CommonNavigatorParams, NativeStackScreenProps} from '#/lib/routes/types' ··· 32 31 const langPrefs = useLanguagePrefs() 33 32 const setLangPrefs = useLanguagePrefsApi() 34 33 const {isTabletOrDesktop} = useWebMediaQueries() 35 - const {screen, track} = useAnalytics() 36 34 const setMinimalShellMode = useSetMinimalShellMode() 37 35 const {openModal} = useModalControls() 38 36 39 37 useFocusEffect( 40 38 React.useCallback(() => { 41 - screen('Settings') 42 39 setMinimalShellMode(false) 43 - }, [screen, setMinimalShellMode]), 40 + }, [setMinimalShellMode]), 44 41 ) 45 42 46 43 const onPressContentLanguages = React.useCallback(() => { 47 - track('Settings:ContentlanguagesButtonClicked') 48 44 openModal({name: 'content-languages-settings'}) 49 - }, [track, openModal]) 45 + }, [openModal]) 50 46 51 47 const onChangePrimaryLanguage = React.useCallback( 52 48 (value: Parameters<PickerSelectProps['onValueChange']>[0]) => {
+6 -9
src/view/screens/ModerationBlockedAccounts.tsx
··· 12 12 import {useFocusEffect} from '@react-navigation/native' 13 13 import {NativeStackScreenProps} from '@react-navigation/native-stack' 14 14 15 + import {usePalette} from '#/lib/hooks/usePalette' 16 + import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 17 + import {CommonNavigatorParams} from '#/lib/routes/types' 15 18 import {cleanError} from '#/lib/strings/errors' 16 19 import {logger} from '#/logger' 17 20 import {useMyBlockedAccountsQuery} from '#/state/queries/my-blocked-accounts' 18 21 import {useSetMinimalShellMode} from '#/state/shell' 19 - import {useAnalytics} from 'lib/analytics/analytics' 20 - import {usePalette} from 'lib/hooks/usePalette' 21 - import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 22 - import {CommonNavigatorParams} from 'lib/routes/types' 23 - import {ProfileCard} from 'view/com/profile/ProfileCard' 24 - import {CenteredView} from 'view/com/util/Views' 22 + import {ProfileCard} from '#/view/com/profile/ProfileCard' 23 + import {CenteredView} from '#/view/com/util/Views' 25 24 import {ErrorScreen} from '../com/util/error/ErrorScreen' 26 25 import {Text} from '../com/util/text/Text' 27 26 import {ViewHeader} from '../com/util/ViewHeader' ··· 35 34 const {_} = useLingui() 36 35 const setMinimalShellMode = useSetMinimalShellMode() 37 36 const {isTabletOrDesktop} = useWebMediaQueries() 38 - const {screen} = useAnalytics() 39 37 40 38 const [isPTRing, setIsPTRing] = React.useState(false) 41 39 const { ··· 58 56 59 57 useFocusEffect( 60 58 React.useCallback(() => { 61 - screen('BlockedAccounts') 62 59 setMinimalShellMode(false) 63 - }, [screen, setMinimalShellMode]), 60 + }, [setMinimalShellMode]), 64 61 ) 65 62 66 63 const onRefresh = React.useCallback(async () => {
+6 -9
src/view/screens/ModerationMutedAccounts.tsx
··· 12 12 import {useFocusEffect} from '@react-navigation/native' 13 13 import {NativeStackScreenProps} from '@react-navigation/native-stack' 14 14 15 + import {usePalette} from '#/lib/hooks/usePalette' 16 + import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 17 + import {CommonNavigatorParams} from '#/lib/routes/types' 15 18 import {cleanError} from '#/lib/strings/errors' 16 19 import {logger} from '#/logger' 17 20 import {useMyMutedAccountsQuery} from '#/state/queries/my-muted-accounts' 18 21 import {useSetMinimalShellMode} from '#/state/shell' 19 - import {useAnalytics} from 'lib/analytics/analytics' 20 - import {usePalette} from 'lib/hooks/usePalette' 21 - import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 22 - import {CommonNavigatorParams} from 'lib/routes/types' 23 - import {ProfileCard} from 'view/com/profile/ProfileCard' 24 - import {CenteredView} from 'view/com/util/Views' 22 + import {ProfileCard} from '#/view/com/profile/ProfileCard' 23 + import {CenteredView} from '#/view/com/util/Views' 25 24 import {ErrorScreen} from '../com/util/error/ErrorScreen' 26 25 import {Text} from '../com/util/text/Text' 27 26 import {ViewHeader} from '../com/util/ViewHeader' ··· 35 34 const {_} = useLingui() 36 35 const setMinimalShellMode = useSetMinimalShellMode() 37 36 const {isTabletOrDesktop} = useWebMediaQueries() 38 - const {screen} = useAnalytics() 39 37 40 38 const [isPTRing, setIsPTRing] = React.useState(false) 41 39 const { ··· 58 56 59 57 useFocusEffect( 60 58 React.useCallback(() => { 61 - screen('MutedAccounts') 62 59 setMinimalShellMode(false) 63 - }, [screen, setMinimalShellMode]), 60 + }, [setMinimalShellMode]), 64 61 ) 65 62 66 63 const onRefresh = React.useCallback(async () => {
+4 -7
src/view/screens/Notifications.tsx
··· 5 5 import {useFocusEffect, useIsFocused} from '@react-navigation/native' 6 6 import {useQueryClient} from '@tanstack/react-query' 7 7 8 - import {useAnalytics} from '#/lib/analytics/analytics' 9 8 import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' 10 9 import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 11 10 import {ComposeIcon2} from '#/lib/icons' ··· 27 26 import {useComposerControls} from '#/state/shell/composer' 28 27 import {Feed} from '#/view/com/notifications/Feed' 29 28 import {FAB} from '#/view/com/util/fab/FAB' 29 + import {ListMethods} from '#/view/com/util/List' 30 + import {LoadLatestBtn} from '#/view/com/util/load-latest/LoadLatestBtn' 30 31 import {MainScrollProvider} from '#/view/com/util/MainScrollProvider' 31 32 import {ViewHeader} from '#/view/com/util/ViewHeader' 32 - import {ListMethods} from 'view/com/util/List' 33 - import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn' 34 - import {CenteredView} from 'view/com/util/Views' 33 + import {CenteredView} from '#/view/com/util/Views' 35 34 import {atoms as a, useTheme} from '#/alf' 36 35 import {Button} from '#/components/Button' 37 36 import {SettingsGear2_Stroke2_Corner0_Rounded as SettingsIcon} from '#/components/icons/SettingsGear2' ··· 49 48 const [isScrolledDown, setIsScrolledDown] = React.useState(false) 50 49 const [isLoadingLatest, setIsLoadingLatest] = React.useState(false) 51 50 const scrollElRef = React.useRef<ListMethods>(null) 52 - const {screen} = useAnalytics() 53 51 const t = useTheme() 54 52 const {isDesktop} = useWebMediaQueries() 55 53 const queryClient = useQueryClient() ··· 101 99 React.useCallback(() => { 102 100 setMinimalShellMode(false) 103 101 logger.debug('NotificationsScreen: Focus') 104 - screen('Notifications') 105 102 onFocusCheckLatest() 106 - }, [screen, setMinimalShellMode, onFocusCheckLatest]), 103 + }, [setMinimalShellMode, onFocusCheckLatest]), 107 104 ) 108 105 React.useEffect(() => { 109 106 if (!isScreenFocused) {
+1 -4
src/view/screens/PreferencesExternalEmbeds.tsx
··· 3 3 import {Trans} from '@lingui/macro' 4 4 import {useFocusEffect} from '@react-navigation/native' 5 5 6 - import {useAnalytics} from '#/lib/analytics/analytics' 7 6 import {usePalette} from '#/lib/hooks/usePalette' 8 7 import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 9 8 import {CommonNavigatorParams, NativeStackScreenProps} from '#/lib/routes/types' ··· 30 29 export function PreferencesExternalEmbeds({}: Props) { 31 30 const pal = usePalette('default') 32 31 const setMinimalShellMode = useSetMinimalShellMode() 33 - const {screen} = useAnalytics() 34 32 const {isTabletOrMobile} = useWebMediaQueries() 35 33 36 34 useFocusEffect( 37 35 React.useCallback(() => { 38 - screen('PreferencesExternalEmbeds') 39 36 setMinimalShellMode(false) 40 - }, [screen, setMinimalShellMode]), 37 + }, [setMinimalShellMode]), 41 38 ) 42 39 43 40 return (
+1 -5
src/view/screens/Profile.tsx
··· 16 16 useQueryClient, 17 17 } from '@tanstack/react-query' 18 18 19 - import {useAnalytics} from '#/lib/analytics/analytics' 20 19 import {useSetTitle} from '#/lib/hooks/useSetTitle' 21 20 import {ComposeIcon2} from '#/lib/icons' 22 21 import {CommonNavigatorParams, NativeStackScreenProps} from '#/lib/routes/types' ··· 167 166 const {hasSession, currentAccount} = useSession() 168 167 const setMinimalShellMode = useSetMinimalShellMode() 169 168 const {openComposer} = useComposerControls() 170 - const {screen, track} = useAnalytics() 171 169 const { 172 170 data: labelerInfo, 173 171 error: labelerError, ··· 296 294 useFocusEffect( 297 295 React.useCallback(() => { 298 296 setMinimalShellMode(false) 299 - screen('Profile') 300 297 return listenSoftReset(() => { 301 298 scrollSectionToTop(currentPage) 302 299 }) 303 - }, [setMinimalShellMode, screen, currentPage, scrollSectionToTop]), 300 + }, [setMinimalShellMode, currentPage, scrollSectionToTop]), 304 301 ) 305 302 306 303 useFocusEffect( ··· 316 313 // = 317 314 318 315 const onPressCompose = () => { 319 - track('ProfileScreen:PressCompose') 320 316 const mention = 321 317 profile.handle === currentAccount?.handle || 322 318 isInvalidHandle(profile.handle)
+25 -31
src/view/screens/ProfileFeed.tsx
··· 8 8 import {useQueryClient} from '@tanstack/react-query' 9 9 10 10 import {HITSLOP_20} from '#/lib/constants' 11 + import {useHaptics} from '#/lib/haptics' 12 + import {usePalette} from '#/lib/hooks/usePalette' 13 + import {useSetTitle} from '#/lib/hooks/useSetTitle' 14 + import {ComposeIcon2} from '#/lib/icons' 15 + import {makeCustomFeedLink} from '#/lib/routes/links' 16 + import {CommonNavigatorParams} from '#/lib/routes/types' 17 + import {NavigationProp} from '#/lib/routes/types' 18 + import {shareUrl} from '#/lib/sharing' 19 + import {makeRecordUri} from '#/lib/strings/url-helpers' 20 + import {toShareUrl} from '#/lib/strings/url-helpers' 21 + import {s} from '#/lib/styles' 11 22 import {logger} from '#/logger' 12 23 import {isNative} from '#/platform/detection' 13 24 import {listenSoftReset} from '#/state/events' ··· 27 38 import {truncateAndInvalidate} from '#/state/queries/util' 28 39 import {useSession} from '#/state/session' 29 40 import {useComposerControls} from '#/state/shell/composer' 30 - import {useAnalytics} from 'lib/analytics/analytics' 31 - import {useHaptics} from 'lib/haptics' 32 - import {usePalette} from 'lib/hooks/usePalette' 33 - import {useSetTitle} from 'lib/hooks/useSetTitle' 34 - import {ComposeIcon2} from 'lib/icons' 35 - import {makeCustomFeedLink} from 'lib/routes/links' 36 - import {CommonNavigatorParams} from 'lib/routes/types' 37 - import {NavigationProp} from 'lib/routes/types' 38 - import {shareUrl} from 'lib/sharing' 39 - import {makeRecordUri} from 'lib/strings/url-helpers' 40 - import {toShareUrl} from 'lib/strings/url-helpers' 41 - import {s} from 'lib/styles' 42 - import {PagerWithHeader} from 'view/com/pager/PagerWithHeader' 43 - import {Feed} from 'view/com/posts/Feed' 44 - import {ProfileSubpageHeader} from 'view/com/profile/ProfileSubpageHeader' 45 - import {EmptyState} from 'view/com/util/EmptyState' 46 - import {FAB} from 'view/com/util/fab/FAB' 47 - import {Button} from 'view/com/util/forms/Button' 48 - import {ListRef} from 'view/com/util/List' 49 - import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn' 50 - import {LoadingScreen} from 'view/com/util/LoadingScreen' 51 - import {Text} from 'view/com/util/text/Text' 52 - import * as Toast from 'view/com/util/Toast' 53 - import {CenteredView} from 'view/com/util/Views' 41 + import {PagerWithHeader} from '#/view/com/pager/PagerWithHeader' 42 + import {Feed} from '#/view/com/posts/Feed' 43 + import {ProfileSubpageHeader} from '#/view/com/profile/ProfileSubpageHeader' 44 + import {EmptyState} from '#/view/com/util/EmptyState' 45 + import {FAB} from '#/view/com/util/fab/FAB' 46 + import {Button} from '#/view/com/util/forms/Button' 47 + import {ListRef} from '#/view/com/util/List' 48 + import {LoadLatestBtn} from '#/view/com/util/load-latest/LoadLatestBtn' 49 + import {LoadingScreen} from '#/view/com/util/LoadingScreen' 50 + import {Text} from '#/view/com/util/text/Text' 51 + import * as Toast from '#/view/com/util/Toast' 52 + import {CenteredView} from '#/view/com/util/Views' 54 53 import {atoms as a, useTheme} from '#/alf' 55 54 import {Button as NewButton, ButtonText} from '#/components/Button' 56 55 import {useRichText} from '#/components/hooks/useRichText' ··· 158 157 const {hasSession, currentAccount} = useSession() 159 158 const reportDialogControl = useReportDialogControl() 160 159 const {openComposer} = useComposerControls() 161 - const {track} = useAnalytics() 162 160 const playHaptic = useHaptics() 163 161 const feedSectionRef = React.useRef<SectionRef>(null) 164 162 const isScreenFocused = useIsFocused() ··· 247 245 const onPressShare = React.useCallback(() => { 248 246 const url = toShareUrl(feedInfo.route.href) 249 247 shareUrl(url) 250 - track('CustomFeed:Share') 251 - }, [feedInfo, track]) 248 + }, [feedInfo]) 252 249 253 250 const onPressReport = React.useCallback(() => { 254 251 reportDialogControl.open() ··· 515 512 const {_} = useLingui() 516 513 const [likeUri, setLikeUri] = React.useState(feedInfo.likeUri) 517 514 const {hasSession} = useSession() 518 - const {track} = useAnalytics() 519 515 const playHaptic = useHaptics() 520 516 const {mutateAsync: likeFeed, isPending: isLikePending} = useLikeMutation() 521 517 const {mutateAsync: unlikeFeed, isPending: isUnlikePending} = ··· 532 528 533 529 if (isLiked && likeUri) { 534 530 await unlikeFeed({uri: likeUri}) 535 - track('CustomFeed:Unlike') 536 531 setLikeUri('') 537 532 } else { 538 533 const res = await likeFeed({uri: feedInfo.uri, cid: feedInfo.cid}) 539 - track('CustomFeed:Like') 540 534 setLikeUri(res.uri) 541 535 } 542 536 } catch (err) { ··· 548 542 ) 549 543 logger.error('Failed up toggle like', {message: err}) 550 544 } 551 - }, [playHaptic, isLiked, likeUri, unlikeFeed, track, likeFeed, feedInfo, _]) 545 + }, [playHaptic, isLiked, likeUri, unlikeFeed, likeFeed, feedInfo, _]) 552 546 553 547 return ( 554 548 <View style={[styles.aboutSectionContainer]}>
+34 -40
src/view/screens/ProfileList.tsx
··· 14 14 import {useNavigation} from '@react-navigation/native' 15 15 import {useQueryClient} from '@tanstack/react-query' 16 16 17 - import {useAnalytics} from '#/lib/analytics/analytics' 17 + import {useHaptics} from '#/lib/haptics' 18 + import {usePalette} from '#/lib/hooks/usePalette' 19 + import {useSetTitle} from '#/lib/hooks/useSetTitle' 20 + import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 21 + import {ComposeIcon2} from '#/lib/icons' 22 + import {makeListLink, makeProfileLink} from '#/lib/routes/links' 23 + import {CommonNavigatorParams, NativeStackScreenProps} from '#/lib/routes/types' 24 + import {NavigationProp} from '#/lib/routes/types' 25 + import {shareUrl} from '#/lib/sharing' 18 26 import {cleanError} from '#/lib/strings/errors' 27 + import {sanitizeHandle} from '#/lib/strings/handles' 28 + import {toShareUrl} from '#/lib/strings/url-helpers' 29 + import {s} from '#/lib/styles' 19 30 import {logger} from '#/logger' 20 31 import {isNative, isWeb} from '#/platform/detection' 21 32 import {listenSoftReset} from '#/state/events' ··· 41 52 import {useSession} from '#/state/session' 42 53 import {useSetMinimalShellMode} from '#/state/shell' 43 54 import {useComposerControls} from '#/state/shell/composer' 44 - import {useHaptics} from 'lib/haptics' 45 - import {usePalette} from 'lib/hooks/usePalette' 46 - import {useSetTitle} from 'lib/hooks/useSetTitle' 47 - import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 48 - import {ComposeIcon2} from 'lib/icons' 49 - import {makeListLink, makeProfileLink} from 'lib/routes/links' 50 - import {CommonNavigatorParams, NativeStackScreenProps} from 'lib/routes/types' 51 - import {NavigationProp} from 'lib/routes/types' 52 - import {shareUrl} from 'lib/sharing' 53 - import {sanitizeHandle} from 'lib/strings/handles' 54 - import {toShareUrl} from 'lib/strings/url-helpers' 55 - import {s} from 'lib/styles' 56 55 import {ListMembers} from '#/view/com/lists/ListMembers' 57 - import {PagerWithHeader} from 'view/com/pager/PagerWithHeader' 58 - import {Feed} from 'view/com/posts/Feed' 59 - import {ProfileSubpageHeader} from 'view/com/profile/ProfileSubpageHeader' 60 - import {EmptyState} from 'view/com/util/EmptyState' 61 - import {FAB} from 'view/com/util/fab/FAB' 62 - import {Button} from 'view/com/util/forms/Button' 63 - import {DropdownItem, NativeDropdown} from 'view/com/util/forms/NativeDropdown' 64 - import {TextLink} from 'view/com/util/Link' 65 - import {ListRef} from 'view/com/util/List' 66 - import {LoadLatestBtn} from 'view/com/util/load-latest/LoadLatestBtn' 67 - import {LoadingScreen} from 'view/com/util/LoadingScreen' 68 - import {Text} from 'view/com/util/text/Text' 69 - import * as Toast from 'view/com/util/Toast' 70 - import {CenteredView} from 'view/com/util/Views' 56 + import {PagerWithHeader} from '#/view/com/pager/PagerWithHeader' 57 + import {Feed} from '#/view/com/posts/Feed' 58 + import {ProfileSubpageHeader} from '#/view/com/profile/ProfileSubpageHeader' 59 + import {EmptyState} from '#/view/com/util/EmptyState' 60 + import {FAB} from '#/view/com/util/fab/FAB' 61 + import {Button} from '#/view/com/util/forms/Button' 62 + import { 63 + DropdownItem, 64 + NativeDropdown, 65 + } from '#/view/com/util/forms/NativeDropdown' 66 + import {TextLink} from '#/view/com/util/Link' 67 + import {ListRef} from '#/view/com/util/List' 68 + import {LoadLatestBtn} from '#/view/com/util/load-latest/LoadLatestBtn' 69 + import {LoadingScreen} from '#/view/com/util/LoadingScreen' 70 + import {Text} from '#/view/com/util/text/Text' 71 + import * as Toast from '#/view/com/util/Toast' 72 + import {CenteredView} from '#/view/com/util/Views' 71 73 import {ListHiddenScreen} from '#/screens/List/ListHiddenScreen' 72 74 import {atoms as a, useTheme} from '#/alf' 73 75 import {useDialogControl} from '#/components/Dialog' ··· 306 308 const isBlocking = !!list.viewer?.blocked 307 309 const isMuting = !!list.viewer?.muted 308 310 const isOwner = list.creator.did === currentAccount?.did 309 - const {track} = useAnalytics() 310 311 const playHaptic = useHaptics() 311 312 312 313 const {mutateAsync: addSavedFeeds, isPending: isAddSavedFeedPending} = ··· 384 385 try { 385 386 await listMuteMutation.mutateAsync({uri: list.uri, mute: true}) 386 387 Toast.show(_(msg`List muted`)) 387 - track('Lists:Mute') 388 388 } catch { 389 389 Toast.show( 390 390 _( ··· 392 392 ), 393 393 ) 394 394 } 395 - }, [list, listMuteMutation, track, _]) 395 + }, [list, listMuteMutation, _]) 396 396 397 397 const onUnsubscribeMute = useCallback(async () => { 398 398 try { 399 399 await listMuteMutation.mutateAsync({uri: list.uri, mute: false}) 400 400 Toast.show(_(msg`List unmuted`)) 401 - track('Lists:Unmute') 402 401 } catch { 403 402 Toast.show( 404 403 _( ··· 406 405 ), 407 406 ) 408 407 } 409 - }, [list, listMuteMutation, track, _]) 408 + }, [list, listMuteMutation, _]) 410 409 411 410 const onSubscribeBlock = useCallback(async () => { 412 411 try { 413 412 await listBlockMutation.mutateAsync({uri: list.uri, block: true}) 414 413 Toast.show(_(msg`List blocked`)) 415 - track('Lists:Block') 416 414 } catch { 417 415 Toast.show( 418 416 _( ··· 420 418 ), 421 419 ) 422 420 } 423 - }, [list, listBlockMutation, track, _]) 421 + }, [list, listBlockMutation, _]) 424 422 425 423 const onUnsubscribeBlock = useCallback(async () => { 426 424 try { 427 425 await listBlockMutation.mutateAsync({uri: list.uri, block: false}) 428 426 Toast.show(_(msg`List unblocked`)) 429 - track('Lists:Unblock') 430 427 } catch { 431 428 Toast.show( 432 429 _( ··· 434 431 ), 435 432 ) 436 433 } 437 - }, [list, listBlockMutation, track, _]) 434 + }, [list, listBlockMutation, _]) 438 435 439 436 const onPressEdit = useCallback(() => { 440 437 openModal({ ··· 451 448 } 452 449 453 450 Toast.show(_(msg`List deleted`)) 454 - track('Lists:Delete') 455 451 if (navigation.canGoBack()) { 456 452 navigation.goBack() 457 453 } else { ··· 461 457 list, 462 458 listDeleteMutation, 463 459 navigation, 464 - track, 465 460 _, 466 461 removeSavedFeed, 467 462 savedFeedConfig, ··· 474 469 const onPressShare = useCallback(() => { 475 470 const url = toShareUrl(`/profile/${list.creator.did}/lists/${rkey}`) 476 471 shareUrl(url) 477 - track('Lists:Share') 478 - }, [list, rkey, track]) 472 + }, [list, rkey]) 479 473 480 474 const dropdownItems: DropdownItem[] = useMemo(() => { 481 475 let items: DropdownItem[] = [
+12 -24
src/view/screens/SavedFeeds.tsx
··· 7 7 import {useFocusEffect} from '@react-navigation/native' 8 8 import {NativeStackScreenProps} from '@react-navigation/native-stack' 9 9 10 - import {track} from '#/lib/analytics/analytics' 10 + import {useHaptics} from '#/lib/haptics' 11 + import {usePalette} from '#/lib/hooks/usePalette' 12 + import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 13 + import {CommonNavigatorParams} from '#/lib/routes/types' 14 + import {colors, s} from '#/lib/styles' 11 15 import {logger} from '#/logger' 12 16 import { 13 17 useOverwriteSavedFeedsMutation, ··· 16 20 } from '#/state/queries/preferences' 17 21 import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types' 18 22 import {useSetMinimalShellMode} from '#/state/shell' 19 - import {useAnalytics} from 'lib/analytics/analytics' 20 - import {useHaptics} from 'lib/haptics' 21 - import {usePalette} from 'lib/hooks/usePalette' 22 - import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 23 - import {CommonNavigatorParams} from 'lib/routes/types' 24 - import {colors, s} from 'lib/styles' 25 - import {FeedSourceCard} from 'view/com/feeds/FeedSourceCard' 26 - import {TextLink} from 'view/com/util/Link' 27 - import {Text} from 'view/com/util/text/Text' 28 - import * as Toast from 'view/com/util/Toast' 29 - import {ViewHeader} from 'view/com/util/ViewHeader' 30 - import {CenteredView, ScrollView} from 'view/com/util/Views' 23 + import {FeedSourceCard} from '#/view/com/feeds/FeedSourceCard' 24 + import {TextLink} from '#/view/com/util/Link' 25 + import {Text} from '#/view/com/util/text/Text' 26 + import * as Toast from '#/view/com/util/Toast' 27 + import {ViewHeader} from '#/view/com/util/ViewHeader' 28 + import {CenteredView, ScrollView} from '#/view/com/util/Views' 31 29 import {NoFollowingFeed} from '#/screens/Feeds/NoFollowingFeed' 32 30 import {NoSavedFeedsOfAnyType} from '#/screens/Feeds/NoSavedFeedsOfAnyType' 33 31 import {atoms as a, useTheme} from '#/alf' ··· 51 49 const pal = usePalette('default') 52 50 const {_} = useLingui() 53 51 const {isMobile, isTabletOrDesktop} = useWebMediaQueries() 54 - const {screen} = useAnalytics() 55 52 const setMinimalShellMode = useSetMinimalShellMode() 56 53 const {data: preferences} = usePreferencesQuery() 57 54 const { ··· 77 74 78 75 useFocusEffect( 79 76 React.useCallback(() => { 80 - screen('SavedFeeds') 81 77 setMinimalShellMode(false) 82 - }, [screen, setMinimalShellMode]), 78 + }, [setMinimalShellMode]), 83 79 ) 84 80 85 81 return ( ··· 256 252 257 253 try { 258 254 await overwriteSavedFeeds(nextFeeds) 259 - track('CustomFeed:Reorder', { 260 - uri: feed.value, 261 - index: nextIndex, 262 - }) 263 255 } catch (e) { 264 256 Toast.show(_(msg`There was an issue contacting the server`), 'xmark') 265 257 logger.error('Failed to set pinned feed order', {message: e}) ··· 282 274 283 275 try { 284 276 await overwriteSavedFeeds(nextFeeds) 285 - track('CustomFeed:Reorder', { 286 - uri: feed.value, 287 - index: nextIndex, 288 - }) 289 277 } catch (e) { 290 278 Toast.show(_(msg`There was an issue contacting the server`), 'xmark') 291 279 logger.error('Failed to set pinned feed order', {message: e})
+1 -4
src/view/screens/Search/Search.tsx
··· 23 23 import {useFocusEffect, useNavigation} from '@react-navigation/native' 24 24 25 25 import {LANGUAGES} from '#/lib/../locale/languages' 26 - import {useAnalytics} from '#/lib/analytics/analytics' 27 26 import {createHitslop} from '#/lib/constants' 28 27 import {HITSLOP_10} from '#/lib/constants' 29 28 import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' ··· 601 600 const navigation = useNavigation<NavigationProp>() 602 601 const textInput = React.useRef<TextInput>(null) 603 602 const {_} = useLingui() 604 - const {track} = useAnalytics() 605 603 const setDrawerOpen = useSetDrawerOpen() 606 604 const setMinimalShellMode = useSetMinimalShellMode() 607 605 ··· 656 654 }, []) 657 655 658 656 const onPressMenu = React.useCallback(() => { 659 - track('ViewHeader:MenuButtonClicked') 660 657 setDrawerOpen(true) 661 - }, [track, setDrawerOpen]) 658 + }, [setDrawerOpen]) 662 659 663 660 const onPressClearQuery = React.useCallback(() => { 664 661 scrollToTopWeb()
+3 -8
src/view/screens/Settings/index.tsx
··· 18 18 import {useFocusEffect, useNavigation} from '@react-navigation/native' 19 19 import {useQueryClient} from '@tanstack/react-query' 20 20 21 - import {useAnalytics} from '#/lib/analytics/analytics' 22 21 import {appVersion, BUNDLE_DATE, bundleInfo} from '#/lib/app-info' 23 22 import {STATUS_PAGE_URL} from '#/lib/constants' 24 23 import {useAccountSwitcher} from '#/lib/hooks/useAccountSwitcher' ··· 146 145 const onboardingDispatch = useOnboardingDispatch() 147 146 const navigation = useNavigation<NavigationProp>() 148 147 const {isMobile} = useWebMediaQueries() 149 - const {screen, track} = useAnalytics() 150 148 const {openModal} = useModalControls() 151 149 const {accounts, currentAccount} = useSession() 152 150 const {mutate: clearPreferences} = useClearPreferencesMutation() ··· 178 176 179 177 useFocusEffect( 180 178 React.useCallback(() => { 181 - screen('Settings') 182 179 setMinimalShellMode(false) 183 - }, [screen, setMinimalShellMode]), 180 + }, [setMinimalShellMode]), 184 181 ) 185 182 186 183 const onPressAddAccount = React.useCallback(() => { 187 - track('Settings:AddAccountButtonClicked') 188 184 setShowLoggedOut(true) 189 185 closeAllActiveElements() 190 - }, [track, setShowLoggedOut, closeAllActiveElements]) 186 + }, [setShowLoggedOut, closeAllActiveElements]) 191 187 192 188 const onPressChangeHandle = React.useCallback(() => { 193 - track('Settings:ChangeHandleButtonClicked') 194 189 openModal({ 195 190 name: 'change-handle', 196 191 onChanged() { ··· 202 197 } 203 198 }, 204 199 }) 205 - }, [track, queryClient, openModal, currentAccount]) 200 + }, [queryClient, openModal, currentAccount]) 206 201 207 202 const onPressExportRepository = React.useCallback(() => { 208 203 exportCarControl.open()
+6 -14
src/view/shell/Drawer.tsx
··· 14 14 import {useLingui} from '@lingui/react' 15 15 import {StackActions, useNavigation} from '@react-navigation/native' 16 16 17 - import {useAnalytics} from '#/lib/analytics/analytics' 18 17 import {FEEDBACK_FORM_URL, HELP_DESK_URL} from '#/lib/constants' 19 18 import {useNavigationTabState} from '#/lib/hooks/useNavigationTabState' 20 19 import {usePalette} from '#/lib/hooks/usePalette' ··· 146 145 const {_} = useLingui() 147 146 const setDrawerOpen = useSetDrawerOpen() 148 147 const navigation = useNavigation<NavigationProp>() 149 - const {track} = useAnalytics() 150 148 const {isAtHome, isAtSearch, isAtFeeds, isAtNotifications, isAtMyProfile} = 151 149 useNavigationTabState() 152 150 const {hasSession, currentAccount} = useSession() ··· 157 155 158 156 const onPressTab = React.useCallback( 159 157 (tab: string) => { 160 - track('Menu:ItemClicked', {url: tab}) 161 158 const state = navigation.getState() 162 159 setDrawerOpen(false) 163 160 if (isWeb) { ··· 180 177 } 181 178 } 182 179 }, 183 - [track, navigation, setDrawerOpen, currentAccount], 180 + [navigation, setDrawerOpen, currentAccount], 184 181 ) 185 182 186 183 const onPressHome = React.useCallback(() => onPressTab('Home'), [onPressTab]) ··· 200 197 }, [onPressTab]) 201 198 202 199 const onPressMyFeeds = React.useCallback(() => { 203 - track('Menu:ItemClicked', {url: 'Feeds'}) 204 200 navigation.navigate('Feeds') 205 201 setDrawerOpen(false) 206 - }, [navigation, setDrawerOpen, track]) 202 + }, [navigation, setDrawerOpen]) 207 203 208 204 const onPressLists = React.useCallback(() => { 209 - track('Menu:ItemClicked', {url: 'Lists'}) 210 205 navigation.navigate('Lists') 211 206 setDrawerOpen(false) 212 - }, [navigation, track, setDrawerOpen]) 207 + }, [navigation, setDrawerOpen]) 213 208 214 209 const onPressSettings = React.useCallback(() => { 215 - track('Menu:ItemClicked', {url: 'Settings'}) 216 210 navigation.navigate('Settings') 217 211 setDrawerOpen(false) 218 - }, [navigation, track, setDrawerOpen]) 212 + }, [navigation, setDrawerOpen]) 219 213 220 214 const onPressFeedback = React.useCallback(() => { 221 - track('Menu:FeedbackClicked') 222 215 Linking.openURL( 223 216 FEEDBACK_FORM_URL({ 224 217 email: currentAccount?.email, 225 218 handle: currentAccount?.handle, 226 219 }), 227 220 ) 228 - }, [track, currentAccount]) 221 + }, [currentAccount]) 229 222 230 223 const onPressHelp = React.useCallback(() => { 231 - track('Menu:HelpClicked') 232 224 Linking.openURL(HELP_DESK_URL) 233 - }, [track]) 225 + }, []) 234 226 235 227 // rendering 236 228 // =
+1 -4
src/view/shell/bottom-bar/BottomBar.tsx
··· 7 7 import {BottomTabBarProps} from '@react-navigation/bottom-tabs' 8 8 import {StackActions} from '@react-navigation/native' 9 9 10 - import {useAnalytics} from '#/lib/analytics/analytics' 11 10 import {PressableScale} from '#/lib/custom-animations/PressableScale' 12 11 import {useHaptics} from '#/lib/haptics' 13 12 import {useDedupe} from '#/lib/hooks/useDedupe' ··· 62 61 const pal = usePalette('default') 63 62 const {_} = useLingui() 64 63 const safeAreaInsets = useSafeAreaInsets() 65 - const {track} = useAnalytics() 66 64 const {footerHeight} = useShellLayout() 67 65 const {isAtHome, isAtSearch, isAtNotifications, isAtMyProfile, isAtMessages} = 68 66 useNavigationTabState() ··· 90 88 91 89 const onPressTab = React.useCallback( 92 90 (tab: TabOptions) => { 93 - track(`MobileShell:${tab}ButtonPressed`) 94 91 const state = navigation.getState() 95 92 const tabState = getTabState(state, tab) 96 93 if (tabState === TabState.InsideAtRoot) { ··· 101 98 dedupe(() => navigation.navigate(`${tab}Tab`)) 102 99 } 103 100 }, 104 - [track, navigation, dedupe], 101 + [navigation, dedupe], 105 102 ) 106 103 const onPressHome = React.useCallback(() => onPressTab('Home'), [onPressTab]) 107 104 const onPressSearch = React.useCallback(
+9 -1065
yarn.lock
··· 4900 4900 "@babel/runtime" "^7.20.13" 4901 4901 "@lingui/core" "4.5.0" 4902 4902 4903 - "@lukeed/csprng@^1.1.0": 4904 - version "1.1.0" 4905 - resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.1.0.tgz#1e3e4bd05c1cc7a0b2ddbd8a03f39f6e4b5e6cfe" 4906 - integrity sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA== 4907 - 4908 - "@lukeed/uuid@^2.0.0": 4909 - version "2.0.1" 4910 - resolved "https://registry.yarnpkg.com/@lukeed/uuid/-/uuid-2.0.1.tgz#4f6c34259ee0982a455e1797d56ac27bb040fd74" 4911 - integrity sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w== 4912 - dependencies: 4913 - "@lukeed/csprng" "^1.1.0" 4914 - 4915 4903 "@mattermost/react-native-paste-input@^0.7.1": 4916 4904 version "0.7.1" 4917 4905 resolved "https://registry.yarnpkg.com/@mattermost/react-native-paste-input/-/react-native-paste-input-0.7.1.tgz#f14585030b992cf7c9bbd0921225eefa501756ba" ··· 5358 5346 version "1.23.1" 5359 5347 resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.23.1.tgz#cad3cd4fab7dacfe9838dce6ecb352f79150c883" 5360 5348 integrity sha512-Qd2kQ3yi6Y3+AcUlrHxSLlnBvpdCEMVGFlVBneVOjaFaPU61g1huc38g339ysXspwY1QZA2aNhrk/KlHGO+ewA== 5361 - dependencies: 5362 - merge-options "^3.0.4" 5363 - 5364 - "@react-native-async-storage/async-storage@^1.15.15": 5365 - version "1.19.2" 5366 - resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.19.2.tgz#44f0af5927a04436b3f67aae67f028b888ff452c" 5367 - integrity sha512-7jTQKbT3BdhFHQMnfElsLeeyVqNICv72lPKbeNHnNgLP9eH3+Yk1GFMWWb7A8qRMYianSmwmx1cYofNe9H9hLQ== 5368 5349 dependencies: 5369 5350 merge-options "^3.0.4" 5370 5351 ··· 5891 5872 resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz#16ab6c727d8c2020a5b6e4a176a243ecd88d8d69" 5892 5873 integrity sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw== 5893 5874 5894 - "@segment/analytics-core@1.3.0": 5895 - version "1.3.0" 5896 - resolved "https://registry.yarnpkg.com/@segment/analytics-core/-/analytics-core-1.3.0.tgz#677d1087af44d31266ddf60f72f93b5d5693c933" 5897 - integrity sha512-ujScWZH49NK1hYlp2/EMw45nOPEh+pmTydAnR6gSkRNucZD4fuinvpPL03rmFCw8ibaMuKLAdgPJfQ0gkLKZ5A== 5898 - dependencies: 5899 - "@lukeed/uuid" "^2.0.0" 5900 - dset "^3.1.2" 5901 - tslib "^2.4.1" 5902 - 5903 - "@segment/analytics-next@^1.51.3": 5904 - version "1.53.3" 5905 - resolved "https://registry.yarnpkg.com/@segment/analytics-next/-/analytics-next-1.53.3.tgz#d6ae5c96648d309efae51a02d34136b15ed06cd5" 5906 - integrity sha512-aAkVDm5HUaHtNrpQR0uXoGDkMKHbBK2ut+Quq0QGN4JNIpNX4j77vhCIZKkzNEResxH94d45Hm3uEFhQ0ycCBQ== 5907 - dependencies: 5908 - "@lukeed/uuid" "^2.0.0" 5909 - "@segment/analytics-core" "1.3.0" 5910 - "@segment/analytics.js-video-plugins" "^0.2.1" 5911 - "@segment/facade" "^3.4.9" 5912 - "@segment/tsub" "^2.0.0" 5913 - dset "^3.1.2" 5914 - js-cookie "3.0.1" 5915 - node-fetch "^2.6.7" 5916 - spark-md5 "^3.0.1" 5917 - tslib "^2.4.1" 5918 - unfetch "^4.1.0" 5919 - 5920 - "@segment/analytics-react-native@^2.10.1": 5921 - version "2.16.0" 5922 - resolved "https://registry.yarnpkg.com/@segment/analytics-react-native/-/analytics-react-native-2.16.0.tgz#91be02d9241043dfcbb1ced7ee79db2ba399c78b" 5923 - integrity sha512-SkTw6bphIr4B4fcu5SDluS12mS08e4iRSt55F+PuM7vv4gxR9bp1/uOF24nJkV2ovBZ31pCDHd/cd+COi6xiMQ== 5924 - dependencies: 5925 - "@segment/sovran-react-native" "^1" 5926 - "@segment/tsub" "^2" 5927 - deepmerge "^4.2.2" 5928 - js-base64 "^3.7.2" 5929 - uuid "^9.0.0" 5930 - 5931 - "@segment/analytics-react@^1.0.0-rc1": 5932 - version "1.0.0-rc1" 5933 - resolved "https://registry.yarnpkg.com/@segment/analytics-react/-/analytics-react-1.0.0-rc1.tgz#4ef7683f291b26ce731fdccecd2151cd00facf5a" 5934 - integrity sha512-b3bH8sYV2i4GfdqntuNTak6OlnQBF7LGsb11y6HZlIbYRNxW3kdr1HnLlR0HcaALLopMy9dZn/5PaeVKsaVezQ== 5935 - dependencies: 5936 - tslib "^2.4.0" 5937 - 5938 - "@segment/analytics.js-video-plugins@^0.2.1": 5939 - version "0.2.1" 5940 - resolved "https://registry.yarnpkg.com/@segment/analytics.js-video-plugins/-/analytics.js-video-plugins-0.2.1.tgz#3596fa3887dcd9df5978dc566edf4a0aea2a9b1e" 5941 - integrity sha512-lZwCyEXT4aaHBLNK433okEKdxGAuyrVmop4BpQqQSJuRz0DglPZgd9B/XjiiWs1UyOankg2aNYMN3VcS8t4eSQ== 5942 - dependencies: 5943 - unfetch "^3.1.1" 5944 - 5945 - "@segment/facade@^3.4.9": 5946 - version "3.4.10" 5947 - resolved "https://registry.yarnpkg.com/@segment/facade/-/facade-3.4.10.tgz#118fab29cf2250d3128f9b2a16d6ec76f86e3710" 5948 - integrity sha512-xVQBbB/lNvk/u8+ey0kC/+g8pT3l0gCT8O2y9Z+StMMn3KAFAQ9w8xfgef67tJybktOKKU7pQGRPolRM1i1pdA== 5949 - dependencies: 5950 - "@segment/isodate-traverse" "^1.1.1" 5951 - inherits "^2.0.4" 5952 - new-date "^1.0.3" 5953 - obj-case "0.2.1" 5954 - 5955 - "@segment/isodate-traverse@^1.1.1": 5956 - version "1.1.1" 5957 - resolved "https://registry.yarnpkg.com/@segment/isodate-traverse/-/isodate-traverse-1.1.1.tgz#37e1a68b5e48a841260145f1be86d342995dfc64" 5958 - integrity sha512-+G6e1SgAUkcq0EDMi+SRLfT48TNlLPF3QnSgFGVs0V9F3o3fq/woQ2rHFlW20W0yy5NnCUH0QGU3Am2rZy/E3w== 5959 - dependencies: 5960 - "@segment/isodate" "^1.0.3" 5961 - 5962 - "@segment/isodate@1.0.3", "@segment/isodate@^1.0.3": 5963 - version "1.0.3" 5964 - resolved "https://registry.yarnpkg.com/@segment/isodate/-/isodate-1.0.3.tgz#f44e8202d5edd277ce822785239474b2c9411d4a" 5965 - integrity sha512-BtanDuvJqnACFkeeYje7pWULVv8RgZaqKHWwGFnL/g/TH/CcZjkIVTfGDp/MAxmilYHUkrX70SqwnYSTNEaN7A== 5966 - 5967 5875 "@segment/loosely-validate-event@^2.0.0": 5968 5876 version "2.0.0" 5969 5877 resolved "https://registry.yarnpkg.com/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz#87dfc979e5b4e7b82c5f1d8b722dfd5d77644681" ··· 5971 5879 dependencies: 5972 5880 component-type "^1.2.1" 5973 5881 join-component "^1.1.0" 5974 - 5975 - "@segment/sovran-react-native@^0.4.5": 5976 - version "0.4.5" 5977 - resolved "https://registry.yarnpkg.com/@segment/sovran-react-native/-/sovran-react-native-0.4.5.tgz#2ae057790623cfbd84eb15e4a3bb9835d108f815" 5978 - integrity sha512-/dvud4hkszRNgTHdb7p822U+NXTuPxifqQzhcrfdjmFoXMafnzOUAi1KxeGV6Qdb73VAIxcnr/8hkTqdjZ3YLw== 5979 - dependencies: 5980 - "@react-native-async-storage/async-storage" "^1.15.15" 5981 - ansi-regex "5.0.1" 5982 - deepmerge "^4.2.2" 5983 - shell-quote "1.7.3" 5984 - 5985 - "@segment/sovran-react-native@^1": 5986 - version "1.0.4" 5987 - resolved "https://registry.yarnpkg.com/@segment/sovran-react-native/-/sovran-react-native-1.0.4.tgz#862c9c01c15f5ea81a77012c6e720ebd56153ccc" 5988 - integrity sha512-oeIjspLOX9V+YmM7arZ+OXCyjooKdurnyVji+sj8OVkw+tUcXtvy+m9oC8E4yqazR/tghWCYE+tCriNx4jsVTw== 5989 - dependencies: 5990 - ansi-regex "5.0.1" 5991 - deepmerge "^4.2.2" 5992 - shell-quote "1.8.0" 5993 - 5994 - "@segment/tsub@^2", "@segment/tsub@^2.0.0": 5995 - version "2.0.0" 5996 - resolved "https://registry.yarnpkg.com/@segment/tsub/-/tsub-2.0.0.tgz#321e781a38fcd3720853f2da7574b523b447a296" 5997 - integrity sha512-NzkBK8GwPsyQ74AceLjENbUoaFrObnzEKOX4ko2wZDuIyK+DnDm3B//8xZYI2LCKt+wUD55l6ygfjCoVs8RMWw== 5998 - dependencies: 5999 - "@stdlib/math-base-special-ldexp" "^0.0.5" 6000 - dlv "^1.1.3" 6001 - dset "^3.1.1" 6002 - tiny-hashes "^1.0.1" 6003 5882 6004 5883 "@sentry-internal/feedback@7.119.0": 6005 5884 version "7.119.0" ··· 6679 6558 "@smithy/types" "^2.6.0" 6680 6559 tslib "^2.5.0" 6681 6560 6682 - "@stdlib/array-float32@^0.0.x": 6683 - version "0.0.6" 6684 - resolved "https://registry.yarnpkg.com/@stdlib/array-float32/-/array-float32-0.0.6.tgz#7a1c89db3c911183ec249fa32455abd9328cfa27" 6685 - integrity sha512-QgKT5UaE92Rv7cxfn7wBKZAlwFFHPla8eXsMFsTGt5BiL4yUy36lwinPUh4hzybZ11rw1vifS3VAPuk6JP413Q== 6686 - dependencies: 6687 - "@stdlib/assert-has-float32array-support" "^0.0.x" 6688 - 6689 - "@stdlib/array-float64@^0.0.x": 6690 - version "0.0.6" 6691 - resolved "https://registry.yarnpkg.com/@stdlib/array-float64/-/array-float64-0.0.6.tgz#02d1c80dd4c38a0f1ec150ddfefe706e148bfc10" 6692 - integrity sha512-oE8y4a84LyBF1goX5//sU1mOjet8gLI0/6wucZcjg+j/yMmNV1xFu84Az9GOGmFSE6Ze6lirGOhfBeEWNNNaJg== 6693 - dependencies: 6694 - "@stdlib/assert-has-float64array-support" "^0.0.x" 6695 - 6696 - "@stdlib/array-uint16@^0.0.x": 6697 - version "0.0.6" 6698 - resolved "https://registry.yarnpkg.com/@stdlib/array-uint16/-/array-uint16-0.0.6.tgz#2545110f0b611a1d55b01e52bd9160aaa67d6973" 6699 - integrity sha512-/A8Tr0CqJ4XScIDRYQawosko8ha1Uy+50wsTgJhjUtXDpPRp7aUjmxvYkbe7Rm+ImYYbDQVix/uCiPAFQ8ed4Q== 6700 - dependencies: 6701 - "@stdlib/assert-has-uint16array-support" "^0.0.x" 6702 - 6703 - "@stdlib/array-uint32@^0.0.x": 6704 - version "0.0.6" 6705 - resolved "https://registry.yarnpkg.com/@stdlib/array-uint32/-/array-uint32-0.0.6.tgz#5a923576475f539bfb2fda4721ea7bac6e993949" 6706 - integrity sha512-2hFPK1Fg7obYPZWlGDjW9keiIB6lXaM9dKmJubg/ergLQCsJQJZpYsG6mMAfTJi4NT1UF4jTmgvyKD+yf0D9cA== 6707 - dependencies: 6708 - "@stdlib/assert-has-uint32array-support" "^0.0.x" 6709 - 6710 - "@stdlib/array-uint8@^0.0.x": 6711 - version "0.0.7" 6712 - resolved "https://registry.yarnpkg.com/@stdlib/array-uint8/-/array-uint8-0.0.7.tgz#56f82b361da6bd9caad0e1d05e7f6ef20af9c895" 6713 - integrity sha512-qYJQQfGKIcky6TzHFIGczZYTuVlut7oO+V8qUBs7BJC9TwikVnnOmb3hY3jToY4xaoi5p9OvgdJKPInhyIhzFg== 6714 - dependencies: 6715 - "@stdlib/assert-has-uint8array-support" "^0.0.x" 6716 - 6717 - "@stdlib/assert-has-float32array-support@^0.0.x": 6718 - version "0.0.8" 6719 - resolved "https://registry.yarnpkg.com/@stdlib/assert-has-float32array-support/-/assert-has-float32array-support-0.0.8.tgz#77371183726e26ca9e6f9db41d34543607074067" 6720 - integrity sha512-Yrg7K6rBqwCzDWZ5bN0VWLS5dNUWcoSfUeU49vTERdUmZID06J069CDc07UUl8vfQWhFgBWGocH3rrpKm1hi9w== 6721 - dependencies: 6722 - "@stdlib/assert-is-float32array" "^0.0.x" 6723 - "@stdlib/cli-ctor" "^0.0.x" 6724 - "@stdlib/constants-float64-pinf" "^0.0.x" 6725 - "@stdlib/fs-read-file" "^0.0.x" 6726 - 6727 - "@stdlib/assert-has-float64array-support@^0.0.x": 6728 - version "0.0.8" 6729 - resolved "https://registry.yarnpkg.com/@stdlib/assert-has-float64array-support/-/assert-has-float64array-support-0.0.8.tgz#4d154994d348f5d894f63b3fbb9d7a6e2e4e5311" 6730 - integrity sha512-UVQcoeWqgMw9b8PnAmm/sgzFnuWkZcNhJoi7xyMjbiDV/SP1qLCrvi06mq86cqS3QOCma1fEayJdwgteoXyyuw== 6731 - dependencies: 6732 - "@stdlib/assert-is-float64array" "^0.0.x" 6733 - "@stdlib/cli-ctor" "^0.0.x" 6734 - "@stdlib/fs-read-file" "^0.0.x" 6735 - 6736 - "@stdlib/assert-has-node-buffer-support@^0.0.x": 6737 - version "0.0.8" 6738 - resolved "https://registry.yarnpkg.com/@stdlib/assert-has-node-buffer-support/-/assert-has-node-buffer-support-0.0.8.tgz#5564d8e797c850f6ffc522b720eab1f6cba9c814" 6739 - integrity sha512-fgI+hW4Yg4ciiv4xVKH+1rzdV7e5+6UKgMnFbc1XDXHcxLub3vOr8+H6eDECdAIfgYNA7X0Dxa/DgvX9dwDTAQ== 6740 - dependencies: 6741 - "@stdlib/assert-is-buffer" "^0.0.x" 6742 - "@stdlib/cli-ctor" "^0.0.x" 6743 - "@stdlib/fs-read-file" "^0.0.x" 6744 - 6745 - "@stdlib/assert-has-own-property@^0.0.x": 6746 - version "0.0.7" 6747 - resolved "https://registry.yarnpkg.com/@stdlib/assert-has-own-property/-/assert-has-own-property-0.0.7.tgz#8b55b38e25db8366b028cb871905ac09c9c253fb" 6748 - integrity sha512-3YHwSWiUqGlTLSwxAWxrqaD1PkgcJniGyotJeIt5X0tSNmSW0/c9RWroCImTUUB3zBkyBJ79MyU9Nf4Qgm59fQ== 6749 - 6750 - "@stdlib/assert-has-symbol-support@^0.0.x": 6751 - version "0.0.8" 6752 - resolved "https://registry.yarnpkg.com/@stdlib/assert-has-symbol-support/-/assert-has-symbol-support-0.0.8.tgz#8606b247f0d023f2a7a6aa8a6fe5e346aa802a8f" 6753 - integrity sha512-PoQ9rk8DgDCuBEkOIzGGQmSnjtcdagnUIviaP5YskB45/TJHXseh4NASWME8FV77WFW9v/Wt1MzKFKMzpDFu4Q== 6754 - dependencies: 6755 - "@stdlib/cli-ctor" "^0.0.x" 6756 - "@stdlib/fs-read-file" "^0.0.x" 6757 - 6758 - "@stdlib/assert-has-tostringtag-support@^0.0.x": 6759 - version "0.0.9" 6760 - resolved "https://registry.yarnpkg.com/@stdlib/assert-has-tostringtag-support/-/assert-has-tostringtag-support-0.0.9.tgz#1080ef0a4be576a72d19a819498719265456f170" 6761 - integrity sha512-UTsqdkrnQ7eufuH5BeyWOJL3ska3u5nvDWKqw3onNNZ2mvdgkfoFD7wHutVGzAA2rkTsSJAMBHVwWLsm5SbKgw== 6762 - dependencies: 6763 - "@stdlib/assert-has-symbol-support" "^0.0.x" 6764 - "@stdlib/cli-ctor" "^0.0.x" 6765 - "@stdlib/fs-read-file" "^0.0.x" 6766 - 6767 - "@stdlib/assert-has-uint16array-support@^0.0.x": 6768 - version "0.0.8" 6769 - resolved "https://registry.yarnpkg.com/@stdlib/assert-has-uint16array-support/-/assert-has-uint16array-support-0.0.8.tgz#083828067d55e3cc896796bc63cbf5726f67eecf" 6770 - integrity sha512-vqFDn30YrtzD+BWnVqFhB130g3cUl2w5AdOxhIkRkXCDYAM5v7YwdNMJEON+D4jI8YB4D5pEYjqKweYaCq4nyg== 6771 - dependencies: 6772 - "@stdlib/assert-is-uint16array" "^0.0.x" 6773 - "@stdlib/cli-ctor" "^0.0.x" 6774 - "@stdlib/constants-uint16-max" "^0.0.x" 6775 - "@stdlib/fs-read-file" "^0.0.x" 6776 - 6777 - "@stdlib/assert-has-uint32array-support@^0.0.x": 6778 - version "0.0.8" 6779 - resolved "https://registry.yarnpkg.com/@stdlib/assert-has-uint32array-support/-/assert-has-uint32array-support-0.0.8.tgz#a98c431fee45743088adb9602ef753c7552f9155" 6780 - integrity sha512-tJtKuiFKwFSQQUfRXEReOVGXtfdo6+xlshSfwwNWXL1WPP2LrceoiUoQk7zMCMT6VdbXgGH92LDjVcPmSbH4Xw== 6781 - dependencies: 6782 - "@stdlib/assert-is-uint32array" "^0.0.x" 6783 - "@stdlib/cli-ctor" "^0.0.x" 6784 - "@stdlib/constants-uint32-max" "^0.0.x" 6785 - "@stdlib/fs-read-file" "^0.0.x" 6786 - 6787 - "@stdlib/assert-has-uint8array-support@^0.0.x": 6788 - version "0.0.8" 6789 - resolved "https://registry.yarnpkg.com/@stdlib/assert-has-uint8array-support/-/assert-has-uint8array-support-0.0.8.tgz#9bed19de9834c3ced633551ed630982f0f424724" 6790 - integrity sha512-ie4vGTbAS/5Py+LLjoSQi0nwtYBp+WKk20cMYCzilT0rCsBI/oez0RqHrkYYpmt4WaJL4eJqC+/vfQ5NsI7F5w== 6791 - dependencies: 6792 - "@stdlib/assert-is-uint8array" "^0.0.x" 6793 - "@stdlib/cli-ctor" "^0.0.x" 6794 - "@stdlib/constants-uint8-max" "^0.0.x" 6795 - "@stdlib/fs-read-file" "^0.0.x" 6796 - 6797 - "@stdlib/assert-is-array@^0.0.x": 6798 - version "0.0.7" 6799 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-array/-/assert-is-array-0.0.7.tgz#7f30904f88a195d918c588540a6807d1ae639d79" 6800 - integrity sha512-/o6KclsGkNcZ5hiROarsD9XUs6xQMb4lTwF6O71UHbKWTtomEF/jD0rxLvlvj0BiCxfKrReddEYd2CnhUyskMA== 6801 - dependencies: 6802 - "@stdlib/utils-native-class" "^0.0.x" 6803 - 6804 - "@stdlib/assert-is-big-endian@^0.0.x": 6805 - version "0.0.7" 6806 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-big-endian/-/assert-is-big-endian-0.0.7.tgz#25ca21fb1ae0ec8201a716731497a2a15f315a7f" 6807 - integrity sha512-BvutsX84F76YxaSIeS5ZQTl536lz+f+P7ew68T1jlFqxBhr4v7JVYFmuf24U040YuK1jwZ2sAq+bPh6T09apwQ== 6808 - dependencies: 6809 - "@stdlib/array-uint16" "^0.0.x" 6810 - "@stdlib/array-uint8" "^0.0.x" 6811 - "@stdlib/cli-ctor" "^0.0.x" 6812 - "@stdlib/fs-read-file" "^0.0.x" 6813 - 6814 - "@stdlib/assert-is-boolean@^0.0.x": 6815 - version "0.0.8" 6816 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-boolean/-/assert-is-boolean-0.0.8.tgz#6b38c2e799e4475d7647fb0e44519510e67080ce" 6817 - integrity sha512-PRCpslMXSYqFMz1Yh4dG2K/WzqxTCtlKbgJQD2cIkAtXux4JbYiXCtepuoV7l4Wv1rm0a1eU8EqNPgnOmWajGw== 6818 - dependencies: 6819 - "@stdlib/assert-has-tostringtag-support" "^0.0.x" 6820 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 6821 - "@stdlib/utils-native-class" "^0.0.x" 6822 - 6823 - "@stdlib/assert-is-buffer@^0.0.x": 6824 - version "0.0.8" 6825 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-buffer/-/assert-is-buffer-0.0.8.tgz#633b98bc342979e9ed8ed71c3a0f1366782d1412" 6826 - integrity sha512-SYmGwOXkzZVidqUyY1IIx6V6QnSL36v3Lcwj8Rvne/fuW0bU2OomsEBzYCFMvcNgtY71vOvgZ9VfH3OppvV6eA== 6827 - dependencies: 6828 - "@stdlib/assert-is-object-like" "^0.0.x" 6829 - 6830 - "@stdlib/assert-is-float32array@^0.0.x": 6831 - version "0.0.8" 6832 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-float32array/-/assert-is-float32array-0.0.8.tgz#a43f6106a2ef8797496ab85aaf6570715394654a" 6833 - integrity sha512-Phk0Ze7Vj2/WLv5Wy8Oo7poZIDMSTiTrEnc1t4lBn3Svz2vfBXlvCufi/i5d93vc4IgpkdrOEwfry6nldABjNQ== 6834 - dependencies: 6835 - "@stdlib/utils-native-class" "^0.0.x" 6836 - 6837 - "@stdlib/assert-is-float64array@^0.0.x": 6838 - version "0.0.8" 6839 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-float64array/-/assert-is-float64array-0.0.8.tgz#8c27204ae6cf309e16f0bbad1937f8aa06c2a812" 6840 - integrity sha512-UC0Av36EEYIgqBbCIz1lj9g7qXxL5MqU1UrWun+n91lmxgdJ+Z77fHy75efJbJlXBf6HXhcYXECIsc0u3SzyDQ== 6841 - dependencies: 6842 - "@stdlib/utils-native-class" "^0.0.x" 6843 - 6844 - "@stdlib/assert-is-function@^0.0.x": 6845 - version "0.0.8" 6846 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-function/-/assert-is-function-0.0.8.tgz#e4925022b7dd8c4a67e86769691d1d29ab159db9" 6847 - integrity sha512-M55Dt2njp5tnY8oePdbkKBRIypny+LpCMFZhEjJIxjLE4rA6zSlHs1yRMqD4PmW+Wl9WTeEM1GYO4AQHl1HAjA== 6848 - dependencies: 6849 - "@stdlib/utils-type-of" "^0.0.x" 6850 - 6851 - "@stdlib/assert-is-little-endian@^0.0.x": 6852 - version "0.0.7" 6853 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-little-endian/-/assert-is-little-endian-0.0.7.tgz#f369fa3ec05c0e3a813738174b6821aacda6e323" 6854 - integrity sha512-SPObC73xXfDXY0dOewXR0LDGN3p18HGzm+4K8azTj6wug0vpRV12eB3hbT28ybzRCa6TAKUjwM/xY7Am5QzIlA== 6855 - dependencies: 6856 - "@stdlib/array-uint16" "^0.0.x" 6857 - "@stdlib/array-uint8" "^0.0.x" 6858 - "@stdlib/cli-ctor" "^0.0.x" 6859 - "@stdlib/fs-read-file" "^0.0.x" 6860 - 6861 - "@stdlib/assert-is-number@^0.0.x": 6862 - version "0.0.7" 6863 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-number/-/assert-is-number-0.0.7.tgz#82b07cda4045bd0ecc846d3bc26d39dca7041c61" 6864 - integrity sha512-mNV4boY1cUOmoWWfA2CkdEJfXA6YvhcTvwKC0Fzq+HoFFOuTK/scpTd9HanUyN6AGBlWA8IW+cQ1ZwOT3XMqag== 6865 - dependencies: 6866 - "@stdlib/assert-has-tostringtag-support" "^0.0.x" 6867 - "@stdlib/number-ctor" "^0.0.x" 6868 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 6869 - "@stdlib/utils-native-class" "^0.0.x" 6870 - 6871 - "@stdlib/assert-is-object-like@^0.0.x": 6872 - version "0.0.8" 6873 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-object-like/-/assert-is-object-like-0.0.8.tgz#f6fc36eb7b612d650c6201d177214733426f0c56" 6874 - integrity sha512-pe9selDPYAu/lYTFV5Rj4BStepgbzQCr36b/eC8EGSJh6gMgRXgHVv0R+EbdJ69KNkHvKKRjnWj0A/EmCwW+OA== 6875 - dependencies: 6876 - "@stdlib/assert-tools-array-function" "^0.0.x" 6877 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 6878 - 6879 - "@stdlib/assert-is-object@^0.0.x": 6880 - version "0.0.8" 6881 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-object/-/assert-is-object-0.0.8.tgz#0220dca73bc3df044fc43e73b02963d5ef7ae489" 6882 - integrity sha512-ooPfXDp9c7w+GSqD2NBaZ/Du1JRJlctv+Abj2vRJDcDPyrnRTb1jmw+AuPgcW7Ca7op39JTbArI+RVHm/FPK+Q== 6883 - dependencies: 6884 - "@stdlib/assert-is-array" "^0.0.x" 6885 - 6886 - "@stdlib/assert-is-plain-object@^0.0.x": 6887 - version "0.0.7" 6888 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-plain-object/-/assert-is-plain-object-0.0.7.tgz#0c3679faf61b03023363f1ce30f8d00f8ed1c37b" 6889 - integrity sha512-t/CEq2a083ajAgXgSa5tsH8l3kSoEqKRu1qUwniVLFYL4RGv3615CrpJUDQKVtEX5S/OKww5q0Byu3JidJ4C5w== 6890 - dependencies: 6891 - "@stdlib/assert-has-own-property" "^0.0.x" 6892 - "@stdlib/assert-is-function" "^0.0.x" 6893 - "@stdlib/assert-is-object" "^0.0.x" 6894 - "@stdlib/utils-get-prototype-of" "^0.0.x" 6895 - "@stdlib/utils-native-class" "^0.0.x" 6896 - 6897 - "@stdlib/assert-is-regexp-string@^0.0.x": 6898 - version "0.0.9" 6899 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-regexp-string/-/assert-is-regexp-string-0.0.9.tgz#424f77b4aaa46a19f4b60ba4b671893a2e5df066" 6900 - integrity sha512-FYRJJtH7XwXEf//X6UByUC0Eqd0ZYK5AC8or5g5m5efQrgr2lOaONHyDQ3Scj1A2D6QLIJKZc9XBM4uq5nOPXA== 6901 - dependencies: 6902 - "@stdlib/assert-is-string" "^0.0.x" 6903 - "@stdlib/cli-ctor" "^0.0.x" 6904 - "@stdlib/fs-read-file" "^0.0.x" 6905 - "@stdlib/process-read-stdin" "^0.0.x" 6906 - "@stdlib/regexp-eol" "^0.0.x" 6907 - "@stdlib/regexp-regexp" "^0.0.x" 6908 - "@stdlib/streams-node-stdin" "^0.0.x" 6909 - 6910 - "@stdlib/assert-is-regexp@^0.0.x": 6911 - version "0.0.7" 6912 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-regexp/-/assert-is-regexp-0.0.7.tgz#430fe42417114e7ea01d21399a70ed9c4cbae867" 6913 - integrity sha512-ty5qvLiqkDq6AibHlNJe0ZxDJ9Mg896qolmcHb69mzp64vrsORnPPOTzVapAq0bEUZbXoypeijypLPs9sCGBSQ== 6914 - dependencies: 6915 - "@stdlib/assert-has-tostringtag-support" "^0.0.x" 6916 - "@stdlib/utils-native-class" "^0.0.x" 6917 - 6918 - "@stdlib/assert-is-string@^0.0.x": 6919 - version "0.0.8" 6920 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-string/-/assert-is-string-0.0.8.tgz#b07e4a4cbd93b13d38fa5ebfaa281ccd6ae9e43f" 6921 - integrity sha512-Uk+bR4cglGBbY0q7O7HimEJiW/DWnO1tSzr4iAGMxYgf+VM2PMYgI5e0TLy9jOSOzWon3YS39lc63eR3a9KqeQ== 6922 - dependencies: 6923 - "@stdlib/assert-has-tostringtag-support" "^0.0.x" 6924 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 6925 - "@stdlib/utils-native-class" "^0.0.x" 6926 - 6927 - "@stdlib/assert-is-uint16array@^0.0.x": 6928 - version "0.0.8" 6929 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-uint16array/-/assert-is-uint16array-0.0.8.tgz#770cc5d86906393d30d387a291e81df0a984fdfb" 6930 - integrity sha512-M+qw7au+qglRXcXHjvoUZVLlGt1mPjuKudrVRto6KL4+tDsP2j+A89NDP3Fz8/XIUD+5jhj+65EOKHSMvDYnng== 6931 - dependencies: 6932 - "@stdlib/utils-native-class" "^0.0.x" 6933 - 6934 - "@stdlib/assert-is-uint32array@^0.0.x": 6935 - version "0.0.8" 6936 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-uint32array/-/assert-is-uint32array-0.0.8.tgz#2a7f1265db25d728e3fc084f0f59be5f796efac5" 6937 - integrity sha512-cnZi2DicYcplMnkJ3dBxBVKsRNFjzoGpmG9A6jXq4KH5rFl52SezGAXSVY9o5ZV7bQGaF5JLyCLp6n9Y74hFGg== 6938 - dependencies: 6939 - "@stdlib/utils-native-class" "^0.0.x" 6940 - 6941 - "@stdlib/assert-is-uint8array@^0.0.x": 6942 - version "0.0.8" 6943 - resolved "https://registry.yarnpkg.com/@stdlib/assert-is-uint8array/-/assert-is-uint8array-0.0.8.tgz#4521054b5d3a2206b406cad7368e0a50eaee4dec" 6944 - integrity sha512-8cqpDQtjnJAuVtRkNAktn45ixq0JHaGJxVsSiK79k7GRggvMI6QsbzO6OvcLnZ/LimD42FmgbLd13Yc2esDmZw== 6945 - dependencies: 6946 - "@stdlib/utils-native-class" "^0.0.x" 6947 - 6948 - "@stdlib/assert-tools-array-function@^0.0.x": 6949 - version "0.0.7" 6950 - resolved "https://registry.yarnpkg.com/@stdlib/assert-tools-array-function/-/assert-tools-array-function-0.0.7.tgz#34e9e5a3fca62ea75da99fc9995ba845ba514988" 6951 - integrity sha512-3lqkaCIBMSJ/IBHHk4NcCnk2NYU52tmwTYbbqhAmv7vim8rZPNmGfj3oWkzrCsyCsyTF7ooD+In2x+qTmUbCtQ== 6952 - dependencies: 6953 - "@stdlib/assert-is-array" "^0.0.x" 6954 - 6955 - "@stdlib/buffer-ctor@^0.0.x": 6956 - version "0.0.7" 6957 - resolved "https://registry.yarnpkg.com/@stdlib/buffer-ctor/-/buffer-ctor-0.0.7.tgz#d05b7f4a6ef26defe6cdd41ca244a927b96c55ec" 6958 - integrity sha512-4IyTSGijKUQ8+DYRaKnepf9spvKLZ+nrmZ+JrRcB3FrdTX/l9JDpggcUcC/Fe+A4KIZOnClfxLn6zfIlkCZHNA== 6959 - dependencies: 6960 - "@stdlib/assert-has-node-buffer-support" "^0.0.x" 6961 - 6962 - "@stdlib/buffer-from-string@^0.0.x": 6963 - version "0.0.8" 6964 - resolved "https://registry.yarnpkg.com/@stdlib/buffer-from-string/-/buffer-from-string-0.0.8.tgz#0901a6e66c278db84836e483a7278502e2a33994" 6965 - integrity sha512-Dws5ZbK2M9l4Bkn/ODHFm3lNZ8tWko+NYXqGS/UH/RIQv3PGp+1tXFUSvjwjDneM6ppjQVExzVedUH1ftABs9A== 6966 - dependencies: 6967 - "@stdlib/assert-is-function" "^0.0.x" 6968 - "@stdlib/assert-is-string" "^0.0.x" 6969 - "@stdlib/buffer-ctor" "^0.0.x" 6970 - "@stdlib/string-format" "^0.0.x" 6971 - 6972 - "@stdlib/cli-ctor@^0.0.x": 6973 - version "0.0.3" 6974 - resolved "https://registry.yarnpkg.com/@stdlib/cli-ctor/-/cli-ctor-0.0.3.tgz#5b0a6d253217556c778015eee6c14be903f82c2b" 6975 - integrity sha512-0zCuZnzFyxj66GoF8AyIOhTX5/mgGczFvr6T9h4mXwegMZp8jBC/ZkOGMwmp+ODLBTvlcnnDNpNFkDDyR6/c2g== 6976 - dependencies: 6977 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 6978 - "@stdlib/utils-noop" "^0.0.x" 6979 - minimist "^1.2.0" 6980 - 6981 - "@stdlib/complex-float32@^0.0.7", "@stdlib/complex-float32@^0.0.x": 6982 - version "0.0.7" 6983 - resolved "https://registry.yarnpkg.com/@stdlib/complex-float32/-/complex-float32-0.0.7.tgz#fb9a0c34254eaf3ed91c39983e19ef131fc18bc1" 6984 - integrity sha512-POCtQcBZnPm4IrFmTujSaprR1fcOFr/MRw2Mt7INF4oed6b1nzeG647K+2tk1m4mMrMPiuXCdvwJod4kJ0SXxQ== 6985 - dependencies: 6986 - "@stdlib/assert-is-number" "^0.0.x" 6987 - "@stdlib/number-float64-base-to-float32" "^0.0.x" 6988 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 6989 - "@stdlib/utils-define-property" "^0.0.x" 6990 - "@stdlib/utils-library-manifest" "^0.0.x" 6991 - 6992 - "@stdlib/complex-float64@^0.0.8", "@stdlib/complex-float64@^0.0.x": 6993 - version "0.0.8" 6994 - resolved "https://registry.yarnpkg.com/@stdlib/complex-float64/-/complex-float64-0.0.8.tgz#00ee3a0629d218a01b830a20406aea7d7aff6fb3" 6995 - integrity sha512-lUJwsXtGEziOWAqCcnKnZT4fcVoRsl6t6ECaCJX45Z7lAc70yJLiwUieLWS5UXmyoADHuZyUXkxtI4oClfpnaw== 6996 - dependencies: 6997 - "@stdlib/assert-is-number" "^0.0.x" 6998 - "@stdlib/complex-float32" "^0.0.x" 6999 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 7000 - "@stdlib/utils-define-property" "^0.0.x" 7001 - "@stdlib/utils-library-manifest" "^0.0.x" 7002 - 7003 - "@stdlib/complex-reim@^0.0.6", "@stdlib/complex-reim@^0.0.x": 7004 - version "0.0.6" 7005 - resolved "https://registry.yarnpkg.com/@stdlib/complex-reim/-/complex-reim-0.0.6.tgz#9657971e36f2a1f1930a21249c1934c8c5087efd" 7006 - integrity sha512-28WXfPSIFMtHb0YgdatkGS4yxX5sPYea5MiNgqPv3E78+tFcg8JJG52NQ/MviWP2wsN9aBQAoCPeu8kXxSPdzA== 7007 - dependencies: 7008 - "@stdlib/array-float64" "^0.0.x" 7009 - "@stdlib/complex-float64" "^0.0.x" 7010 - "@stdlib/types" "^0.0.x" 7011 - "@stdlib/utils-library-manifest" "^0.0.x" 7012 - 7013 - "@stdlib/complex-reimf@^0.0.1", "@stdlib/complex-reimf@^0.0.x": 7014 - version "0.0.1" 7015 - resolved "https://registry.yarnpkg.com/@stdlib/complex-reimf/-/complex-reimf-0.0.1.tgz#6797bc1bfb668a30511611f2544d0cff4d297775" 7016 - integrity sha512-P9zu05ZW2i68Oppp3oHelP7Tk0D7tGBL0hGl1skJppr2vY9LltuNbeYI3C96tQe/7Enw/5GyAWgxoQI4cWccQA== 7017 - dependencies: 7018 - "@stdlib/array-float32" "^0.0.x" 7019 - "@stdlib/complex-float32" "^0.0.x" 7020 - "@stdlib/types" "^0.0.x" 7021 - "@stdlib/utils-library-manifest" "^0.0.x" 7022 - 7023 - "@stdlib/constants-float64-exponent-bias@^0.0.x": 7024 - version "0.0.8" 7025 - resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-exponent-bias/-/constants-float64-exponent-bias-0.0.8.tgz#f5069931a9a16d69e90a7c925739d7f64e4d725e" 7026 - integrity sha512-IzBJQw9hYgWCki7VoC/zJxEA76Nmf8hmY+VkOWnJ8IyfgTXClgY8tfDGS1cc4l/hCOEllxGp9FRvVdn24A5tKQ== 7027 - dependencies: 7028 - "@stdlib/utils-library-manifest" "^0.0.x" 7029 - 7030 - "@stdlib/constants-float64-high-word-abs-mask@^0.0.x": 7031 - version "0.0.1" 7032 - resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-high-word-abs-mask/-/constants-float64-high-word-abs-mask-0.0.1.tgz#efb4cd3c13c301a3e9da83e8065dd2479e2c976e" 7033 - integrity sha512-1vy8SUyMHFBwqUUVaZFA7r4/E3cMMRKSwsaa/EZ15w7Kmc01W/ZmaaTLevRcIdACcNgK+8i8813c8H7LScXNcQ== 7034 - dependencies: 7035 - "@stdlib/utils-library-manifest" "^0.0.x" 7036 - 7037 - "@stdlib/constants-float64-high-word-exponent-mask@^0.0.x": 7038 - version "0.0.8" 7039 - resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-high-word-exponent-mask/-/constants-float64-high-word-exponent-mask-0.0.8.tgz#c5671d462674ab09e48f25c2b3ca4d6d5cc4d875" 7040 - integrity sha512-z28/EQERc0VG7N36bqdvtrRWjFc8600PKkwvl/nqx6TpKAzMXNw55BS1xT4C28Sa9Z7uBWeUj3UbIFedbkoyMw== 7041 - dependencies: 7042 - "@stdlib/utils-library-manifest" "^0.0.x" 7043 - 7044 - "@stdlib/constants-float64-high-word-sign-mask@^0.0.x": 7045 - version "0.0.1" 7046 - resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-high-word-sign-mask/-/constants-float64-high-word-sign-mask-0.0.1.tgz#d45bdec657199cdf522240d02ccd4b04040f58ca" 7047 - integrity sha512-hmTr5caK1lh1m0eyaQqt2Vt3y+eEdAx57ndbADEbXhxC9qSGd0b4bLSzt/Xp4MYBYdQkHAE/BlkgUiRThswhCg== 7048 - dependencies: 7049 - "@stdlib/utils-library-manifest" "^0.0.x" 7050 - 7051 - "@stdlib/constants-float64-max-base2-exponent-subnormal@^0.0.x": 7052 - version "0.0.8" 7053 - resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-max-base2-exponent-subnormal/-/constants-float64-max-base2-exponent-subnormal-0.0.8.tgz#a24288c9c5e401eeb28d29f808c00a0bad481280" 7054 - integrity sha512-YGBZykSiXFebznnJfWFDwhho2Q9xhUWOL+X0lZJ4ItfTTo40W6VHAyNYz98tT/gJECFype0seNzzo1nUxCE7jQ== 7055 - dependencies: 7056 - "@stdlib/utils-library-manifest" "^0.0.x" 7057 - 7058 - "@stdlib/constants-float64-max-base2-exponent@^0.0.x": 7059 - version "0.0.8" 7060 - resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-max-base2-exponent/-/constants-float64-max-base2-exponent-0.0.8.tgz#1d93dd829129a9e77133c5ad4f8c390c93f31bcb" 7061 - integrity sha512-xBAOtso1eiy27GnTut2difuSdpsGxI8dJhXupw0UukGgvy/3CSsyNm+a1Suz/dhqK4tPOTe5QboIdNMw5IgXKQ== 7062 - dependencies: 7063 - "@stdlib/utils-library-manifest" "^0.0.x" 7064 - 7065 - "@stdlib/constants-float64-min-base2-exponent-subnormal@^0.0.x": 7066 - version "0.0.8" 7067 - resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-min-base2-exponent-subnormal/-/constants-float64-min-base2-exponent-subnormal-0.0.8.tgz#a5bd5a84ae2dec5694daccdaf2da54759185b727" 7068 - integrity sha512-bt81nBus/91aEqGRQBenEFCyWNsf8uaxn4LN1NjgkvY92S1yVxXFlC65fJHsj9FTqvyZ+uj690/gdMKUDV3NjQ== 7069 - dependencies: 7070 - "@stdlib/utils-library-manifest" "^0.0.x" 7071 - 7072 - "@stdlib/constants-float64-ninf@^0.0.x": 7073 - version "0.0.8" 7074 - resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-ninf/-/constants-float64-ninf-0.0.8.tgz#4a83691d4d46503e2339fa3ec21d0440877b5bb7" 7075 - integrity sha512-bn/uuzCne35OSLsQZJlNrkvU1/40spGTm22g1+ZI1LL19J8XJi/o4iupIHRXuLSTLFDBqMoJlUNphZlWQ4l8zw== 7076 - dependencies: 7077 - "@stdlib/number-ctor" "^0.0.x" 7078 - "@stdlib/utils-library-manifest" "^0.0.x" 7079 - 7080 - "@stdlib/constants-float64-pinf@^0.0.x": 7081 - version "0.0.8" 7082 - resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-pinf/-/constants-float64-pinf-0.0.8.tgz#ad3d5b267b142b0927363f6eda74c94b8c4be8bf" 7083 - integrity sha512-I3R4rm2cemoMuiDph07eo5oWZ4ucUtpuK73qBJiJPDQKz8fSjSe4wJBAigq2AmWYdd7yJHsl5NJd8AgC6mP5Qw== 7084 - dependencies: 7085 - "@stdlib/utils-library-manifest" "^0.0.x" 7086 - 7087 - "@stdlib/constants-float64-smallest-normal@^0.0.x": 7088 - version "0.0.8" 7089 - resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-smallest-normal/-/constants-float64-smallest-normal-0.0.8.tgz#ea1b2335175480f7e846fdf5bbe378a31b7409b6" 7090 - integrity sha512-Qwxpn5NA3RXf+mQcffCWRcsHSPTUQkalsz0+JDpblDszuz2XROcXkOdDr5LKgTAUPIXsjOgZzTsuRONENhsSEg== 7091 - dependencies: 7092 - "@stdlib/utils-library-manifest" "^0.0.x" 7093 - 7094 - "@stdlib/constants-uint16-max@^0.0.x": 7095 - version "0.0.7" 7096 - resolved "https://registry.yarnpkg.com/@stdlib/constants-uint16-max/-/constants-uint16-max-0.0.7.tgz#c20dbe90cf3825f03f5f44b9ee7e8cbada26f4f1" 7097 - integrity sha512-7TPoku7SlskA67mAm7mykIAjeEnkQJemw1cnKZur0mT5W4ryvDR6iFfL9xBiByVnWYq/+ei7DHbOv6/2b2jizw== 7098 - 7099 - "@stdlib/constants-uint32-max@^0.0.x": 7100 - version "0.0.7" 7101 - resolved "https://registry.yarnpkg.com/@stdlib/constants-uint32-max/-/constants-uint32-max-0.0.7.tgz#60bda569b226120a5d2e01f3066da8e2d3b8e21a" 7102 - integrity sha512-8+NK0ewqc1vnEZNqzwFJgFSy3S543Eft7i8WyW/ygkofiqEiLAsujvYMHzPAB8/3D+PYvjTSe37StSwRwvQ6uw== 7103 - 7104 - "@stdlib/constants-uint8-max@^0.0.x": 7105 - version "0.0.7" 7106 - resolved "https://registry.yarnpkg.com/@stdlib/constants-uint8-max/-/constants-uint8-max-0.0.7.tgz#d50affeaeb6e67a0f39059a8f5122f3fd5ff4447" 7107 - integrity sha512-fqV+xds4jgwFxwWu08b8xDuIoW6/D4/1dtEjZ1sXVeWR7nf0pjj1cHERq4kdkYxsvOGu+rjoR3MbjzpFc4fvSw== 7108 - 7109 - "@stdlib/fs-exists@^0.0.x": 7110 - version "0.0.8" 7111 - resolved "https://registry.yarnpkg.com/@stdlib/fs-exists/-/fs-exists-0.0.8.tgz#391b2cee3e014a3b20266e5d047847f68ef82331" 7112 - integrity sha512-mZktcCxiLmycCJefm1+jbMTYkmhK6Jk1ShFmUVqJvs+Ps9/2EEQXfPbdEniLoVz4HeHLlcX90JWobUEghOOnAQ== 7113 - dependencies: 7114 - "@stdlib/cli-ctor" "^0.0.x" 7115 - "@stdlib/fs-read-file" "^0.0.x" 7116 - "@stdlib/process-cwd" "^0.0.x" 7117 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 7118 - 7119 - "@stdlib/fs-read-file@^0.0.x": 7120 - version "0.0.8" 7121 - resolved "https://registry.yarnpkg.com/@stdlib/fs-read-file/-/fs-read-file-0.0.8.tgz#2f12669fa6dd2d330fb5006a94dc8896f0aaa0e0" 7122 - integrity sha512-pIZID/G91+q7ep4x9ECNC45+JT2j0+jdz/ZQVjCHiEwXCwshZPEvxcPQWb9bXo6coOY+zJyX5TwBIpXBxomWFg== 7123 - dependencies: 7124 - "@stdlib/cli-ctor" "^0.0.x" 7125 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 7126 - 7127 - "@stdlib/fs-resolve-parent-path@^0.0.x": 7128 - version "0.0.8" 7129 - resolved "https://registry.yarnpkg.com/@stdlib/fs-resolve-parent-path/-/fs-resolve-parent-path-0.0.8.tgz#628119952dfaae78afe3916dca856408a4f5c1eb" 7130 - integrity sha512-ok1bTWsAziChibQE3u7EoXwbCQUDkFjjRAHSxh7WWE5JEYVJQg1F0o3bbjRr4D/wfYYPWLAt8AFIKBUDmWghpg== 7131 - dependencies: 7132 - "@stdlib/assert-has-own-property" "^0.0.x" 7133 - "@stdlib/assert-is-function" "^0.0.x" 7134 - "@stdlib/assert-is-plain-object" "^0.0.x" 7135 - "@stdlib/assert-is-string" "^0.0.x" 7136 - "@stdlib/cli-ctor" "^0.0.x" 7137 - "@stdlib/fs-exists" "^0.0.x" 7138 - "@stdlib/fs-read-file" "^0.0.x" 7139 - "@stdlib/process-cwd" "^0.0.x" 7140 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 7141 - 7142 - "@stdlib/math-base-assert-is-infinite@^0.0.x": 7143 - version "0.0.9" 7144 - resolved "https://registry.yarnpkg.com/@stdlib/math-base-assert-is-infinite/-/math-base-assert-is-infinite-0.0.9.tgz#f9aa84e43a01ce4ccd976b20fbe7c508de884a90" 7145 - integrity sha512-JuPDdmxd+AtPWPHu9uaLvTsnEPaZODZk+zpagziNbDKy8DRiU1cy+t+QEjB5WizZt0A5MkuxDTjZ/8/sG5GaYQ== 7146 - dependencies: 7147 - "@stdlib/constants-float64-ninf" "^0.0.x" 7148 - "@stdlib/constants-float64-pinf" "^0.0.x" 7149 - "@stdlib/utils-library-manifest" "^0.0.x" 7150 - 7151 - "@stdlib/math-base-assert-is-nan@^0.0.x": 7152 - version "0.0.8" 7153 - resolved "https://registry.yarnpkg.com/@stdlib/math-base-assert-is-nan/-/math-base-assert-is-nan-0.0.8.tgz#0cd6a546ca1e758251f04898fc906f6fce9e0f80" 7154 - integrity sha512-m+gCVBxLFW8ZdAfdkATetYMvM7sPFoMKboacHjb1pe21jHQqVb+/4bhRSDg6S7HGX7/8/bSzEUm9zuF7vqK5rQ== 7155 - dependencies: 7156 - "@stdlib/utils-library-manifest" "^0.0.x" 7157 - 7158 - "@stdlib/math-base-napi-binary@^0.0.x": 7159 - version "0.0.8" 7160 - resolved "https://registry.yarnpkg.com/@stdlib/math-base-napi-binary/-/math-base-napi-binary-0.0.8.tgz#b2754b021e40e3982c5f22b853ca50724b9eb8de" 7161 - integrity sha512-B8d0HBPhfXefbdl/h0h5c+lM2sE+/U7Fb7hY/huVeoQtBtEx0Jbx/qKvPSVxMjmWCKfWlbPpbgKpN5GbFgLiAg== 7162 - dependencies: 7163 - "@stdlib/complex-float32" "^0.0.x" 7164 - "@stdlib/complex-float64" "^0.0.x" 7165 - "@stdlib/complex-reim" "^0.0.x" 7166 - "@stdlib/complex-reimf" "^0.0.x" 7167 - "@stdlib/utils-library-manifest" "^0.0.x" 7168 - 7169 - "@stdlib/math-base-napi-unary@^0.0.x": 7170 - version "0.0.9" 7171 - resolved "https://registry.yarnpkg.com/@stdlib/math-base-napi-unary/-/math-base-napi-unary-0.0.9.tgz#3a70fa64128aca7011c5a477110d2682d06c8ea8" 7172 - integrity sha512-2WNKhjCygkGMp0RgjaD7wAHJTqPZmuVW7yPOc62Tnz2U+Ad8q/tcOcN+uvq2dtKsAGr1HDMIQxZ/XrrThMePyA== 7173 - dependencies: 7174 - "@stdlib/complex-float32" "^0.0.7" 7175 - "@stdlib/complex-float64" "^0.0.8" 7176 - "@stdlib/complex-reim" "^0.0.6" 7177 - "@stdlib/complex-reimf" "^0.0.1" 7178 - "@stdlib/utils-library-manifest" "^0.0.8" 7179 - 7180 - "@stdlib/math-base-special-abs@^0.0.x": 7181 - version "0.0.6" 7182 - resolved "https://registry.yarnpkg.com/@stdlib/math-base-special-abs/-/math-base-special-abs-0.0.6.tgz#1e95dbeaf417ef779c6ab6beaf15f9f96cae6fa9" 7183 - integrity sha512-FaaMUnYs2qIVN3kI5m/qNlBhDnjszhDOzEhxGEoQWR/k0XnxbCsTyjNesR2DkpiKuoAXAr9ojoDe2qBYdirWoQ== 7184 - dependencies: 7185 - "@stdlib/math-base-napi-unary" "^0.0.x" 7186 - "@stdlib/number-float64-base-to-words" "^0.0.x" 7187 - "@stdlib/utils-library-manifest" "^0.0.x" 7188 - 7189 - "@stdlib/math-base-special-copysign@^0.0.x": 7190 - version "0.0.7" 7191 - resolved "https://registry.yarnpkg.com/@stdlib/math-base-special-copysign/-/math-base-special-copysign-0.0.7.tgz#d2ead27ff93a84a46263ecfa5f9838a8ab809cfc" 7192 - integrity sha512-7Br7oeuVJSBKG8BiSk/AIRFTBd2sbvHdV3HaqRj8tTZHX8BQomZ3Vj4Qsiz3kPyO4d6PpBLBTYlGTkSDlGOZJA== 7193 - dependencies: 7194 - "@stdlib/constants-float64-high-word-abs-mask" "^0.0.x" 7195 - "@stdlib/constants-float64-high-word-sign-mask" "^0.0.x" 7196 - "@stdlib/math-base-napi-binary" "^0.0.x" 7197 - "@stdlib/number-float64-base-from-words" "^0.0.x" 7198 - "@stdlib/number-float64-base-get-high-word" "^0.0.x" 7199 - "@stdlib/number-float64-base-to-words" "^0.0.x" 7200 - "@stdlib/utils-library-manifest" "^0.0.x" 7201 - 7202 - "@stdlib/math-base-special-ldexp@^0.0.5": 7203 - version "0.0.5" 7204 - resolved "https://registry.yarnpkg.com/@stdlib/math-base-special-ldexp/-/math-base-special-ldexp-0.0.5.tgz#df5a1fc0252a6d6cc5f12126af903e7391d78aad" 7205 - integrity sha512-RLRsPpCdcJZMhwb4l4B/FsmGfEPEWAsik6KYUkUSSHb7ok/gZWt8LgVScxGMpJMpl5IV0v9qG4ZINVONKjX5KA== 7206 - dependencies: 7207 - "@stdlib/constants-float64-exponent-bias" "^0.0.x" 7208 - "@stdlib/constants-float64-max-base2-exponent" "^0.0.x" 7209 - "@stdlib/constants-float64-max-base2-exponent-subnormal" "^0.0.x" 7210 - "@stdlib/constants-float64-min-base2-exponent-subnormal" "^0.0.x" 7211 - "@stdlib/constants-float64-ninf" "^0.0.x" 7212 - "@stdlib/constants-float64-pinf" "^0.0.x" 7213 - "@stdlib/math-base-assert-is-infinite" "^0.0.x" 7214 - "@stdlib/math-base-assert-is-nan" "^0.0.x" 7215 - "@stdlib/math-base-special-copysign" "^0.0.x" 7216 - "@stdlib/number-float64-base-exponent" "^0.0.x" 7217 - "@stdlib/number-float64-base-from-words" "^0.0.x" 7218 - "@stdlib/number-float64-base-normalize" "^0.0.x" 7219 - "@stdlib/number-float64-base-to-words" "^0.0.x" 7220 - 7221 - "@stdlib/number-ctor@^0.0.x": 7222 - version "0.0.7" 7223 - resolved "https://registry.yarnpkg.com/@stdlib/number-ctor/-/number-ctor-0.0.7.tgz#e97a66664639c9853b6c80bc7a15f7d67a2fc991" 7224 - integrity sha512-kXNwKIfnb10Ro3RTclhAYqbE3DtIXax+qpu0z1/tZpI2vkmTfYDQLno2QJrzJsZZgdeFtXIws+edONN9kM34ow== 7225 - 7226 - "@stdlib/number-float64-base-exponent@^0.0.x": 7227 - version "0.0.6" 7228 - resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-exponent/-/number-float64-base-exponent-0.0.6.tgz#cd4483d9faccaf7324c385da8e37d5ecf2f120b0" 7229 - integrity sha512-wLXsG+cvynmapoffmj5hVNDH7BuHIGspBcTCdjPaD+tnqPDIm03qV5Z9YBhDh91BdOCuPZQ8Ovu2WBpX+ySeGg== 7230 - dependencies: 7231 - "@stdlib/constants-float64-exponent-bias" "^0.0.x" 7232 - "@stdlib/constants-float64-high-word-exponent-mask" "^0.0.x" 7233 - "@stdlib/number-float64-base-get-high-word" "^0.0.x" 7234 - 7235 - "@stdlib/number-float64-base-from-words@^0.0.x": 7236 - version "0.0.6" 7237 - resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-from-words/-/number-float64-base-from-words-0.0.6.tgz#886e7dedd086e97d38b7e5fcf4c310467dbaac3c" 7238 - integrity sha512-r0elnekypCN831aw9Gp8+08br8HHAqvqtc5uXaxEh3QYIgBD/QM5qSb3b7WSAQ0ZxJJKdoykupODWWBkWQTijg== 7239 - dependencies: 7240 - "@stdlib/array-float64" "^0.0.x" 7241 - "@stdlib/array-uint32" "^0.0.x" 7242 - "@stdlib/assert-is-little-endian" "^0.0.x" 7243 - "@stdlib/number-float64-base-to-words" "^0.0.x" 7244 - "@stdlib/utils-library-manifest" "^0.0.x" 7245 - 7246 - "@stdlib/number-float64-base-get-high-word@^0.0.x": 7247 - version "0.0.6" 7248 - resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-get-high-word/-/number-float64-base-get-high-word-0.0.6.tgz#4d3b8731a22017521cc7fc3ba57c7915b3e20fee" 7249 - integrity sha512-jSFSYkgiG/IzDurbwrDKtWiaZeSEJK8iJIsNtbPG1vOIdQMRyw+t0bf3Kf3vuJu/+bnSTvYZLqpCO6wzT/ve9g== 7250 - dependencies: 7251 - "@stdlib/array-float64" "^0.0.x" 7252 - "@stdlib/array-uint32" "^0.0.x" 7253 - "@stdlib/assert-is-little-endian" "^0.0.x" 7254 - "@stdlib/number-float64-base-to-words" "^0.0.x" 7255 - "@stdlib/utils-library-manifest" "^0.0.x" 7256 - 7257 - "@stdlib/number-float64-base-normalize@^0.0.x": 7258 - version "0.0.9" 7259 - resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-normalize/-/number-float64-base-normalize-0.0.9.tgz#9e98eda47faa9ffc24bcf8161e587ae7b5f96a39" 7260 - integrity sha512-+rm7RQJEj8zHkqYFE2a6DgNQSB5oKE/IydHAajgZl40YB91BoYRYf/ozs5/tTwfy2Fc04+tIpSfFtzDr4ZY19Q== 7261 - dependencies: 7262 - "@stdlib/constants-float64-smallest-normal" "^0.0.x" 7263 - "@stdlib/math-base-assert-is-infinite" "^0.0.x" 7264 - "@stdlib/math-base-assert-is-nan" "^0.0.x" 7265 - "@stdlib/math-base-special-abs" "^0.0.x" 7266 - "@stdlib/types" "^0.0.x" 7267 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 7268 - "@stdlib/utils-library-manifest" "^0.0.x" 7269 - 7270 - "@stdlib/number-float64-base-to-float32@^0.0.x": 7271 - version "0.0.7" 7272 - resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-to-float32/-/number-float64-base-to-float32-0.0.7.tgz#c7b82bb26cb7404017ede32cebe5864fd84c0e35" 7273 - integrity sha512-PNUSi6+cqfFiu4vgFljUKMFY2O9PxI6+T+vqtIoh8cflf+PjSGj3v4QIlstK9+6qU40eGR5SHZyLTWdzmNqLTQ== 7274 - dependencies: 7275 - "@stdlib/array-float32" "^0.0.x" 7276 - 7277 - "@stdlib/number-float64-base-to-words@^0.0.x": 7278 - version "0.0.7" 7279 - resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-to-words/-/number-float64-base-to-words-0.0.7.tgz#b3e88daa82334d90cf416f5387f503f66849545e" 7280 - integrity sha512-7wsYuq+2MGp9rAkTnQ985rah7EJI9TfgHrYSSd4UIu4qIjoYmWIKEhIDgu7/69PfGrls18C3PxKg1pD/v7DQTg== 7281 - dependencies: 7282 - "@stdlib/array-float64" "^0.0.x" 7283 - "@stdlib/array-uint32" "^0.0.x" 7284 - "@stdlib/assert-is-little-endian" "^0.0.x" 7285 - "@stdlib/os-byte-order" "^0.0.x" 7286 - "@stdlib/os-float-word-order" "^0.0.x" 7287 - "@stdlib/types" "^0.0.x" 7288 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 7289 - "@stdlib/utils-library-manifest" "^0.0.x" 7290 - 7291 - "@stdlib/os-byte-order@^0.0.x": 7292 - version "0.0.7" 7293 - resolved "https://registry.yarnpkg.com/@stdlib/os-byte-order/-/os-byte-order-0.0.7.tgz#131e02fb2ec67d172b9fe57caa629809fba11e7f" 7294 - integrity sha512-rRJWjFM9lOSBiIX4zcay7BZsqYBLoE32Oz/Qfim8cv1cN1viS5D4d3DskRJcffw7zXDnG3oZAOw5yZS0FnlyUg== 7295 - dependencies: 7296 - "@stdlib/assert-is-big-endian" "^0.0.x" 7297 - "@stdlib/assert-is-little-endian" "^0.0.x" 7298 - "@stdlib/cli-ctor" "^0.0.x" 7299 - "@stdlib/fs-read-file" "^0.0.x" 7300 - "@stdlib/utils-library-manifest" "^0.0.x" 7301 - 7302 - "@stdlib/os-float-word-order@^0.0.x": 7303 - version "0.0.7" 7304 - resolved "https://registry.yarnpkg.com/@stdlib/os-float-word-order/-/os-float-word-order-0.0.7.tgz#067914ee1d1196b20d136c2eb55db6fd217833b4" 7305 - integrity sha512-gXIcIZf+ENKP7E41bKflfXmPi+AIfjXW/oU+m8NbP3DQasqHaZa0z5758qvnbO8L1lRJb/MzLOkIY8Bx/0cWEA== 7306 - dependencies: 7307 - "@stdlib/cli-ctor" "^0.0.x" 7308 - "@stdlib/fs-read-file" "^0.0.x" 7309 - "@stdlib/os-byte-order" "^0.0.x" 7310 - "@stdlib/utils-library-manifest" "^0.0.x" 7311 - 7312 - "@stdlib/process-cwd@^0.0.x": 7313 - version "0.0.8" 7314 - resolved "https://registry.yarnpkg.com/@stdlib/process-cwd/-/process-cwd-0.0.8.tgz#5eef63fb75ffb5fc819659d2f450fa3ee2aa10bf" 7315 - integrity sha512-GHINpJgSlKEo9ODDWTHp0/Zc/9C/qL92h5Mc0QlIFBXAoUjy6xT4FB2U16wCNZMG3eVOzt5+SjmCwvGH0Wbg3Q== 7316 - dependencies: 7317 - "@stdlib/cli-ctor" "^0.0.x" 7318 - "@stdlib/fs-read-file" "^0.0.x" 7319 - 7320 - "@stdlib/process-read-stdin@^0.0.x": 7321 - version "0.0.7" 7322 - resolved "https://registry.yarnpkg.com/@stdlib/process-read-stdin/-/process-read-stdin-0.0.7.tgz#684ad531759c6635715a67bdd8721fc249baa200" 7323 - integrity sha512-nep9QZ5iDGrRtrZM2+pYAvyCiYG4HfO0/9+19BiLJepjgYq4GKeumPAQo22+1xawYDL7Zu62uWzYszaVZcXuyw== 7324 - dependencies: 7325 - "@stdlib/assert-is-function" "^0.0.x" 7326 - "@stdlib/assert-is-string" "^0.0.x" 7327 - "@stdlib/buffer-ctor" "^0.0.x" 7328 - "@stdlib/buffer-from-string" "^0.0.x" 7329 - "@stdlib/streams-node-stdin" "^0.0.x" 7330 - "@stdlib/utils-next-tick" "^0.0.x" 7331 - 7332 - "@stdlib/regexp-eol@^0.0.x": 7333 - version "0.0.7" 7334 - resolved "https://registry.yarnpkg.com/@stdlib/regexp-eol/-/regexp-eol-0.0.7.tgz#cf1667fdb5da1049c2c2f8d5c47dcbaede8650a4" 7335 - integrity sha512-BTMpRWrmlnf1XCdTxOrb8o6caO2lmu/c80XSyhYCi1DoizVIZnqxOaN5yUJNCr50g28vQ47PpsT3Yo7J3SdlRA== 7336 - dependencies: 7337 - "@stdlib/assert-has-own-property" "^0.0.x" 7338 - "@stdlib/assert-is-boolean" "^0.0.x" 7339 - "@stdlib/assert-is-plain-object" "^0.0.x" 7340 - "@stdlib/assert-is-string" "^0.0.x" 7341 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 7342 - 7343 - "@stdlib/regexp-extended-length-path@^0.0.x": 7344 - version "0.0.7" 7345 - resolved "https://registry.yarnpkg.com/@stdlib/regexp-extended-length-path/-/regexp-extended-length-path-0.0.7.tgz#7f76641c29895771e6249930e1863e7e137a62e0" 7346 - integrity sha512-z6uqzMWq3WPDKbl4MIZJoNA5ZsYLQI9G3j2TIvhU8X2hnhlku8p4mvK9F+QmoVvgPxKliwNnx/DAl7ltutSDKw== 7347 - dependencies: 7348 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 7349 - 7350 - "@stdlib/regexp-function-name@^0.0.x": 7351 - version "0.0.7" 7352 - resolved "https://registry.yarnpkg.com/@stdlib/regexp-function-name/-/regexp-function-name-0.0.7.tgz#e8dc6c7fe9276f0a8b4bc7f630a9e32ba9f37250" 7353 - integrity sha512-MaiyFUUqkAUpUoz/9F6AMBuMQQfA9ssQfK16PugehLQh4ZtOXV1LhdY8e5Md7SuYl9IrvFVg1gSAVDysrv5ZMg== 7354 - dependencies: 7355 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 7356 - 7357 - "@stdlib/regexp-regexp@^0.0.x": 7358 - version "0.0.8" 7359 - resolved "https://registry.yarnpkg.com/@stdlib/regexp-regexp/-/regexp-regexp-0.0.8.tgz#50221b52088cd427ef19fae6593977c1c3f77e87" 7360 - integrity sha512-S5PZICPd/XRcn1dncVojxIDzJsHtEleuJHHD7ji3o981uPHR7zI2Iy9a1eV2u7+ABeUswbI1Yuix6fXJfcwV1w== 7361 - dependencies: 7362 - "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" 7363 - 7364 - "@stdlib/streams-node-stdin@^0.0.x": 7365 - version "0.0.7" 7366 - resolved "https://registry.yarnpkg.com/@stdlib/streams-node-stdin/-/streams-node-stdin-0.0.7.tgz#65ff09a2140999702a1ad885e6505334d947428f" 7367 - integrity sha512-gg4lgrjuoG3V/L29wNs32uADMCqepIcmoOFHJCTAhVe0GtHDLybUVnLljaPfdvmpPZmTvmusPQtIcscbyWvAyg== 7368 - 7369 - "@stdlib/string-base-format-interpolate@^0.0.x": 7370 - version "0.0.4" 7371 - resolved "https://registry.yarnpkg.com/@stdlib/string-base-format-interpolate/-/string-base-format-interpolate-0.0.4.tgz#297eeb23c76f745dcbb3d9dbd24e316773944538" 7372 - integrity sha512-8FC8+/ey+P5hf1B50oXpXzRzoAgKI1rikpyKZ98Xmjd5rcbSq3NWYi8TqOF8mUHm9hVZ2CXWoNCtEe2wvMQPMg== 7373 - 7374 - "@stdlib/string-base-format-tokenize@^0.0.x": 7375 - version "0.0.4" 7376 - resolved "https://registry.yarnpkg.com/@stdlib/string-base-format-tokenize/-/string-base-format-tokenize-0.0.4.tgz#c1fc612ee0c0de5516dbf083e88c11d14748c30e" 7377 - integrity sha512-+vMIkheqAhDeT/iF5hIQo95IMkt5IzC68eR3CxW1fhc48NMkKFE2UfN73ET8fmLuOanLo/5pO2E90c2G7PExow== 7378 - 7379 - "@stdlib/string-format@^0.0.x": 7380 - version "0.0.3" 7381 - resolved "https://registry.yarnpkg.com/@stdlib/string-format/-/string-format-0.0.3.tgz#e916a7be14d83c83716f5d30b1b1af94c4e105b9" 7382 - integrity sha512-1jiElUQXlI/tTkgRuzJi9jUz/EjrO9kzS8VWHD3g7gdc3ZpxlA5G9JrIiPXGw/qmZTi0H1pXl6KmX+xWQEQJAg== 7383 - dependencies: 7384 - "@stdlib/string-base-format-interpolate" "^0.0.x" 7385 - "@stdlib/string-base-format-tokenize" "^0.0.x" 7386 - 7387 - "@stdlib/string-lowercase@^0.0.x": 7388 - version "0.0.9" 7389 - resolved "https://registry.yarnpkg.com/@stdlib/string-lowercase/-/string-lowercase-0.0.9.tgz#487361a10364bd0d9b5ee44f5cc654c7da79b66d" 7390 - integrity sha512-tXFFjbhIlDak4jbQyV1DhYiSTO8b1ozS2g/LELnsKUjIXECDKxGFyWYcz10KuyAWmFotHnCJdIm8/blm2CfDIA== 7391 - dependencies: 7392 - "@stdlib/assert-is-string" "^0.0.x" 7393 - "@stdlib/cli-ctor" "^0.0.x" 7394 - "@stdlib/fs-read-file" "^0.0.x" 7395 - "@stdlib/process-read-stdin" "^0.0.x" 7396 - "@stdlib/streams-node-stdin" "^0.0.x" 7397 - "@stdlib/string-format" "^0.0.x" 7398 - 7399 - "@stdlib/string-replace@^0.0.x": 7400 - version "0.0.11" 7401 - resolved "https://registry.yarnpkg.com/@stdlib/string-replace/-/string-replace-0.0.11.tgz#5e8790cdf4d9805ab78cc5798ab3d364dfbf5016" 7402 - integrity sha512-F0MY4f9mRE5MSKpAUfL4HLbJMCbG6iUTtHAWnNeAXIvUX1XYIw/eItkA58R9kNvnr1l5B08bavnjrgTJGIKFFQ== 7403 - dependencies: 7404 - "@stdlib/assert-is-function" "^0.0.x" 7405 - "@stdlib/assert-is-regexp" "^0.0.x" 7406 - "@stdlib/assert-is-regexp-string" "^0.0.x" 7407 - "@stdlib/assert-is-string" "^0.0.x" 7408 - "@stdlib/cli-ctor" "^0.0.x" 7409 - "@stdlib/fs-read-file" "^0.0.x" 7410 - "@stdlib/process-read-stdin" "^0.0.x" 7411 - "@stdlib/regexp-eol" "^0.0.x" 7412 - "@stdlib/streams-node-stdin" "^0.0.x" 7413 - "@stdlib/string-format" "^0.0.x" 7414 - "@stdlib/utils-escape-regexp-string" "^0.0.x" 7415 - "@stdlib/utils-regexp-from-string" "^0.0.x" 7416 - 7417 - "@stdlib/types@^0.0.x": 7418 - version "0.0.14" 7419 - resolved "https://registry.yarnpkg.com/@stdlib/types/-/types-0.0.14.tgz#02d3aab7a9bfaeb86e34ab749772ea22f7b2f7e0" 7420 - integrity sha512-AP3EI9/il/xkwUazcoY+SbjtxHRrheXgSbWZdEGD+rWpEgj6n2i63hp6hTOpAB5NipE0tJwinQlDGOuQ1lCaCw== 7421 - 7422 - "@stdlib/utils-constructor-name@^0.0.x": 7423 - version "0.0.8" 7424 - resolved "https://registry.yarnpkg.com/@stdlib/utils-constructor-name/-/utils-constructor-name-0.0.8.tgz#ef63d17466c555b58b348a0c1175cee6044b8848" 7425 - integrity sha512-GXpyNZwjN8u3tyYjL2GgGfrsxwvfogUC3gg7L7NRZ1i86B6xmgfnJUYHYOUnSfB+R531ET7NUZlK52GxL7P82Q== 7426 - dependencies: 7427 - "@stdlib/assert-is-buffer" "^0.0.x" 7428 - "@stdlib/regexp-function-name" "^0.0.x" 7429 - "@stdlib/utils-native-class" "^0.0.x" 7430 - 7431 - "@stdlib/utils-convert-path@^0.0.x": 7432 - version "0.0.8" 7433 - resolved "https://registry.yarnpkg.com/@stdlib/utils-convert-path/-/utils-convert-path-0.0.8.tgz#a959d02103eee462777d222584e72eceef8c223b" 7434 - integrity sha512-GNd8uIswrcJCctljMbmjtE4P4oOjhoUIfMvdkqfSrRLRY+ZqPB2xM+yI0MQFfUq/0Rnk/xtESlGSVLz9ZDtXfA== 7435 - dependencies: 7436 - "@stdlib/assert-is-string" "^0.0.x" 7437 - "@stdlib/cli-ctor" "^0.0.x" 7438 - "@stdlib/fs-read-file" "^0.0.x" 7439 - "@stdlib/process-read-stdin" "^0.0.x" 7440 - "@stdlib/regexp-eol" "^0.0.x" 7441 - "@stdlib/regexp-extended-length-path" "^0.0.x" 7442 - "@stdlib/streams-node-stdin" "^0.0.x" 7443 - "@stdlib/string-lowercase" "^0.0.x" 7444 - "@stdlib/string-replace" "^0.0.x" 7445 - 7446 - "@stdlib/utils-define-nonenumerable-read-only-property@^0.0.x": 7447 - version "0.0.7" 7448 - resolved "https://registry.yarnpkg.com/@stdlib/utils-define-nonenumerable-read-only-property/-/utils-define-nonenumerable-read-only-property-0.0.7.tgz#ee74540c07bfc3d997ef6f8a1b2df267ea0c07ca" 7449 - integrity sha512-c7dnHDYuS4Xn3XBRWIQBPcROTtP/4lkcFyq0FrQzjXUjimfMgHF7cuFIIob6qUTnU8SOzY9p0ydRR2QJreWE6g== 7450 - dependencies: 7451 - "@stdlib/types" "^0.0.x" 7452 - "@stdlib/utils-define-property" "^0.0.x" 7453 - 7454 - "@stdlib/utils-define-property@^0.0.x": 7455 - version "0.0.9" 7456 - resolved "https://registry.yarnpkg.com/@stdlib/utils-define-property/-/utils-define-property-0.0.9.tgz#2f40ad66e28099714e3774f3585db80b13816e76" 7457 - integrity sha512-pIzVvHJvVfU/Lt45WwUAcodlvSPDDSD4pIPc9WmIYi4vnEBA9U7yHtiNz2aTvfGmBMTaLYTVVFIXwkFp+QotMA== 7458 - dependencies: 7459 - "@stdlib/types" "^0.0.x" 7460 - 7461 - "@stdlib/utils-escape-regexp-string@^0.0.x": 7462 - version "0.0.9" 7463 - resolved "https://registry.yarnpkg.com/@stdlib/utils-escape-regexp-string/-/utils-escape-regexp-string-0.0.9.tgz#36f25d78b2899384ca6c97f4064a8b48edfedb6e" 7464 - integrity sha512-E+9+UDzf2mlMLgb+zYrrPy2FpzbXh189dzBJY6OG+XZqEJAXcjWs7DURO5oGffkG39EG5KXeaQwDXUavcMDCIw== 7465 - dependencies: 7466 - "@stdlib/assert-is-string" "^0.0.x" 7467 - "@stdlib/string-format" "^0.0.x" 7468 - 7469 - "@stdlib/utils-get-prototype-of@^0.0.x": 7470 - version "0.0.7" 7471 - resolved "https://registry.yarnpkg.com/@stdlib/utils-get-prototype-of/-/utils-get-prototype-of-0.0.7.tgz#f677132bcbc0ec89373376637148d364435918df" 7472 - integrity sha512-fCUk9lrBO2ELrq+/OPJws1/hquI4FtwG0SzVRH6UJmJfwb1zoEFnjcwyDAy+HWNVmo3xeRLsrz6XjHrJwer9pg== 7473 - dependencies: 7474 - "@stdlib/assert-is-function" "^0.0.x" 7475 - "@stdlib/utils-native-class" "^0.0.x" 7476 - 7477 - "@stdlib/utils-global@^0.0.x": 7478 - version "0.0.7" 7479 - resolved "https://registry.yarnpkg.com/@stdlib/utils-global/-/utils-global-0.0.7.tgz#0d99dcd11b72ad10b97dfb43536ff50436db6fb4" 7480 - integrity sha512-BBNYBdDUz1X8Lhfw9nnnXczMv9GztzGpQ88J/6hnY7PHJ71av5d41YlijWeM9dhvWjnH9I7HNE3LL7R07yw0kA== 7481 - dependencies: 7482 - "@stdlib/assert-is-boolean" "^0.0.x" 7483 - 7484 - "@stdlib/utils-library-manifest@^0.0.8", "@stdlib/utils-library-manifest@^0.0.x": 7485 - version "0.0.8" 7486 - resolved "https://registry.yarnpkg.com/@stdlib/utils-library-manifest/-/utils-library-manifest-0.0.8.tgz#61d3ed283e82c8f14b7f952d82cfb8e47d036825" 7487 - integrity sha512-IOQSp8skSRQn9wOyMRUX9Hi0j/P5v5TvD8DJWTqtE8Lhr8kVVluMBjHfvheoeKHxfWAbNHSVpkpFY/Bdh/SHgQ== 7488 - dependencies: 7489 - "@stdlib/cli-ctor" "^0.0.x" 7490 - "@stdlib/fs-resolve-parent-path" "^0.0.x" 7491 - "@stdlib/utils-convert-path" "^0.0.x" 7492 - debug "^2.6.9" 7493 - resolve "^1.1.7" 7494 - 7495 - "@stdlib/utils-native-class@^0.0.x": 7496 - version "0.0.8" 7497 - resolved "https://registry.yarnpkg.com/@stdlib/utils-native-class/-/utils-native-class-0.0.8.tgz#2e79de97f85d88a2bb5baa7a4528add71448d2be" 7498 - integrity sha512-0Zl9me2V9rSrBw/N8o8/9XjmPUy8zEeoMM0sJmH3N6C9StDsYTjXIAMPGzYhMEWaWHvGeYyNteFK2yDOVGtC3w== 7499 - dependencies: 7500 - "@stdlib/assert-has-own-property" "^0.0.x" 7501 - "@stdlib/assert-has-tostringtag-support" "^0.0.x" 7502 - 7503 - "@stdlib/utils-next-tick@^0.0.x": 7504 - version "0.0.8" 7505 - resolved "https://registry.yarnpkg.com/@stdlib/utils-next-tick/-/utils-next-tick-0.0.8.tgz#72345745ec3b3aa2cedda056338ed95daae9388c" 7506 - integrity sha512-l+hPl7+CgLPxk/gcWOXRxX/lNyfqcFCqhzzV/ZMvFCYLY/wI9lcWO4xTQNMALY2rp+kiV+qiAiO9zcO+hewwUg== 7507 - 7508 - "@stdlib/utils-noop@^0.0.x": 7509 - version "0.0.14" 7510 - resolved "https://registry.yarnpkg.com/@stdlib/utils-noop/-/utils-noop-0.0.14.tgz#8a2077fae0877c4c9e4c5f72f3c9284ca109d4c3" 7511 - integrity sha512-A5faFEUfszMgd93RCyB+aWb62hQxgP+dZ/l9rIOwNWbIrCYNwSuL4z50lNJuatnwwU4BQ4EjQr+AmBsnvuLcyQ== 7512 - 7513 - "@stdlib/utils-regexp-from-string@^0.0.x": 7514 - version "0.0.9" 7515 - resolved "https://registry.yarnpkg.com/@stdlib/utils-regexp-from-string/-/utils-regexp-from-string-0.0.9.tgz#fe4745a9a000157b365971c513fd7d4b2cb9ad6e" 7516 - integrity sha512-3rN0Mcyiarl7V6dXRjFAUMacRwe0/sYX7ThKYurf0mZkMW9tjTP+ygak9xmL9AL0QQZtbrFFwWBrDO+38Vnavw== 7517 - dependencies: 7518 - "@stdlib/assert-is-string" "^0.0.x" 7519 - "@stdlib/regexp-regexp" "^0.0.x" 7520 - "@stdlib/string-format" "^0.0.x" 7521 - 7522 - "@stdlib/utils-type-of@^0.0.x": 7523 - version "0.0.8" 7524 - resolved "https://registry.yarnpkg.com/@stdlib/utils-type-of/-/utils-type-of-0.0.8.tgz#c62ed3fcf629471fe80d83f44c4e325860109cbe" 7525 - integrity sha512-b4xqdy3AnnB7NdmBBpoiI67X4vIRxvirjg3a8BfhM5jPr2k0njby1jAbG9dUxJvgAV6o32S4kjUgfIdjEYpTNQ== 7526 - dependencies: 7527 - "@stdlib/utils-constructor-name" "^0.0.x" 7528 - "@stdlib/utils-global" "^0.0.x" 7529 - 7530 6561 "@surma/rollup-plugin-off-main-thread@^2.2.3": 7531 6562 version "2.2.3" 7532 6563 resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" ··· 8873 7904 version "0.0.8" 8874 7905 resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" 8875 7906 integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== 8876 - 8877 - ansi-regex@5.0.1, ansi-regex@^5.0.0, ansi-regex@^5.0.1: 8878 - version "5.0.1" 8879 - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 8880 - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 8881 7907 8882 7908 ansi-regex@^4.0.0, ansi-regex@^4.1.0: 8883 7909 version "4.1.1" 8884 7910 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" 8885 7911 integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== 8886 7912 7913 + ansi-regex@^5.0.0, ansi-regex@^5.0.1: 7914 + version "5.0.1" 7915 + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 7916 + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 7917 + 8887 7918 ansi-regex@^6.0.1: 8888 7919 version "6.0.1" 8889 7920 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" ··· 11295 10326 version "16.4.5" 11296 10327 resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" 11297 10328 integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== 11298 - 11299 - dset@^3.1.1, dset@^3.1.2: 11300 - version "3.1.2" 11301 - resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" 11302 - integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== 11303 10329 11304 10330 duplexer@^0.1.2: 11305 10331 version "0.1.2" ··· 15508 14534 resolved "https://registry.yarnpkg.com/jose/-/jose-5.6.3.tgz#415688bc84875461c86dfe271ea6029112a23e27" 15509 14535 integrity sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g== 15510 14536 15511 - js-base64@^3.7.2: 15512 - version "3.7.5" 15513 - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.5.tgz#21e24cf6b886f76d6f5f165bfcd69cc55b9e3fca" 15514 - integrity sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA== 15515 - 15516 - js-cookie@3.0.1: 15517 - version "3.0.1" 15518 - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414" 15519 - integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw== 15520 - 15521 14537 js-sha256@^0.10.1: 15522 14538 version "0.10.1" 15523 14539 resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.10.1.tgz#b40104ba1368e823fdd5f41b66b104b15a0da60d" ··· 16864 15880 resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz#d2cc9fc5235ddb371fc44d506234339c8e4b0a4b" 16865 15881 integrity sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A== 16866 15882 16867 - new-date@^1.0.3: 16868 - version "1.0.3" 16869 - resolved "https://registry.yarnpkg.com/new-date/-/new-date-1.0.3.tgz#a5956086d3f5ed43d0b210d87a10219ccb7a2326" 16870 - integrity sha512-0fsVvQPbo2I18DT2zVHpezmeeNYV2JaJSrseiHLc17GNOxJzUdx5mvSigPu8LtIfZSij5i1wXnXFspEs2CD6hA== 16871 - dependencies: 16872 - "@segment/isodate" "1.0.3" 16873 - 16874 15883 nice-try@^1.0.4: 16875 15884 version "1.0.5" 16876 15885 resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" ··· 17056 16065 version "0.80.4" 17057 16066 resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.4.tgz#a2e77e2dbe144c76356c834b994e147e19bb472f" 17058 16067 integrity sha512-Lku8OBpq+fhF1ZdKUjbPnTNeqG+3OL0psGAEVJ8zcUiCB5/DPGR/rm3kLcjKDylzC9Rfv540/7I08+oImzfrhw== 17059 - 17060 - obj-case@0.2.1: 17061 - version "0.2.1" 17062 - resolved "https://registry.yarnpkg.com/obj-case/-/obj-case-0.2.1.tgz#13a554d04e5ca32dfd9d566451fd2b0e11007f1a" 17063 - integrity sha512-PquYBBTy+Y6Ob/O2574XHhDtHJlV1cJHMCgW+rDRc9J5hhmRelJB3k5dTK/3cVmFVtzvAKuENeuLpoyTzMzkOg== 17064 16068 17065 16069 object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 17066 16070 version "4.1.1" ··· 20224 19228 resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 20225 19229 integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 20226 19230 20227 - shell-quote@1.7.3: 20228 - version "1.7.3" 20229 - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" 20230 - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== 20231 - 20232 - shell-quote@1.8.0: 20233 - version "1.8.0" 20234 - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" 20235 - integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== 20236 - 20237 19231 shell-quote@^1.6.1, shell-quote@^1.7.3: 20238 19232 version "1.8.1" 20239 19233 resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" ··· 20439 19433 resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 20440 19434 integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 20441 19435 20442 - spark-md5@^3.0.1: 20443 - version "3.0.2" 20444 - resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.2.tgz#7952c4a30784347abcee73268e473b9c0167e3fc" 20445 - integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw== 20446 - 20447 19436 spdy-transport@^3.0.0: 20448 19437 version "3.0.0" 20449 19438 resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" ··· 20649 19638 resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" 20650 19639 integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== 20651 19640 20652 - "string-width-cjs@npm:string-width@^4.2.0": 20653 - version "4.2.3" 20654 - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 20655 - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 20656 - dependencies: 20657 - emoji-regex "^8.0.0" 20658 - is-fullwidth-code-point "^3.0.0" 20659 - strip-ansi "^6.0.1" 20660 - 20661 - string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 19641 + "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 20662 19642 version "4.2.3" 20663 19643 resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 20664 19644 integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== ··· 20767 19747 is-obj "^1.0.1" 20768 19748 is-regexp "^1.0.0" 20769 19749 20770 - "strip-ansi-cjs@npm:strip-ansi@^6.0.1": 19750 + "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: 20771 19751 version "6.0.1" 20772 19752 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 20773 19753 integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== ··· 20780 19760 integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 20781 19761 dependencies: 20782 19762 ansi-regex "^4.1.0" 20783 - 20784 - strip-ansi@^6.0.0, strip-ansi@^6.0.1: 20785 - version "6.0.1" 20786 - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 20787 - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 20788 - dependencies: 20789 - ansi-regex "^5.0.1" 20790 19763 20791 19764 strip-ansi@^7.0.1: 20792 19765 version "7.1.0" ··· 21259 20232 resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" 21260 20233 integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== 21261 20234 21262 - tiny-hashes@^1.0.1: 21263 - version "1.0.1" 21264 - resolved "https://registry.yarnpkg.com/tiny-hashes/-/tiny-hashes-1.0.1.tgz#ddbe9060312ddb4efe0a174bb3a27e1331c425a1" 21265 - integrity sha512-knIN5zj4fl7kW4EBU5sLP20DWUvi/rVouvJezV0UAym2DkQaqm365Nyc8F3QEiOvunNDMxR8UhcXd1d5g+Wg1g== 21266 - 21267 20235 tippy.js@^6.3.7: 21268 20236 version "6.3.7" 21269 20237 resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" ··· 21425 20393 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 21426 20394 integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 21427 20395 21428 - tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0: 20396 + tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0: 21429 20397 version "2.6.2" 21430 20398 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" 21431 20399 integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== ··· 21626 20594 resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.5.tgz#5829101361b583b53206e81579f4df71c56d6be8" 21627 20595 integrity sha512-LryC15SWzqQsREHIOUybavaIHF5IoL0dJ9aWWxL/PgT1KfqAW5225FZpDUFlt9xiDMS2/S7DOKhFWA7RLksWdg== 21628 20596 21629 - unfetch@^3.1.1: 21630 - version "3.1.2" 21631 - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-3.1.2.tgz#dc271ef77a2800768f7b459673c5604b5101ef77" 21632 - integrity sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw== 21633 - 21634 - unfetch@^4.1.0: 21635 - version "4.2.0" 21636 - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" 21637 - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== 21638 - 21639 20597 unicode-canonical-property-names-ecmascript@^2.0.0: 21640 20598 version "2.0.0" 21641 20599 resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" ··· 21874 20832 version "8.3.2" 21875 20833 resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 21876 20834 integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 21877 - 21878 - uuid@^9.0.0: 21879 - version "9.0.0" 21880 - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" 21881 - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== 21882 20835 21883 20836 v8-compile-cache-lib@^3.0.1: 21884 20837 version "3.0.1" ··· 22523 21476 "@types/trusted-types" "^2.0.2" 22524 21477 workbox-core "6.6.1" 22525 21478 22526 - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 21479 + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: 22527 21480 version "7.0.0" 22528 21481 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 22529 21482 integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== ··· 22536 21489 version "6.2.0" 22537 21490 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 22538 21491 integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 22539 - dependencies: 22540 - ansi-styles "^4.0.0" 22541 - string-width "^4.1.0" 22542 - strip-ansi "^6.0.0" 22543 - 22544 - wrap-ansi@^7.0.0: 22545 - version "7.0.0" 22546 - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 22547 - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 22548 21492 dependencies: 22549 21493 ansi-styles "^4.0.0" 22550 21494 string-width "^4.1.0"