@bluenath/engage 2.0.9 → 2.0.10

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.
@@ -5,6 +5,7 @@ export declare class EngagePro {
5
5
  private context;
6
6
  private queue;
7
7
  private transport;
8
+ private domTracker;
8
9
  private sessionId;
9
10
  private countryCode;
10
11
  private currentSentiment;
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var e=Object.defineProperty,i=(i,t,a)=>((i,t,a)=>t in i?e(i,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[t]=a)(i,"symbol"!=typeof t?t+"":t,a);Object.defineProperties(exports,{i:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("react/jsx-runtime"),a=require("react");let n;const r=new Uint8Array(16);function o(){if(!n&&(n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!n))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return n(r)}const s=[];for(let P=0;P<256;++P)s.push((P+256).toString(16).slice(1));const c={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function u(e,i,t){if(c.randomUUID&&!e)return c.randomUUID();const a=(e=e||{}).random||(e.rng||o)();return a[6]=15&a[6]|64,a[8]=63&a[8]|128,function(e,i=0){return s[e[i+0]]+s[e[i+1]]+s[e[i+2]]+s[e[i+3]]+"-"+s[e[i+4]]+s[e[i+5]]+"-"+s[e[i+6]]+s[e[i+7]]+"-"+s[e[i+8]]+s[e[i+9]]+"-"+s[e[i+10]]+s[e[i+11]]+s[e[i+12]]+s[e[i+13]]+s[e[i+14]]+s[e[i+15]]}(a)}const d=e=>{let i=2166136261;const t=e.length;for(let a=0;a<t;a++)i^=e.charCodeAt(a),i+=(i<<1)+(i<<4)+(i<<7)+(i<<8)+(i<<24);return("0000000"+(i>>>0).toString(16)).substr(-8)};class h{constructor(e="local"){i(this,"memoryStore",{}),i(this,"keyPrefix","engage_"),i(this,"domain"),this.type=e,this.domain=this.getCookieDomain()}getItem(e){const i=this.keyPrefix+e;if(this.memoryStore.hasOwnProperty(i))return this.memoryStore[i];try{if("local"===this.type&&this.isBrowser())return window.localStorage.getItem(i);if("cookie"===this.type&&this.isBrowser())return this.getCookie(i)}catch(t){return null}return null}setItem(e,i){const t=this.keyPrefix+e;this.memoryStore[t]=i;try{"local"===this.type&&this.isBrowser()?window.localStorage.setItem(t,i):"cookie"===this.type&&this.isBrowser()&&this.setCookie(t,i,365)}catch(a){this.isQuotaError(a)&&(this.type="memory")}}removeItem(e){const i=this.keyPrefix+e;delete this.memoryStore[i];try{"local"===this.type&&this.isBrowser()?window.localStorage.removeItem(i):"cookie"===this.type&&this.isBrowser()&&this.setCookie(i,"",-1)}catch(t){}}getCookie(e){const i=e+"=",t=document.cookie.split(";");for(let a=0;a<t.length;a++){let e=t[a];for(;" "===e.charAt(0);)e=e.substring(1,e.length);if(0===e.indexOf(i))return decodeURIComponent(e.substring(i.length,e.length))}return null}setCookie(e,i,t){let a="";if(t){const e=new Date;e.setTime(e.getTime()+24*t*60*60*1e3),a="; expires="+e.toUTCString()}document.cookie=`${e}=${encodeURIComponent(i)}${a}; path=/; domain=${this.domain}; SameSite=Lax; Secure`}getCookieDomain(){if(!this.isBrowser())return"";const e=window.location.hostname,i=e.split(".");return 1===i.length||"localhost"===e?"":i.length>2?"."+i.slice(-2).join("."):"."+e}isBrowser(){try{return"undefined"!=typeof window&&void 0!==window.document}catch(e){return!1}}isQuotaError(e){return e instanceof DOMException&&(22===e.code||1014===e.code||"QuotaExceededError"===e.name||"NS_ERROR_DOM_QUOTA_REACHED"===e.name)}}class l{constructor(e){i(this,"storage"),i(this,"SESSION_TIMEOUT",18e5),i(this,"deviceId"),i(this,"sessionId"),i(this,"userId",null),i(this,"currentUrl"),i(this,"referrer"),this.storage=new h(e.persistence),this.deviceId=this.getOrSetDeviceId(),this.sessionId="",this.manageSession(),"undefined"!=typeof window?(this.currentUrl=window.location.href,this.referrer=document.referrer,this.listenToHistory()):(this.currentUrl="",this.referrer="")}getOrSetDeviceId(){const e=this.storage.getItem("device_id");if(e)return e;const i=(()=>{if("undefined"==typeof window)return"server-side-id";const e=navigator,i=window.screen,t={userAgent:e.userAgent||"",screenRes:`${i.width}x${i.height}`,colorDepth:i.colorDepth||0,timezone:(new Date).getTimezoneOffset(),language:e.language||"en-US",platform:e.platform||"unknown",hardwareConcurrency:e.hardwareConcurrency||1,deviceMemory:e.deviceMemory||0},a=[t.platform,t.language,t.screenRes,t.colorDepth,t.timezone,t.hardwareConcurrency,t.deviceMemory].join("|");return`${d(a)}-${d(t.userAgent)}`})();return this.storage.setItem("device_id",i),i}manageSession(){const e=Date.now(),i=this.storage.getItem("session_id"),t=parseInt(this.storage.getItem("last_activity")||"0");if(!i||e-t>this.SESSION_TIMEOUT?(this.sessionId=`sess_${e}_${Math.random().toString(36).substr(2,9)}`,this.storage.setItem("session_id",this.sessionId)):this.sessionId=i,this.storage.setItem("last_activity",e.toString()),"undefined"!=typeof window){const e=()=>this.storage.setItem("last_activity",Date.now().toString());window.addEventListener("click",e),window.addEventListener("scroll",e)}}listenToHistory(){const e=history.pushState;history.pushState=(...i)=>{e.apply(history,i),this.handleUrlChange()},window.addEventListener("popstate",()=>this.handleUrlChange())}handleUrlChange(){const e=window.location.href;e!==this.currentUrl&&(this.referrer=this.currentUrl,this.currentUrl=e)}getPayload(){var e;return{library:{name:"@engagepro/analytics",version:"2.0.0"},user:{anonymousId:this.deviceId,id:this.userId},session:{id:this.sessionId,startTime:parseInt(this.sessionId.split("_")[1]||Date.now().toString())},page:{path:"undefined"!=typeof window?window.location.pathname:"",referrer:this.referrer,title:"undefined"!=typeof document?document.title:"",search:"undefined"!=typeof window?window.location.search:"",url:this.currentUrl},network:{online:"undefined"==typeof navigator||navigator.onLine,downlink:null==(e=navigator.connection)?void 0:e.downlink},screen:{width:"undefined"!=typeof screen?screen.width:0,height:"undefined"!=typeof screen?screen.height:0,density:"undefined"!=typeof window?window.devicePixelRatio:1},device:{fingerprint:this.deviceId,type:this.getDeviceType(),userAgent:"undefined"!=typeof navigator?navigator.userAgent:"server"},locale:"undefined"!=typeof navigator?navigator.language:"en-US",timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}}getDeviceType(){if("undefined"==typeof navigator)return"desktop";const e=navigator.userAgent;return/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(e)?"tablet":/Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated/.test(e)?"mobile":"desktop"}}class A{constructor(e){i(this,"engageQueue",[]),i(this,"storage"),i(this,"transport"),i(this,"ENGAGE_STORAGE_KEY","engage_events_v2"),i(this,"isFlushing",!1),i(this,"flushInterval"),i(this,"MAX_RETRIES",3),this.transport=e,this.storage=new h("local"),this.load(),"undefined"!=typeof window&&(window.addEventListener("online",()=>{this.flushEngageEvents()}),window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&this.flushBeacon()}),window.addEventListener("beforeunload",()=>{this.flushBeacon()})),this.startTimer()}startTimer(){this.flushInterval&&clearInterval(this.flushInterval),this.flushInterval=setInterval(()=>{this.flushEngageEvents()},5e3)}enqueueEngageEvent(e){this.engageQueue.push(e),this.saveEngage(),this.engageQueue.length>=10&&this.flushEngageEvents()}enqueue(e){}saveEngage(){this.storage.setItem(this.ENGAGE_STORAGE_KEY,JSON.stringify(this.engageQueue))}load(){const e=this.storage.getItem(this.ENGAGE_STORAGE_KEY);if(e)try{this.engageQueue=JSON.parse(e)}catch(i){this.engageQueue=[]}}async flushEngageEvents(){if(0===this.engageQueue.length||this.isFlushing)return;if("undefined"!=typeof navigator&&!navigator.onLine)return;this.isFlushing=!0;const e=[...this.engageQueue];this.engageQueue=[],this.saveEngage();let i=0,t=!1;for(;i<this.MAX_RETRIES&&!t;){const a=await this.transport.sendEngageEvents(e);if(a.success){t=!0;break}if(a.permanent)return void(this.isFlushing=!1);if(i++,i<this.MAX_RETRIES){const e=1e3*Math.pow(2,i-1);await new Promise(i=>setTimeout(i,e))}}this.isFlushing=!1}flushBeacon(){if(this.engageQueue.length>0){const e=JSON.stringify({events:this.engageQueue});this.transport.beaconFlush(e)&&(this.engageQueue=[],this.saveEngage())}}}class f{constructor(e){i(this,"apiKey",""),this.endpoints=e}setApiKey(e){this.apiKey=e}async sendEngageEvents(e){const i=JSON.stringify({events:e});return this.sendRaw(i,this.endpoints.engage)}async sendRaw(e,i){const t={"Content-Type":"application/json"};this.apiKey&&(t.Authorization=`Bearer ${this.apiKey}`);try{const a=await fetch(i,{method:"POST",headers:t,body:e,keepalive:!0});return 401===a.status||422===a.status?{success:!1,permanent:!0,status:a.status}:{success:a.ok||202===a.status,permanent:!1,status:a.status}}catch(a){return{success:!1,permanent:!1}}}beaconFlush(e){if("undefined"==typeof navigator||!navigator.sendBeacon)return!1;const i=this.endpoints.engage,t=new Blob([e],{type:"application/json"});return navigator.sendBeacon(i,t)}}const p={"Asia/Kolkata":"IN","Asia/Calcutta":"IN","Asia/Mumbai":"IN","Asia/Dhaka":"BD","Asia/Kathmandu":"NP","Asia/Colombo":"LK","Asia/Karachi":"PK","Asia/Kabul":"AF","Asia/Tehran":"IR","Asia/Dubai":"AE","Asia/Muscat":"OM","Asia/Bahrain":"BH","Asia/Qatar":"QA","Asia/Kuwait":"KW","Asia/Riyadh":"SA","Asia/Aden":"YE","Asia/Baghdad":"IQ","Asia/Amman":"JO","Asia/Beirut":"LB","Asia/Damascus":"SY","Asia/Jerusalem":"IL","Asia/Tel_Aviv":"IL","Asia/Nicosia":"CY","Asia/Tokyo":"JP","Asia/Seoul":"KR","Asia/Pyongyang":"KP","Asia/Shanghai":"CN","Asia/Chongqing":"CN","Asia/Harbin":"CN","Asia/Urumqi":"CN","Asia/Hong_Kong":"HK","Asia/Macau":"MO","Asia/Taipei":"TW","Asia/Singapore":"SG","Asia/Kuala_Lumpur":"MY","Asia/Brunei":"BN","Asia/Jakarta":"ID","Asia/Makassar":"ID","Asia/Jayapura":"ID","Asia/Bangkok":"TH","Asia/Ho_Chi_Minh":"VN","Asia/Saigon":"VN","Asia/Phnom_Penh":"KH","Asia/Vientiane":"LA","Asia/Yangon":"MM","Asia/Rangoon":"MM","Asia/Manila":"PH","Asia/Ulaanbaatar":"MN","Asia/Hovd":"MN","Asia/Tbilisi":"GE","Asia/Baku":"AZ","Asia/Yerevan":"AM","Asia/Almaty":"KZ","Asia/Bishkek":"KG","Asia/Tashkent":"UZ","Asia/Ashgabat":"TM","Asia/Dushanbe":"TJ","Asia/Thimphu":"BT","Asia/Dili":"TL","Europe/London":"GB","Europe/Dublin":"IE","Europe/Lisbon":"PT","Europe/Madrid":"ES","Europe/Paris":"FR","Europe/Brussels":"BE","Europe/Amsterdam":"NL","Europe/Luxembourg":"LU","Europe/Berlin":"DE","Europe/Zurich":"CH","Europe/Vienna":"AT","Europe/Rome":"IT","Europe/Monaco":"MC","Europe/Vatican":"VA","Europe/Malta":"MT","Europe/Prague":"CZ","Europe/Budapest":"HU","Europe/Warsaw":"PL","Europe/Bratislava":"SK","Europe/Ljubljana":"SI","Europe/Zagreb":"HR","Europe/Belgrade":"RS","Europe/Sarajevo":"BA","Europe/Podgorica":"ME","Europe/Skopje":"MK","Europe/Tirane":"AL","Europe/Sofia":"BG","Europe/Bucharest":"RO","Europe/Chisinau":"MD","Europe/Athens":"GR","Europe/Istanbul":"TR","Europe/Helsinki":"FI","Europe/Stockholm":"SE","Europe/Oslo":"NO","Europe/Copenhagen":"DK","Europe/Tallinn":"EE","Europe/Riga":"LV","Europe/Vilnius":"LT","Europe/Minsk":"BY","Europe/Moscow":"RU","Europe/Kaliningrad":"RU","Europe/Samara":"RU","Europe/Kiev":"UA","Europe/Kyiv":"UA","Europe/Reykjavik":"IS","Europe/Andorra":"AD","Europe/Gibraltar":"GI","Europe/San_Marino":"SM","America/New_York":"US","America/Chicago":"US","America/Denver":"US","America/Los_Angeles":"US","America/Phoenix":"US","America/Anchorage":"US","Pacific/Honolulu":"US","America/Detroit":"US","America/Indianapolis":"US","America/Boise":"US","America/Juneau":"US","America/Adak":"US","America/Toronto":"CA","America/Vancouver":"CA","America/Montreal":"CA","America/Winnipeg":"CA","America/Edmonton":"CA","America/Halifax":"CA","America/St_Johns":"CA","America/Regina":"CA","America/Mexico_City":"MX","America/Cancun":"MX","America/Tijuana":"MX","America/Monterrey":"MX","America/Hermosillo":"MX","America/Guatemala":"GT","America/Belize":"BZ","America/El_Salvador":"SV","America/Tegucigalpa":"HN","America/Managua":"NI","America/Costa_Rica":"CR","America/Panama":"PA","America/Bogota":"CO","America/Lima":"PE","America/Guayaquil":"EC","America/Caracas":"VE","America/La_Paz":"BO","America/Asuncion":"PY","America/Montevideo":"UY","America/Buenos_Aires":"AR","America/Argentina/Buenos_Aires":"AR","America/Santiago":"CL","America/Sao_Paulo":"BR","America/Recife":"BR","America/Manaus":"BR","America/Fortaleza":"BR","America/Bahia":"BR","America/Havana":"CU","America/Jamaica":"JM","America/Port-au-Prince":"HT","America/Santo_Domingo":"DO","America/Puerto_Rico":"PR","America/Port_of_Spain":"TT","America/Barbados":"BB","America/Martinique":"MQ","America/Guyana":"GY","America/Paramaribo":"SR","America/Cayenne":"GF","America/Curacao":"CW","Africa/Cairo":"EG","Africa/Casablanca":"MA","Africa/Tunis":"TN","Africa/Algiers":"DZ","Africa/Tripoli":"LY","Africa/Khartoum":"SD","Africa/Addis_Ababa":"ET","Africa/Nairobi":"KE","Africa/Dar_es_Salaam":"TZ","Africa/Kampala":"UG","Africa/Mogadishu":"SO","Africa/Lagos":"NG","Africa/Accra":"GH","Africa/Abidjan":"CI","Africa/Dakar":"SN","Africa/Bamako":"ML","Africa/Ouagadougou":"BF","Africa/Conakry":"GN","Africa/Freetown":"SL","Africa/Monrovia":"LR","Africa/Lome":"TG","Africa/Porto-Novo":"BJ","Africa/Niamey":"NE","Africa/Douala":"CM","Africa/Libreville":"GA","Africa/Bangui":"CF","Africa/Brazzaville":"CG","Africa/Kinshasa":"CD","Africa/Lubumbashi":"CD","Africa/Luanda":"AO","Africa/Maputo":"MZ","Africa/Harare":"ZW","Africa/Lusaka":"ZM","Africa/Lilongwe":"MW","Africa/Johannesburg":"ZA","Africa/Windhoek":"NA","Africa/Gaborone":"BW","Africa/Maseru":"LS","Africa/Mbabane":"SZ","Indian/Antananarivo":"MG","Indian/Mauritius":"MU","Indian/Reunion":"RE","Indian/Comoro":"KM","Indian/Mayotte":"YT","Africa/Djibouti":"DJ","Africa/Asmara":"ER","Australia/Sydney":"AU","Australia/Melbourne":"AU","Australia/Brisbane":"AU","Australia/Perth":"AU","Australia/Adelaide":"AU","Australia/Hobart":"AU","Australia/Darwin":"AU","Australia/Lord_Howe":"AU","Pacific/Auckland":"NZ","Pacific/Chatham":"NZ","Pacific/Fiji":"FJ","Pacific/Tongatapu":"TO","Pacific/Apia":"WS","Pacific/Port_Moresby":"PG","Pacific/Noumea":"NC","Pacific/Guam":"GU","Pacific/Pago_Pago":"AS","Pacific/Tahiti":"PF","Atlantic/Reykjavik":"IS","Atlantic/Azores":"PT","Atlantic/Canary":"ES","Atlantic/Madeira":"PT","Atlantic/Cape_Verde":"CV","Atlantic/Bermuda":"BM","Indian/Maldives":"MV","Indian/Chagos":"IO","Indian/Christmas":"CX","Indian/Cocos":"CC"},m=new Set(["localhost","127.0.0.1"]),y="engage_session_id",g={$:"USD",US$:"USD",USD:"USD","₹":"INR",RS:"INR","RS.":"INR",INR:"INR","€":"EUR",EUR:"EUR","£":"GBP",GBP:"GBP","¥":"JPY",JPY:"JPY"},v=e=>{if("string"!=typeof e)return;const i=e.trim().toUpperCase();return i?g[i]?g[i]:i.includes("₹")||i.startsWith("RS")?"INR":i.includes("$")&&!i.includes("CAD")?"USD":i.includes("€")?"EUR":i.includes("£")?"GBP":i.includes("¥")?"JPY":/^[A-Z]{3}$/.test(i)?i:void 0:void 0};function E(e){if(!e||"object"!=typeof e)return;const i={},t=Object.keys(e).slice(0,20);for(const a of t){const t=e[a];"boolean"==typeof t||"number"==typeof t?i[a]=t:"string"==typeof t&&(i[a]=t.slice(0,100))}return Object.keys(i).length>0?i:void 0}class w{constructor(e){i(this,"config"),i(this,"context"),i(this,"queue"),i(this,"transport"),i(this,"sessionId"),i(this,"countryCode"),i(this,"currentSentiment"),i(this,"identify",(e,i)=>{this.context.userId=e,this.processEvent({event:"Identify",properties:{traits:i},standardEvent:"LOGIN",intent:"identity",confidence:1})}),i(this,"page",(e,i)=>{const t=this.context.getPayload().page;this.processEvent({event:e||t.title||"Unknown Page",properties:{path:t.path,referrer:t.referrer,title:t.title,...i},standardEvent:"PAGE_VIEW",intent:"navigation",confidence:1}),this.emitEngageEvent("pageview",i)}),i(this,"track",(e,i,t)=>{this.processEvent({event:e,properties:i||{},...t});const a={purchase:"purchase",PURCHASE:"purchase",signup:"signup",SIGNUP:"signup",register:"signup",REGISTER:"signup",add_to_cart:"add_to_cart",ADD_TO_CART:"add_to_cart",product_view:"product_view",VIEW_CONTENT:"product_view",session_start:"session_start",session_end:"session_end"},n=a[e]||a[(null==t?void 0:t.standardEvent)||""]||"custom";this.emitEngageEvent(n,i)}),i(this,"trackRevenue",(e,i,t)=>{const a=Math.max(0,(e=>{if("number"==typeof e)return Number.isFinite(e)?e:0;const i=e.trim().replace(/[^0-9.+-]/g,""),t=Number(i);return Number.isFinite(t)?t:0})(e)),n=v(null==i?void 0:i.currency)||v(null==i?void 0:i.currencyCode)||v(null==i?void 0:i.currencySymbol)||("string"==typeof e?v(e):void 0)||"USD";this.track("PURCHASE",{...i||{},value:a,amount:a,valuePaise:Math.round(100*a),amountPaise:Math.round(100*a),currency:n,currencyCode:n},{standardEvent:"PURCHASE",intent:"commerce",confidence:1,...t})}),i(this,"setSentiment",e=>{this.currentSentiment=e}),this.config=e;const t=e.apiKey,a=((e,i,t)=>{if(!e)return t;try{const i=new URL(e);return i.hostname.endsWith("bluenath.com")||m.has(i.hostname)?(i.pathname="/api/v1/analytics/ingest",i.search="",i.hash="",i.toString()):t}catch{return t}})(e.apiHost,0,"https://engage-api.bluenath.com/api/v1/analytics/ingest");this.transport=new f({engage:a}),this.transport.setApiKey(t),this.context=new l({persistence:e.tracking.useCookies?"cookie":"local"}),this.queue=new A(this.transport),this.sessionId=function(){if("undefined"==typeof sessionStorage)return u();let e=sessionStorage.getItem(y);return e||(e=u(),sessionStorage.setItem(y,e)),e}(),this.countryCode=function(){try{const e=Intl.DateTimeFormat().resolvedOptions().timeZone;if(!e)return;return p[e]}catch{return}}(),e.tracking.autoTrack&&"undefined"!=typeof window&&this.page()}emitEngageEvent(e,i){const t=this.context.getPayload().page,a={type:e,timestamp:(new Date).toISOString(),sessionId:this.sessionId,userId:this.context.getPayload().user.id||void 0,countryCode:this.countryCode,sentiment:this.currentSentiment,referrer:(t.referrer||"").slice(0,500),path:t.path||("undefined"!=typeof window?window.location.pathname:"/"),currency:v(null==i?void 0:i.currency)||v(null==i?void 0:i.currencyCode)||void 0,amount:"number"==typeof(null==i?void 0:i.amountPaise)?i.amountPaise:"number"==typeof(null==i?void 0:i.amount)?Math.round(100*i.amount):void 0,productId:"string"==typeof(null==i?void 0:i.productId)?i.productId:void 0,productName:"string"==typeof(null==i?void 0:i.productName)?i.productName:void 0,productCategory:"string"==typeof(null==i?void 0:i.productCategory)?i.productCategory:void 0,metadata:E(null==i?void 0:i.metadata)};this.queue.enqueueEngageEvent(a),this.currentSentiment&&(this.currentSentiment=void 0)}parseRef(e){if(!e)return{};const i=e.match(/^camp_([^_]+)_cr_([^_]+)$/);return i?{campaignId:i[1],creatorId:i[2]}:{}}processEvent(e){const i=this.context.getPayload(),t=e.properties.ref,a=("string"==typeof t?t:void 0)||new URLSearchParams(i.page.search||"").get("ref")||void 0,n=this.parseRef(a),r=e.properties.value??e.properties.amount??e.properties.valuePaise??e.properties.amountPaise,o=Number(r),s=e.properties.campaignId,c=e.properties.creatorId,d=e.properties.currency,h={event:e.event,properties:e.properties,standardEvent:e.standardEvent,intent:e.intent,confidence:e.confidence,rawLabel:e.rawLabel,timestamp:(new Date).toISOString(),messageId:u(),writeKey:this.config.apiKey||"",ref:a,campaignId:("string"==typeof s?s:void 0)||n.campaignId,creatorId:("string"==typeof c?c:void 0)||n.creatorId,value:Number.isFinite(o)?Math.round(o):void 0,valuePaise:Number.isFinite(o)?Math.round(100*o):void 0,currency:("string"==typeof d?d:void 0)||"USD",userId:i.user.id||void 0,anonymousId:i.user.anonymousId,context:i};this.config.debug,this.queue.enqueue(h)}}class S{constructor(e){i(this,"analytics"),i(this,"metrics",{}),this.analytics=e,"undefined"!=typeof window&&"PerformanceObserver"in window&&this.observe()}observe(){try{new PerformanceObserver(e=>{for(const i of e.getEntries()){const e=i;e.hadRecentInput||(this.metrics.cls=(this.metrics.cls||0)+e.value)}}).observe({type:"layout-shift",buffered:!0}),new PerformanceObserver(e=>{const i=e.getEntries(),t=i[i.length-1];this.metrics.lcp=t.renderTime||t.loadTime,this.logMetric("LCP",this.metrics.lcp)}).observe({type:"largest-contentful-paint",buffered:!0}),new PerformanceObserver(e=>{const i=e.getEntries()[0];i&&(this.metrics.fid=i.processingStart-i.startTime,this.logMetric("FID",this.metrics.fid))}).observe({type:"first-input",buffered:!0}),window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&this.metrics.cls&&this.logMetric("CLS",this.metrics.cls)})}catch(e){}}logMetric(e,i){i<0||this.analytics.track(`Core Web Vital: ${e}`,{metric:e,value:Math.round(i)},{standardEvent:"PERFORMANCE",intent:"performance",confidence:1,rawLabel:`${e}: ${Math.round(i)}ms`})}}const b=a.createContext(null);let C=null;const R=e=>{if(!C){const i={...e,apiKey:e.apiKey||""};C=new w(i)}return C},M={init:e=>R({apiKey:e.apiKey,apiHost:e.apiHost,tracking:e.tracking||{useCookies:!0,fingerprint:!0,autoTrack:!0},debug:e.debug}),track(e,i){C&&C.track(e,i)},page(e,i){C&&C.page(e,i)},identify(e,i){C&&C.identify(e,i)},trackRevenue(e,i){C&&C.trackRevenue(e,i)},setSentiment(e){C&&C.setSentiment(e)}};exports.EngageProProvider=({children:e,...i})=>{const n=a.useRef(null),r=a.useRef(null);n.current||(n.current=new w(i),"undefined"!=typeof window&&new S(n.current));const o=n.current;return a.useEffect(()=>{if(!i.tracking.autoTrack)return;const e=e=>{const i=e.target.closest('button, a, input[type="submit"], [data-track], .clickable');if(i){const t=Date.now(),a=r.current;a&&a.el===i&&t-a.ts<500?(a.count++,a.ts=t,3===a.count&&(o.track("Rage Click detected",{element:i.tagName},{standardEvent:"RAGE_CLICK",intent:"frustration",confidence:1}),r.current=null)):r.current={el:i,count:1,ts:t};const n=(e=>{let i=(e.innerText||e.value||e.getAttribute("aria-label")||"").trim();if(!i){const t=e.querySelector("img");t&&t.alt&&(i=t.alt);const a=e.querySelector("title");a&&(i=a.textContent||"")}const t=i.slice(0,100),a=t.toLowerCase(),n=(e.id||"").toLowerCase(),r=e.href||"";return/add to (cart|bag)|buy now/.test(a)||n.includes("add-to-cart")?{standard:"ADD_TO_CART",intent:"commerce",label:t,confidence:.9}:/checkout|proceed/.test(a)||r.includes("/checkout")?{standard:"INITIATE_CHECKOUT",intent:"commerce",label:t,confidence:.9}:/place order|pay now/.test(a)||n.includes("place-order")?{standard:"PURCHASE",intent:"commerce",label:t,confidence:.95}:/cancel order/.test(a)||n.includes("cancel")?{standard:"ORDER_CANCEL",intent:"lifecycle",label:t,confidence:.85}:/refund|return/.test(a)||n.includes("refund")?{standard:"ORDER_REFUND",intent:"lifecycle",label:t,confidence:.85}:/track package|shipping/.test(a)?{standard:"TRACK_PACKAGE",intent:"lifecycle",label:t,confidence:.8}:/write review/.test(a)||a.includes("star")&&/^[1-5]/.test(a)?{standard:"RATE_PRODUCT",intent:"engagement",label:t,confidence:.8}:a.includes("search")||n.includes("search")?{standard:"SEARCH",intent:"search",label:t,confidence:.7}:{standard:"GENERIC",intent:"interaction",label:t,confidence:.5}})(i),s="A"===i.tagName;let c={};"commerce"===n.intent&&(c=(i=>{let t={};try{const a=document.querySelectorAll('script[type="application/ld+json"]');for(const i of Array.from(a))try{const e=JSON.parse(i.innerHTML),a=Array.isArray(e)?e:[e];for(const i of a)if("Product"===i["@type"]){if(i.name&&(t.productName=i.name),(i.sku||i.productID)&&(t.productId=i.sku||i.productID),i.offers){const e=Array.isArray(i.offers)?i.offers[0]:i.offers;e.price&&(t.amount=Number(e.price)),e.priceCurrency&&(t.currency=e.priceCurrency)}if(t.amount)return t}}catch(e){}if(!t.amount){const e=document.querySelector('meta[property="product:price:amount"]'),i=document.querySelector('meta[property="product:price:currency"]'),a=document.querySelector('meta[property="og:title"]');e&&(t.amount=Number(e.getAttribute("content"))),i&&(t.currency=i.getAttribute("content")),a&&(t.productName=a.getAttribute("content"))}if(!t.amount){const e=(i.innerText||"").match(/([$€£₹¥])\s*([0-9,]+\.[0-9]{2})/);if(e){const i=e[1],a=e[2].replace(/,/g,"");t.amount=Number(a);const n={$:"USD","€":"EUR","£":"GBP","₹":"INR","¥":"JPY"};t.currency=n[i]||"USD"}else{let e=i,a=0;for(;e&&a<3&&!t.amount;){const i=e.innerText||"";if(i.length<500){const e=i.match(/([$€£₹¥])\s*([0-9,]+\.[0-9]{2})/);if(e){const i=e[1],a=e[2].replace(/,/g,"");t.amount=Number(a);const n={$:"USD","€":"EUR","£":"GBP","₹":"INR","¥":"JPY"};t.currency=n[i]||"USD"}}e=e.parentElement,a++}}}}catch(a){}return t})(i)),o.track("Interaction",{element:i.tagName.toLowerCase(),id:i.id,destination:s?i.href:void 0,...c},{standardEvent:n.standard,intent:n.intent,rawLabel:n.label,confidence:n.confidence})}},t=e=>{const i=e.target;(e=>"password"===e.getAttribute("type")||"hidden"===e.getAttribute("type")||/password|cvc|card|cc-num|ssn|credit|hidden/i.test(e.getAttribute("name")||e.id||""))(i)||"focusin"!==e.type||i.dataset.tracked||(i.dataset.tracked="true",o.track("Form Start",{field:i.name||i.id},{standardEvent:"FORM_START",intent:"identity"}))},a=()=>{const e=new URLSearchParams(window.location.search);e.has("q")&&o.track("Search Query",{query:e.get("q")},{standardEvent:"SEARCH",intent:"search"}),requestAnimationFrame(()=>o.page())},n=history.pushState;return history.pushState=(...e)=>{n.apply(history,e),a()},window.addEventListener("popstate",a),window.addEventListener("click",e,!0),window.addEventListener("focusin",t,!0),a(),()=>{history.pushState=n,window.removeEventListener("popstate",a),window.removeEventListener("click",e,!0),window.removeEventListener("focusin",t,!0)}},[i.tracking.autoTrack]),t.jsx(b.Provider,{value:o,children:e})},exports.default=w,exports.engage=M,exports.init=R,exports.useAnalytics=()=>{const e=a.useContext(b);if(!e)throw new Error("useAnalytics must be used within EngageProProvider");return e};
1
+ "use strict";var e=Object.defineProperty,t=(t,i,a)=>((t,i,a)=>i in t?e(t,i,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[i]=a)(t,"symbol"!=typeof i?i+"":i,a);Object.defineProperties(exports,{t:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("react/jsx-runtime"),a=require("react");let n;const r=new Uint8Array(16);function o(){if(!n&&(n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!n))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return n(r)}const s=[];for(let U=0;U<256;++U)s.push((U+256).toString(16).slice(1));const c={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function d(e,t,i){if(c.randomUUID&&!e)return c.randomUUID();const a=(e=e||{}).random||(e.rng||o)();return a[6]=15&a[6]|64,a[8]=63&a[8]|128,function(e,t=0){return s[e[t+0]]+s[e[t+1]]+s[e[t+2]]+s[e[t+3]]+"-"+s[e[t+4]]+s[e[t+5]]+"-"+s[e[t+6]]+s[e[t+7]]+"-"+s[e[t+8]]+s[e[t+9]]+"-"+s[e[t+10]]+s[e[t+11]]+s[e[t+12]]+s[e[t+13]]+s[e[t+14]]+s[e[t+15]]}(a)}const u=e=>{let t=2166136261;const i=e.length;for(let a=0;a<i;a++)t^=e.charCodeAt(a),t+=(t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24);return("0000000"+(t>>>0).toString(16)).substr(-8)},h=()=>{try{const e=document.createElement("canvas");e.width=200,e.height=50;const t=e.getContext("2d");return t?(t.textBaseline="top",t.font="14px 'Arial'",t.textBaseline="alphabetic",t.fillStyle="#f60",t.fillRect(125,1,62,20),t.fillStyle="#069",t.fillText("EngagePro, 😃",2,15),t.fillStyle="rgba(102, 204, 0, 0.7)",t.fillText("EngagePro, 😃",4,17),u(e.toDataURL())):""}catch(e){return""}};class l{constructor(e="local"){t(this,"memoryStore",{}),t(this,"keyPrefix","engage_"),t(this,"domain"),this.type=e,this.domain=this.getCookieDomain()}getItem(e){const t=this.keyPrefix+e;if(this.memoryStore.hasOwnProperty(t))return this.memoryStore[t];try{if("local"===this.type&&this.isBrowser())return window.localStorage.getItem(t);if("cookie"===this.type&&this.isBrowser())return this.getCookie(t)}catch(i){return null}return null}setItem(e,t){const i=this.keyPrefix+e;this.memoryStore[i]=t;try{"local"===this.type&&this.isBrowser()?window.localStorage.setItem(i,t):"cookie"===this.type&&this.isBrowser()&&this.setCookie(i,t,365)}catch(a){this.isQuotaError(a)&&(this.type="memory")}}removeItem(e){const t=this.keyPrefix+e;delete this.memoryStore[t];try{"local"===this.type&&this.isBrowser()?window.localStorage.removeItem(t):"cookie"===this.type&&this.isBrowser()&&this.setCookie(t,"",-1)}catch(i){}}getCookie(e){const t=e+"=",i=document.cookie.split(";");for(let a=0;a<i.length;a++){let e=i[a];for(;" "===e.charAt(0);)e=e.substring(1,e.length);if(0===e.indexOf(t))return decodeURIComponent(e.substring(t.length,e.length))}return null}setCookie(e,t,i){let a="";if(i){const e=new Date;e.setTime(e.getTime()+24*i*60*60*1e3),a="; expires="+e.toUTCString()}document.cookie=`${e}=${encodeURIComponent(t)}${a}; path=/; domain=${this.domain}; SameSite=Lax; Secure`}getCookieDomain(){if(!this.isBrowser())return"";const e=window.location.hostname,t=e.split(".");return 1===t.length||"localhost"===e?"":t.length>2?"."+t.slice(-2).join("."):"."+e}isBrowser(){try{return"undefined"!=typeof window&&void 0!==window.document}catch(e){return!1}}isQuotaError(e){return e instanceof DOMException&&(22===e.code||1014===e.code||"QuotaExceededError"===e.name||"NS_ERROR_DOM_QUOTA_REACHED"===e.name)}}class A{constructor(e){t(this,"storage"),t(this,"SESSION_TIMEOUT",18e5),t(this,"deviceId"),t(this,"sessionId"),t(this,"userId",null),t(this,"currentUrl"),t(this,"referrer"),this.storage=new l(e.persistence),this.deviceId=this.getOrSetDeviceId(),this.sessionId="",this.manageSession(),"undefined"!=typeof window?(this.currentUrl=window.location.href,this.referrer=document.referrer,this.listenToHistory()):(this.currentUrl="",this.referrer="")}getOrSetDeviceId(){const e=this.storage.getItem("device_id");if(e)return e;const t=(()=>{if("undefined"==typeof window)return"server-side-id";const e=navigator,t=window.screen,i=(()=>{try{const e=document.createElement("canvas"),t=e.getContext("webgl")||e.getContext("experimental-webgl");if(!t)return{vendor:"",renderer:""};const i=t.getExtension("WEBGL_debug_renderer_info");return i?{vendor:t.getParameter(i.UNMASKED_VENDOR_WEBGL),renderer:t.getParameter(i.UNMASKED_RENDERER_WEBGL)}:{vendor:"",renderer:""}}catch(e){return{vendor:"",renderer:""}}})(),a={userAgent:e.userAgent||"",screenRes:`${t.width}x${t.height}`,colorDepth:t.colorDepth||0,timezone:(new Date).getTimezoneOffset(),language:e.language||"en-US",platform:e.platform||"unknown",hardwareConcurrency:e.hardwareConcurrency||1,deviceMemory:e.deviceMemory||0,canvasFingerprint:h(),webglVendor:i.vendor,webglRenderer:i.renderer},n=[a.platform,a.language,a.screenRes,a.colorDepth,a.timezone,a.hardwareConcurrency,a.deviceMemory,a.canvasFingerprint,a.webglVendor,a.webglRenderer].join("|");return`${u(n)}-${u(a.userAgent)}`})();return this.storage.setItem("device_id",t),t}manageSession(){const e=Date.now(),t=this.storage.getItem("session_id"),i=parseInt(this.storage.getItem("last_activity")||"0");if(!t||e-i>this.SESSION_TIMEOUT?(this.sessionId=`sess_${e}_${Math.random().toString(36).substr(2,9)}`,this.storage.setItem("session_id",this.sessionId)):this.sessionId=t,this.storage.setItem("last_activity",e.toString()),"undefined"!=typeof window){const e=()=>this.storage.setItem("last_activity",Date.now().toString());window.addEventListener("click",e),window.addEventListener("scroll",e)}}listenToHistory(){const e=history.pushState;history.pushState=(...t)=>{e.apply(history,t),this.handleUrlChange()},window.addEventListener("popstate",()=>this.handleUrlChange())}handleUrlChange(){const e=window.location.href;e!==this.currentUrl&&(this.referrer=this.currentUrl,this.currentUrl=e)}getPayload(){var e;return{library:{name:"@engagepro/analytics",version:"2.0.0"},user:{anonymousId:this.deviceId,id:this.userId},session:{id:this.sessionId,startTime:parseInt(this.sessionId.split("_")[1]||Date.now().toString())},page:{path:"undefined"!=typeof window?window.location.pathname:"",referrer:this.referrer,title:"undefined"!=typeof document?document.title:"",search:"undefined"!=typeof window?window.location.search:"",url:this.currentUrl},network:{online:"undefined"==typeof navigator||navigator.onLine,downlink:null==(e=navigator.connection)?void 0:e.downlink},screen:{width:"undefined"!=typeof screen?screen.width:0,height:"undefined"!=typeof screen?screen.height:0,density:"undefined"!=typeof window?window.devicePixelRatio:1},device:{fingerprint:this.deviceId,type:this.getDeviceType(),userAgent:"undefined"!=typeof navigator?navigator.userAgent:"server"},locale:"undefined"!=typeof navigator?navigator.language:"en-US",timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}}getDeviceType(){if("undefined"==typeof navigator)return"desktop";const e=navigator.userAgent;return/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(e)?"tablet":/Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated/.test(e)?"mobile":"desktop"}}class p{constructor(e){t(this,"engageQueue",[]),t(this,"storage"),t(this,"transport"),t(this,"ENGAGE_STORAGE_KEY","engage_events_v2"),t(this,"isFlushing",!1),t(this,"flushInterval"),t(this,"MAX_RETRIES",3),this.transport=e,this.storage=new l("local"),this.load(),"undefined"!=typeof window&&(window.addEventListener("online",()=>{this.flushEngageEvents()}),window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&this.flushBeacon()}),window.addEventListener("beforeunload",()=>{this.flushBeacon()})),this.startTimer()}startTimer(){this.flushInterval&&clearInterval(this.flushInterval),this.flushInterval=setInterval(()=>{this.flushEngageEvents()},5e3)}enqueueEngageEvent(e){this.engageQueue.push(e),this.saveEngage(),this.engageQueue.length>=10&&this.flushEngageEvents()}enqueue(e){}saveEngage(){this.storage.setItem(this.ENGAGE_STORAGE_KEY,JSON.stringify(this.engageQueue))}load(){const e=this.storage.getItem(this.ENGAGE_STORAGE_KEY);if(e)try{this.engageQueue=JSON.parse(e)}catch(t){this.engageQueue=[]}}async flushEngageEvents(){if(0===this.engageQueue.length||this.isFlushing)return;if("undefined"!=typeof navigator&&!navigator.onLine)return;this.isFlushing=!0;const e=[...this.engageQueue];this.engageQueue=[],this.saveEngage();let t=0,i=!1;for(;t<this.MAX_RETRIES&&!i;){const a=await this.transport.sendEngageEvents(e);if(a.success){i=!0;break}if(a.permanent)return void(this.isFlushing=!1);if(t++,t<this.MAX_RETRIES){const e=1e3*Math.pow(2,t-1);await new Promise(t=>setTimeout(t,e))}}this.isFlushing=!1}flushBeacon(){if(this.engageQueue.length>0){const e=JSON.stringify({events:this.engageQueue});this.transport.beaconFlush(e)&&(this.engageQueue=[],this.saveEngage())}}}class f{constructor(e){t(this,"apiKey",""),this.endpoints=e}setApiKey(e){this.apiKey=e}async sendEngageEvents(e){const t=JSON.stringify({events:e});return this.sendRaw(t,this.endpoints.engage)}async sendRaw(e,t){const i={"Content-Type":"application/json"};this.apiKey&&(i.Authorization=`Bearer ${this.apiKey}`);try{const a=await fetch(t,{method:"POST",headers:i,body:e,keepalive:!0});return 401===a.status||422===a.status?{success:!1,permanent:!0,status:a.status}:{success:a.ok||202===a.status,permanent:!1,status:a.status}}catch(a){return{success:!1,permanent:!1}}}beaconFlush(e){if("undefined"==typeof navigator||!navigator.sendBeacon)return!1;const t=this.endpoints.engage,i=new Blob([e],{type:"application/json"});return navigator.sendBeacon(t,i)}}const m={"Asia/Kolkata":"IN","Asia/Calcutta":"IN","Asia/Mumbai":"IN","Asia/Dhaka":"BD","Asia/Kathmandu":"NP","Asia/Colombo":"LK","Asia/Karachi":"PK","Asia/Kabul":"AF","Asia/Tehran":"IR","Asia/Dubai":"AE","Asia/Muscat":"OM","Asia/Bahrain":"BH","Asia/Qatar":"QA","Asia/Kuwait":"KW","Asia/Riyadh":"SA","Asia/Aden":"YE","Asia/Baghdad":"IQ","Asia/Amman":"JO","Asia/Beirut":"LB","Asia/Damascus":"SY","Asia/Jerusalem":"IL","Asia/Tel_Aviv":"IL","Asia/Nicosia":"CY","Asia/Tokyo":"JP","Asia/Seoul":"KR","Asia/Pyongyang":"KP","Asia/Shanghai":"CN","Asia/Chongqing":"CN","Asia/Harbin":"CN","Asia/Urumqi":"CN","Asia/Hong_Kong":"HK","Asia/Macau":"MO","Asia/Taipei":"TW","Asia/Singapore":"SG","Asia/Kuala_Lumpur":"MY","Asia/Brunei":"BN","Asia/Jakarta":"ID","Asia/Makassar":"ID","Asia/Jayapura":"ID","Asia/Bangkok":"TH","Asia/Ho_Chi_Minh":"VN","Asia/Saigon":"VN","Asia/Phnom_Penh":"KH","Asia/Vientiane":"LA","Asia/Yangon":"MM","Asia/Rangoon":"MM","Asia/Manila":"PH","Asia/Ulaanbaatar":"MN","Asia/Hovd":"MN","Asia/Tbilisi":"GE","Asia/Baku":"AZ","Asia/Yerevan":"AM","Asia/Almaty":"KZ","Asia/Bishkek":"KG","Asia/Tashkent":"UZ","Asia/Ashgabat":"TM","Asia/Dushanbe":"TJ","Asia/Thimphu":"BT","Asia/Dili":"TL","Europe/London":"GB","Europe/Dublin":"IE","Europe/Lisbon":"PT","Europe/Madrid":"ES","Europe/Paris":"FR","Europe/Brussels":"BE","Europe/Amsterdam":"NL","Europe/Luxembourg":"LU","Europe/Berlin":"DE","Europe/Zurich":"CH","Europe/Vienna":"AT","Europe/Rome":"IT","Europe/Monaco":"MC","Europe/Vatican":"VA","Europe/Malta":"MT","Europe/Prague":"CZ","Europe/Budapest":"HU","Europe/Warsaw":"PL","Europe/Bratislava":"SK","Europe/Ljubljana":"SI","Europe/Zagreb":"HR","Europe/Belgrade":"RS","Europe/Sarajevo":"BA","Europe/Podgorica":"ME","Europe/Skopje":"MK","Europe/Tirane":"AL","Europe/Sofia":"BG","Europe/Bucharest":"RO","Europe/Chisinau":"MD","Europe/Athens":"GR","Europe/Istanbul":"TR","Europe/Helsinki":"FI","Europe/Stockholm":"SE","Europe/Oslo":"NO","Europe/Copenhagen":"DK","Europe/Tallinn":"EE","Europe/Riga":"LV","Europe/Vilnius":"LT","Europe/Minsk":"BY","Europe/Moscow":"RU","Europe/Kaliningrad":"RU","Europe/Samara":"RU","Europe/Kiev":"UA","Europe/Kyiv":"UA","Europe/Reykjavik":"IS","Europe/Andorra":"AD","Europe/Gibraltar":"GI","Europe/San_Marino":"SM","America/New_York":"US","America/Chicago":"US","America/Denver":"US","America/Los_Angeles":"US","America/Phoenix":"US","America/Anchorage":"US","Pacific/Honolulu":"US","America/Detroit":"US","America/Indianapolis":"US","America/Boise":"US","America/Juneau":"US","America/Adak":"US","America/Toronto":"CA","America/Vancouver":"CA","America/Montreal":"CA","America/Winnipeg":"CA","America/Edmonton":"CA","America/Halifax":"CA","America/St_Johns":"CA","America/Regina":"CA","America/Mexico_City":"MX","America/Cancun":"MX","America/Tijuana":"MX","America/Monterrey":"MX","America/Hermosillo":"MX","America/Guatemala":"GT","America/Belize":"BZ","America/El_Salvador":"SV","America/Tegucigalpa":"HN","America/Managua":"NI","America/Costa_Rica":"CR","America/Panama":"PA","America/Bogota":"CO","America/Lima":"PE","America/Guayaquil":"EC","America/Caracas":"VE","America/La_Paz":"BO","America/Asuncion":"PY","America/Montevideo":"UY","America/Buenos_Aires":"AR","America/Argentina/Buenos_Aires":"AR","America/Santiago":"CL","America/Sao_Paulo":"BR","America/Recife":"BR","America/Manaus":"BR","America/Fortaleza":"BR","America/Bahia":"BR","America/Havana":"CU","America/Jamaica":"JM","America/Port-au-Prince":"HT","America/Santo_Domingo":"DO","America/Puerto_Rico":"PR","America/Port_of_Spain":"TT","America/Barbados":"BB","America/Martinique":"MQ","America/Guyana":"GY","America/Paramaribo":"SR","America/Cayenne":"GF","America/Curacao":"CW","Africa/Cairo":"EG","Africa/Casablanca":"MA","Africa/Tunis":"TN","Africa/Algiers":"DZ","Africa/Tripoli":"LY","Africa/Khartoum":"SD","Africa/Addis_Ababa":"ET","Africa/Nairobi":"KE","Africa/Dar_es_Salaam":"TZ","Africa/Kampala":"UG","Africa/Mogadishu":"SO","Africa/Lagos":"NG","Africa/Accra":"GH","Africa/Abidjan":"CI","Africa/Dakar":"SN","Africa/Bamako":"ML","Africa/Ouagadougou":"BF","Africa/Conakry":"GN","Africa/Freetown":"SL","Africa/Monrovia":"LR","Africa/Lome":"TG","Africa/Porto-Novo":"BJ","Africa/Niamey":"NE","Africa/Douala":"CM","Africa/Libreville":"GA","Africa/Bangui":"CF","Africa/Brazzaville":"CG","Africa/Kinshasa":"CD","Africa/Lubumbashi":"CD","Africa/Luanda":"AO","Africa/Maputo":"MZ","Africa/Harare":"ZW","Africa/Lusaka":"ZM","Africa/Lilongwe":"MW","Africa/Johannesburg":"ZA","Africa/Windhoek":"NA","Africa/Gaborone":"BW","Africa/Maseru":"LS","Africa/Mbabane":"SZ","Indian/Antananarivo":"MG","Indian/Mauritius":"MU","Indian/Reunion":"RE","Indian/Comoro":"KM","Indian/Mayotte":"YT","Africa/Djibouti":"DJ","Africa/Asmara":"ER","Australia/Sydney":"AU","Australia/Melbourne":"AU","Australia/Brisbane":"AU","Australia/Perth":"AU","Australia/Adelaide":"AU","Australia/Hobart":"AU","Australia/Darwin":"AU","Australia/Lord_Howe":"AU","Pacific/Auckland":"NZ","Pacific/Chatham":"NZ","Pacific/Fiji":"FJ","Pacific/Tongatapu":"TO","Pacific/Apia":"WS","Pacific/Port_Moresby":"PG","Pacific/Noumea":"NC","Pacific/Guam":"GU","Pacific/Pago_Pago":"AS","Pacific/Tahiti":"PF","Atlantic/Reykjavik":"IS","Atlantic/Azores":"PT","Atlantic/Canary":"ES","Atlantic/Madeira":"PT","Atlantic/Cape_Verde":"CV","Atlantic/Bermuda":"BM","Indian/Maldives":"MV","Indian/Chagos":"IO","Indian/Christmas":"CX","Indian/Cocos":"CC"},g=new Set(["password","hidden","email","tel","number"]),y=["password","pass","cvv","card","credit","ssn","secret","name","phone","email","address"];class v{constructor(e){t(this,"instance"),t(this,"observer",null),t(this,"trackedProducts",new Set),this.instance=e}init(){"undefined"!=typeof window&&"undefined"!=typeof document&&(this.attachEventListeners(),this.startMutationObserver())}destroy(){this.observer&&this.observer.disconnect()}isSensitive(e,t){if(g.has(t.toLowerCase()))return!0;const i=e.toLowerCase();return y.some(e=>i.includes(e))}attachEventListeners(){document.addEventListener("click",e=>{var t;const i=e.target.closest("button, a, [role='button'], [data-engage-action]");if(!i)return;const a=i.getAttribute("data-engage-action")||(null==(t=i.textContent)?void 0:t.trim().slice(0,50)),n=i.getAttribute("data-engage-product-id"),r=i.getAttribute("data-engage-price"),o=i.getAttribute("data-engage-currency")||"USD",s=(null==a?void 0:a.toLowerCase())||"";s.includes("add to cart")||s.includes("buy now")||"add_to_cart"===i.getAttribute("data-engage-intent")?this.instance.track("ADD_TO_CART",{productId:n,amount:r?parseFloat(r):void 0,currency:o,actionName:a},{intent:"commerce",standardEvent:"ADD_TO_CART"}):s.includes("cancel")&&(s.includes("order")||s.includes("subscription"))?this.instance.track("ORDER_CANCELLED",{actionName:a},{intent:"commerce",standardEvent:"GENERIC"}):s.includes("review")||s.includes("submit rating")||"review"===i.getAttribute("data-engage-intent")?this.instance.track("REVIEW_SUBMITTED",{productId:n},{intent:"engagement"}):i.hasAttribute("data-engage-track")&&this.instance.track("CLICK",{actionName:a,productId:n})},{capture:!0,passive:!0}),document.addEventListener("submit",e=>{const t=e.target,i=t.getAttribute("action")||"",a=t.id||"",n=t.className||"",r=t.getAttribute("data-engage-intent"),o=`${i} ${a} ${n} ${r}`.toLowerCase(),s={};new FormData(t),t.querySelectorAll("input, select, textarea").forEach(e=>{const t=e;t.name&&!this.isSensitive(t.name,t.type)&&(s[`has_${t.name}`]=!0)}),o.includes("signup")||o.includes("register")?this.instance.track("SIGNUP",{formId:a,metadata:s},{intent:"identity",standardEvent:"REGISTER"}):o.includes("checkout")||o.includes("payment")?this.instance.track("CHECKOUT_STARTED",{formId:a},{intent:"commerce"}):r&&this.instance.track(r.toUpperCase(),{formId:a,metadata:s})},{capture:!0,passive:!0})}startMutationObserver(){this.observer=new MutationObserver(e=>{e.forEach(e=>{"childList"===e.type&&e.addedNodes.forEach(e=>{if(e.nodeType===Node.ELEMENT_NODE){const t=e;this.scanForProducts(t)}})})}),this.observer.observe(document.body,{childList:!0,subtree:!0}),this.scanForProducts(document.body)}scanForProducts(e){e.querySelectorAll("[data-engage-product-id]").forEach(e=>{const t=e.getAttribute("data-engage-product-id");if(!t||this.trackedProducts.has(t))return;this.trackedProducts.add(t);const i=e.getAttribute("data-engage-product-name"),a=e.getAttribute("data-engage-category"),n=e.getAttribute("data-engage-price"),r=e.getAttribute("data-engage-currency")||"USD";this.instance.track("VIEW_CONTENT",{productId:t,productName:i,productCategory:a,amount:n?parseFloat(n):void 0,currency:r},{intent:"commerce",standardEvent:"VIEW_CONTENT"})})}}const E=new Set(["localhost","127.0.0.1"]),w="engage_session_id",b={$:"USD",US$:"USD",USD:"USD","₹":"INR",RS:"INR","RS.":"INR",INR:"INR","€":"EUR",EUR:"EUR","£":"GBP",GBP:"GBP","¥":"JPY",JPY:"JPY"},S=e=>{if("string"!=typeof e)return;const t=e.trim().toUpperCase();return t?b[t]?b[t]:t.includes("₹")||t.startsWith("RS")?"INR":t.includes("$")&&!t.includes("CAD")?"USD":t.includes("€")?"EUR":t.includes("£")?"GBP":t.includes("¥")?"JPY":/^[A-Z]{3}$/.test(t)?t:void 0:void 0};function C(e){if(!e||"object"!=typeof e)return;const t={},i=Object.keys(e).slice(0,20);for(const a of i){const i=e[a];"boolean"==typeof i||"number"==typeof i?t[a]=i:"string"==typeof i&&(t[a]=i.slice(0,100))}return Object.keys(t).length>0?t:void 0}class R{constructor(e){t(this,"config"),t(this,"context"),t(this,"queue"),t(this,"transport"),t(this,"domTracker"),t(this,"sessionId"),t(this,"countryCode"),t(this,"currentSentiment"),t(this,"identify",(e,t)=>{this.context.userId=e,this.processEvent({event:"Identify",properties:{traits:t},standardEvent:"LOGIN",intent:"identity",confidence:1})}),t(this,"page",(e,t)=>{const i=this.context.getPayload().page;this.processEvent({event:e||i.title||"Unknown Page",properties:{path:i.path,referrer:i.referrer,title:i.title,...t},standardEvent:"PAGE_VIEW",intent:"navigation",confidence:1}),this.emitEngageEvent("pageview",t)}),t(this,"track",(e,t,i)=>{this.processEvent({event:e,properties:t||{},...i});const a={purchase:"purchase",PURCHASE:"purchase",signup:"signup",SIGNUP:"signup",register:"signup",REGISTER:"signup",add_to_cart:"add_to_cart",ADD_TO_CART:"add_to_cart",product_view:"product_view",VIEW_CONTENT:"product_view",session_start:"session_start",session_end:"session_end"},n=a[e]||a[(null==i?void 0:i.standardEvent)||""]||"custom";this.emitEngageEvent(n,t)}),t(this,"trackRevenue",(e,t,i)=>{const a=Math.max(0,(e=>{if("number"==typeof e)return Number.isFinite(e)?e:0;const t=e.trim().replace(/[^0-9.+-]/g,""),i=Number(t);return Number.isFinite(i)?i:0})(e)),n=S(null==t?void 0:t.currency)||S(null==t?void 0:t.currencyCode)||S(null==t?void 0:t.currencySymbol)||("string"==typeof e?S(e):void 0)||"USD";this.track("PURCHASE",{...t||{},value:a,amount:a,valuePaise:Math.round(100*a),amountPaise:Math.round(100*a),currency:n,currencyCode:n},{standardEvent:"PURCHASE",intent:"commerce",confidence:1,...i})}),t(this,"setSentiment",e=>{this.currentSentiment=e}),this.config=e;const i=e.apiKey,a=((e,t,i)=>{if(!e)return i;try{const t=new URL(e);return t.hostname.endsWith("bluenath.com")||E.has(t.hostname)?(t.pathname="/api/v1/analytics/ingest",t.search="",t.hash="",t.toString()):i}catch{return i}})(e.apiHost,0,"https://engage-api.bluenath.com/api/v1/analytics/ingest");this.transport=new f({engage:a}),this.transport.setApiKey(i),this.context=new A({persistence:e.tracking.useCookies?"cookie":"local"}),this.queue=new p(this.transport),this.sessionId=function(){if("undefined"==typeof sessionStorage)return d();let e=sessionStorage.getItem(w);return e||(e=d(),sessionStorage.setItem(w,e)),e}(),this.countryCode=function(){try{const e=Intl.DateTimeFormat().resolvedOptions().timeZone;if(!e)return;return m[e]}catch{return}}(),this.domTracker=new v(this),e.tracking.autoTrack&&"undefined"!=typeof window&&(this.page(),this.domTracker.init())}emitEngageEvent(e,t){const i=this.context.getPayload().page,a={type:e,timestamp:(new Date).toISOString(),sessionId:this.sessionId,userId:this.context.getPayload().user.id||void 0,countryCode:this.countryCode,sentiment:this.currentSentiment,referrer:(i.referrer||"").slice(0,500),path:i.path||("undefined"!=typeof window?window.location.pathname:"/"),currency:S(null==t?void 0:t.currency)||S(null==t?void 0:t.currencyCode)||void 0,amount:"number"==typeof(null==t?void 0:t.amountPaise)?t.amountPaise:"number"==typeof(null==t?void 0:t.amount)?Math.round(100*t.amount):void 0,productId:"string"==typeof(null==t?void 0:t.productId)?t.productId:void 0,productName:"string"==typeof(null==t?void 0:t.productName)?t.productName:void 0,productCategory:"string"==typeof(null==t?void 0:t.productCategory)?t.productCategory:void 0,metadata:C(null==t?void 0:t.metadata)};this.queue.enqueueEngageEvent(a),this.currentSentiment&&(this.currentSentiment=void 0)}parseRef(e){if(!e)return{};const t=e.match(/^camp_([^_]+)_cr_([^_]+)$/);return t?{campaignId:t[1],creatorId:t[2]}:{}}processEvent(e){const t=this.context.getPayload(),i=e.properties.ref,a=("string"==typeof i?i:void 0)||new URLSearchParams(t.page.search||"").get("ref")||void 0,n=this.parseRef(a),r=e.properties.value??e.properties.amount??e.properties.valuePaise??e.properties.amountPaise,o=Number(r),s=e.properties.campaignId,c=e.properties.creatorId,u=e.properties.currency,h={event:e.event,properties:e.properties,standardEvent:e.standardEvent,intent:e.intent,confidence:e.confidence,rawLabel:e.rawLabel,timestamp:(new Date).toISOString(),messageId:d(),writeKey:this.config.apiKey||"",ref:a,campaignId:("string"==typeof s?s:void 0)||n.campaignId,creatorId:("string"==typeof c?c:void 0)||n.creatorId,value:Number.isFinite(o)?Math.round(o):void 0,valuePaise:Number.isFinite(o)?Math.round(100*o):void 0,currency:("string"==typeof u?u:void 0)||"USD",userId:t.user.id||void 0,anonymousId:t.user.anonymousId,context:t};this.config.debug,this.queue.enqueue(h)}}class I{constructor(e){t(this,"analytics"),t(this,"metrics",{}),this.analytics=e,"undefined"!=typeof window&&"PerformanceObserver"in window&&this.observe()}observe(){try{new PerformanceObserver(e=>{for(const t of e.getEntries()){const e=t;e.hadRecentInput||(this.metrics.cls=(this.metrics.cls||0)+e.value)}}).observe({type:"layout-shift",buffered:!0}),new PerformanceObserver(e=>{const t=e.getEntries(),i=t[t.length-1];this.metrics.lcp=i.renderTime||i.loadTime,this.logMetric("LCP",this.metrics.lcp)}).observe({type:"largest-contentful-paint",buffered:!0}),new PerformanceObserver(e=>{const t=e.getEntries()[0];t&&(this.metrics.fid=t.processingStart-t.startTime,this.logMetric("FID",this.metrics.fid))}).observe({type:"first-input",buffered:!0}),window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&this.metrics.cls&&this.logMetric("CLS",this.metrics.cls)})}catch(e){}}logMetric(e,t){t<0||this.analytics.track(`Core Web Vital: ${e}`,{metric:e,value:Math.round(t)},{standardEvent:"PERFORMANCE",intent:"performance",confidence:1,rawLabel:`${e}: ${Math.round(t)}ms`})}}const _=a.createContext(null);let P=null;const M=e=>{if(!P){const t={...e,apiKey:e.apiKey||""};P=new R(t)}return P},T={init:e=>M({apiKey:e.apiKey,apiHost:e.apiHost,tracking:e.tracking||{useCookies:!0,fingerprint:!0,autoTrack:!0},debug:e.debug}),track(e,t){P&&P.track(e,t)},page(e,t){P&&P.page(e,t)},identify(e,t){P&&P.identify(e,t)},trackRevenue(e,t){P&&P.trackRevenue(e,t)},setSentiment(e){P&&P.setSentiment(e)}};exports.EngageProProvider=({children:e,...t})=>{const n=a.useRef(null),r=a.useRef(null);n.current||(n.current=new R(t),"undefined"!=typeof window&&new I(n.current));const o=n.current;return a.useEffect(()=>{if(!t.tracking.autoTrack)return;const e=e=>{const t=e.target.closest('button, a, input[type="submit"], [data-track], .clickable');if(t){const i=Date.now(),a=r.current;a&&a.el===t&&i-a.ts<500?(a.count++,a.ts=i,3===a.count&&(o.track("Rage Click detected",{element:t.tagName},{standardEvent:"RAGE_CLICK",intent:"frustration",confidence:1}),r.current=null)):r.current={el:t,count:1,ts:i};const n=(e=>{let t=(e.innerText||e.value||e.getAttribute("aria-label")||"").trim();if(!t){const i=e.querySelector("img");i&&i.alt&&(t=i.alt);const a=e.querySelector("title");a&&(t=a.textContent||"")}const i=t.slice(0,100),a=i.toLowerCase(),n=(e.id||"").toLowerCase(),r=e.href||"";return/add to (cart|bag)|buy now/.test(a)||n.includes("add-to-cart")?{standard:"ADD_TO_CART",intent:"commerce",label:i,confidence:.9}:/checkout|proceed/.test(a)||r.includes("/checkout")?{standard:"INITIATE_CHECKOUT",intent:"commerce",label:i,confidence:.9}:/place order|pay now/.test(a)||n.includes("place-order")?{standard:"PURCHASE",intent:"commerce",label:i,confidence:.95}:/cancel order/.test(a)||n.includes("cancel")?{standard:"ORDER_CANCEL",intent:"lifecycle",label:i,confidence:.85}:/refund|return/.test(a)||n.includes("refund")?{standard:"ORDER_REFUND",intent:"lifecycle",label:i,confidence:.85}:/track package|shipping/.test(a)?{standard:"TRACK_PACKAGE",intent:"lifecycle",label:i,confidence:.8}:/write review/.test(a)||a.includes("star")&&/^[1-5]/.test(a)?{standard:"RATE_PRODUCT",intent:"engagement",label:i,confidence:.8}:a.includes("search")||n.includes("search")?{standard:"SEARCH",intent:"search",label:i,confidence:.7}:{standard:"GENERIC",intent:"interaction",label:i,confidence:.5}})(t),s="A"===t.tagName;let c={};"commerce"===n.intent&&(c=(t=>{let i={};try{const a=document.querySelectorAll('script[type="application/ld+json"]');for(const t of Array.from(a))try{const e=JSON.parse(t.innerHTML),a=Array.isArray(e)?e:[e];for(const t of a)if("Product"===t["@type"]){if(t.name&&(i.productName=t.name),(t.sku||t.productID)&&(i.productId=t.sku||t.productID),t.offers){const e=Array.isArray(t.offers)?t.offers[0]:t.offers;e.price&&(i.amount=Number(e.price)),e.priceCurrency&&(i.currency=e.priceCurrency)}if(i.amount)return i}}catch(e){}if(!i.amount){const e=document.querySelector('meta[property="product:price:amount"]'),t=document.querySelector('meta[property="product:price:currency"]'),a=document.querySelector('meta[property="og:title"]');e&&(i.amount=Number(e.getAttribute("content"))),t&&(i.currency=t.getAttribute("content")),a&&(i.productName=a.getAttribute("content"))}if(!i.amount){const e=(t.innerText||"").match(/([$€£₹¥])\s*([0-9,]+\.[0-9]{2})/);if(e){const t=e[1],a=e[2].replace(/,/g,"");i.amount=Number(a);const n={$:"USD","€":"EUR","£":"GBP","₹":"INR","¥":"JPY"};i.currency=n[t]||"USD"}else{let e=t,a=0;for(;e&&a<3&&!i.amount;){const t=e.innerText||"";if(t.length<500){const e=t.match(/([$€£₹¥])\s*([0-9,]+\.[0-9]{2})/);if(e){const t=e[1],a=e[2].replace(/,/g,"");i.amount=Number(a);const n={$:"USD","€":"EUR","£":"GBP","₹":"INR","¥":"JPY"};i.currency=n[t]||"USD"}}e=e.parentElement,a++}}}}catch(a){}return i})(t)),o.track("Interaction",{element:t.tagName.toLowerCase(),id:t.id,destination:s?t.href:void 0,...c},{standardEvent:n.standard,intent:n.intent,rawLabel:n.label,confidence:n.confidence})}},i=e=>{const t=e.target;(e=>"password"===e.getAttribute("type")||"hidden"===e.getAttribute("type")||/password|cvc|card|cc-num|ssn|credit|hidden/i.test(e.getAttribute("name")||e.id||""))(t)||"focusin"!==e.type||t.dataset.tracked||(t.dataset.tracked="true",o.track("Form Start",{field:t.name||t.id},{standardEvent:"FORM_START",intent:"identity"}))},a=()=>{const e=new URLSearchParams(window.location.search);e.has("q")&&o.track("Search Query",{query:e.get("q")},{standardEvent:"SEARCH",intent:"search"}),requestAnimationFrame(()=>o.page())},n=history.pushState;return history.pushState=(...e)=>{n.apply(history,e),a()},window.addEventListener("popstate",a),window.addEventListener("click",e,!0),window.addEventListener("focusin",i,!0),a(),()=>{history.pushState=n,window.removeEventListener("popstate",a),window.removeEventListener("click",e,!0),window.removeEventListener("focusin",i,!0)}},[t.tracking.autoTrack]),i.jsx(_.Provider,{value:o,children:e})},exports.default=R,exports.engage=T,exports.init=M,exports.useAnalytics=()=>{const e=a.useContext(_);if(!e)throw new Error("useAnalytics must be used within EngageProProvider");return e};
package/dist/index.js CHANGED
@@ -44,10 +44,47 @@ const hashFnv32a = (str) => {
44
44
  }
45
45
  return ("0000000" + (hval >>> 0).toString(16)).substr(-8);
46
46
  };
