···11import {init} from '@bitdrift/react-native'
22import {Statsig} from 'statsig-react-native-expo'
33+export {debug, error, info, warn} from '@bitdrift/react-native'
3445import {initPromise} from './statsig/statsig'
56
+4
src/lib/bitdrift.web.ts
···11+export function debug() {}
22+export function error() {}
33+export function info() {}
44+export function warn() {}
+23-3
src/lib/statsig/statsig.tsx
···55import {Statsig, StatsigProvider} from 'statsig-react-native-expo'
6677import {BUNDLE_DATE, BUNDLE_IDENTIFIER, IS_TESTFLIGHT} from '#/lib/app-info'
88+import * as bitdrift from '#/lib/bitdrift'
89import {logger} from '#/logger'
910import {isWeb} from '#/platform/detection'
1011import * as persisted from '#/state/persisted'
···9798 rawMetadata: LogEvents[E] & FlatJSONRecord,
9899) {
99100 try {
100100- const fullMetadata = {
101101- ...rawMetadata,
102102- } as Record<string, string> // Statsig typings are unnecessarily strict here.
101101+ const fullMetadata = toStringRecord(rawMetadata)
103102 fullMetadata.routeName = getCurrentRouteName() ?? '(Uninitialized)'
104103 if (Statsig.initializeCalled()) {
105104 Statsig.logEvent(eventName, null, fullMetadata)
106105 }
106106+ // Intentionally bypass the logger abstraction to log rich objects.
107107+ console.groupCollapsed(eventName)
108108+ console.log(fullMetadata)
109109+ console.groupEnd()
110110+ bitdrift.info(eventName, fullMetadata)
107111 } catch (e) {
108112 // A log should never interrupt the calling code, whatever happens.
109113 logger.error('Failed to log an event', {message: e})
110114 }
115115+}
116116+117117+function toStringRecord<E extends keyof LogEvents>(
118118+ metadata: LogEvents[E] & FlatJSONRecord,
119119+): Record<string, string> {
120120+ const record: Record<string, string> = {}
121121+ for (let key in metadata) {
122122+ if (metadata.hasOwnProperty(key)) {
123123+ if (typeof metadata[key] === 'string') {
124124+ record[key] = metadata[key]
125125+ } else {
126126+ record[key] = JSON.stringify(metadata[key])
127127+ }
128128+ }
129129+ }
130130+ return record
111131}
112132113133// We roll our own cache in front of Statsig because it is a singleton
+2-3
src/logger/bitdriftTransport.ts
···33 error as bdError,
44 info as bdInfo,
55 warn as bdWarn,
66-} from '@bitdrift/react-native'
77-66+} from '../lib/bitdrift'
87import {LogLevel, Transport} from './types'
98109export function createBitdriftTransport(): Transport {
···18171918 return (level, message) => {
2019 const log = logFunctions[level]
2121- log(message.toString())
2020+ log('' + message)
2221 }
2322}
-7
src/logger/bitdriftTransport.web.ts
···11-import {Transport} from './index'
22-33-export function createBitdriftTransport(): Transport {
44- return (_level, _message) => {
55- // noop
66- }
77-}