@bluenath/engage 2.0.9 → 2.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -79
- package/dist/core/Analytics.d.ts +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +196 -4
- package/dist/lib/dom.d.ts +14 -0
- package/dist/lib/fingerprint.d.ts +3 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,34 +1,20 @@
|
|
|
1
1
|
# @bluenath/engage
|
|
2
2
|
|
|
3
|
-
The official
|
|
4
|
-
|
|
5
|
-
Developed by the [Bluenath](https://bluenath.com) team.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Overview
|
|
10
|
-
|
|
11
|
-
`@bluenath/engage` is a high-performance analytics SDK designed to bridge the gap between user interactions and campaign attribution. It captures critical web events, enriches intent signals, and securely transmits batched payloads to EngagePro's ingestion servers for real-time ROI analysis.
|
|
12
|
-
|
|
13
|
-
## Key Features
|
|
14
|
-
|
|
15
|
-
- **Automated Event Capture**: Seamlessly tracks high-value interactions including page views, commerce events, form submissions, and friction signals (e.g., rage-clicks).
|
|
16
|
-
- **Manual Business Events**: Flexible API for tracking custom conversions with support for value, currency, and campaign metadata.
|
|
17
|
-
- **Resilient Delivery**: Robust offline queueing mechanism with exponential backoff and retry logic.
|
|
18
|
-
- **Framework Integration**: Includes a lightweight React Provider and custom hooks for modern web architectures.
|
|
19
|
-
- **Data Security**: Built-in protection for sensitive input fields and secure handling of attribution identifiers.
|
|
3
|
+
The official event tracking SDK for EngagePro.
|
|
20
4
|
|
|
21
5
|
## Installation
|
|
22
6
|
|
|
23
|
-
Install the package
|
|
7
|
+
Install the package using your preferred package manager:
|
|
24
8
|
|
|
25
9
|
```bash
|
|
26
10
|
npm install @bluenath/engage
|
|
27
11
|
```
|
|
28
12
|
|
|
29
|
-
## Quick Start
|
|
13
|
+
## Quick Start
|
|
30
14
|
|
|
31
|
-
|
|
15
|
+
### React Application
|
|
16
|
+
|
|
17
|
+
Initialize the SDK at the root of your application using the `EngageProProvider`:
|
|
32
18
|
|
|
33
19
|
```tsx
|
|
34
20
|
import React from "react";
|
|
@@ -38,7 +24,7 @@ import App from "./App";
|
|
|
38
24
|
|
|
39
25
|
ReactDOM.createRoot(document.getElementById("root")!).render(
|
|
40
26
|
<EngageProProvider
|
|
41
|
-
|
|
27
|
+
apiKey="YOUR_PUBLIC_API_KEY"
|
|
42
28
|
tracking={{
|
|
43
29
|
autoTrack: true,
|
|
44
30
|
useCookies: true,
|
|
@@ -50,16 +36,36 @@ ReactDOM.createRoot(document.getElementById("root")!).render(
|
|
|
50
36
|
);
|
|
51
37
|
```
|
|
52
38
|
|
|
53
|
-
|
|
39
|
+
To track events or identify users in a component, use the `useAnalytics` hook:
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
import { useAnalytics } from "@bluenath/engage";
|
|
43
|
+
|
|
44
|
+
export function ExampleComponent() {
|
|
45
|
+
const analytics = useAnalytics();
|
|
46
|
+
|
|
47
|
+
const handlePurchase = () => {
|
|
48
|
+
analytics.track("PURCHASE", {
|
|
49
|
+
amount: 4999,
|
|
50
|
+
currency: "INR",
|
|
51
|
+
ref: "camp_CAMPAIGN_ID_cr_CREATOR_ID",
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
return <button onClick={handlePurchase}>Complete Purchase</button>;
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Plain JavaScript / Non-React Application
|
|
54
60
|
|
|
55
|
-
|
|
61
|
+
Import and initialize the core `engage` instance:
|
|
56
62
|
|
|
57
63
|
```javascript
|
|
58
64
|
import { engage } from "@bluenath/engage";
|
|
59
65
|
|
|
60
|
-
// Initialize once at the entry point of your
|
|
66
|
+
// Initialize once at the entry point of your application
|
|
61
67
|
engage.init({
|
|
62
|
-
|
|
68
|
+
apiKey: "YOUR_PUBLIC_API_KEY",
|
|
63
69
|
tracking: {
|
|
64
70
|
autoTrack: true,
|
|
65
71
|
useCookies: true,
|
|
@@ -71,67 +77,23 @@ engage.init({
|
|
|
71
77
|
engage.track("PURCHASE", {
|
|
72
78
|
amount: 2999,
|
|
73
79
|
currency: "INR",
|
|
74
|
-
|
|
80
|
+
ref: "camp_CAMPAIGN_ID_cr_CREATOR_ID"
|
|
75
81
|
});
|
|
76
82
|
```
|
|
77
83
|
|
|
78
|
-
##
|
|
79
|
-
|
|
80
|
-
Use the `track` method (or `useAnalytics` hook in React) to capture specific business outcomes.
|
|
81
|
-
|
|
82
|
-
```tsx
|
|
83
|
-
// React Example
|
|
84
|
-
import { useAnalytics } from "@bluenath/engage";
|
|
85
|
-
|
|
86
|
-
export function PurchaseConfirmation() {
|
|
87
|
-
const analytics = useAnalytics();
|
|
88
|
-
|
|
89
|
-
const handlePurchase = () => {
|
|
90
|
-
analytics.track("PURCHASE", {
|
|
91
|
-
orderId: "ORD-1029",
|
|
92
|
-
amount: 4999,
|
|
93
|
-
currency: "INR",
|
|
94
|
-
ref: "camp_<campaignId>_cr_<creatorId>",
|
|
95
|
-
});
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
return <button onClick={handlePurchase}>Confirm Payout</button>;
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Attribution Reference Format
|
|
103
|
-
|
|
104
|
-
For accurate campaign attribution, ensure the `ref` field follows the standard EngagePro format:
|
|
105
|
-
`camp_<campaignId>_cr_<creatorId>`
|
|
106
|
-
|
|
107
|
-
## API Reference
|
|
108
|
-
|
|
109
|
-
### Configuration Options
|
|
84
|
+
## Configuration Options
|
|
110
85
|
|
|
111
86
|
| Property | Type | Required | Description |
|
|
112
87
|
| :--- | :--- | :--- | :--- |
|
|
113
|
-
| `
|
|
114
|
-
| `
|
|
115
|
-
| `tracking.
|
|
116
|
-
| `tracking.
|
|
117
|
-
| `tracking.fingerprint`| `boolean` | **Yes** | Includes device context for fraud prevention and unique visit tracking. |
|
|
88
|
+
| `apiKey` | `string` | Yes | Your public brand API key from the EngagePro Dashboard. |
|
|
89
|
+
| `tracking.autoTrack` | `boolean` | Yes | Enables automated DOM interaction capture. |
|
|
90
|
+
| `tracking.useCookies`| `boolean` | Yes | Persists anonymous identifiers across sessions. |
|
|
91
|
+
| `tracking.fingerprint`| `boolean` | Yes | Includes device context for fraud prevention and unique visit tracking. |
|
|
118
92
|
| `debug` | `boolean` | No | Enables console logging for integration testing. |
|
|
119
93
|
|
|
120
|
-
##
|
|
121
|
-
|
|
122
|
-
- **Endpoint Isolation**: Production data is exclusively routed to EngagePro's managed infrastructure.
|
|
123
|
-
- **Local Development**: The `apiHost` parameter is strictly limited to local environments for testing. External host overrides are rejected for security compliance.
|
|
124
|
-
- **Security Best Practices**:
|
|
125
|
-
- Never expose internal service keys in client-side code.
|
|
126
|
-
- Rotate write keys immediately if leakage is suspected.
|
|
127
|
-
- Use hashed or anonymous identifiers; do not transmit raw PII (Personally Identifiable Information).
|
|
128
|
-
|
|
129
|
-
## Resources
|
|
130
|
-
|
|
131
|
-
- [Official Documentation](https://engagepro.bluenath.com/docs)
|
|
132
|
-
- [EngagePro Platform](https://engagepro.bluenath.com)
|
|
133
|
-
- [Bluenath Creator OS](https://bluenath.com)
|
|
94
|
+
## Documentation and Resources
|
|
134
95
|
|
|
135
|
-
|
|
96
|
+
For detailed API references and integration guides, please visit our website and documentation:
|
|
136
97
|
|
|
137
|
-
|
|
98
|
+
- [EngagePro Website](https://engagepro.bluenath.com)
|
|
99
|
+
- [EngagePro Documentation](https://engagepro.bluenath.com/docs)
|
package/dist/core/Analytics.d.ts
CHANGED
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,n)=>((t,i,n)=>i in t?e(t,i,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[i]=n)(t,"symbol"!=typeof i?i+"":i,n);Object.defineProperties(exports,{t:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("react/jsx-runtime"),n=require("react");let a;const r=new Uint8Array(16);function o(){if(!a&&(a="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!a))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return a(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 n=(e=e||{}).random||(e.rng||o)();return n[6]=15&n[6]|64,n[8]=63&n[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]]}(n)}const u=e=>{let t=2166136261;const i=e.length;for(let n=0;n<i;n++)t^=e.charCodeAt(n),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(n){this.isQuotaError(n)&&(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 n=0;n<i.length;n++){let e=i[n];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 n="";if(i){const e=new Date;e.setTime(e.getTime()+24*i*60*60*1e3),n="; expires="+e.toUTCString()}document.cookie=`${e}=${encodeURIComponent(t)}${n}; 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:""}}})(),n={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},a=[n.platform,n.language,n.screenRes,n.colorDepth,n.timezone,n.hardwareConcurrency,n.deviceMemory,n.canvasFingerprint,n.webglVendor,n.webglRenderer].join("|");return`${u(a)}-${u(n.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 n=await this.transport.sendEngageEvents(e);if(n.success){i=!0;break}if(n.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 n=await fetch(t,{method:"POST",headers:i,body:e,keepalive:!0});return 401===n.status||422===n.status?{success:!1,permanent:!0,status:n.status}:{success:n.ok||202===n.status,permanent:!1,status:n.status}}catch(n){return{success:!1,permanent:!1}}}beaconFlush(e){if("undefined"==typeof navigator||!navigator.sendBeacon)return!1;let t=this.endpoints.engage;if(this.apiKey){const e=t.includes("?")?"&":"?";t=`${t}${e}apiKey=${encodeURIComponent(this.apiKey)}`}const 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 n=i.getAttribute("data-engage-action")||(null==(t=i.textContent)?void 0:t.trim().slice(0,50)),a=i.getAttribute("data-engage-product-id"),r=i.getAttribute("data-engage-price"),o=i.getAttribute("data-engage-currency")||"USD",s=(null==n?void 0:n.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:a,amount:r?parseFloat(r):void 0,currency:o,actionName:n},{intent:"commerce",standardEvent:"ADD_TO_CART"}):s.includes("cancel")&&(s.includes("order")||s.includes("subscription"))?this.instance.track("ORDER_CANCELLED",{actionName:n},{intent:"commerce",standardEvent:"GENERIC"}):s.includes("review")||s.includes("submit rating")||"review"===i.getAttribute("data-engage-intent")?this.instance.track("REVIEW_SUBMITTED",{productId:a},{intent:"engagement"}):i.hasAttribute("data-engage-track")&&this.instance.track("CLICK",{actionName:n,productId:a})},{capture:!0,passive:!0}),document.addEventListener("submit",e=>{const t=e.target,i=t.getAttribute("action")||"",n=t.id||"",a=t.className||"",r=t.getAttribute("data-engage-intent"),o=`${i} ${n} ${a} ${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:n,metadata:s},{intent:"identity",standardEvent:"REGISTER"}):o.includes("checkout")||o.includes("payment")?this.instance.track("CHECKOUT_STARTED",{formId:n},{intent:"commerce"}):r&&this.instance.track(r.toUpperCase(),{formId:n,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"),n=e.getAttribute("data-engage-category"),a=e.getAttribute("data-engage-price"),r=e.getAttribute("data-engage-currency")||"USD";this.instance.track("VIEW_CONTENT",{productId:t,productName:i,productCategory:n,amount:a?parseFloat(a):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 n of i){const i=e[n];"boolean"==typeof i||"number"==typeof i?t[n]=i:"string"==typeof i&&(t[n]=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 n={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"},a=n[e]||n[(null==i?void 0:i.standardEvent)||""]||"custom";this.emitEngageEvent(a,t)}),t(this,"trackRevenue",(e,t,i)=>{const n=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)),a=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:n,amount:n,valuePaise:Math.round(100*n),amountPaise:Math.round(100*n),currency:a,currencyCode:a},{standardEvent:"PURCHASE",intent:"commerce",confidence:1,...i})}),t(this,"setSentiment",e=>{this.currentSentiment=e}),this.config=e;const i=e.apiKey,n=((e,t,i)=>{if("undefined"!=typeof window&&"localhost"!==window.location.hostname&&"127.0.0.1"!==window.location.hostname||!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:n}),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,n={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(n),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,n=("string"==typeof i?i:void 0)||new URLSearchParams(t.page.search||"").get("ref")||void 0,a=this.parseRef(n),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:n,campaignId:("string"==typeof s?s:void 0)||a.campaignId,creatorId:("string"==typeof c?c:void 0)||a.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 _=n.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 a=n.useRef(null),r=n.useRef(null);a.current||(a.current=new R(t),"undefined"!=typeof window&&new I(a.current));const o=a.current;return n.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(),n=r.current;n&&n.el===t&&i-n.ts<500?(n.count++,n.ts=i,3===n.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 a=(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 n=e.querySelector("title");n&&(t=n.textContent||"")}const i=t.slice(0,100),n=i.toLowerCase(),a=(e.id||"").toLowerCase(),r=e.href||"";return/add to (cart|bag)|buy now/.test(n)||a.includes("add-to-cart")?{standard:"ADD_TO_CART",intent:"commerce",label:i,confidence:.9}:/checkout|proceed/.test(n)||r.includes("/checkout")?{standard:"INITIATE_CHECKOUT",intent:"commerce",label:i,confidence:.9}:/place order|pay now/.test(n)||a.includes("place-order")?{standard:"PURCHASE",intent:"commerce",label:i,confidence:.95}:/cancel order/.test(n)||a.includes("cancel")?{standard:"ORDER_CANCEL",intent:"lifecycle",label:i,confidence:.85}:/refund|return/.test(n)||a.includes("refund")?{standard:"ORDER_REFUND",intent:"lifecycle",label:i,confidence:.85}:/track package|shipping/.test(n)?{standard:"TRACK_PACKAGE",intent:"lifecycle",label:i,confidence:.8}:/write review/.test(n)||n.includes("star")&&/^[1-5]/.test(n)?{standard:"RATE_PRODUCT",intent:"engagement",label:i,confidence:.8}:n.includes("search")||a.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"===a.intent&&(c=(t=>{let i={};try{const n=document.querySelectorAll('script[type="application/ld+json"]');for(const t of Array.from(n))try{const e=JSON.parse(t.innerHTML),n=Array.isArray(e)?e:[e];for(const t of n)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"]'),n=document.querySelector('meta[property="og:title"]');e&&(i.amount=Number(e.getAttribute("content"))),t&&(i.currency=t.getAttribute("content")),n&&(i.productName=n.getAttribute("content"))}if(!i.amount){const e=(t.innerText||"").match(/([$€£₹¥])\s*([0-9,]+\.[0-9]{2})/);if(e){const t=e[1],n=e[2].replace(/,/g,"");i.amount=Number(n);const a={$:"USD","€":"EUR","£":"GBP","₹":"INR","¥":"JPY"};i.currency=a[t]||"USD"}else{let e=t,n=0;for(;e&&n<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],n=e[2].replace(/,/g,"");i.amount=Number(n);const a={$:"USD","€":"EUR","£":"GBP","₹":"INR","¥":"JPY"};i.currency=a[t]||"USD"}}e=e.parentElement,n++}}}}catch(n){}return i})(t)),o.track("Interaction",{element:t.tagName.toLowerCase(),id:t.id,destination:s?t.href:void 0,...c},{standardEvent:a.standard,intent:a.intent,rawLabel:a.label,confidence:a.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"}))},n=()=>{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())},a=history.pushState;return history.pushState=(...e)=>{a.apply(history,e),n()},window.addEventListener("popstate",n),window.addEventListener("click",e,!0),window.addEventListener("focusin",i,!0),n(),()=>{history.pushState=a,window.removeEventListener("popstate",n),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=n.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
|
};
|
|
@@ -469,7 +512,11 @@ class Transport {
|
|
|
469
512
|
*/
|
|
470
513
|
beaconFlush(payload) {
|
|
471
514
|
if (typeof navigator === "undefined" || !navigator.sendBeacon) return false;
|
|
472
|
-
|
|
515
|
+
let endpoint = this.endpoints.engage;
|
|
516
|
+
if (this.apiKey) {
|
|
517
|
+
const separator = endpoint.includes("?") ? "&" : "?";
|
|
518
|
+
endpoint = `${endpoint}${separator}apiKey=${encodeURIComponent(this.apiKey)}`;
|
|
519
|
+
}
|
|
473
520
|
const blob = new Blob([payload], { type: "application/json" });
|
|
474
521
|
return navigator.sendBeacon(endpoint, blob);
|
|
475
522
|
}
|
|
@@ -731,6 +778,147 @@ function detectCountryFromTimezone() {
|
|
|
731
778
|
return void 0;
|
|
732
779
|
}
|
|
733
780
|
}
|
|
781
|
+
const SENSITIVE_INPUT_TYPES = /* @__PURE__ */ new Set([
|
|
782
|
+
"password",
|
|
783
|
+
"hidden",
|
|
784
|
+
"email",
|
|
785
|
+
"tel",
|
|
786
|
+
"number"
|
|
787
|
+
// Could be CC
|
|
788
|
+
]);
|
|
789
|
+
const SENSITIVE_FIELD_NAMES = [
|
|
790
|
+
"password",
|
|
791
|
+
"pass",
|
|
792
|
+
"cvv",
|
|
793
|
+
"card",
|
|
794
|
+
"credit",
|
|
795
|
+
"ssn",
|
|
796
|
+
"secret",
|
|
797
|
+
"name",
|
|
798
|
+
"phone",
|
|
799
|
+
"email",
|
|
800
|
+
"address"
|
|
801
|
+
];
|
|
802
|
+
class DOMTracker {
|
|
803
|
+
constructor(instance2) {
|
|
804
|
+
__publicField(this, "instance");
|
|
805
|
+
__publicField(this, "observer", null);
|
|
806
|
+
__publicField(this, "trackedProducts", /* @__PURE__ */ new Set());
|
|
807
|
+
this.instance = instance2;
|
|
808
|
+
}
|
|
809
|
+
init() {
|
|
810
|
+
if (typeof window === "undefined" || typeof document === "undefined") return;
|
|
811
|
+
this.attachEventListeners();
|
|
812
|
+
this.startMutationObserver();
|
|
813
|
+
}
|
|
814
|
+
destroy() {
|
|
815
|
+
if (this.observer) {
|
|
816
|
+
this.observer.disconnect();
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
isSensitive(name, type) {
|
|
820
|
+
if (SENSITIVE_INPUT_TYPES.has(type.toLowerCase())) return true;
|
|
821
|
+
const lowerName = name.toLowerCase();
|
|
822
|
+
return SENSITIVE_FIELD_NAMES.some((s) => lowerName.includes(s));
|
|
823
|
+
}
|
|
824
|
+
attachEventListeners() {
|
|
825
|
+
document.addEventListener(
|
|
826
|
+
"click",
|
|
827
|
+
(e) => {
|
|
828
|
+
var _a;
|
|
829
|
+
const target = e.target;
|
|
830
|
+
const closestBtn = target.closest("button, a, [role='button'], [data-engage-action]");
|
|
831
|
+
if (!closestBtn) return;
|
|
832
|
+
const action = closestBtn.getAttribute("data-engage-action") || ((_a = closestBtn.textContent) == null ? void 0 : _a.trim().slice(0, 50));
|
|
833
|
+
const productId = closestBtn.getAttribute("data-engage-product-id");
|
|
834
|
+
const price = closestBtn.getAttribute("data-engage-price");
|
|
835
|
+
const currency = closestBtn.getAttribute("data-engage-currency") || "USD";
|
|
836
|
+
const textLower = (action == null ? void 0 : action.toLowerCase()) || "";
|
|
837
|
+
if (textLower.includes("add to cart") || textLower.includes("buy now") || closestBtn.getAttribute("data-engage-intent") === "add_to_cart") {
|
|
838
|
+
this.instance.track("ADD_TO_CART", {
|
|
839
|
+
productId,
|
|
840
|
+
amount: price ? parseFloat(price) : void 0,
|
|
841
|
+
currency,
|
|
842
|
+
actionName: action
|
|
843
|
+
}, { intent: "commerce", standardEvent: "ADD_TO_CART" });
|
|
844
|
+
} else if (textLower.includes("cancel") && (textLower.includes("order") || textLower.includes("subscription"))) {
|
|
845
|
+
this.instance.track("ORDER_CANCELLED", { actionName: action }, { intent: "commerce", standardEvent: "GENERIC" });
|
|
846
|
+
} else if (textLower.includes("review") || textLower.includes("submit rating") || closestBtn.getAttribute("data-engage-intent") === "review") {
|
|
847
|
+
this.instance.track("REVIEW_SUBMITTED", { productId }, { intent: "engagement" });
|
|
848
|
+
} else if (closestBtn.hasAttribute("data-engage-track")) {
|
|
849
|
+
this.instance.track("CLICK", { actionName: action, productId });
|
|
850
|
+
}
|
|
851
|
+
},
|
|
852
|
+
{ capture: true, passive: true }
|
|
853
|
+
);
|
|
854
|
+
document.addEventListener(
|
|
855
|
+
"submit",
|
|
856
|
+
(e) => {
|
|
857
|
+
const target = e.target;
|
|
858
|
+
const action = target.getAttribute("action") || "";
|
|
859
|
+
const id = target.id || "";
|
|
860
|
+
const classes = target.className || "";
|
|
861
|
+
const intent = target.getAttribute("data-engage-intent");
|
|
862
|
+
const combinedContext = `${action} ${id} ${classes} ${intent}`.toLowerCase();
|
|
863
|
+
const metadata = {};
|
|
864
|
+
new FormData(target);
|
|
865
|
+
target.querySelectorAll("input, select, textarea").forEach((el) => {
|
|
866
|
+
const input = el;
|
|
867
|
+
if (input.name && !this.isSensitive(input.name, input.type)) {
|
|
868
|
+
metadata[`has_${input.name}`] = true;
|
|
869
|
+
}
|
|
870
|
+
});
|
|
871
|
+
if (combinedContext.includes("signup") || combinedContext.includes("register")) {
|
|
872
|
+
this.instance.track("SIGNUP", { formId: id, metadata }, { intent: "identity", standardEvent: "REGISTER" });
|
|
873
|
+
} else if (combinedContext.includes("checkout") || combinedContext.includes("payment")) {
|
|
874
|
+
this.instance.track("CHECKOUT_STARTED", { formId: id }, { intent: "commerce" });
|
|
875
|
+
} else if (intent) {
|
|
876
|
+
this.instance.track(intent.toUpperCase(), { formId: id, metadata });
|
|
877
|
+
}
|
|
878
|
+
},
|
|
879
|
+
{ capture: true, passive: true }
|
|
880
|
+
);
|
|
881
|
+
}
|
|
882
|
+
startMutationObserver() {
|
|
883
|
+
this.observer = new MutationObserver((mutations) => {
|
|
884
|
+
mutations.forEach((mutation) => {
|
|
885
|
+
if (mutation.type === "childList") {
|
|
886
|
+
mutation.addedNodes.forEach((node) => {
|
|
887
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
888
|
+
const el = node;
|
|
889
|
+
this.scanForProducts(el);
|
|
890
|
+
}
|
|
891
|
+
});
|
|
892
|
+
}
|
|
893
|
+
});
|
|
894
|
+
});
|
|
895
|
+
this.observer.observe(document.body, { childList: true, subtree: true });
|
|
896
|
+
this.scanForProducts(document.body);
|
|
897
|
+
}
|
|
898
|
+
scanForProducts(root) {
|
|
899
|
+
const productElements = root.querySelectorAll("[data-engage-product-id]");
|
|
900
|
+
productElements.forEach((el) => {
|
|
901
|
+
const productId = el.getAttribute("data-engage-product-id");
|
|
902
|
+
if (!productId || this.trackedProducts.has(productId)) return;
|
|
903
|
+
this.trackedProducts.add(productId);
|
|
904
|
+
const productName = el.getAttribute("data-engage-product-name");
|
|
905
|
+
const category = el.getAttribute("data-engage-category");
|
|
906
|
+
const price = el.getAttribute("data-engage-price");
|
|
907
|
+
const currency = el.getAttribute("data-engage-currency") || "USD";
|
|
908
|
+
this.instance.track(
|
|
909
|
+
"VIEW_CONTENT",
|
|
910
|
+
{
|
|
911
|
+
productId,
|
|
912
|
+
productName,
|
|
913
|
+
productCategory: category,
|
|
914
|
+
amount: price ? parseFloat(price) : void 0,
|
|
915
|
+
currency
|
|
916
|
+
},
|
|
917
|
+
{ intent: "commerce", standardEvent: "VIEW_CONTENT" }
|
|
918
|
+
);
|
|
919
|
+
});
|
|
920
|
+
}
|
|
921
|
+
}
|
|
734
922
|
const ENGAGE_INGEST_ENDPOINT = "https://engage-api.bluenath.com/api/v1/analytics/ingest";
|
|
735
923
|
const ENGAGE_INGEST_PATH = "/api/v1/analytics/ingest";
|
|
736
924
|
const ALLOWED_DEV_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1"]);
|
|
@@ -752,7 +940,8 @@ const SYMBOL_TO_CURRENCY = {
|
|
|
752
940
|
JPY: "JPY"
|
|
753
941
|
};
|
|
754
942
|
const resolveEndpoint = (apiHost, path, defaultUrl) => {
|
|
755
|
-
|
|
943
|
+
const isLocalhostEnv = typeof window === "undefined" || window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1";
|
|
944
|
+
if (!isLocalhostEnv || !apiHost) return defaultUrl;
|
|
756
945
|
try {
|
|
757
946
|
const parsed = new URL(apiHost);
|
|
758
947
|
const isAllowedHost = parsed.hostname.endsWith("bluenath.com") || ALLOWED_DEV_HOSTS.has(parsed.hostname);
|
|
@@ -819,6 +1008,7 @@ class EngagePro {
|
|
|
819
1008
|
__publicField(this, "context");
|
|
820
1009
|
__publicField(this, "queue");
|
|
821
1010
|
__publicField(this, "transport");
|
|
1011
|
+
__publicField(this, "domTracker");
|
|
822
1012
|
// Spec §3.2: Auto-detected fields
|
|
823
1013
|
__publicField(this, "sessionId");
|
|
824
1014
|
__publicField(this, "countryCode");
|
|
@@ -922,8 +1112,10 @@ class EngagePro {
|
|
|
922
1112
|
this.queue = new EventQueue(this.transport);
|
|
923
1113
|
this.sessionId = getOrCreateSessionId();
|
|
924
1114
|
this.countryCode = detectCountryFromTimezone();
|
|
1115
|
+
this.domTracker = new DOMTracker(this);
|
|
925
1116
|
if (config.tracking.autoTrack && typeof window !== "undefined") {
|
|
926
1117
|
this.page();
|
|
1118
|
+
this.domTracker.init();
|
|
927
1119
|
}
|
|
928
1120
|
}
|
|
929
1121
|
/**
|
|
@@ -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
|
+
}
|
package/dist/types/index.d.ts
CHANGED