UNPKG

@nuxt/scripts

Version:

Load third-party scripts with better performance, privacy and DX in Nuxt Apps.

89 lines (88 loc) 3.81 kB
import { useRegistryScript } from "../utils.js"; import { any, array, boolean, literal, object, optional, record, string, union } from "#nuxt-scripts-validator"; import { logger } from "../logger.js"; const extensions = [ literal("hash"), literal("outbound-links"), literal("file-downloads"), literal("tagged-events"), literal("revenue"), literal("pageview-props"), literal("compat"), literal("local"), literal("manual") ]; const PlausibleAnalyticsOptionsSchema = object({ // New October 2025: unique script ID per site (replaces domain) scriptId: optional(string()), // Legacy: domain-based approach (deprecated) domain: optional(string()), // Legacy extension support (deprecated) extension: optional(union([union(extensions), array(union(extensions))])), // New October 2025 init options customProperties: optional(record(string(), any())), endpoint: optional(string()), fileDownloads: optional(object({ fileExtensions: optional(array(string())) })), hashBasedRouting: optional(boolean()), autoCapturePageviews: optional(boolean()), captureOnLocalhost: optional(boolean()), trackForms: optional(boolean()) }); export function useScriptPlausibleAnalytics(_options) { return useRegistryScript("plausibleAnalytics", (options) => { const useNewScript = !!options?.scriptId; const useLegacyScript = !!options?.extension; if (import.meta.dev) { if (!useNewScript && !options?.domain) { logger.warn("Plausible Analytics: No `scriptId` or `domain` provided. Please provide either `scriptId` or `domain` (legacy)."); } if (useNewScript && options?.domain) { logger.warn("Plausible Analytics: You are using both `scriptId` (new format) and `domain` (deprecated). Please use only `scriptId` for the new format."); } if (useNewScript && useLegacyScript) { logger.warn("Plausible Analytics: You are using both `scriptId` (new format) and `extension` (deprecated). Please use `scriptId` with init options like `hashBasedRouting`, `captureOnLocalhost`, etc. instead."); } } let scriptSrc; if (useNewScript) { scriptSrc = `https://plausible.io/js/pa-${options.scriptId}.js`; } else if (useLegacyScript) { const extensions2 = Array.isArray(options.extension) ? options.extension.join(".") : [options.extension]; scriptSrc = `https://plausible.io/js/script.${extensions2}.js`; } else { scriptSrc = "https://plausible.io/js/script.js"; } const initOptions = {}; if (options?.customProperties) initOptions.customProperties = options.customProperties; if (options?.endpoint) initOptions.endpoint = options.endpoint; if (options?.fileDownloads) initOptions.fileDownloads = options.fileDownloads; if (options?.hashBasedRouting !== void 0) initOptions.hashBasedRouting = options.hashBasedRouting; if (options?.autoCapturePageviews !== void 0) initOptions.autoCapturePageviews = options.autoCapturePageviews; if (options?.captureOnLocalhost !== void 0) initOptions.captureOnLocalhost = options.captureOnLocalhost; const scriptInput = !useNewScript && options?.domain ? { "src": scriptSrc, "data-domain": options.domain } : { src: scriptSrc }; return { scriptInput, schema: import.meta.dev ? PlausibleAnalyticsOptionsSchema : void 0, scriptOptions: { use() { return { plausible: window.plausible }; }, clientInit() { window.plausible = window.plausible || function() { (plausible.q = plausible.q || []).push(arguments); }, plausible.init = plausible.init || function(i) { plausible.o = i || {}; }; window.plausible.init(initOptions); } } }; }, _options); }