qwik-umami 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -85,7 +85,7 @@ export const useCheckout = routeAction$(async (data) => {
85
85
 
86
86
  ### `<UmamiScript>`
87
87
 
88
- Component that loads the Umami tracking script. Uses `useTask$` with `isServer` guard to preserve Qwik's resumability model. Loads via `requestIdleCallback` by default to avoid blocking the main thread.
88
+ Component that loads the Umami tracking script. Uses `useVisibleTask$` for guaranteed one-shot client initialization. Loads via `requestIdleCallback` by default (`strategy: 'idle'`) to avoid blocking the main thread.
89
89
 
90
90
  | Prop | Type | Default | Description |
91
91
  | --- | --- | --- | --- |
@@ -299,7 +299,7 @@ export const onRequest = createUmamiPlugin({
299
299
 
300
300
  ## How it works
301
301
 
302
- 1. `<UmamiScript>` uses Qwik's `useTask$` with an `isServer` guard — preserves resumability (no eager JS download)
302
+ 1. `<UmamiScript>` uses Qwik's `useVisibleTask$` for guaranteed one-shot client initialization
303
303
  2. By default, the script loads via `requestIdleCallback` to avoid blocking the main thread
304
304
  3. If the script fails to load (blocked by ad blocker, network error), it fails silently and cleans up
305
305
  4. `umamiTrack()` and `umamiIdentify()` check for `window.umami` before calling — safe everywhere
@@ -1,10 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const qwik = require("@builder.io/qwik");
4
- const build = require("@builder.io/qwik/build");
5
4
  const UmamiScript = qwik.component$(({ websiteId, src = "https://cloud.umami.is/script.js", hostUrl, autoTrack = true, domains, tag, excludeSearch, excludeHash, doNotTrack, strategy = "idle" }) => {
6
- qwik.useTask$(({ cleanup }) => {
7
- if (build.isServer) return;
5
+ qwik.useVisibleTask$(({ cleanup }) => {
8
6
  if (document.querySelector(`script[data-website-id="${websiteId}"]`)) {
9
7
  return;
10
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.qwik.cjs","sources":["../src/components/umami-script.tsx","../src/utils/track.ts"],"sourcesContent":["import { component$, useTask$ } from '@builder.io/qwik';\nimport { isServer } from '@builder.io/qwik/build';\nimport type { UmamiConfig } from '../types';\n\nexport const UmamiScript = component$<UmamiConfig>(\n ({\n websiteId,\n src = 'https://cloud.umami.is/script.js',\n hostUrl,\n autoTrack = true,\n domains,\n tag,\n excludeSearch,\n excludeHash,\n doNotTrack,\n strategy = 'idle',\n }) => {\n useTask$(({ cleanup }) => {\n if (isServer) return;\n\n if (document.querySelector(`script[data-website-id=\"${websiteId}\"]`)) {\n return;\n }\n\n let script: HTMLScriptElement | null = null;\n\n const loadScript = () => {\n script = document.createElement('script');\n script.defer = true;\n script.src = src;\n script.setAttribute('data-website-id', websiteId);\n\n if (hostUrl) {\n script.setAttribute('data-host-url', hostUrl);\n }\n\n if (!autoTrack) {\n script.setAttribute('data-auto-track', 'false');\n }\n\n if (domains) {\n script.setAttribute('data-domains', domains);\n }\n\n if (tag) {\n script.setAttribute('data-tag', tag);\n }\n\n if (excludeSearch) {\n script.setAttribute('data-exclude-search', 'true');\n }\n\n if (excludeHash) {\n script.setAttribute('data-exclude-hash', 'true');\n }\n\n if (doNotTrack) {\n script.setAttribute('data-do-not-track', 'true');\n }\n\n script.onerror = () => {\n if (import.meta.env.DEV) {\n console.warn('[qwik-umami] Failed to load script');\n }\n script?.remove();\n script = null;\n };\n\n if (import.meta.env.DEV) {\n script.onload = () => {\n console.log('[qwik-umami] Script loaded successfully');\n };\n }\n\n document.head.appendChild(script);\n };\n\n if (strategy === 'eager') {\n loadScript();\n } else {\n if ('requestIdleCallback' in window) {\n const id = window.requestIdleCallback(loadScript);\n cleanup(() => {\n window.cancelIdleCallback(id);\n script?.remove();\n });\n return;\n }\n const timeoutId = setTimeout(loadScript, 0);\n cleanup(() => {\n clearTimeout(timeoutId);\n script?.remove();\n });\n return;\n }\n\n cleanup(() => {\n script?.remove();\n });\n });\n\n return null;\n },\n);\n","import type { UmamiEventData, UmamiPayload } from '../types';\r\n\r\nexport function umamiTrack(): void;\r\nexport function umamiTrack(payload: UmamiPayload): void;\r\nexport function umamiTrack(eventName: string): void;\r\nexport function umamiTrack(eventName: string, data: UmamiEventData): void;\r\nexport function umamiTrack(\r\n eventNameOrPayload?: string | UmamiPayload,\r\n data?: UmamiEventData,\r\n): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n if (window.umami?.track) {\r\n if (eventNameOrPayload === undefined) {\r\n window.umami.track();\r\n } else if (typeof eventNameOrPayload === 'string') {\r\n window.umami.track(eventNameOrPayload, data!);\r\n } else {\r\n window.umami.track(eventNameOrPayload);\r\n }\r\n } else if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Tracking unavailable');\r\n }\r\n } catch (error) {\r\n if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Error sending event:', eventNameOrPayload, error);\r\n }\r\n }\r\n}\r\n\r\nexport function umamiIdentify(data: UmamiEventData): void;\r\nexport function umamiIdentify(uniqueId: string): void;\r\nexport function umamiIdentify(uniqueId: string, data: UmamiEventData): void;\r\nexport function umamiIdentify(\r\n uniqueIdOrData: string | UmamiEventData,\r\n data?: UmamiEventData,\r\n): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n if (window.umami?.identify) {\r\n if (typeof uniqueIdOrData === 'string') {\r\n window.umami.identify(uniqueIdOrData, data!);\r\n } else {\r\n window.umami.identify(uniqueIdOrData);\r\n }\r\n } else if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Identify unavailable');\r\n }\r\n } catch (error) {\r\n if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Error identifying:', error);\r\n }\r\n }\r\n}\r\n"],"names":["component$","useTask$","isServer"],"mappings":";;;;AAIO,MAAM,cAAcA,KAAAA,WACzB,CAAC,EACC,WACA,MAAM,oCACN,SACA,YAAY,MACZ,SACA,KACA,eACA,aACA,YACA,WAAW,aACZ;AACCC,gBAAS,CAAC,EAAE,cAAS;AACnB,QAAIC,eAAU;AAEd,QAAI,SAAS,cAAc,2BAA2B,SAAA,IAAa,GAAG;AACpE;AAAA,IACF;AAEA,QAAI,SAAmC;AAEvC,UAAM,aAAa,MAAA;AACjB,eAAS,SAAS,cAAc,QAAA;AAChC,aAAO,QAAQ;AACf,aAAO,MAAM;AACb,aAAO,aAAa,mBAAmB,SAAA;AAEvC,UAAI,SAAS;AACX,eAAO,aAAa,iBAAiB,OAAA;AAAA,MACvC;AAEA,UAAI,CAAC,WAAW;AACd,eAAO,aAAa,mBAAmB,OAAA;AAAA,MACzC;AAEA,UAAI,SAAS;AACX,eAAO,aAAa,gBAAgB,OAAA;AAAA,MACtC;AAEA,UAAI,KAAK;AACP,eAAO,aAAa,YAAY,GAAA;AAAA,MAClC;AAEA,UAAI,eAAe;AACjB,eAAO,aAAa,uBAAuB,MAAA;AAAA,MAC7C;AAEA,UAAI,aAAa;AACf,eAAO,aAAa,qBAAqB,MAAA;AAAA,MAC3C;AAEA,UAAI,YAAY;AACd,eAAO,aAAa,qBAAqB,MAAA;AAAA,MAC3C;AAEA,aAAO,UAAU,MAAA;AAIf,gBAAQ,OAAA;AACR,iBAAS;AAAA,MACX;AAQA,eAAS,KAAK,YAAY,MAAA;AAAA,IAC5B;AAEA,QAAI,aAAa,SAAS;AACxB,iBAAA;AAAA,IACF,OAAO;AACL,UAAI,yBAAyB,QAAQ;AACnC,cAAM,KAAK,OAAO,oBAAoB,UAAA;AACtC,gBAAQ,MAAA;AACN,iBAAO,mBAAmB,EAAA;AAC1B,kBAAQ,OAAA;AAAA,QACV,CAAA;AACA;AAAA,MACF;AACA,YAAM,YAAY,WAAW,YAAY,CAAA;AACzC,cAAQ,MAAA;AACN,qBAAa,SAAA;AACb,gBAAQ,OAAA;AAAA,MACV,CAAA;AACA;AAAA,IACF;AAEA,YAAQ,MAAA;AACN,cAAQ,OAAA;AAAA,IACV,CAAA;AAAA,EACF,CAAA;AAEA,SAAO;AACT,CAAA;AChGK,SAAS,WACd,oBACA,MAAqB;AAErB,MAAI,OAAO,WAAW,YAAa;AAEnC,MAAI;AACF,QAAI,OAAO,OAAO,OAAO;AACvB,UAAI,uBAAuB,QAAW;AACpC,eAAO,MAAM,MAAA;AAAA,MACf,WAAW,OAAO,uBAAuB,UAAU;AACjD,eAAO,MAAM,MAAM,oBAAoB,IAAA;AAAA,MACzC,OAAO;AACL,eAAO,MAAM,MAAM,kBAAA;AAAA,MACrB;AAAA,IACF,WAAW,MAAqB;AAAA,EAGlC,SAAS,OAAO;AAAA,EAIhB;AACF;AAKO,SAAS,cACd,gBACA,MAAqB;AAErB,MAAI,OAAO,WAAW,YAAa;AAEnC,MAAI;AACF,QAAI,OAAO,OAAO,UAAU;AAC1B,UAAI,OAAO,mBAAmB,UAAU;AACtC,eAAO,MAAM,SAAS,gBAAgB,IAAA;AAAA,MACxC,OAAO;AACL,eAAO,MAAM,SAAS,cAAA;AAAA,MACxB;AAAA,IACF,WAAW,MAAqB;AAAA,EAGlC,SAAS,OAAO;AAAA,EAIhB;AACF;;;;"}
1
+ {"version":3,"file":"index.qwik.cjs","sources":["../src/components/umami-script.tsx","../src/utils/track.ts"],"sourcesContent":["import { component$, useVisibleTask$ } from '@builder.io/qwik';\nimport type { UmamiConfig } from '../types';\n\nexport const UmamiScript = component$<UmamiConfig>(\n ({\n websiteId,\n src = 'https://cloud.umami.is/script.js',\n hostUrl,\n autoTrack = true,\n domains,\n tag,\n excludeSearch,\n excludeHash,\n doNotTrack,\n strategy = 'idle',\n }) => {\n // eslint-disable-next-line qwik/no-use-visible-task\n useVisibleTask$(({ cleanup }) => {\n if (document.querySelector(`script[data-website-id=\"${websiteId}\"]`)) {\n return;\n }\n\n let script: HTMLScriptElement | null = null;\n\n const loadScript = () => {\n script = document.createElement('script');\n script.defer = true;\n script.src = src;\n script.setAttribute('data-website-id', websiteId);\n\n if (hostUrl) {\n script.setAttribute('data-host-url', hostUrl);\n }\n\n if (!autoTrack) {\n script.setAttribute('data-auto-track', 'false');\n }\n\n if (domains) {\n script.setAttribute('data-domains', domains);\n }\n\n if (tag) {\n script.setAttribute('data-tag', tag);\n }\n\n if (excludeSearch) {\n script.setAttribute('data-exclude-search', 'true');\n }\n\n if (excludeHash) {\n script.setAttribute('data-exclude-hash', 'true');\n }\n\n if (doNotTrack) {\n script.setAttribute('data-do-not-track', 'true');\n }\n\n script.onerror = () => {\n if (import.meta.env.DEV) {\n console.warn('[qwik-umami] Failed to load script');\n }\n script?.remove();\n script = null;\n };\n\n if (import.meta.env.DEV) {\n script.onload = () => {\n console.log('[qwik-umami] Script loaded successfully');\n };\n }\n\n document.head.appendChild(script);\n };\n\n if (strategy === 'eager') {\n loadScript();\n } else {\n if ('requestIdleCallback' in window) {\n const id = window.requestIdleCallback(loadScript);\n cleanup(() => {\n window.cancelIdleCallback(id);\n script?.remove();\n });\n return;\n }\n const timeoutId = setTimeout(loadScript, 0);\n cleanup(() => {\n clearTimeout(timeoutId);\n script?.remove();\n });\n return;\n }\n\n cleanup(() => {\n script?.remove();\n });\n });\n\n return null;\n },\n);\n","import type { UmamiEventData, UmamiPayload } from '../types';\r\n\r\nexport function umamiTrack(): void;\r\nexport function umamiTrack(payload: UmamiPayload): void;\r\nexport function umamiTrack(eventName: string): void;\r\nexport function umamiTrack(eventName: string, data: UmamiEventData): void;\r\nexport function umamiTrack(\r\n eventNameOrPayload?: string | UmamiPayload,\r\n data?: UmamiEventData,\r\n): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n if (window.umami?.track) {\r\n if (eventNameOrPayload === undefined) {\r\n window.umami.track();\r\n } else if (typeof eventNameOrPayload === 'string') {\r\n window.umami.track(eventNameOrPayload, data!);\r\n } else {\r\n window.umami.track(eventNameOrPayload);\r\n }\r\n } else if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Tracking unavailable');\r\n }\r\n } catch (error) {\r\n if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Error sending event:', eventNameOrPayload, error);\r\n }\r\n }\r\n}\r\n\r\nexport function umamiIdentify(data: UmamiEventData): void;\r\nexport function umamiIdentify(uniqueId: string): void;\r\nexport function umamiIdentify(uniqueId: string, data: UmamiEventData): void;\r\nexport function umamiIdentify(\r\n uniqueIdOrData: string | UmamiEventData,\r\n data?: UmamiEventData,\r\n): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n if (window.umami?.identify) {\r\n if (typeof uniqueIdOrData === 'string') {\r\n window.umami.identify(uniqueIdOrData, data!);\r\n } else {\r\n window.umami.identify(uniqueIdOrData);\r\n }\r\n } else if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Identify unavailable');\r\n }\r\n } catch (error) {\r\n if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Error identifying:', error);\r\n }\r\n }\r\n}\r\n"],"names":["component$","useVisibleTask$"],"mappings":";;;AAGO,MAAM,cAAcA,KAAAA,WACzB,CAAC,EACC,WACA,MAAM,oCACN,SACA,YAAY,MACZ,SACA,KACA,eACA,aACA,YACA,WAAW,aACZ;AAECC,uBAAgB,CAAC,EAAE,cAAS;AAC1B,QAAI,SAAS,cAAc,2BAA2B,SAAA,IAAa,GAAG;AACpE;AAAA,IACF;AAEA,QAAI,SAAmC;AAEvC,UAAM,aAAa,MAAA;AACjB,eAAS,SAAS,cAAc,QAAA;AAChC,aAAO,QAAQ;AACf,aAAO,MAAM;AACb,aAAO,aAAa,mBAAmB,SAAA;AAEvC,UAAI,SAAS;AACX,eAAO,aAAa,iBAAiB,OAAA;AAAA,MACvC;AAEA,UAAI,CAAC,WAAW;AACd,eAAO,aAAa,mBAAmB,OAAA;AAAA,MACzC;AAEA,UAAI,SAAS;AACX,eAAO,aAAa,gBAAgB,OAAA;AAAA,MACtC;AAEA,UAAI,KAAK;AACP,eAAO,aAAa,YAAY,GAAA;AAAA,MAClC;AAEA,UAAI,eAAe;AACjB,eAAO,aAAa,uBAAuB,MAAA;AAAA,MAC7C;AAEA,UAAI,aAAa;AACf,eAAO,aAAa,qBAAqB,MAAA;AAAA,MAC3C;AAEA,UAAI,YAAY;AACd,eAAO,aAAa,qBAAqB,MAAA;AAAA,MAC3C;AAEA,aAAO,UAAU,MAAA;AAIf,gBAAQ,OAAA;AACR,iBAAS;AAAA,MACX;AAQA,eAAS,KAAK,YAAY,MAAA;AAAA,IAC5B;AAEA,QAAI,aAAa,SAAS;AACxB,iBAAA;AAAA,IACF,OAAO;AACL,UAAI,yBAAyB,QAAQ;AACnC,cAAM,KAAK,OAAO,oBAAoB,UAAA;AACtC,gBAAQ,MAAA;AACN,iBAAO,mBAAmB,EAAA;AAC1B,kBAAQ,OAAA;AAAA,QACV,CAAA;AACA;AAAA,MACF;AACA,YAAM,YAAY,WAAW,YAAY,CAAA;AACzC,cAAQ,MAAA;AACN,qBAAa,SAAA;AACb,gBAAQ,OAAA;AAAA,MACV,CAAA;AACA;AAAA,IACF;AAEA,YAAQ,MAAA;AACN,cAAQ,OAAA;AAAA,IACV,CAAA;AAAA,EACF,CAAA;AAEA,SAAO;AACT,CAAA;AC9FK,SAAS,WACd,oBACA,MAAqB;AAErB,MAAI,OAAO,WAAW,YAAa;AAEnC,MAAI;AACF,QAAI,OAAO,OAAO,OAAO;AACvB,UAAI,uBAAuB,QAAW;AACpC,eAAO,MAAM,MAAA;AAAA,MACf,WAAW,OAAO,uBAAuB,UAAU;AACjD,eAAO,MAAM,MAAM,oBAAoB,IAAA;AAAA,MACzC,OAAO;AACL,eAAO,MAAM,MAAM,kBAAA;AAAA,MACrB;AAAA,IACF,WAAW,MAAqB;AAAA,EAGlC,SAAS,OAAO;AAAA,EAIhB;AACF;AAKO,SAAS,cACd,gBACA,MAAqB;AAErB,MAAI,OAAO,WAAW,YAAa;AAEnC,MAAI;AACF,QAAI,OAAO,OAAO,UAAU;AAC1B,UAAI,OAAO,mBAAmB,UAAU;AACtC,eAAO,MAAM,SAAS,gBAAgB,IAAA;AAAA,MACxC,OAAO;AACL,eAAO,MAAM,SAAS,cAAA;AAAA,MACxB;AAAA,IACF,WAAW,MAAqB;AAAA,EAGlC,SAAS,OAAO;AAAA,EAIhB;AACF;;;;"}
@@ -1,8 +1,6 @@
1
- import { component$, useTask$ } from "@builder.io/qwik";
2
- import { isServer } from "@builder.io/qwik/build";
1
+ import { component$, useVisibleTask$ } from "@builder.io/qwik";
3
2
  const UmamiScript = component$(({ websiteId, src = "https://cloud.umami.is/script.js", hostUrl, autoTrack = true, domains, tag, excludeSearch, excludeHash, doNotTrack, strategy = "idle" }) => {
4
- useTask$(({ cleanup }) => {
5
- if (isServer) return;
3
+ useVisibleTask$(({ cleanup }) => {
6
4
  if (document.querySelector(`script[data-website-id="${websiteId}"]`)) {
7
5
  return;
8
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.qwik.mjs","sources":["../src/components/umami-script.tsx","../src/utils/track.ts"],"sourcesContent":["import { component$, useTask$ } from '@builder.io/qwik';\nimport { isServer } from '@builder.io/qwik/build';\nimport type { UmamiConfig } from '../types';\n\nexport const UmamiScript = component$<UmamiConfig>(\n ({\n websiteId,\n src = 'https://cloud.umami.is/script.js',\n hostUrl,\n autoTrack = true,\n domains,\n tag,\n excludeSearch,\n excludeHash,\n doNotTrack,\n strategy = 'idle',\n }) => {\n useTask$(({ cleanup }) => {\n if (isServer) return;\n\n if (document.querySelector(`script[data-website-id=\"${websiteId}\"]`)) {\n return;\n }\n\n let script: HTMLScriptElement | null = null;\n\n const loadScript = () => {\n script = document.createElement('script');\n script.defer = true;\n script.src = src;\n script.setAttribute('data-website-id', websiteId);\n\n if (hostUrl) {\n script.setAttribute('data-host-url', hostUrl);\n }\n\n if (!autoTrack) {\n script.setAttribute('data-auto-track', 'false');\n }\n\n if (domains) {\n script.setAttribute('data-domains', domains);\n }\n\n if (tag) {\n script.setAttribute('data-tag', tag);\n }\n\n if (excludeSearch) {\n script.setAttribute('data-exclude-search', 'true');\n }\n\n if (excludeHash) {\n script.setAttribute('data-exclude-hash', 'true');\n }\n\n if (doNotTrack) {\n script.setAttribute('data-do-not-track', 'true');\n }\n\n script.onerror = () => {\n if (import.meta.env.DEV) {\n console.warn('[qwik-umami] Failed to load script');\n }\n script?.remove();\n script = null;\n };\n\n if (import.meta.env.DEV) {\n script.onload = () => {\n console.log('[qwik-umami] Script loaded successfully');\n };\n }\n\n document.head.appendChild(script);\n };\n\n if (strategy === 'eager') {\n loadScript();\n } else {\n if ('requestIdleCallback' in window) {\n const id = window.requestIdleCallback(loadScript);\n cleanup(() => {\n window.cancelIdleCallback(id);\n script?.remove();\n });\n return;\n }\n const timeoutId = setTimeout(loadScript, 0);\n cleanup(() => {\n clearTimeout(timeoutId);\n script?.remove();\n });\n return;\n }\n\n cleanup(() => {\n script?.remove();\n });\n });\n\n return null;\n },\n);\n","import type { UmamiEventData, UmamiPayload } from '../types';\r\n\r\nexport function umamiTrack(): void;\r\nexport function umamiTrack(payload: UmamiPayload): void;\r\nexport function umamiTrack(eventName: string): void;\r\nexport function umamiTrack(eventName: string, data: UmamiEventData): void;\r\nexport function umamiTrack(\r\n eventNameOrPayload?: string | UmamiPayload,\r\n data?: UmamiEventData,\r\n): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n if (window.umami?.track) {\r\n if (eventNameOrPayload === undefined) {\r\n window.umami.track();\r\n } else if (typeof eventNameOrPayload === 'string') {\r\n window.umami.track(eventNameOrPayload, data!);\r\n } else {\r\n window.umami.track(eventNameOrPayload);\r\n }\r\n } else if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Tracking unavailable');\r\n }\r\n } catch (error) {\r\n if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Error sending event:', eventNameOrPayload, error);\r\n }\r\n }\r\n}\r\n\r\nexport function umamiIdentify(data: UmamiEventData): void;\r\nexport function umamiIdentify(uniqueId: string): void;\r\nexport function umamiIdentify(uniqueId: string, data: UmamiEventData): void;\r\nexport function umamiIdentify(\r\n uniqueIdOrData: string | UmamiEventData,\r\n data?: UmamiEventData,\r\n): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n if (window.umami?.identify) {\r\n if (typeof uniqueIdOrData === 'string') {\r\n window.umami.identify(uniqueIdOrData, data!);\r\n } else {\r\n window.umami.identify(uniqueIdOrData);\r\n }\r\n } else if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Identify unavailable');\r\n }\r\n } catch (error) {\r\n if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Error identifying:', error);\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAIO,MAAM,cAAc,WACzB,CAAC,EACC,WACA,MAAM,oCACN,SACA,YAAY,MACZ,SACA,KACA,eACA,aACA,YACA,WAAW,aACZ;AACC,WAAS,CAAC,EAAE,cAAS;AACnB,QAAI,SAAU;AAEd,QAAI,SAAS,cAAc,2BAA2B,SAAA,IAAa,GAAG;AACpE;AAAA,IACF;AAEA,QAAI,SAAmC;AAEvC,UAAM,aAAa,MAAA;AACjB,eAAS,SAAS,cAAc,QAAA;AAChC,aAAO,QAAQ;AACf,aAAO,MAAM;AACb,aAAO,aAAa,mBAAmB,SAAA;AAEvC,UAAI,SAAS;AACX,eAAO,aAAa,iBAAiB,OAAA;AAAA,MACvC;AAEA,UAAI,CAAC,WAAW;AACd,eAAO,aAAa,mBAAmB,OAAA;AAAA,MACzC;AAEA,UAAI,SAAS;AACX,eAAO,aAAa,gBAAgB,OAAA;AAAA,MACtC;AAEA,UAAI,KAAK;AACP,eAAO,aAAa,YAAY,GAAA;AAAA,MAClC;AAEA,UAAI,eAAe;AACjB,eAAO,aAAa,uBAAuB,MAAA;AAAA,MAC7C;AAEA,UAAI,aAAa;AACf,eAAO,aAAa,qBAAqB,MAAA;AAAA,MAC3C;AAEA,UAAI,YAAY;AACd,eAAO,aAAa,qBAAqB,MAAA;AAAA,MAC3C;AAEA,aAAO,UAAU,MAAA;AAIf,gBAAQ,OAAA;AACR,iBAAS;AAAA,MACX;AAQA,eAAS,KAAK,YAAY,MAAA;AAAA,IAC5B;AAEA,QAAI,aAAa,SAAS;AACxB,iBAAA;AAAA,IACF,OAAO;AACL,UAAI,yBAAyB,QAAQ;AACnC,cAAM,KAAK,OAAO,oBAAoB,UAAA;AACtC,gBAAQ,MAAA;AACN,iBAAO,mBAAmB,EAAA;AAC1B,kBAAQ,OAAA;AAAA,QACV,CAAA;AACA;AAAA,MACF;AACA,YAAM,YAAY,WAAW,YAAY,CAAA;AACzC,cAAQ,MAAA;AACN,qBAAa,SAAA;AACb,gBAAQ,OAAA;AAAA,MACV,CAAA;AACA;AAAA,IACF;AAEA,YAAQ,MAAA;AACN,cAAQ,OAAA;AAAA,IACV,CAAA;AAAA,EACF,CAAA;AAEA,SAAO;AACT,CAAA;AChGK,SAAS,WACd,oBACA,MAAqB;AAErB,MAAI,OAAO,WAAW,YAAa;AAEnC,MAAI;AACF,QAAI,OAAO,OAAO,OAAO;AACvB,UAAI,uBAAuB,QAAW;AACpC,eAAO,MAAM,MAAA;AAAA,MACf,WAAW,OAAO,uBAAuB,UAAU;AACjD,eAAO,MAAM,MAAM,oBAAoB,IAAA;AAAA,MACzC,OAAO;AACL,eAAO,MAAM,MAAM,kBAAA;AAAA,MACrB;AAAA,IACF,WAAW,MAAqB;AAAA,EAGlC,SAAS,OAAO;AAAA,EAIhB;AACF;AAKO,SAAS,cACd,gBACA,MAAqB;AAErB,MAAI,OAAO,WAAW,YAAa;AAEnC,MAAI;AACF,QAAI,OAAO,OAAO,UAAU;AAC1B,UAAI,OAAO,mBAAmB,UAAU;AACtC,eAAO,MAAM,SAAS,gBAAgB,IAAA;AAAA,MACxC,OAAO;AACL,eAAO,MAAM,SAAS,cAAA;AAAA,MACxB;AAAA,IACF,WAAW,MAAqB;AAAA,EAGlC,SAAS,OAAO;AAAA,EAIhB;AACF;"}
1
+ {"version":3,"file":"index.qwik.mjs","sources":["../src/components/umami-script.tsx","../src/utils/track.ts"],"sourcesContent":["import { component$, useVisibleTask$ } from '@builder.io/qwik';\nimport type { UmamiConfig } from '../types';\n\nexport const UmamiScript = component$<UmamiConfig>(\n ({\n websiteId,\n src = 'https://cloud.umami.is/script.js',\n hostUrl,\n autoTrack = true,\n domains,\n tag,\n excludeSearch,\n excludeHash,\n doNotTrack,\n strategy = 'idle',\n }) => {\n // eslint-disable-next-line qwik/no-use-visible-task\n useVisibleTask$(({ cleanup }) => {\n if (document.querySelector(`script[data-website-id=\"${websiteId}\"]`)) {\n return;\n }\n\n let script: HTMLScriptElement | null = null;\n\n const loadScript = () => {\n script = document.createElement('script');\n script.defer = true;\n script.src = src;\n script.setAttribute('data-website-id', websiteId);\n\n if (hostUrl) {\n script.setAttribute('data-host-url', hostUrl);\n }\n\n if (!autoTrack) {\n script.setAttribute('data-auto-track', 'false');\n }\n\n if (domains) {\n script.setAttribute('data-domains', domains);\n }\n\n if (tag) {\n script.setAttribute('data-tag', tag);\n }\n\n if (excludeSearch) {\n script.setAttribute('data-exclude-search', 'true');\n }\n\n if (excludeHash) {\n script.setAttribute('data-exclude-hash', 'true');\n }\n\n if (doNotTrack) {\n script.setAttribute('data-do-not-track', 'true');\n }\n\n script.onerror = () => {\n if (import.meta.env.DEV) {\n console.warn('[qwik-umami] Failed to load script');\n }\n script?.remove();\n script = null;\n };\n\n if (import.meta.env.DEV) {\n script.onload = () => {\n console.log('[qwik-umami] Script loaded successfully');\n };\n }\n\n document.head.appendChild(script);\n };\n\n if (strategy === 'eager') {\n loadScript();\n } else {\n if ('requestIdleCallback' in window) {\n const id = window.requestIdleCallback(loadScript);\n cleanup(() => {\n window.cancelIdleCallback(id);\n script?.remove();\n });\n return;\n }\n const timeoutId = setTimeout(loadScript, 0);\n cleanup(() => {\n clearTimeout(timeoutId);\n script?.remove();\n });\n return;\n }\n\n cleanup(() => {\n script?.remove();\n });\n });\n\n return null;\n },\n);\n","import type { UmamiEventData, UmamiPayload } from '../types';\r\n\r\nexport function umamiTrack(): void;\r\nexport function umamiTrack(payload: UmamiPayload): void;\r\nexport function umamiTrack(eventName: string): void;\r\nexport function umamiTrack(eventName: string, data: UmamiEventData): void;\r\nexport function umamiTrack(\r\n eventNameOrPayload?: string | UmamiPayload,\r\n data?: UmamiEventData,\r\n): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n if (window.umami?.track) {\r\n if (eventNameOrPayload === undefined) {\r\n window.umami.track();\r\n } else if (typeof eventNameOrPayload === 'string') {\r\n window.umami.track(eventNameOrPayload, data!);\r\n } else {\r\n window.umami.track(eventNameOrPayload);\r\n }\r\n } else if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Tracking unavailable');\r\n }\r\n } catch (error) {\r\n if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Error sending event:', eventNameOrPayload, error);\r\n }\r\n }\r\n}\r\n\r\nexport function umamiIdentify(data: UmamiEventData): void;\r\nexport function umamiIdentify(uniqueId: string): void;\r\nexport function umamiIdentify(uniqueId: string, data: UmamiEventData): void;\r\nexport function umamiIdentify(\r\n uniqueIdOrData: string | UmamiEventData,\r\n data?: UmamiEventData,\r\n): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n if (window.umami?.identify) {\r\n if (typeof uniqueIdOrData === 'string') {\r\n window.umami.identify(uniqueIdOrData, data!);\r\n } else {\r\n window.umami.identify(uniqueIdOrData);\r\n }\r\n } else if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Identify unavailable');\r\n }\r\n } catch (error) {\r\n if (import.meta.env.DEV) {\r\n console.warn('[qwik-umami] Error identifying:', error);\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";AAGO,MAAM,cAAc,WACzB,CAAC,EACC,WACA,MAAM,oCACN,SACA,YAAY,MACZ,SACA,KACA,eACA,aACA,YACA,WAAW,aACZ;AAEC,kBAAgB,CAAC,EAAE,cAAS;AAC1B,QAAI,SAAS,cAAc,2BAA2B,SAAA,IAAa,GAAG;AACpE;AAAA,IACF;AAEA,QAAI,SAAmC;AAEvC,UAAM,aAAa,MAAA;AACjB,eAAS,SAAS,cAAc,QAAA;AAChC,aAAO,QAAQ;AACf,aAAO,MAAM;AACb,aAAO,aAAa,mBAAmB,SAAA;AAEvC,UAAI,SAAS;AACX,eAAO,aAAa,iBAAiB,OAAA;AAAA,MACvC;AAEA,UAAI,CAAC,WAAW;AACd,eAAO,aAAa,mBAAmB,OAAA;AAAA,MACzC;AAEA,UAAI,SAAS;AACX,eAAO,aAAa,gBAAgB,OAAA;AAAA,MACtC;AAEA,UAAI,KAAK;AACP,eAAO,aAAa,YAAY,GAAA;AAAA,MAClC;AAEA,UAAI,eAAe;AACjB,eAAO,aAAa,uBAAuB,MAAA;AAAA,MAC7C;AAEA,UAAI,aAAa;AACf,eAAO,aAAa,qBAAqB,MAAA;AAAA,MAC3C;AAEA,UAAI,YAAY;AACd,eAAO,aAAa,qBAAqB,MAAA;AAAA,MAC3C;AAEA,aAAO,UAAU,MAAA;AAIf,gBAAQ,OAAA;AACR,iBAAS;AAAA,MACX;AAQA,eAAS,KAAK,YAAY,MAAA;AAAA,IAC5B;AAEA,QAAI,aAAa,SAAS;AACxB,iBAAA;AAAA,IACF,OAAO;AACL,UAAI,yBAAyB,QAAQ;AACnC,cAAM,KAAK,OAAO,oBAAoB,UAAA;AACtC,gBAAQ,MAAA;AACN,iBAAO,mBAAmB,EAAA;AAC1B,kBAAQ,OAAA;AAAA,QACV,CAAA;AACA;AAAA,MACF;AACA,YAAM,YAAY,WAAW,YAAY,CAAA;AACzC,cAAQ,MAAA;AACN,qBAAa,SAAA;AACb,gBAAQ,OAAA;AAAA,MACV,CAAA;AACA;AAAA,IACF;AAEA,YAAQ,MAAA;AACN,cAAQ,OAAA;AAAA,IACV,CAAA;AAAA,EACF,CAAA;AAEA,SAAO;AACT,CAAA;AC9FK,SAAS,WACd,oBACA,MAAqB;AAErB,MAAI,OAAO,WAAW,YAAa;AAEnC,MAAI;AACF,QAAI,OAAO,OAAO,OAAO;AACvB,UAAI,uBAAuB,QAAW;AACpC,eAAO,MAAM,MAAA;AAAA,MACf,WAAW,OAAO,uBAAuB,UAAU;AACjD,eAAO,MAAM,MAAM,oBAAoB,IAAA;AAAA,MACzC,OAAO;AACL,eAAO,MAAM,MAAM,kBAAA;AAAA,MACrB;AAAA,IACF,WAAW,MAAqB;AAAA,EAGlC,SAAS,OAAO;AAAA,EAIhB;AACF;AAKO,SAAS,cACd,gBACA,MAAqB;AAErB,MAAI,OAAO,WAAW,YAAa;AAEnC,MAAI;AACF,QAAI,OAAO,OAAO,UAAU;AAC1B,UAAI,OAAO,mBAAmB,UAAU;AACtC,eAAO,MAAM,SAAS,gBAAgB,IAAA;AAAA,MACxC,OAAO;AACL,eAAO,MAAM,SAAS,cAAA;AAAA,MACxB;AAAA,IACF,WAAW,MAAqB;AAAA,EAGlC,SAAS,OAAO;AAAA,EAIhB;AACF;"}
package/llms.txt CHANGED
@@ -24,7 +24,7 @@ import type { UmamiServerOptions, UmamiServerPayload, UmamiPluginOptions } from
24
24
 
25
25
  ## UmamiScript component
26
26
 
27
- Qwik component. Place in `<head>` inside `root.tsx`. Loads the Umami tracker script client-side only using `useTask$` with `isServer` guard (preserves resumability). Renders `null`.
27
+ Qwik component. Place in `<head>` inside `root.tsx`. Loads the Umami tracker script client-side only using `useVisibleTask$` (one-shot client init). Renders `null`.
28
28
 
29
29
  ```tsx
30
30
  // Minimum setup — automatic page view tracking
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwik-umami",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "SSR-safe Umami Analytics component and hook for Qwik — automatic page views + custom event tracking with zero config",
5
5
  "type": "module",
6
6
  "main": "./lib/index.qwik.mjs",