47
+ const getCanvasFingerprint = () => {
48
+ try {
49
+ const canvas = document.createElement("canvas");
50
+ canvas.width = 200;
51
+ canvas.height = 50;
52
+ const ctx = canvas.getContext("2d");
53
+ if (!ctx) return "";
54
+ ctx.textBaseline = "top";
55
+ ctx.font = "14px 'Arial'";
56
+ ctx.textBaseline = "alphabetic";
57
+ ctx.fillStyle = "#f60";
58
+ ctx.fillRect(125, 1, 62, 20);
59
+ ctx.fillStyle = "#069";
60
+ ctx.fillText("EngagePro, 😃", 2, 15);
61
+ ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
62
+ ctx.fillText("EngagePro, 😃", 4, 17);
63
+ return hashFnv32a(canvas.toDataURL());
64
+ } catch (e) {
65
+ return "";
66
+ }
67
+ };
68
+ const getWebGLFingerprint = () => {
69
+ try {
70
+ const canvas = document.createElement("canvas");
71
+ const gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
72
+ if (!gl) return { vendor: "", renderer: "" };
73
+ const debugInfo = gl.getExtension("WEBGL_debug_renderer_info");
74
+ if (!debugInfo) return { vendor: "", renderer: "" };
75
+ return {
76
+ vendor: gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL),
77
+ renderer: gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)
78
+ };
79
+ } catch (e) {
80
+ return { vendor: "", renderer: "" };
81
+ }
82
+ };
47
83
  const getDeviceFingerprint = () => {
48
84
  if (typeof window === "undefined") return "server-side-id";
49
85
  const n = navigator;
50
86
  const s = window.screen;
87
+ const webgl = getWebGLFingerprint();
51
88
  const signals = {
52
89
  userAgent: n.userAgent || "",
53
90
  screenRes: `${s.width}x${s.height}`,
@@ -57,8 +94,11 @@ const getDeviceFingerprint = () => {
57
94
  platform: n.platform || "unknown",
58
95
  hardwareConcurrency: n.hardwareConcurrency || 1,
59
96
  // CPU Cores
60
- deviceMemory: n.deviceMemory || 0
97
+ deviceMemory: n.deviceMemory || 0,
61
98
  // RAM (approx in GB, Chrome only)
99
+ canvasFingerprint: getCanvasFingerprint(),
100
+ webglVendor: webgl.vendor,
101
+ webglRenderer: webgl.renderer
62
102
  };
63
103
  const entropy = [
64
104
  signals.platform,
@@ -67,7 +107,10 @@ const getDeviceFingerprint = () => {
67
107
  signals.colorDepth,
68
108
  signals.timezone,
69
109
  signals.hardwareConcurrency,
70
- signals.deviceMemory
110
+ signals.deviceMemory,
111
+ signals.canvasFingerprint,
112
+ signals.webglVendor,
113
+ signals.webglRenderer
71
114
  ].join("|");
72
115
  return `${hashFnv32a(entropy)}-${hashFnv32a(signals.userAgent)}`;
73
116
  };
@@ -731,6 +774,147 @@ function detectCountryFromTimezone() {
731
774
  return void 0;
732
775
  }
733
776
  }
777
+ const SENSITIVE_INPUT_TYPES = /* @__PURE__ */ new Set([
778
+ "password",
779
+ "hidden",
780
+ "email",
781
+ "tel",
782
+ "number"
783
+ // Could be CC
784
+ ]);
785
+ const SENSITIVE_FIELD_NAMES = [
786
+ "password",
787
+ "pass",
788
+ "cvv",
789
+ "card",
790
+ "credit",
791
+ "ssn",
792
+ "secret",
793
+ "name",
794
+ "phone",
795
+ "email",
796
+ "address"
797
+ ];
798
+ class DOMTracker {
799
+ constructor(instance2) {
800
+ __publicField(this, "instance");
801
+ __publicField(this, "observer", null);
802
+ __publicField(this, "trackedProducts", /* @__PURE__ */ new Set());
803
+ this.instance = instance2;
804
+ }
805
+ init() {
806
+ if (typeof window === "undefined" || typeof document === "undefined") return;
807
+ this.attachEventListeners();
808
+ this.startMutationObserver();
809
+ }
810
+ destroy() {
811
+ if (this.observer) {
812
+ this.observer.disconnect();
813
+ }
814
+ }
815
+ isSensitive(name, type) {
816
+ if (SENSITIVE_INPUT_TYPES.has(type.toLowerCase())) return true;
817
+ const lowerName = name.toLowerCase();
818
+ return SENSITIVE_FIELD_NAMES.some((s) => lowerName.includes(s));
819
+ }
820
+ attachEventListeners() {
821
+ document.addEventListener(
822
+ "click",
823
+ (e) => {
824
+ var _a;
825
+ const target = e.target;
826
+ const closestBtn = target.closest("button, a, [role='button'], [data-engage-action]");
827
+ if (!closestBtn) return;
828
+ const action = closestBtn.getAttribute("data-engage-action") || ((_a = closestBtn.textContent) == null ? void 0 : _a.trim().slice(0, 50));
829
+ const productId = closestBtn.getAttribute("data-engage-product-id");
830
+ const price = closestBtn.getAttribute("data-engage-price");
831
+ const currency = closestBtn.getAttribute("data-engage-currency") || "USD";
832
+ const textLower = (action == null ? void 0 : action.toLowerCase()) || "";
833
+ if (textLower.includes("add to cart") || textLower.includes("buy now") || closestBtn.getAttribute("data-engage-intent") === "add_to_cart") {
834
+ this.instance.track("ADD_TO_CART", {
835
+ productId,
836
+ amount: price ? parseFloat(price) : void 0,
837
+ currency,
838
+ actionName: action
839
+ }, { intent: "commerce", standardEvent: "ADD_TO_CART" });
840
+ } else if (textLower.includes("cancel") && (textLower.includes("order") || textLower.includes("subscription"))) {
841
+ this.instance.track("ORDER_CANCELLED", { actionName: action }, { intent: "commerce", standardEvent: "GENERIC" });
842
+ } else if (textLower.includes("review") || textLower.includes("submit rating") || closestBtn.getAttribute("data-engage-intent") === "review") {
843
+ this.instance.track("REVIEW_SUBMITTED", { productId }, { intent: "engagement" });
844
+ } else if (closestBtn.hasAttribute("data-engage-track")) {
845
+ this.instance.track("CLICK", { actionName: action, productId });
846
+ }
847
+ },
848
+ { capture: true, passive: true }
849
+ );
850
+ document.addEventListener(
851
+ "submit",
852
+ (e) => {
853
+ const target = e.target;
854
+ const action = target.getAttribute("action") || "";
855
+ const id = target.id || "";
856
+ const classes = target.className || "";
857
+ const intent = target.getAttribute("data-engage-intent");
858
+ const combinedContext = `${action} ${id} ${classes} ${intent}`.toLowerCase();
859
+ const metadata = {};
860
+ new FormData(target);
861
+ target.querySelectorAll("input, select, textarea").forEach((el) => {
862
+ const input = el;
863
+ if (input.name && !this.isSensitive(input.name, input.type)) {
864
+ metadata[`has_${input.name}`] = true;
865
+ }
866
+ });
867
+ if (combinedContext.includes("signup") || combinedContext.includes("register")) {
868
+ this.instance.track("SIGNUP", { formId: id, metadata }, { intent: "identity", standardEvent: "REGISTER" });
869
+ } else if (combinedContext.includes("checkout") || combinedContext.includes("payment")) {
870
+ this.instance.track("CHECKOUT_STARTED", { formId: id }, { intent: "commerce" });
871
+ } else if (intent) {
872
+ this.instance.track(intent.toUpperCase(), { formId: id, metadata });
873
+ }
874
+ },
875
+ { capture: true, passive: true }
876
+ );
877
+ }
878
+ startMutationObserver() {
879
+ this.observer = new MutationObserver((mutations) => {
880
+ mutations.forEach((mutation) => {
881
+ if (mutation.type === "childList") {
882
+ mutation.addedNodes.forEach((node) => {
883
+ if (node.nodeType === Node.ELEMENT_NODE) {
884
+ const el = node;
885
+ this.scanForProducts(el);
886
+ }
887
+ });
888
+ }
889
+ });
890
+ });
891
+ this.observer.observe(document.body, { childList: true, subtree: true });
892
+ this.scanForProducts(document.body);
893
+ }
894
+ scanForProducts(root) {
895
+ const productElements = root.querySelectorAll("[data-engage-product-id]");
896
+ productElements.forEach((el) => {
897
+ const productId = el.getAttribute("data-engage-product-id");
898
+ if (!productId || this.trackedProducts.has(productId)) return;
899
+ this.trackedProducts.add(productId);
900
+ const productName = el.getAttribute("data-engage-product-name");
901
+ const category = el.getAttribute("data-engage-category");
902
+ const price = el.getAttribute("data-engage-price");
903
+ const currency = el.getAttribute("data-engage-currency") || "USD";
904
+ this.instance.track(
905
+ "VIEW_CONTENT",
906
+ {
907
+ productId,
908
+ productName,
909
+ productCategory: category,
910
+ amount: price ? parseFloat(price) : void 0,
911
+ currency
912
+ },
913
+ { intent: "commerce", standardEvent: "VIEW_CONTENT" }
914
+ );
915
+ });
916
+ }
917
+ }
734
918
  const ENGAGE_INGEST_ENDPOINT = "https://engage-api.bluenath.com/api/v1/analytics/ingest";
735
919
  const ENGAGE_INGEST_PATH = "/api/v1/analytics/ingest";
736
920
  const ALLOWED_DEV_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1"]);
@@ -819,6 +1003,7 @@ class EngagePro {
819
1003
  __publicField(this, "context");
820
1004
  __publicField(this, "queue");
821
1005
  __publicField(this, "transport");
1006
+ __publicField(this, "domTracker");
822
1007
  // Spec §3.2: Auto-detected fields
823
1008
  __publicField(this, "sessionId");
824
1009
  __publicField(this, "countryCode");
@@ -922,8 +1107,10 @@ class EngagePro {
922
1107
  this.queue = new EventQueue(this.transport);
923
1108
  this.sessionId = getOrCreateSessionId();
924
1109
  this.countryCode = detectCountryFromTimezone();
1110
+ this.domTracker = new DOMTracker(this);
925
1111
  if (config.tracking.autoTrack && typeof window !== "undefined") {
926
1112
  this.page();
1113
+ this.domTracker.init();
927
1114
  }
928
1115
  }
929
1116
  /**
@@ -0,0 +1,14 @@
1
+ import { EngagePro } from '../core/Analytics';
2
+
3
+ export declare class DOMTracker {
4
+ private instance;
5
+ private observer;
6
+ private trackedProducts;
7
+ constructor(instance: EngagePro);
8
+ init(): void;
9
+ destroy(): void;
10
+ private isSensitive;
11
+ private attachEventListeners;
12
+ private startMutationObserver;
13
+ private scanForProducts;
14
+ }
@@ -7,5 +7,8 @@ export interface DeviceSignal {
7
7
  platform: string;
8
8
  hardwareConcurrency: number;
9
9
  deviceMemory?: number;
10
+ canvasFingerprint: string;
11
+ webglVendor: string;
12
+ webglRenderer: string;
10
13
  }
11
14
  export declare const getDeviceFingerprint: () => string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bluenath/engage",
3
- "version": "2.0.9",
3
+ "version": "2.0.10",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",