UNPKG

@jaseeey/vue-umami-plugin

Version:

A plugin designed for Vue 3 which enables the use of Umami Analytics

71 lines (70 loc) 2.47 kB
const queuedEvents = []; export function VueUmamiPlugin(options) { return { install: () => { if (window.location.hostname.includes('localhost') && !options.allowLocalhost) { console.warn('Umami plugin not installed due to being on localhost.'); return; } const { scriptSrc = 'https://us.umami.is/script.js', websiteID, router } = options; if (!websiteID) { return console.warn('Website ID not provided for Umami plugin, skipping.'); } if (router) { attachUmamiToRouter(router); } onDocumentReady(() => initUmamiScript(scriptSrc, websiteID)); } }; } function attachUmamiToRouter(router) { router.afterEach((to) => trackUmamiPageView({ url: to.fullPath })); } function onDocumentReady(callback) { document.readyState !== 'loading' ? callback() : document.addEventListener('DOMContentLoaded', callback); } function initUmamiScript(scriptSrc, websiteID) { const script = document.createElement('script'); script.defer = true; script.src = scriptSrc; script.onload = () => { console.log('Umami plugin loaded'); processQueuedEvents(); }; script.setAttribute('data-website-id', websiteID); script.setAttribute('data-auto-track', 'false'); document.head.appendChild(script); } function processQueuedEvents() { while (queuedEvents.length) { const item = queuedEvents.shift(); if (!item) { continue; } typeof item === 'function' ? window.umami.track(item) : item.type === 'identify' ? window.umami.identify(item.args[0]) : window.umami.track(item.type, item.args[0]); } } export function trackUmamiPageView(options) { const trackPageViewOptionsFn = (props) => { return { ...props, ...options }; }; window.umami ? window.umami.track(trackPageViewOptionsFn) : queuedEvents.push(trackPageViewOptionsFn); } export function trackUmamiEvent(event, eventParams) { window.umami ? window.umami.track(event, eventParams) : queuedEvents.push({ type: event, args: [eventParams] }); } export function identifyUmamiSession(sessionData) { window.umami ? window.umami.identify(sessionData) : queuedEvents.push({ type: 'identify', args: [sessionData] }); }