Files
speckle-server/packages/frontend-2/plugins/mp.ts
T
Kristaps Fabians Geikins 83d8035dc2 chore: upgrade to eslint 9 (#2348)
* root + server

* frontend

* frontend-2

* dui3

* dui3

* tailwind theme

* ui-components

* preview service

* viewer

* viewer-sandbox

* fileimport-service

* webhook service

* objectloader

* shared

* ui-components-nuxt

* WIP full config

* WIP full linter

* eslint projectwide util

* minor fix

* removing redundant ci

* clean up test errors

* fixed prettier formatting

* CI improvements

* TSC lint fix

* 'buildBatch' needs to be async since some batch types (like Text) require it. Removed a disabled liniting rule from ObjLoader

* removed unnecessary void

---------

Co-authored-by: AlexandruPopovici <alexandrupopoviciioan@gmail.com>
2024-06-12 14:38:02 +03:00

84 lines
2.0 KiB
TypeScript

/* eslint-disable camelcase */
import { LogicError } from '@speckle/ui-components'
import type { OverridedMixpanel } from 'mixpanel-browser'
import type { Merge } from 'type-fest'
/**
* mixpanel-browser only supports being ran on the client-side (hence the name)! So it's only going to be accessible
* in client-side execution branches
*/
type LimitedMixpanel = Merge<
Pick<
OverridedMixpanel,
'track' | 'init' | 'reset' | 'register' | 'identify' | 'people' | 'add_group'
>,
{
people: Pick<OverridedMixpanel['people'], 'set' | 'set_once'>
}
>
const fakeLimitedMixpanel = (): LimitedMixpanel => ({
init: noop as LimitedMixpanel['init'],
track: noop,
reset: noop,
register: noop,
identify: noop,
people: {
set: noop,
set_once: noop
},
add_group: noop
})
export default defineNuxtPlugin(async () => {
const {
public: { mixpanelApiHost, mixpanelTokenId, logCsrEmitProps }
} = useRuntimeConfig()
const logger = useLogger()
let mixpanel: LimitedMixpanel | undefined = undefined
try {
mixpanel = import.meta.client
? (await import('mixpanel-browser')).default
: undefined
if (import.meta.server) {
mixpanel = {
...fakeLimitedMixpanel(),
track: () => {
throw new Error('mixpanel is not available on the server-side')
},
identify: () => {
throw new Error('mixpanel is not available on the server-side')
},
register: () => {
throw new Error('mixpanel is not available on the server-side')
}
}
}
} catch (e) {
logger.warn(e, 'Failed to load mixpanel')
}
if (!mixpanel) {
// Implement mocked version
mixpanel = fakeLimitedMixpanel()
}
// Init
mixpanel.init(mixpanelTokenId, {
api_host: mixpanelApiHost,
debug: !!import.meta.dev && logCsrEmitProps
})
return {
provide: {
mixpanel: () => {
if (!mixpanel) throw new LogicError('Mixpanel unexpectedly not defined')
return mixpanel
}
}
}
})