v-plausible
Version:
Plausible Analytics plugin for Vue or Nuxt
57 lines (56 loc) • 1.75 kB
JavaScript
import defu from "defu";
import Plausible from "plausible-tracker";
import { inject } from "vue";
function loadScript(source, options = {}) {
return new Promise((resolve, reject) => {
const head = document.head || document.getElementsByTagName("head")[0];
const script = document.createElement("script");
const {
src,
type = options.partytown ? "text/partytown" : "text/javascript",
defer = false,
async = false,
...restAttrs
} = options;
script.type = type;
script.defer = defer;
script.async = async;
script.src = src || source;
script.setAttribute("data-domain", options["data-domain"]);
Object.keys(restAttrs).forEach((key) => {
script[key] = restAttrs[key];
});
head.appendChild(script);
script.onload = resolve;
script.onerror = reject;
});
}
export function createPlausible(options) {
const plausible = {
install(app) {
const data = defu(options.init, {
apiHost: "https://plausible.io",
enableAutoPageviews: true
});
const plausible2 = Plausible(data);
if (options.settings.enableAutoPageviews === true)
plausible2.enableAutoPageviews();
if (options.settings.enableAutoOutboundTracking === true)
plausible2.enableAutoOutboundTracking();
loadScript(`${data.apiHost}/js/script.js`, {
"defer": true,
"data-domain": data.domain || "https://plausible.io",
"partytown": options.partytown || false
});
app.config.globalProperties.$plausible = plausible2;
app.provide("$plausible", plausible2);
}
};
return plausible;
}
export function usePlausible() {
const plausible = inject("$plausible");
return {
...plausible
};
}