@hifilabs/pixel 0.17.1 → 0.17.2

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/dist/browser.js CHANGED
@@ -8,7 +8,7 @@ var ArtistPixel = (() => {
8
8
 
9
9
  // src/browser.ts
10
10
  (function() {
11
- const PIXEL_VERSION = "0.17.1";
11
+ const PIXEL_VERSION = "0.17.2";
12
12
  const currentScript = document.currentScript;
13
13
  const debug = currentScript?.dataset.debug === "true";
14
14
  const SILENT_MODE = !debug;
@@ -221,6 +221,7 @@ var ArtistPixel = (() => {
221
221
  let sessionId = null;
222
222
  let visitorId = null;
223
223
  let fanIdHash = null;
224
+ let identifyInProgress = false;
224
225
  let consent = null;
225
226
  let attribution = {};
226
227
  let linkRegistry = {};
@@ -932,22 +933,30 @@ var ArtistPixel = (() => {
932
933
  }
933
934
  function getOrCreateVisitorId() {
934
935
  try {
935
- const stored = localStorage.getItem(STORAGE_PREFIX + VISITOR_ID_KEY);
936
- if (stored) {
936
+ const useLocal = currentStorageTier === "local";
937
+ const storage = useLocal ? localStorage : sessionStorage;
938
+ const stored = storage.getItem(STORAGE_PREFIX + VISITOR_ID_KEY);
939
+ if (stored)
937
940
  return stored;
938
- }
939
941
  const newId = generateUUID();
940
- localStorage.setItem(STORAGE_PREFIX + VISITOR_ID_KEY, newId);
941
- log("Created persistent visitor ID:", newId.substring(0, 8) + "...");
942
+ storage.setItem(STORAGE_PREFIX + VISITOR_ID_KEY, newId);
943
+ log(
944
+ useLocal ? "Created persistent visitor ID:" : "Created session-only visitor ID:",
945
+ newId.substring(0, 8) + "..."
946
+ );
942
947
  return newId;
943
948
  } catch (e) {
944
- log("localStorage unavailable, using session ID as fallback");
949
+ log("Storage unavailable, using session ID as fallback");
945
950
  return sessionId || generateUUID();
946
951
  }
947
952
  }
948
953
  function loadVisitorId() {
949
954
  try {
950
- visitorId = localStorage.getItem(STORAGE_PREFIX + VISITOR_ID_KEY);
955
+ if (currentStorageTier === "local") {
956
+ visitorId = localStorage.getItem(STORAGE_PREFIX + VISITOR_ID_KEY);
957
+ } else {
958
+ visitorId = sessionStorage.getItem(STORAGE_PREFIX + VISITOR_ID_KEY);
959
+ }
951
960
  if (visitorId) {
952
961
  log("Loaded visitor ID:", visitorId.substring(0, 8) + "...");
953
962
  }
@@ -1018,8 +1027,28 @@ var ArtistPixel = (() => {
1018
1027
  sessionStorage.removeItem(STORAGE_PREFIX + FAN_ID_KEY);
1019
1028
  } catch {
1020
1029
  }
1030
+ try {
1031
+ localStorage.removeItem(STORAGE_PREFIX + VISITOR_ID_KEY);
1032
+ } catch {
1033
+ }
1021
1034
  fanIdHash = null;
1035
+ identifyInProgress = false;
1036
+ for (const event2 of eventQueue) {
1037
+ if (event2.fan_id_hash) {
1038
+ delete event2.fan_id_hash;
1039
+ }
1040
+ if (event2.metadata?.email) {
1041
+ delete event2.metadata.email;
1042
+ }
1043
+ if (event2.metadata?.email_sha256) {
1044
+ delete event2.metadata.email_sha256;
1045
+ }
1046
+ if (event2.metadata?.email_display) {
1047
+ delete event2.metadata.email_display;
1048
+ }
1049
+ }
1022
1050
  log("Fan ID hash cleared from storage and memory (consent revoked)");
1051
+ log("Scrubbed identity data from", eventQueue.length, "queued events");
1023
1052
  }
1024
1053
  const event = buildEvent({
1025
1054
  event_name: "consent_updated",
@@ -1106,6 +1135,7 @@ var ArtistPixel = (() => {
1106
1135
  function buildEvent(partial) {
1107
1136
  const deviceInfo = getDeviceInfo();
1108
1137
  const base = {
1138
+ event_id: generateUUID(),
1109
1139
  artist_id: artistId,
1110
1140
  fan_session_id: sessionId,
1111
1141
  visitor_id: visitorId || getOrCreateVisitorId(),
@@ -1174,6 +1204,8 @@ var ArtistPixel = (() => {
1174
1204
  }
1175
1205
  if (eventQueue.length < 50) {
1176
1206
  eventQueue.push(...events);
1207
+ } else {
1208
+ log("Event queue full, dropping", events.length, "events");
1177
1209
  }
1178
1210
  }
1179
1211
  }
@@ -1278,8 +1310,13 @@ var ArtistPixel = (() => {
1278
1310
  });
1279
1311
  if (navigator.sendBeacon && API_ENDPOINT) {
1280
1312
  const payload = JSON.stringify({ events: [event] });
1281
- navigator.sendBeacon(API_ENDPOINT, payload);
1282
- log("Engagement summary sent via sendBeacon:", Math.round(activeTimeMs / 1e3), "seconds active");
1313
+ const sent = navigator.sendBeacon(API_ENDPOINT, payload);
1314
+ if (sent) {
1315
+ log("Engagement summary sent via sendBeacon:", Math.round(activeTimeMs / 1e3), "seconds active");
1316
+ } else {
1317
+ enqueueEvent(event);
1318
+ log("sendBeacon failed, engagement summary enqueued:", Math.round(activeTimeMs / 1e3), "seconds active");
1319
+ }
1283
1320
  } else {
1284
1321
  enqueueEvent(event);
1285
1322
  log("Engagement summary enqueued:", Math.round(activeTimeMs / 1e3), "seconds active");
@@ -1318,6 +1355,11 @@ var ArtistPixel = (() => {
1318
1355
  log("identify() skipped - no analytics consent");
1319
1356
  return;
1320
1357
  }
1358
+ if (identifyInProgress) {
1359
+ log("identify() already in progress, skipping");
1360
+ return;
1361
+ }
1362
+ identifyInProgress = true;
1321
1363
  let hashVersion = 1;
1322
1364
  const serverResult = await hashEmailFromServer(email);
1323
1365
  if (serverResult) {
@@ -1366,6 +1408,8 @@ var ArtistPixel = (() => {
1366
1408
  enqueueEvent(event);
1367
1409
  } catch (error) {
1368
1410
  logError(" Failed to identify:", error);
1411
+ } finally {
1412
+ identifyInProgress = false;
1369
1413
  }
1370
1414
  }
1371
1415
  function setFanIdHash(hash) {
@@ -1373,6 +1417,10 @@ var ArtistPixel = (() => {
1373
1417
  logError("setFanIdHash: invalid hash provided");
1374
1418
  return;
1375
1419
  }
1420
+ if (identifyInProgress) {
1421
+ log("setFanIdHash() skipped - identify() in progress");
1422
+ return;
1423
+ }
1376
1424
  fanIdHash = hash;
1377
1425
  if (consent?.analytics === true) {
1378
1426
  try {
@@ -1,4 +1,4 @@
1
- var ArtistPixel=(()=>{var qe=Object.defineProperty;var Ne=(v,i,x)=>i in v?qe(v,i,{enumerable:!0,configurable:!0,writable:!0,value:x}):v[i]=x;var J=(v,i,x)=>(Ne(v,typeof i!="symbol"?i+"":i,x),x);(function(){let v="0.17.1",i=document.currentScript,x=i?.dataset.debug==="true",Wt=!x,a=(...t)=>{x&&console.log("[artistPixel]",...t)},C=(...t)=>{Wt||console.error("[artistPixel]",...t)};function Yt(t){let e="desktop";/ipad|tablet|android(?!.*mobile)/i.test(t)?e="tablet":/mobile|iphone|android.*mobile|blackberry|iemobile/i.test(t)&&(e="mobile");let n="Unknown";/edg/i.test(t)?n="Edge":/opr|opera/i.test(t)?n="Opera":/firefox/i.test(t)?n="Firefox":/chrome/i.test(t)?n="Chrome":/safari/i.test(t)&&(n="Safari");let o="Unknown";return/iphone|ipad/i.test(t)?o="iOS":/android/i.test(t)?o="Android":/windows/i.test(t)?o="Windows":/mac os/i.test(t)?o="macOS":/linux/i.test(t)?o="Linux":/cros/i.test(t)&&(o="ChromeOS"),{device_type:e,browser:n,os:o}}let V=null;function Jt(){if(!V)try{V=Yt(navigator.userAgent)}catch{V={device_type:"desktop",browser:"Unknown",os:"Unknown"}}return V}let M=i?.dataset.artistId,K=i?.dataset.projectId,X=K?Kt(K):void 0;function Kt(t){return!t||t.startsWith("release_")||t.startsWith("merch_")||t.startsWith("link_")||t.startsWith("custom_")?t:`custom_${t}`}let Q=i?.dataset.emulator==="true",Z=parseInt(i?.dataset.heartbeatInterval||"120000",10),yt=i?.dataset.heartbeat!=="false",bt=i?.dataset.source,vt=i?.dataset.endpoint,f=window.__artistPixelConfig||{},O=i?.dataset.metaPixelId||f.metaPixelId,T=i?.dataset.tiktokPixelId||f.tiktokPixelId,p=i?.dataset.googleAdsId||f.googleAdsId,_t=i?.dataset.googleAdsConversionLabel||f.googleAdsConversionLabel,j=i?.dataset.googleTagManagerId||f.googleTagManagerId,h=i?.dataset.googleAnalyticsId||f.googleAnalyticsId,m={pageview:(i?.dataset.forwardPageview??f.forwardPageview)!=="false",purchase:(i?.dataset.forwardPurchase??f.forwardPurchase)!=="false",addToCart:(i?.dataset.forwardAddToCart??f.forwardAddToCart)!=="false",lead:(i?.dataset.forwardLead??f.forwardLead)!=="false",viewContent:(i?.dataset.forwardViewContent??f.forwardViewContent)!=="false",initiateCheckout:(i?.dataset.forwardInitiateCheckout??f.forwardInitiateCheckout)!=="false",completeRegistration:(i?.dataset.forwardCompleteRegistration??f.forwardCompleteRegistration)!=="false",subscribe:(i?.dataset.forwardSubscribe??f.forwardSubscribe)!=="false",search:(i?.dataset.forwardSearch??f.forwardSearch)!=="false",contact:(i?.dataset.forwardContact??f.forwardContact)!=="false",custom:(i?.dataset.forwardCustom||f.forwardCustom||"").split(",").filter(Boolean)},U=!!(O||T||p||j||h),tt=i?.dataset.consentUi==="true",Xt=i?.dataset.consentStyle||"brutalist",Qt=i?.dataset.primaryColor,Zt=i?.dataset.bannerPosition||"bottom",kt=i?.dataset.excludePages?.split(",").filter(Boolean)||[],It=i?.dataset.trackFileDownloads==="true",te=i?.dataset.hashRouting==="true";function ee(){if(bt)return bt;let t=typeof window.dataLayer<"u"&&Array.isArray(window.dataLayer),e=typeof window.gtag=="function";return t&&e?"gtm":"pixel"}let G="pixel";if(!M){C(" Error: data-artist-id attribute is required");return}let xt="session_id",et="session_timestamp",Ct="attribution",y="fan_id_hash",nt="visitor_id",B="artistPixel_consent",ne=365*24*60*60*1e3,ae=30*24*60*60*1e3,oe=60*60*1e3,w="balance_";function ie(t){let e=t.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp("^"+e+"$")}function re(t){if(kt.length===0)return!1;try{let e=new URL(t,window.location.origin).pathname;return kt.some(n=>ie(n).test(e))}catch{return!1}}let se=[".pdf",".zip",".tar",".gz",".rar",".7z",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".mp3",".wav",".flac",".aac",".ogg",".mp4",".mov",".avi",".mkv",".webm",".exe",".dmg",".pkg",".deb",".rpm",".csv",".json",".xml",".txt"];function St(t){try{let e=new URL(t,window.location.origin).pathname.toLowerCase();return se.some(n=>e.endsWith(n))}catch{return!1}}function ce(t,e){try{let o=new URL(t,window.location.origin).pathname.split("/").pop()||"unknown",c=o.includes(".")?o.split(".").pop():"unknown";a("File download tracked:",{url:t,fileName:o,fileExtension:c});let d=S({event_name:"custom",metadata:{event_type:"file_download",file_url:t,file_name:o,file_extension:c,link_text:e?.textContent?.trim().substring(0,100)||""}});P(d)}catch(n){C("Failed to track file download:",n)}}let de="https://e.os.xyz",Pt="https://us-central1-artist-os-distro.cloudfunctions.net/ingestEvents",le="https://us-central1-artist-os-distro.cloudfunctions.net/identityHashIdentity",L=vt||(Q?"http://localhost:5001/artist-os-distro/us-central1/ingestEvents":de),F=null,b=null,g=null,l=null,A={},at={},_=[],ot=null,k="session",R=null,it=0,rt=0,D=0,q=!0,st=0,ct=!1,ge=2*60*1e3,Et=Date.now(),N=!1,dt={base:`
1
+ var ArtistPixel=(()=>{var He=Object.defineProperty;var Ne=(k,o,C)=>o in k?He(k,o,{enumerable:!0,configurable:!0,writable:!0,value:C}):k[o]=C;var X=(k,o,C)=>(Ne(k,typeof o!="symbol"?o+"":o,C),C);(function(){let k="0.17.2",o=document.currentScript,C=o?.dataset.debug==="true",Yt=!C,a=(...t)=>{C&&console.log("[artistPixel]",...t)},S=(...t)=>{Yt||console.error("[artistPixel]",...t)};function Jt(t){let e="desktop";/ipad|tablet|android(?!.*mobile)/i.test(t)?e="tablet":/mobile|iphone|android.*mobile|blackberry|iemobile/i.test(t)&&(e="mobile");let n="Unknown";/edg/i.test(t)?n="Edge":/opr|opera/i.test(t)?n="Opera":/firefox/i.test(t)?n="Firefox":/chrome/i.test(t)?n="Chrome":/safari/i.test(t)&&(n="Safari");let i="Unknown";return/iphone|ipad/i.test(t)?i="iOS":/android/i.test(t)?i="Android":/windows/i.test(t)?i="Windows":/mac os/i.test(t)?i="macOS":/linux/i.test(t)?i="Linux":/cros/i.test(t)&&(i="ChromeOS"),{device_type:e,browser:n,os:i}}let W=null;function Kt(){if(!W)try{W=Jt(navigator.userAgent)}catch{W={device_type:"desktop",browser:"Unknown",os:"Unknown"}}return W}let M=o?.dataset.artistId,Q=o?.dataset.projectId,Z=Q?Xt(Q):void 0;function Xt(t){return!t||t.startsWith("release_")||t.startsWith("merch_")||t.startsWith("link_")||t.startsWith("custom_")?t:`custom_${t}`}let tt=o?.dataset.emulator==="true",et=parseInt(o?.dataset.heartbeatInterval||"120000",10),bt=o?.dataset.heartbeat!=="false",vt=o?.dataset.source,_t=o?.dataset.endpoint,f=window.__artistPixelConfig||{},O=o?.dataset.metaPixelId||f.metaPixelId,T=o?.dataset.tiktokPixelId||f.tiktokPixelId,p=o?.dataset.googleAdsId||f.googleAdsId,kt=o?.dataset.googleAdsConversionLabel||f.googleAdsConversionLabel,j=o?.dataset.googleTagManagerId||f.googleTagManagerId,h=o?.dataset.googleAnalyticsId||f.googleAnalyticsId,w={pageview:(o?.dataset.forwardPageview??f.forwardPageview)!=="false",purchase:(o?.dataset.forwardPurchase??f.forwardPurchase)!=="false",addToCart:(o?.dataset.forwardAddToCart??f.forwardAddToCart)!=="false",lead:(o?.dataset.forwardLead??f.forwardLead)!=="false",viewContent:(o?.dataset.forwardViewContent??f.forwardViewContent)!=="false",initiateCheckout:(o?.dataset.forwardInitiateCheckout??f.forwardInitiateCheckout)!=="false",completeRegistration:(o?.dataset.forwardCompleteRegistration??f.forwardCompleteRegistration)!=="false",subscribe:(o?.dataset.forwardSubscribe??f.forwardSubscribe)!=="false",search:(o?.dataset.forwardSearch??f.forwardSearch)!=="false",contact:(o?.dataset.forwardContact??f.forwardContact)!=="false",custom:(o?.dataset.forwardCustom||f.forwardCustom||"").split(",").filter(Boolean)},q=!!(O||T||p||j||h),nt=o?.dataset.consentUi==="true",Qt=o?.dataset.consentStyle||"brutalist",Zt=o?.dataset.primaryColor,te=o?.dataset.bannerPosition||"bottom",It=o?.dataset.excludePages?.split(",").filter(Boolean)||[],xt=o?.dataset.trackFileDownloads==="true",ee=o?.dataset.hashRouting==="true";function ne(){if(vt)return vt;let t=typeof window.dataLayer<"u"&&Array.isArray(window.dataLayer),e=typeof window.gtag=="function";return t&&e?"gtm":"pixel"}let Y="pixel";if(!M){S(" Error: data-artist-id attribute is required");return}let Ct="session_id",at="session_timestamp",St="attribution",y="fan_id_hash",F="visitor_id",J="artistPixel_consent",ae=365*24*60*60*1e3,ie=30*24*60*60*1e3,oe=60*60*1e3,m="balance_";function re(t){let e=t.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp("^"+e+"$")}function se(t){if(It.length===0)return!1;try{let e=new URL(t,window.location.origin).pathname;return It.some(n=>re(n).test(e))}catch{return!1}}let ce=[".pdf",".zip",".tar",".gz",".rar",".7z",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".mp3",".wav",".flac",".aac",".ogg",".mp4",".mov",".avi",".mkv",".webm",".exe",".dmg",".pkg",".deb",".rpm",".csv",".json",".xml",".txt"];function Pt(t){try{let e=new URL(t,window.location.origin).pathname.toLowerCase();return ce.some(n=>e.endsWith(n))}catch{return!1}}function de(t,e){try{let i=new URL(t,window.location.origin).pathname.split("/").pop()||"unknown",c=i.includes(".")?i.split(".").pop():"unknown";a("File download tracked:",{url:t,fileName:i,fileExtension:c});let d=P({event_name:"custom",metadata:{event_type:"file_download",file_url:t,file_name:i,file_extension:c,link_text:e?.textContent?.trim().substring(0,100)||""}});I(d)}catch(n){S("Failed to track file download:",n)}}let le="https://e.os.xyz",Et="https://us-central1-artist-os-distro.cloudfunctions.net/ingestEvents",ge="https://us-central1-artist-os-distro.cloudfunctions.net/identityHashIdentity",L=_t||(tt?"http://localhost:5001/artist-os-distro/us-central1/ingestEvents":le),U=null,b=null,g=null,H=!1,l=null,A={},it={},v=[],ot=null,_="session",R=null,rt=0,st=0,D=0,N=!0,ct=0,dt=!1,ue=2*60*1e3,Tt=Date.now(),z=!1,lt={base:`
2
2
  :host {
3
3
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
4
4
  position: fixed;
@@ -83,11 +83,11 @@ var ArtistPixel=(()=>{var qe=Object.defineProperty;var Ne=(v,i,x)=>i in v?qe(v,i
83
83
  }
84
84
  .btn.accept { background: #fff; color: #000; border-color: #fff; }
85
85
  .btn:hover { opacity: 0.8; }
86
- `};class ue{constructor(e){J(this,"container",null);J(this,"shadow",null);J(this,"config");if(this.config=e,this.hasStoredConsent()){a("ConsentManager: Consent already exists, not showing banner");return}this.container=document.createElement("div"),this.container.id="artistPixel-consent-manager",this.shadow=this.container.attachShadow({mode:"closed"}),this.render(),document.body.appendChild(this.container),a("ConsentManager: Banner rendered")}hasStoredConsent(){try{return window._balanceConsentNeedsRefresh?!1:localStorage.getItem(B)!==null}catch{return!1}}render(){if(!this.shadow)return;let e=this.config.style||"brutalist",n=dt.base,o=dt[e]||dt.brutalist,c=this.config.position==="top"?"top: 0;":"bottom: 0;",d=this.config.primaryColor?`.btn.accept { background: ${this.config.primaryColor} !important; border-color: ${this.config.primaryColor} !important; color: #fff !important; }`:"";this.shadow.innerHTML=`
86
+ `};class fe{constructor(e){X(this,"container",null);X(this,"shadow",null);X(this,"config");if(this.config=e,this.hasStoredConsent()){a("ConsentManager: Consent already exists, not showing banner");return}this.container=document.createElement("div"),this.container.id="artistPixel-consent-manager",this.shadow=this.container.attachShadow({mode:"closed"}),this.render(),document.body.appendChild(this.container),a("ConsentManager: Banner rendered")}hasStoredConsent(){try{return window._balanceConsentNeedsRefresh?!1:localStorage.getItem(J)!==null}catch{return!1}}render(){if(!this.shadow)return;let e=this.config.style||"brutalist",n=lt.base,i=lt[e]||lt.brutalist,c=this.config.position==="top"?"top: 0;":"bottom: 0;",d=this.config.primaryColor?`.btn.accept { background: ${this.config.primaryColor} !important; border-color: ${this.config.primaryColor} !important; color: #fff !important; }`:"";this.shadow.innerHTML=`
87
87
  <style>
88
88
  ${n}
89
89
  :host { ${c} }
90
- ${o}
90
+ ${i}
91
91
  ${d}
92
92
  </style>
93
93
  <div class="banner" role="dialog" aria-label="Cookie consent" aria-modal="false">
@@ -99,4 +99,4 @@ var ArtistPixel=(()=>{var qe=Object.defineProperty;var Ne=(v,i,x)=>i in v?qe(v,i
99
99
  <button id="accept" class="btn accept">Accept</button>
100
100
  </div>
101
101
  </div>
102
- `,this.shadow.getElementById("accept")?.addEventListener("click",()=>this.handleConsent(!0)),this.shadow.getElementById("decline")?.addEventListener("click",()=>this.handleConsent(!1))}handleConsent(e){window.balance?.setConsent&&window.balance.setConsent({analytics:e,marketing:e,personalization:e,timestamp:new Date().toISOString()}),e&&!window._balanceInitialPageviewFired&&(window._balanceInitialPageviewFired=!0,window.balance?.page&&window.balance.page(),ft(),a("Initial pageview fired after consent granted")),this.remove()}remove(){this.container&&(this.container.remove(),this.container=null,this.shadow=null,a("ConsentManager: Banner removed"))}}let Tt=!1,H=!1;function fe(){if(!O)return;if(window.fbq){a("[Platform:Meta] Already loaded, skipping");return}a("[Platform:Meta] Injecting pixel:",O);let t=function(...n){t.callMethod?t.callMethod.apply(t,n):t.queue.push(n)};window._fbq||(window._fbq=t),t.push=t,t.loaded=!0,t.version="2.0",t.queue=[],window.fbq=t;let e=document.createElement("script");e.async=!0,e.src="https://connect.facebook.net/en_US/fbevents.js",e.onload=()=>{window.fbq("init",O),m.pageview&&window.fbq("track","PageView"),a("[Platform:Meta] Initialized and PageView tracked")},document.head.appendChild(e)}function me(){if(!T)return;if(window.ttq?._i?.[T]){a("[Platform:TikTok] Already loaded, skipping");return}a("[Platform:TikTok] Injecting pixel:",T);let t=window,e="ttq";t.TiktokAnalyticsObject=e;let n=t[e]=t[e]||[];n.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie","holdConsent","revokeConsent","grantConsent"],n.setAndDefer=function(o,c){o[c]=function(...d){o.push([c].concat(d))}};for(let o=0;o<n.methods.length;o++)n.setAndDefer(n,n.methods[o]);n.instance=function(o){let c=n._i[o]||[];for(let d=0;d<n.methods.length;d++)n.setAndDefer(c,n.methods[d]);return c},n.load=function(o){let c="https://analytics.tiktok.com/i18n/pixel/events.js";n._i=n._i||{},n._i[o]=[],n._i[o]._u=c,n._t=n._t||{},n._t[o]=+new Date,n._o=n._o||{};let d=document.createElement("script");d.type="text/javascript",d.async=!0,d.src=c+"?sdkid="+o+"&lib="+e,document.head.appendChild(d)},n.load(T),m.pageview&&n.page(),a("[Platform:TikTok] Initialized and page() tracked")}function we(){if(!p)return;if(window.dataLayer=window.dataLayer||[],typeof window.gtag!="function"&&(window.gtag=function(...e){window.dataLayer.push(e)}),document.querySelector('script[src*="googletagmanager.com/gtag/js"]')){a("[Platform:GoogleAds] gtag.js already loaded, configuring"),window.gtag("config",p);return}a("[Platform:GoogleAds] Injecting gtag:",p),window.gtag("consent","default",{ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted",analytics_storage:"granted"});let t=document.createElement("script");t.async=!0,t.src=`https://www.googletagmanager.com/gtag/js?id=${p}`,t.onload=()=>{window.gtag("js",new Date),window.gtag("config",p),a("[Platform:GoogleAds] Initialized")},document.head.appendChild(t)}function pe(){if(!j)return;if(document.querySelector(`script[src*="googletagmanager.com/gtm.js?id=${j}"]`)){a("[Platform:GTM] Already loaded, skipping");return}a("[Platform:GTM] Injecting GTM:",j),window.dataLayer=window.dataLayer||[],typeof window.gtag!="function"&&(window.gtag=function(...n){window.dataLayer.push(n)});let t=H?"granted":"denied";window.gtag("consent","default",{ad_storage:t,ad_user_data:t,ad_personalization:t,analytics_storage:t}),window.gtag("set","wait_for_update",500),window.dataLayer.push({"gtm.start":new Date().getTime(),event:"gtm.js"});let e=document.createElement("script");e.async=!0,e.src=`https://www.googletagmanager.com/gtm.js?id=${j}`,e.onload=()=>{a("[Platform:GTM] Initialized")},document.head.appendChild(e)}function he(){if(!h)return;let t=document.querySelector('script[src*="googletagmanager.com/gtag/js"]');window.dataLayer=window.dataLayer||[],typeof window.gtag!="function"&&(window.gtag=function(...o){window.dataLayer.push(o)});let e=H?"granted":"denied";if(window.gtag("consent","default",{ad_storage:e,ad_user_data:e,ad_personalization:e,analytics_storage:e}),t){a("[Platform:GA4] gtag.js already loaded, configuring"),window.gtag("config",h,{send_page_view:!1});return}a("[Platform:GA4] Injecting gtag:",h);let n=document.createElement("script");n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${h}`,n.onload=()=>{window.gtag("js",new Date),window.gtag("config",h,{send_page_view:!1}),a("[Platform:GA4] Initialized")},document.head.appendChild(n)}function ye(){if(U){if(Tt){a("[Platform] Already loaded, skipping");return}if(!H){a("[Platform] Marketing consent not granted, deferring");return}a("[Platform] Injecting platform pixels (consent granted)"),Tt=!0,fe(),me(),we(),pe(),he()}}function Lt(t){if(H=t,a("[Platform] Marketing consent:",t?"granted":"denied"),t&&ye(),window.ttq&&(t?window.ttq.grantConsent?.():window.ttq.revokeConsent?.()),typeof window.gtag=="function"){let e=t?"granted":"denied";window.gtag("consent","update",{ad_storage:e,ad_user_data:e,ad_personalization:e,analytics_storage:e})}}function lt(t){if(!U||!H)return!1;let e=t.toLowerCase();return e==="pageview"||e==="page_view"?m.pageview:e==="purchase"?m.purchase:e==="addtocart"||e==="add_to_cart"?m.addToCart:e==="lead"||e==="form_submit"?m.lead:e==="viewcontent"||e==="view_content"?m.viewContent:e==="initiatecheckout"||e==="initiate_checkout"?m.initiateCheckout:e==="completeregistration"||e==="complete_registration"?m.completeRegistration:e==="subscribe"?m.subscribe:e==="search"?m.search:e==="contact"?m.contact:m.custom.length>0?m.custom.some(n=>n.toLowerCase()===e):!1}function be(){lt("pageview")&&(a("[Platform] Forwarding PageView"),window.fbq&&window.fbq("track","PageView"),window.ttq&&window.ttq.page(),typeof window.gtag=="function"&&h&&window.gtag("event","page_view",{send_to:h}))}function ve(t,e,n){if(lt("purchase")){if(a("[Platform] Forwarding Purchase:",t,e),window.fbq&&window.fbq("track","Purchase",{value:t,currency:e,content_ids:n?.contentIds,content_type:n?.contentType||"product",order_id:n?.transactionId}),window.ttq&&window.ttq.track("CompletePayment",{value:t,currency:e,order_id:n?.transactionId}),typeof window.gtag=="function"&&p){let o=_t?`${p}/${_t}`:p;window.gtag("event","conversion",{send_to:o,value:t,currency:e,transaction_id:n?.transactionId}),window.gtag("event","purchase",{send_to:p,value:t,currency:e,transaction_id:n?.transactionId})}typeof window.gtag=="function"&&h&&window.gtag("event","purchase",{send_to:h,value:t,currency:e,transaction_id:n?.transactionId,items:n?.items})}}function _e(t,e){if(!lt(t))return;let n=t.toLowerCase();a("[Platform] Forwarding custom event:",t);let o={addtocart:"AddToCart",add_to_cart:"AddToCart",lead:"Lead",form_submit:"Lead",viewcontent:"ViewContent",view_content:"ViewContent",search:"Search",subscribe:"Subscribe",contact:"Contact",completeregistration:"CompleteRegistration",complete_registration:"CompleteRegistration",initiatecheckout:"InitiateCheckout",initiate_checkout:"InitiateCheckout"},c={addtocart:"AddToCart",add_to_cart:"AddToCart",lead:"SubmitForm",form_submit:"SubmitForm",viewcontent:"ViewContent",view_content:"ViewContent",search:"Search",subscribe:"Subscribe",contact:"Contact",completeregistration:"CompleteRegistration",complete_registration:"CompleteRegistration",initiatecheckout:"InitiateCheckout",initiate_checkout:"InitiateCheckout"},d={addtocart:"add_to_cart",add_to_cart:"add_to_cart",lead:"generate_lead",form_submit:"generate_lead",viewcontent:"view_item",view_content:"view_item",search:"search",subscribe:"subscribe",contact:"contact",completeregistration:"sign_up",complete_registration:"sign_up",initiatecheckout:"begin_checkout",initiate_checkout:"begin_checkout"};if(window.fbq){let s=o[n];s?window.fbq("track",s,e):window.fbq("trackCustom",t,e)}if(window.ttq){let s=c[n]||t;window.ttq.track(s,e)}if(typeof window.gtag=="function"&&p){let s=d[n]||t;window.gtag("event",s,{send_to:p,...e})}if(typeof window.gtag=="function"&&h){let s=d[n]||t;window.gtag("event",s,{send_to:h,...e})}}function At(){try{return k==="local"?localStorage:sessionStorage}catch{return null}}function W(t){let e=At();if(!e)return null;try{let n=w+t,o=e.getItem(n);if(!o&&k==="session")try{o=localStorage.getItem(n)}catch{}return o}catch{return null}}function E(t,e){let n=At();if(n)try{n.setItem(w+t,e)}catch{}}function Rt(){if(k!=="local"){a("Upgrading storage tier: session -> local");try{let t=[];for(let e=0;e<sessionStorage.length;e++){let n=sessionStorage.key(e);n?.startsWith(w)&&t.push(n)}for(let e of t){let n=sessionStorage.getItem(e);n&&localStorage.setItem(e,n)}for(let e of t)sessionStorage.removeItem(e);k="local",a(`Storage tier upgraded, migrated ${t.length} items`)}catch(t){C(" Storage migration failed:",t)}}}function Y(){return crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let e=Math.random()*16|0;return(t==="x"?e:e&3|8).toString(16)})}function ke(){try{let t=W(xt),e=W(et);if(t&&e&&Date.now()-parseInt(e,10)<oe)return E(et,Date.now().toString()),t;let n=Y();return E(xt,n),E(et,Date.now().toString()),n}catch{return Y()}}function Ie(){let t=new URLSearchParams(window.location.search),e={};return["source","medium","campaign","content","term"].forEach(n=>{let o=t.get(`utm_${n}`);o&&(e[`utm_${n}`]=o)}),e}function xe(){try{let t=W(Ct);if(t){A=JSON.parse(t),a("Loaded attribution:",A);return}let e=Ie();Object.keys(e).length>0&&(A=e,E(Ct,JSON.stringify(e)),a("Captured attribution:",A))}catch{}}function Ce(){try{if(l?.analytics!==!0){a("Skipping fan ID load - no analytics consent");return}g=localStorage.getItem(w+y),g&&a("Loaded fan ID hash:",g.substring(0,16)+"...")}catch{if(l?.analytics===!0)try{g=W(y)}catch{}}}function gt(){try{let t=localStorage.getItem(w+nt);if(t)return t;let e=Y();return localStorage.setItem(w+nt,e),a("Created persistent visitor ID:",e.substring(0,8)+"..."),e}catch{return a("localStorage unavailable, using session ID as fallback"),F||Y()}}function Se(){try{b=localStorage.getItem(w+nt),b&&a("Loaded visitor ID:",b.substring(0,8)+"...")}catch{}}function Pe(){try{let t=localStorage.getItem(B);if(t){let e=JSON.parse(t);if(e.expiresAt&&Date.now()>e.expiresAt){a("Consent expired - clearing stored consent"),localStorage.removeItem(B),l=null;return}if(e.expiresAt){let n=e.expiresAt-Date.now();n>0&&n<ae&&(a("Consent nearing expiration - will prompt for refresh"),window._balanceConsentNeedsRefresh=!0)}l=e.preferences||null,a("Loaded consent:",l)}}catch{}}function Dt(t){let e=l;l=t;try{let o={preferences:t,method:"explicit",version:1,expiresAt:Date.now()+ne};localStorage.setItem(B,JSON.stringify(o)),a("Consent saved with TTL:",t),window._balanceConsentNeedsRefresh=!1}catch(o){C(" Could not save consent:",o)}if(t.analytics===!0&&(Rt(),b||(b=gt()),g))try{localStorage.setItem(w+y,g),a("Fan ID hash persisted after consent granted")}catch{E(y,g)}if(t.analytics!==!0){try{localStorage.removeItem(w+y)}catch{}try{sessionStorage.removeItem(w+y)}catch{}g=null,a("Fan ID hash cleared from storage and memory (consent revoked)")}let n=S({event_name:"consent_updated",metadata:{consent_preferences:t,consent_method:"explicit",previous_consent:e||void 0}});P(n);try{window.dispatchEvent(new CustomEvent("artistPixel:consent:updated",{detail:t})),a("DOM event artistPixel:consent:updated dispatched")}catch{}U&&Lt(t.marketing===!0)}function Ee(){return l}function Te(t){return l?.[t]===!0}function Le(t){for(let[e,n]of Object.entries(t))try{let o=Mt(e);at[o]=n}catch{at[e]=n}a("Registered",Object.keys(t).length,"links for tracking enrichment")}function Mt(t){try{let e=new URL(t);return`${e.protocol}//${e.host}${e.pathname}${e.search}`}catch{return t}}function Ae(t){let e=Mt(t);return at[e]||null}async function Re(t){let e=t.toLowerCase().trim(),o=new TextEncoder().encode(e),c=await crypto.subtle.digest("SHA-256",o);return Array.from(new Uint8Array(c)).map(s=>s.toString(16).padStart(2,"0")).join("")}async function De(t){if(!M)return null;try{let e=await fetch(le,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({data:{email:t.toLowerCase().trim(),artistId:M}})});if(!e.ok)return a("hashIdentity endpoint failed:",e.status),null;let n=await e.json();return{hash:n.result.fanIdHash,version:n.result.hashVersion}}catch(e){return a("hashIdentity endpoint error:",e),null}}function S(t){let e=Jt(),n={artist_id:M,fan_session_id:F,visitor_id:b||gt(),fan_id_hash:g||void 0,timestamp:new Date().toISOString(),source_url:window.location.href,referrer_url:document.referrer||void 0,user_agent:navigator.userAgent,device_type:e.device_type,browser:e.browser,os:e.os,tracking_source:G,...t,...A};return X&&!t.projectId&&(n.projectId=X),n}function P(t){_.push(t),a("Event queued:",t.event_name,"(queue:",_.length,")"),_.length>=10&&z()}async function z(){if(_.length===0)return;let t=[..._];_=[],a("Flushing",t.length,"events to",L);try{let e=await fetch(L,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({events:t}),keepalive:!0});if(!e.ok)throw new Error(`HTTP ${e.status}`);a("Events sent successfully")}catch(e){if(C(" Failed to send events, trying fallback:",e),L!==Pt&&!Q)try{if((await fetch(Pt,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({events:t}),keepalive:!0})).ok){a("Events sent via fallback (no geo)");return}}catch(n){C(" Fallback also failed:",n)}_.length<50&&_.push(...t)}}function Me(){ot&&clearInterval(ot),ot=window.setInterval(()=>{_.length>0&&z()},5e3)}function ut(){D||(it=Date.now()),D=Date.now(),q=!0,a("Active time tracking started/resumed")}function Ot(){D&&q&&(rt+=Date.now()-D),q=!1,a("Active time tracking paused, accumulated:",rt,"ms")}function jt(){let t=rt;return q&&D&&(t+=Date.now()-D),t}function Oe(){Et=Date.now(),N&&(N=!1,ut(),a("User returned from idle"))}function je(){if(document.visibilityState==="hidden"){a("Skipping heartbeat - tab hidden");return}if(Date.now()-Et>ge){N||(N=!0,Ot(),a("User idle - pausing heartbeat"));return}let t=jt(),e=Math.round(t/1e3),n=S({event_name:"engagement_heartbeat",metadata:{time_on_page_seconds:e,time_on_page_ms:t,heartbeat_interval_ms:Z,is_active:q&&!N}});P(n),st++,a("Heartbeat sent:",e,"seconds active")}function ft(){if(!yt){a('Heartbeat disabled via data-heartbeat="false"');return}R&&clearInterval(R),ut(),R=window.setInterval(()=>{je()},Z),a("Heartbeat started with interval:",Z,"ms")}function mt(){if(!ct){if(ct=!0,R&&(clearInterval(R),R=null),yt){let t=it?Date.now()-it:0,e=jt(),n=S({event_name:"engagement_summary",metadata:{total_time_ms:t,active_time_ms:e,heartbeat_samples:st,page_path:window.location.pathname}});if(navigator.sendBeacon&&L){let o=JSON.stringify({events:[n]});navigator.sendBeacon(L,o),a("Engagement summary sent via sendBeacon:",Math.round(e/1e3),"seconds active")}else P(n),a("Engagement summary enqueued:",Math.round(e/1e3),"seconds active")}st=0}}function $(t={}){let e=t.url||window.location.href;if(re(e)){a("Page excluded from tracking:",e);return}let n=S({event_name:"pageview",page_title:t.title||document.title,source_url:e});P(n),be()}function wt(t,e={}){let n=S({event_name:"custom",metadata:{event_type:t,...e}});P(n),_e(t,e)}async function Ut(t,e={}){try{if(l?.analytics!==!0){a("identify() skipped - no analytics consent");return}let n=1,o=await De(t);if(o?(g=o.hash,n=o.version,a("identify() using server HMAC hash (v2)")):(g=await Re(t),a("identify() using local SHA256 hash (v1 fallback)")),l?.analytics===!0&&Rt(),l?.analytics===!0)try{localStorage.setItem(w+y,g)}catch{E(y,g)}let c=t.split("@"),d=c[0].charAt(0)+"***@"+(c[1]||"");a("Fan identified:",{name:e.name||"(no name)",email:d,hash:g.substring(0,16)+"...",hashVersion:n,traits:e,storageTier:k});let s=S({event_name:"identify",fan_id_hash:g,metadata:{email:t.toLowerCase().trim(),email_sha256:g,email_display:d,hash_version:n,traits:e,consent_preferences:l||void 0,storage_tier:k}});P(s)}catch(n){C(" Failed to identify:",n)}}function Ue(t){if(!t||typeof t!="string"){C("setFanIdHash: invalid hash provided");return}if(g=t,l?.analytics===!0)try{localStorage.setItem(w+y,t),a("Fan ID hash persisted:",t.substring(0,16)+"...")}catch{E(y,t)}else a("Fan ID hash set (memory only - no consent):",t.substring(0,16)+"...")}function Ft(t,e="USD",n={}){let o=S({event_name:"purchase",metadata:{revenue:t,currency:e,...n}});P(o),ve(t,e,n)}function qt(){if(G=ee(),a("Tracking source detected:",G),Pe(),l?.analytics!==!0){try{localStorage.removeItem(w+y)}catch{}try{sessionStorage.removeItem(w+y)}catch{}}l?.analytics===!0?(k="local",a("Storage tier: local (analytics consent granted)")):(k="session",a("Storage tier: session (privacy by default)")),F=ke(),Ce(),Se(),b||(b=gt()),l||a(tt?"Consent UI enabled, waiting for explicit user consent (Tier 0 mode)":"No consent - operating in privacy-first mode (session storage only, limited tracking)"),U&&l?.marketing===!0?(a("[Platform] Marketing consent already granted, initializing platform pixels"),Lt(!0)):U&&a("[Platform] Platform pixels configured:",{meta:O||"(none)",tiktok:T||"(none)",googleAds:p||"(none)"}),xe(),Me(),a("Initialized",{artistId:M,projectId:X||"(none - will track to all projects)",rawProjectId:K||"(none)",sessionId:F,visitorId:b?b.substring(0,8)+"...":null,fanIdHash:g,consent:l,storageTier:k,trackingSource:G,useEmulator:Q,endpoint:L}),l?.analytics===!0?(window._balanceInitialPageviewFired=!0,$(),ft(),a("Full tracking enabled (user consented)")):tt?a("Tracking dormant - waiting for explicit consent via ConsentManager"):(window._balanceInitialPageviewFired=!0,$(),ft(),a("Privacy-first tracking enabled (session-scoped, visitor_id for deduplication)")),["mousemove","keydown","scroll","touchstart"].forEach(s=>{document.addEventListener(s,Oe,{passive:!0})});let t=window.location.hostname;function e(s){try{let r=new URL(s).hostname.toLowerCase();return r.includes("spotify")?"spotify":r.includes("apple")||r.includes("music.apple")?"apple_music":r.includes("youtube")||r.includes("youtu.be")?"youtube":r.includes("soundcloud")?"soundcloud":r.includes("tidal")?"tidal":r.includes("deezer")?"deezer":r.includes("amazon")||r.includes("music.amazon")?"amazon_music":r.includes("bandcamp")?"bandcamp":r.includes("lnk.to")||r.includes("linkfire")?"linkfire":r.includes("linktr.ee")?"linktree":r.includes("shop")||r.includes("store")||r.includes("merch")?"shop":r.includes("ticketmaster")||r.includes("eventbrite")||r.includes("dice.fm")?"tickets":r.includes("instagram")?"instagram":r.includes("twitter")||r.includes("x.com")?"twitter":r.includes("tiktok")?"tiktok":r.includes("facebook")?"facebook":"external"}catch{return"external"}}function n(s){try{return new URL(s,window.location.origin).hostname!==t}catch{return!1}}function o(s,r){let u=e(s),I=Ae(s),Vt=I?.title||r?.textContent?.trim().substring(0,100)||"",Gt=I?.id||r?.id||r?.getAttribute("data-link-id")||void 0,Bt=I?.category;a("External link clicked:",{url:s,platform:u,linkText:Vt,linkId:Gt,fromRegistry:!!I}),wt("page_link_click",{link_url:s,link_text:Vt,link_id:Gt,platform:u,link_type:"external",...Bt&&{link_category:Bt},...I&&Object.fromEntries(Object.entries(I).filter(([ht])=>!["title","id","category"].includes(ht)).map(([ht,Fe])=>[`link_${ht}`,Fe]))})}let c=window.open;if(window.open=function(s,r,u){if(s){let I=s.toString();n(I)&&o(I)}return c.call(window,s,r,u)},a("window.open interception enabled (always on)"),i?.dataset.autoTrackLinks==="true"&&(document.addEventListener("click",s=>{let u=s.target.closest("a");if(u&&u.href&&n(u.href)){if(It&&(St(u.href)||u.hasAttribute("download")))return;o(u.href,u)}},{capture:!0,passive:!0}),a("External link click listener enabled (opt-in)")),It&&(document.addEventListener("click",s=>{let u=s.target.closest("a");u?.href&&(St(u.href)||u.hasAttribute("download"))&&ce(u.href,u)},{capture:!0,passive:!0}),a("File download tracking enabled")),te){let s=window.location.href;window.addEventListener("hashchange",()=>{let r=window.location.href;r!==s&&(s=r,setTimeout(()=>{$({title:document.title,url:r})},0))}),a("Hash routing tracking enabled")}document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?(Ot(),mt(),z()):(ut(),ct=!1)}),window.addEventListener("pagehide",()=>{mt(),z()}),window.addEventListener("beforeunload",()=>{mt(),z()})}if(window.balance?._version&&window.balance._version!==v){console.warn(`[artistPixel] Version conflict: ${window.balance._version} already loaded, skipping ${v}`);return}let pt=window.balance?.q||[];function Nt(){if(pt.length>0){a("Processing",pt.length,"queued commands");for(let t of pt){let[e,...n]=t;switch(e){case"track":wt(n[0],n[1]);break;case"identify":Ut(n[0],n[1]);break;case"page":$(n[0]);break;case"purchase":Ft(n[0],n[1],n[2]);break;case"setConsent":Dt(n[0]);break;default:a("Unknown queued command:",e)}}}}let Ht={track:wt,identify:Ut,page:$,purchase:Ft,getSessionId:()=>F,getVisitorId:()=>b,getFanIdHash:()=>g,setFanIdHash:Ue,getAttribution:()=>A,setConsent:Dt,getConsent:Ee,hasConsent:Te,registerLinks:Le,_version:v};window.artistPixel=Ht,window.balance=Ht;function zt(){tt&&!l&&new ue({style:Xt,primaryColor:Qt,position:Zt})}let $t=window.requestIdleCallback||(t=>setTimeout(t,1));document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{qt(),Nt(),$t(()=>zt())}):(qt(),Nt(),$t(()=>zt())),a("Pixel script loaded")})();})();
102
+ `,this.shadow.getElementById("accept")?.addEventListener("click",()=>this.handleConsent(!0)),this.shadow.getElementById("decline")?.addEventListener("click",()=>this.handleConsent(!1))}handleConsent(e){window.balance?.setConsent&&window.balance.setConsent({analytics:e,marketing:e,personalization:e,timestamp:new Date().toISOString()}),e&&!window._balanceInitialPageviewFired&&(window._balanceInitialPageviewFired=!0,window.balance?.page&&window.balance.page(),mt(),a("Initial pageview fired after consent granted")),this.remove()}remove(){this.container&&(this.container.remove(),this.container=null,this.shadow=null,a("ConsentManager: Banner removed"))}}let Lt=!1,$=!1;function me(){if(!O)return;if(window.fbq){a("[Platform:Meta] Already loaded, skipping");return}a("[Platform:Meta] Injecting pixel:",O);let t=function(...n){t.callMethod?t.callMethod.apply(t,n):t.queue.push(n)};window._fbq||(window._fbq=t),t.push=t,t.loaded=!0,t.version="2.0",t.queue=[],window.fbq=t;let e=document.createElement("script");e.async=!0,e.src="https://connect.facebook.net/en_US/fbevents.js",e.onload=()=>{window.fbq("init",O),w.pageview&&window.fbq("track","PageView"),a("[Platform:Meta] Initialized and PageView tracked")},document.head.appendChild(e)}function we(){if(!T)return;if(window.ttq?._i?.[T]){a("[Platform:TikTok] Already loaded, skipping");return}a("[Platform:TikTok] Injecting pixel:",T);let t=window,e="ttq";t.TiktokAnalyticsObject=e;let n=t[e]=t[e]||[];n.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie","holdConsent","revokeConsent","grantConsent"],n.setAndDefer=function(i,c){i[c]=function(...d){i.push([c].concat(d))}};for(let i=0;i<n.methods.length;i++)n.setAndDefer(n,n.methods[i]);n.instance=function(i){let c=n._i[i]||[];for(let d=0;d<n.methods.length;d++)n.setAndDefer(c,n.methods[d]);return c},n.load=function(i){let c="https://analytics.tiktok.com/i18n/pixel/events.js";n._i=n._i||{},n._i[i]=[],n._i[i]._u=c,n._t=n._t||{},n._t[i]=+new Date,n._o=n._o||{};let d=document.createElement("script");d.type="text/javascript",d.async=!0,d.src=c+"?sdkid="+i+"&lib="+e,document.head.appendChild(d)},n.load(T),w.pageview&&n.page(),a("[Platform:TikTok] Initialized and page() tracked")}function pe(){if(!p)return;if(window.dataLayer=window.dataLayer||[],typeof window.gtag!="function"&&(window.gtag=function(...e){window.dataLayer.push(e)}),document.querySelector('script[src*="googletagmanager.com/gtag/js"]')){a("[Platform:GoogleAds] gtag.js already loaded, configuring"),window.gtag("config",p);return}a("[Platform:GoogleAds] Injecting gtag:",p),window.gtag("consent","default",{ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted",analytics_storage:"granted"});let t=document.createElement("script");t.async=!0,t.src=`https://www.googletagmanager.com/gtag/js?id=${p}`,t.onload=()=>{window.gtag("js",new Date),window.gtag("config",p),a("[Platform:GoogleAds] Initialized")},document.head.appendChild(t)}function he(){if(!j)return;if(document.querySelector(`script[src*="googletagmanager.com/gtm.js?id=${j}"]`)){a("[Platform:GTM] Already loaded, skipping");return}a("[Platform:GTM] Injecting GTM:",j),window.dataLayer=window.dataLayer||[],typeof window.gtag!="function"&&(window.gtag=function(...n){window.dataLayer.push(n)});let t=$?"granted":"denied";window.gtag("consent","default",{ad_storage:t,ad_user_data:t,ad_personalization:t,analytics_storage:t}),window.gtag("set","wait_for_update",500),window.dataLayer.push({"gtm.start":new Date().getTime(),event:"gtm.js"});let e=document.createElement("script");e.async=!0,e.src=`https://www.googletagmanager.com/gtm.js?id=${j}`,e.onload=()=>{a("[Platform:GTM] Initialized")},document.head.appendChild(e)}function ye(){if(!h)return;let t=document.querySelector('script[src*="googletagmanager.com/gtag/js"]');window.dataLayer=window.dataLayer||[],typeof window.gtag!="function"&&(window.gtag=function(...i){window.dataLayer.push(i)});let e=$?"granted":"denied";if(window.gtag("consent","default",{ad_storage:e,ad_user_data:e,ad_personalization:e,analytics_storage:e}),t){a("[Platform:GA4] gtag.js already loaded, configuring"),window.gtag("config",h,{send_page_view:!1});return}a("[Platform:GA4] Injecting gtag:",h);let n=document.createElement("script");n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${h}`,n.onload=()=>{window.gtag("js",new Date),window.gtag("config",h,{send_page_view:!1}),a("[Platform:GA4] Initialized")},document.head.appendChild(n)}function be(){if(q){if(Lt){a("[Platform] Already loaded, skipping");return}if(!$){a("[Platform] Marketing consent not granted, deferring");return}a("[Platform] Injecting platform pixels (consent granted)"),Lt=!0,me(),we(),pe(),he(),ye()}}function At(t){if($=t,a("[Platform] Marketing consent:",t?"granted":"denied"),t&&be(),window.ttq&&(t?window.ttq.grantConsent?.():window.ttq.revokeConsent?.()),typeof window.gtag=="function"){let e=t?"granted":"denied";window.gtag("consent","update",{ad_storage:e,ad_user_data:e,ad_personalization:e,analytics_storage:e})}}function gt(t){if(!q||!$)return!1;let e=t.toLowerCase();return e==="pageview"||e==="page_view"?w.pageview:e==="purchase"?w.purchase:e==="addtocart"||e==="add_to_cart"?w.addToCart:e==="lead"||e==="form_submit"?w.lead:e==="viewcontent"||e==="view_content"?w.viewContent:e==="initiatecheckout"||e==="initiate_checkout"?w.initiateCheckout:e==="completeregistration"||e==="complete_registration"?w.completeRegistration:e==="subscribe"?w.subscribe:e==="search"?w.search:e==="contact"?w.contact:w.custom.length>0?w.custom.some(n=>n.toLowerCase()===e):!1}function ve(){gt("pageview")&&(a("[Platform] Forwarding PageView"),window.fbq&&window.fbq("track","PageView"),window.ttq&&window.ttq.page(),typeof window.gtag=="function"&&h&&window.gtag("event","page_view",{send_to:h}))}function _e(t,e,n){if(gt("purchase")){if(a("[Platform] Forwarding Purchase:",t,e),window.fbq&&window.fbq("track","Purchase",{value:t,currency:e,content_ids:n?.contentIds,content_type:n?.contentType||"product",order_id:n?.transactionId}),window.ttq&&window.ttq.track("CompletePayment",{value:t,currency:e,order_id:n?.transactionId}),typeof window.gtag=="function"&&p){let i=kt?`${p}/${kt}`:p;window.gtag("event","conversion",{send_to:i,value:t,currency:e,transaction_id:n?.transactionId}),window.gtag("event","purchase",{send_to:p,value:t,currency:e,transaction_id:n?.transactionId})}typeof window.gtag=="function"&&h&&window.gtag("event","purchase",{send_to:h,value:t,currency:e,transaction_id:n?.transactionId,items:n?.items})}}function ke(t,e){if(!gt(t))return;let n=t.toLowerCase();a("[Platform] Forwarding custom event:",t);let i={addtocart:"AddToCart",add_to_cart:"AddToCart",lead:"Lead",form_submit:"Lead",viewcontent:"ViewContent",view_content:"ViewContent",search:"Search",subscribe:"Subscribe",contact:"Contact",completeregistration:"CompleteRegistration",complete_registration:"CompleteRegistration",initiatecheckout:"InitiateCheckout",initiate_checkout:"InitiateCheckout"},c={addtocart:"AddToCart",add_to_cart:"AddToCart",lead:"SubmitForm",form_submit:"SubmitForm",viewcontent:"ViewContent",view_content:"ViewContent",search:"Search",subscribe:"Subscribe",contact:"Contact",completeregistration:"CompleteRegistration",complete_registration:"CompleteRegistration",initiatecheckout:"InitiateCheckout",initiate_checkout:"InitiateCheckout"},d={addtocart:"add_to_cart",add_to_cart:"add_to_cart",lead:"generate_lead",form_submit:"generate_lead",viewcontent:"view_item",view_content:"view_item",search:"search",subscribe:"subscribe",contact:"contact",completeregistration:"sign_up",complete_registration:"sign_up",initiatecheckout:"begin_checkout",initiate_checkout:"begin_checkout"};if(window.fbq){let s=i[n];s?window.fbq("track",s,e):window.fbq("trackCustom",t,e)}if(window.ttq){let s=c[n]||t;window.ttq.track(s,e)}if(typeof window.gtag=="function"&&p){let s=d[n]||t;window.gtag("event",s,{send_to:p,...e})}if(typeof window.gtag=="function"&&h){let s=d[n]||t;window.gtag("event",s,{send_to:h,...e})}}function Rt(){try{return _==="local"?localStorage:sessionStorage}catch{return null}}function K(t){let e=Rt();if(!e)return null;try{let n=m+t,i=e.getItem(n);if(!i&&_==="session")try{i=localStorage.getItem(n)}catch{}return i}catch{return null}}function E(t,e){let n=Rt();if(n)try{n.setItem(m+t,e)}catch{}}function Dt(){if(_!=="local"){a("Upgrading storage tier: session -> local");try{let t=[];for(let e=0;e<sessionStorage.length;e++){let n=sessionStorage.key(e);n?.startsWith(m)&&t.push(n)}for(let e of t){let n=sessionStorage.getItem(e);n&&localStorage.setItem(e,n)}for(let e of t)sessionStorage.removeItem(e);_="local",a(`Storage tier upgraded, migrated ${t.length} items`)}catch(t){S(" Storage migration failed:",t)}}}function V(){return crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let e=Math.random()*16|0;return(t==="x"?e:e&3|8).toString(16)})}function Ie(){try{let t=K(Ct),e=K(at);if(t&&e&&Date.now()-parseInt(e,10)<oe)return E(at,Date.now().toString()),t;let n=V();return E(Ct,n),E(at,Date.now().toString()),n}catch{return V()}}function xe(){let t=new URLSearchParams(window.location.search),e={};return["source","medium","campaign","content","term"].forEach(n=>{let i=t.get(`utm_${n}`);i&&(e[`utm_${n}`]=i)}),e}function Ce(){try{let t=K(St);if(t){A=JSON.parse(t),a("Loaded attribution:",A);return}let e=xe();Object.keys(e).length>0&&(A=e,E(St,JSON.stringify(e)),a("Captured attribution:",A))}catch{}}function Se(){try{if(l?.analytics!==!0){a("Skipping fan ID load - no analytics consent");return}g=localStorage.getItem(m+y),g&&a("Loaded fan ID hash:",g.substring(0,16)+"...")}catch{if(l?.analytics===!0)try{g=K(y)}catch{}}}function ut(){try{let t=_==="local",e=t?localStorage:sessionStorage,n=e.getItem(m+F);if(n)return n;let i=V();return e.setItem(m+F,i),a(t?"Created persistent visitor ID:":"Created session-only visitor ID:",i.substring(0,8)+"..."),i}catch{return a("Storage unavailable, using session ID as fallback"),U||V()}}function Pe(){try{_==="local"?b=localStorage.getItem(m+F):b=sessionStorage.getItem(m+F),b&&a("Loaded visitor ID:",b.substring(0,8)+"...")}catch{}}function Ee(){try{let t=localStorage.getItem(J);if(t){let e=JSON.parse(t);if(e.expiresAt&&Date.now()>e.expiresAt){a("Consent expired - clearing stored consent"),localStorage.removeItem(J),l=null;return}if(e.expiresAt){let n=e.expiresAt-Date.now();n>0&&n<ie&&(a("Consent nearing expiration - will prompt for refresh"),window._balanceConsentNeedsRefresh=!0)}l=e.preferences||null,a("Loaded consent:",l)}}catch{}}function Mt(t){let e=l;l=t;try{let i={preferences:t,method:"explicit",version:1,expiresAt:Date.now()+ae};localStorage.setItem(J,JSON.stringify(i)),a("Consent saved with TTL:",t),window._balanceConsentNeedsRefresh=!1}catch(i){S(" Could not save consent:",i)}if(t.analytics===!0&&(Dt(),b||(b=ut()),g))try{localStorage.setItem(m+y,g),a("Fan ID hash persisted after consent granted")}catch{E(y,g)}if(t.analytics!==!0){try{localStorage.removeItem(m+y)}catch{}try{sessionStorage.removeItem(m+y)}catch{}try{localStorage.removeItem(m+F)}catch{}g=null,H=!1;for(let i of v)i.fan_id_hash&&delete i.fan_id_hash,i.metadata?.email&&delete i.metadata.email,i.metadata?.email_sha256&&delete i.metadata.email_sha256,i.metadata?.email_display&&delete i.metadata.email_display;a("Fan ID hash cleared from storage and memory (consent revoked)"),a("Scrubbed identity data from",v.length,"queued events")}let n=P({event_name:"consent_updated",metadata:{consent_preferences:t,consent_method:"explicit",previous_consent:e||void 0}});I(n);try{window.dispatchEvent(new CustomEvent("artistPixel:consent:updated",{detail:t})),a("DOM event artistPixel:consent:updated dispatched")}catch{}q&&At(t.marketing===!0)}function Te(){return l}function Le(t){return l?.[t]===!0}function Ae(t){for(let[e,n]of Object.entries(t))try{let i=Ot(e);it[i]=n}catch{it[e]=n}a("Registered",Object.keys(t).length,"links for tracking enrichment")}function Ot(t){try{let e=new URL(t);return`${e.protocol}//${e.host}${e.pathname}${e.search}`}catch{return t}}function Re(t){let e=Ot(t);return it[e]||null}async function De(t){let e=t.toLowerCase().trim(),i=new TextEncoder().encode(e),c=await crypto.subtle.digest("SHA-256",i);return Array.from(new Uint8Array(c)).map(s=>s.toString(16).padStart(2,"0")).join("")}async function Me(t){if(!M)return null;try{let e=await fetch(ge,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({data:{email:t.toLowerCase().trim(),artistId:M}})});if(!e.ok)return a("hashIdentity endpoint failed:",e.status),null;let n=await e.json();return{hash:n.result.fanIdHash,version:n.result.hashVersion}}catch(e){return a("hashIdentity endpoint error:",e),null}}function P(t){let e=Kt(),n={event_id:V(),artist_id:M,fan_session_id:U,visitor_id:b||ut(),fan_id_hash:g||void 0,timestamp:new Date().toISOString(),source_url:window.location.href,referrer_url:document.referrer||void 0,user_agent:navigator.userAgent,device_type:e.device_type,browser:e.browser,os:e.os,tracking_source:Y,...t,...A};return Z&&!t.projectId&&(n.projectId=Z),n}function I(t){v.push(t),a("Event queued:",t.event_name,"(queue:",v.length,")"),v.length>=10&&G()}async function G(){if(v.length===0)return;let t=[...v];v=[],a("Flushing",t.length,"events to",L);try{let e=await fetch(L,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({events:t}),keepalive:!0});if(!e.ok)throw new Error(`HTTP ${e.status}`);a("Events sent successfully")}catch(e){if(S(" Failed to send events, trying fallback:",e),L!==Et&&!tt)try{if((await fetch(Et,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({events:t}),keepalive:!0})).ok){a("Events sent via fallback (no geo)");return}}catch(n){S(" Fallback also failed:",n)}v.length<50?v.push(...t):a("Event queue full, dropping",t.length,"events")}}function Oe(){ot&&clearInterval(ot),ot=window.setInterval(()=>{v.length>0&&G()},5e3)}function ft(){D||(rt=Date.now()),D=Date.now(),N=!0,a("Active time tracking started/resumed")}function jt(){D&&N&&(st+=Date.now()-D),N=!1,a("Active time tracking paused, accumulated:",st,"ms")}function qt(){let t=st;return N&&D&&(t+=Date.now()-D),t}function je(){Tt=Date.now(),z&&(z=!1,ft(),a("User returned from idle"))}function qe(){if(document.visibilityState==="hidden"){a("Skipping heartbeat - tab hidden");return}if(Date.now()-Tt>ue){z||(z=!0,jt(),a("User idle - pausing heartbeat"));return}let t=qt(),e=Math.round(t/1e3),n=P({event_name:"engagement_heartbeat",metadata:{time_on_page_seconds:e,time_on_page_ms:t,heartbeat_interval_ms:et,is_active:N&&!z}});I(n),ct++,a("Heartbeat sent:",e,"seconds active")}function mt(){if(!bt){a('Heartbeat disabled via data-heartbeat="false"');return}R&&clearInterval(R),ft(),R=window.setInterval(()=>{qe()},et),a("Heartbeat started with interval:",et,"ms")}function wt(){if(!dt){if(dt=!0,R&&(clearInterval(R),R=null),bt){let t=rt?Date.now()-rt:0,e=qt(),n=P({event_name:"engagement_summary",metadata:{total_time_ms:t,active_time_ms:e,heartbeat_samples:ct,page_path:window.location.pathname}});if(navigator.sendBeacon&&L){let i=JSON.stringify({events:[n]});navigator.sendBeacon(L,i)?a("Engagement summary sent via sendBeacon:",Math.round(e/1e3),"seconds active"):(I(n),a("sendBeacon failed, engagement summary enqueued:",Math.round(e/1e3),"seconds active"))}else I(n),a("Engagement summary enqueued:",Math.round(e/1e3),"seconds active")}ct=0}}function B(t={}){let e=t.url||window.location.href;if(se(e)){a("Page excluded from tracking:",e);return}let n=P({event_name:"pageview",page_title:t.title||document.title,source_url:e});I(n),ve()}function pt(t,e={}){let n=P({event_name:"custom",metadata:{event_type:t,...e}});I(n),ke(t,e)}async function Ft(t,e={}){try{if(l?.analytics!==!0){a("identify() skipped - no analytics consent");return}if(H){a("identify() already in progress, skipping");return}H=!0;let n=1,i=await Me(t);if(i?(g=i.hash,n=i.version,a("identify() using server HMAC hash (v2)")):(g=await De(t),a("identify() using local SHA256 hash (v1 fallback)")),l?.analytics===!0&&Dt(),l?.analytics===!0)try{localStorage.setItem(m+y,g)}catch{E(y,g)}let c=t.split("@"),d=c[0].charAt(0)+"***@"+(c[1]||"");a("Fan identified:",{name:e.name||"(no name)",email:d,hash:g.substring(0,16)+"...",hashVersion:n,traits:e,storageTier:_});let s=P({event_name:"identify",fan_id_hash:g,metadata:{email:t.toLowerCase().trim(),email_sha256:g,email_display:d,hash_version:n,traits:e,consent_preferences:l||void 0,storage_tier:_}});I(s)}catch(n){S(" Failed to identify:",n)}finally{H=!1}}function Fe(t){if(!t||typeof t!="string"){S("setFanIdHash: invalid hash provided");return}if(H){a("setFanIdHash() skipped - identify() in progress");return}if(g=t,l?.analytics===!0)try{localStorage.setItem(m+y,t),a("Fan ID hash persisted:",t.substring(0,16)+"...")}catch{E(y,t)}else a("Fan ID hash set (memory only - no consent):",t.substring(0,16)+"...")}function Ut(t,e="USD",n={}){let i=P({event_name:"purchase",metadata:{revenue:t,currency:e,...n}});I(i),_e(t,e,n)}function Ht(){if(Y=ne(),a("Tracking source detected:",Y),Ee(),l?.analytics!==!0){try{localStorage.removeItem(m+y)}catch{}try{sessionStorage.removeItem(m+y)}catch{}}l?.analytics===!0?(_="local",a("Storage tier: local (analytics consent granted)")):(_="session",a("Storage tier: session (privacy by default)")),U=Ie(),Se(),Pe(),b||(b=ut()),l||a(nt?"Consent UI enabled, waiting for explicit user consent (Tier 0 mode)":"No consent - operating in privacy-first mode (session storage only, limited tracking)"),q&&l?.marketing===!0?(a("[Platform] Marketing consent already granted, initializing platform pixels"),At(!0)):q&&a("[Platform] Platform pixels configured:",{meta:O||"(none)",tiktok:T||"(none)",googleAds:p||"(none)"}),Ce(),Oe(),a("Initialized",{artistId:M,projectId:Z||"(none - will track to all projects)",rawProjectId:Q||"(none)",sessionId:U,visitorId:b?b.substring(0,8)+"...":null,fanIdHash:g,consent:l,storageTier:_,trackingSource:Y,useEmulator:tt,endpoint:L}),l?.analytics===!0?(window._balanceInitialPageviewFired=!0,B(),mt(),a("Full tracking enabled (user consented)")):nt?a("Tracking dormant - waiting for explicit consent via ConsentManager"):(window._balanceInitialPageviewFired=!0,B(),mt(),a("Privacy-first tracking enabled (session-scoped, visitor_id for deduplication)")),["mousemove","keydown","scroll","touchstart"].forEach(s=>{document.addEventListener(s,je,{passive:!0})});let t=window.location.hostname;function e(s){try{let r=new URL(s).hostname.toLowerCase();return r.includes("spotify")?"spotify":r.includes("apple")||r.includes("music.apple")?"apple_music":r.includes("youtube")||r.includes("youtu.be")?"youtube":r.includes("soundcloud")?"soundcloud":r.includes("tidal")?"tidal":r.includes("deezer")?"deezer":r.includes("amazon")||r.includes("music.amazon")?"amazon_music":r.includes("bandcamp")?"bandcamp":r.includes("lnk.to")||r.includes("linkfire")?"linkfire":r.includes("linktr.ee")?"linktree":r.includes("shop")||r.includes("store")||r.includes("merch")?"shop":r.includes("ticketmaster")||r.includes("eventbrite")||r.includes("dice.fm")?"tickets":r.includes("instagram")?"instagram":r.includes("twitter")||r.includes("x.com")?"twitter":r.includes("tiktok")?"tiktok":r.includes("facebook")?"facebook":"external"}catch{return"external"}}function n(s){try{return new URL(s,window.location.origin).hostname!==t}catch{return!1}}function i(s,r){let u=e(s),x=Re(s),Gt=x?.title||r?.textContent?.trim().substring(0,100)||"",Bt=x?.id||r?.id||r?.getAttribute("data-link-id")||void 0,Wt=x?.category;a("External link clicked:",{url:s,platform:u,linkText:Gt,linkId:Bt,fromRegistry:!!x}),pt("page_link_click",{link_url:s,link_text:Gt,link_id:Bt,platform:u,link_type:"external",...Wt&&{link_category:Wt},...x&&Object.fromEntries(Object.entries(x).filter(([yt])=>!["title","id","category"].includes(yt)).map(([yt,Ue])=>[`link_${yt}`,Ue]))})}let c=window.open;if(window.open=function(s,r,u){if(s){let x=s.toString();n(x)&&i(x)}return c.call(window,s,r,u)},a("window.open interception enabled (always on)"),o?.dataset.autoTrackLinks==="true"&&(document.addEventListener("click",s=>{let u=s.target.closest("a");if(u&&u.href&&n(u.href)){if(xt&&(Pt(u.href)||u.hasAttribute("download")))return;i(u.href,u)}},{capture:!0,passive:!0}),a("External link click listener enabled (opt-in)")),xt&&(document.addEventListener("click",s=>{let u=s.target.closest("a");u?.href&&(Pt(u.href)||u.hasAttribute("download"))&&de(u.href,u)},{capture:!0,passive:!0}),a("File download tracking enabled")),ee){let s=window.location.href;window.addEventListener("hashchange",()=>{let r=window.location.href;r!==s&&(s=r,setTimeout(()=>{B({title:document.title,url:r})},0))}),a("Hash routing tracking enabled")}document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?(jt(),wt(),G()):(ft(),dt=!1)}),window.addEventListener("pagehide",()=>{wt(),G()}),window.addEventListener("beforeunload",()=>{wt(),G()})}if(window.balance?._version&&window.balance._version!==k){console.warn(`[artistPixel] Version conflict: ${window.balance._version} already loaded, skipping ${k}`);return}let ht=window.balance?.q||[];function Nt(){if(ht.length>0){a("Processing",ht.length,"queued commands");for(let t of ht){let[e,...n]=t;switch(e){case"track":pt(n[0],n[1]);break;case"identify":Ft(n[0],n[1]);break;case"page":B(n[0]);break;case"purchase":Ut(n[0],n[1],n[2]);break;case"setConsent":Mt(n[0]);break;default:a("Unknown queued command:",e)}}}}let zt={track:pt,identify:Ft,page:B,purchase:Ut,getSessionId:()=>U,getVisitorId:()=>b,getFanIdHash:()=>g,setFanIdHash:Fe,getAttribution:()=>A,setConsent:Mt,getConsent:Te,hasConsent:Le,registerLinks:Ae,_version:k};window.artistPixel=zt,window.balance=zt;function $t(){nt&&!l&&new fe({style:Qt,primaryColor:Zt,position:te})}let Vt=window.requestIdleCallback||(t=>setTimeout(t,1));document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{Ht(),Nt(),Vt(()=>$t())}):(Ht(),Nt(),Vt(()=>$t())),a("Pixel script loaded")})();})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hifilabs/pixel",
3
- "version": "0.17.1",
3
+ "version": "0.17.2",
4
4
  "description": "artistPixel - Lightweight browser tracking script for artist fan analytics",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",