import { version as vueVersion } from 'vue' import { toIntegrations, toMajorVersionIntegration } from '@datadog/browser-core' import type { RumPlugin, RumPublicApi, StartRumResult } from '@datadog/browser-rum-core' let globalPublicApi: RumPublicApi | undefined let globalConfiguration: VuePluginConfiguration | undefined let globalAddError: StartRumResult['addError'] | undefined type InitSubscriber = (configuration: VuePluginConfiguration, rumPublicApi: RumPublicApi) => void type StartSubscriber = (addError: StartRumResult['addError']) => void const onRumInitSubscribers: InitSubscriber[] = [] const onRumStartSubscribers: StartSubscriber[] = [] export interface VuePluginConfiguration { router?: boolean } export type VuePlugin = Required export function vuePlugin(configuration: VuePluginConfiguration = {}): VuePlugin { return { name: 'vue', onInit({ publicApi, initConfiguration }) { globalPublicApi = publicApi globalConfiguration = configuration for (const subscriber of onRumInitSubscribers) { subscriber(globalConfiguration, globalPublicApi) } if (configuration.router) { initConfiguration.trackViewsManually = true } }, onRumStart({ addError }) { globalAddError = addError if (addError) { for (const subscriber of onRumStartSubscribers) { subscriber(addError) } } }, getConfigurationTelemetry() { const vueIntegration = toMajorVersionIntegration('vue', vueVersion) return { router: !!configuration.router, integrations: toIntegrations(vueIntegration, configuration.router && 'vue-router'), } }, } satisfies RumPlugin } export function onRumInit(callback: InitSubscriber) { if (globalConfiguration && globalPublicApi) { callback(globalConfiguration, globalPublicApi) } else { onRumInitSubscribers.push(callback) } } export function onRumStart(callback: StartSubscriber) { if (globalAddError) { callback(globalAddError) } else { onRumStartSubscribers.push(callback) } } export function resetVuePlugin() { globalPublicApi = undefined globalConfiguration = undefined globalAddError = undefined onRumInitSubscribers.length = 0 onRumStartSubscribers.length = 0 }