@zaplier/sdk 1.8.6 → 1.9.0

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.
Files changed (45) hide show
  1. package/dist/v2/chunks/anti-adblock-B_7p9rSc.min.js +6 -0
  2. package/dist/v2/chunks/anti-adblock-B_aAB361.min.js +6 -0
  3. package/dist/v2/chunks/auto-tracker-5ij0Y4C-.min.js +6 -0
  4. package/dist/v2/chunks/browser-apis-zkKPQ-Pn.min.js +6 -0
  5. package/dist/v2/chunks/confidence-DCUtUduG.min.js +6 -0
  6. package/dist/v2/chunks/core-BUMPOlca.min.js +6 -0
  7. package/dist/v2/chunks/core-CGxFM5QW.min.js +6 -0
  8. package/dist/v2/chunks/core-NFvhjAfH.min.js +6 -0
  9. package/dist/v2/chunks/core-zJiDcx4q.min.js +6 -0
  10. package/dist/v2/chunks/device-signals-DzcCjR7i.min.js +6 -0
  11. package/dist/v2/chunks/dom-blockers-CtmwJ8XW.min.js +6 -0
  12. package/dist/v2/chunks/fingerprint-C1MH_xUr.min.js +6 -0
  13. package/dist/v2/chunks/hardware-VrMyNUbt.min.js +6 -0
  14. package/dist/v2/chunks/heatmap-BxbXSH7M.min.js +6 -0
  15. package/dist/v2/chunks/incognito-CUk-WJ9L.min.js +6 -0
  16. package/dist/v2/chunks/math-k-cWr0Zr.min.js +6 -0
  17. package/dist/v2/chunks/plugins-enhanced-DybbZw-x.min.js +6 -0
  18. package/dist/v2/chunks/session-replay-DsIhuKDJ.min.js +6 -0
  19. package/dist/v2/chunks/session-replay-DzEF_WqO.min.js +6 -0
  20. package/dist/v2/chunks/storage-DGh64hgU.min.js +6 -0
  21. package/dist/v2/chunks/system-Bu10BgJe.min.js +6 -0
  22. package/dist/v2/chunks/visitor-persistence-BUu5td5h.min.js +6 -0
  23. package/dist/v2/chunks/visitor-persistence-CIXH9EKf.min.js +6 -0
  24. package/dist/v2/chunks/visitor-persistence-DSIEfVJQ.min.js +6 -0
  25. package/dist/v2/chunks/visitor-persistence-Djomq4wG.min.js +6 -0
  26. package/dist/v2/core.d.ts +151 -80
  27. package/dist/v2/core.min.js +2 -2
  28. package/dist/v2/modules/anti-adblock.js +2 -2
  29. package/dist/v2/modules/auto-tracker.js +6 -0
  30. package/dist/v2/modules/browser-apis-BFbMjhvj.js +6 -0
  31. package/dist/v2/modules/confidence-B8ji6M6W.js +6 -0
  32. package/dist/v2/modules/device-signals-OERVSprN.js +6 -0
  33. package/dist/v2/modules/dom-blockers-NN7G4m7O.js +6 -0
  34. package/dist/v2/modules/fingerprint-BmsWDNK6.js +6 -0
  35. package/dist/v2/modules/fingerprint.js +2 -2
  36. package/dist/v2/modules/hardware-DEB_C62e.js +6 -0
  37. package/dist/v2/modules/heatmap.js +1 -1
  38. package/dist/v2/modules/incognito-B8-4CGqL.js +6 -0
  39. package/dist/v2/modules/math-D6mV6BoT.js +6 -0
  40. package/dist/v2/modules/plugins-enhanced-Bs-rTKz4.js +6 -0
  41. package/dist/v2/modules/replay.js +2 -2
  42. package/dist/v2/modules/storage-DpYaBLNV.js +6 -0
  43. package/dist/v2/modules/system-C8YX5XCh.js +6 -0
  44. package/dist/v2/modules/visitor-persistence.js +6 -0
  45. package/package.json +2 -3
package/dist/v2/core.d.ts CHANGED
@@ -107,6 +107,8 @@ interface SDKConfig {
107
107
  allow_localhost?: boolean;
108
108
  /** GDPR mode - limits invasive fingerprinting (default: false) */
109
109
  gdprMode?: boolean;
110
+ /** Fraction of sessions that record replay (0.0–1.0). Default: 1.0 (100% of sessions). */
111
+ replaySampleRate?: number;
110
112
  }
111
113
  /**
112
114
  * Internal configuration with optimized defaults
@@ -204,14 +206,16 @@ interface IdentifyParams {
204
206
  */
205
207
  interface ConversionLikelihoodResponse {
206
208
  score: number;
209
+ level: string;
207
210
  factors: string[];
208
211
  }
209
212
  /**
210
213
  * Response from getUserSegment()
211
214
  */
212
215
  interface UserSegmentResponse {
213
- type: "high_intent" | "medium_intent" | "exploring";
216
+ segment: string;
214
217
  confidence: number;
218
+ traits: string[];
215
219
  }
216
220
 
217
221
  /**
@@ -235,13 +239,30 @@ interface ZaplierSDK {
235
239
  heatmap: {
236
240
  enable(): void;
237
241
  disable(): void;
242
+ enableMouseTracking(): void;
243
+ disableMouseTracking(): void;
244
+ getStats(): any;
245
+ isRecording(): boolean;
238
246
  };
239
247
  replay: {
240
248
  enable(): void;
241
249
  disable(): void;
250
+ start(): Promise<boolean>;
251
+ stop(): void;
252
+ isRecording(): boolean;
253
+ getEventCount(): number;
242
254
  addFunnelStep(stepData: Record<string, any>): void;
243
255
  markConversion(data: Record<string, any>): void;
244
256
  };
257
+ autoTrack: {
258
+ enable(): void;
259
+ disable(): void;
260
+ configure(config: Record<string, any>): void;
261
+ refreshTracking(): void;
262
+ getDiagnostics(): any;
263
+ getStats(): any;
264
+ isEnabled(): boolean;
265
+ };
245
266
  enableEnhancedTracking(): boolean;
246
267
  disableEnhancedTracking(): void;
247
268
  isEnhancedMode(): boolean;
@@ -269,103 +290,153 @@ declare global {
269
290
  }
270
291
 
271
292
  /**
272
- * Zaplier SDK Core v2.0.0 - Performance Optimized
273
- * Minimal core for instant initialization with lazy loading
293
+ * Zaplier SDK v1.9.0 - Unified SDK
294
+ * Instant init (<1ms) + full features via lazy loading
295
+ * Replaces both ZaplierCore (v2, no enrichment) and ZaplierSDK (v1.7, 400KB)
274
296
  */
275
297
 
276
- interface CoreConfig {
277
- token: string;
278
- debug?: boolean;
279
- apiEndpoint?: string;
280
- allow_localhost?: boolean;
281
- replay?: boolean;
282
- replaySampling?: number;
283
- deferAdvanced?: boolean;
284
- loadTimeout?: number;
285
- }
286
- /**
287
- * Minimal SDK Core - Only essential tracking functionality
288
- * Heavy operations are lazy-loaded to avoid blocking main thread
289
- */
290
298
  declare class ZaplierCore {
291
- private config;
292
- private eventQueue;
299
+ config: InternalConfig;
300
+ readonly version = "1.9.0";
293
301
  private isInitialized;
302
+ private eventQueue;
294
303
  private sessionId?;
295
304
  private visitorId?;
296
- private modules;
297
305
  private backendVisitorId?;
298
306
  private cachedVisitorInfo?;
299
- private readonly version;
300
- /** Cached dev environment flag, computed once at init time */
307
+ private fingerprint?;
301
308
  private _isDev;
302
- constructor(config: CoreConfig);
303
- /**
304
- * Detect dev environment for isDev event flagging.
305
- * Matches ZaplierSDK.isDevEnvironment() for parity.
306
- */
307
- private isDevEnvironment;
308
- /**
309
- * Instant core initialization - only essential setup
310
- */
309
+ private antiAdblockManager?;
310
+ private visitorIdentityManager?;
311
+ heatmap: {
312
+ enable(): void;
313
+ disable(): void;
314
+ enableMouseTracking(): void;
315
+ disableMouseTracking(): void;
316
+ getStats(): any;
317
+ isRecording(): boolean;
318
+ };
319
+ replay: {
320
+ enable(): void;
321
+ disable(): void;
322
+ start(): Promise<boolean>;
323
+ stop(): void;
324
+ isRecording(): boolean;
325
+ getEventCount(): number;
326
+ addFunnelStep(stepData: Record<string, any>): void;
327
+ markConversion(data: Record<string, any>): void;
328
+ };
329
+ autoTrack: {
330
+ enable(): void;
331
+ disable(): void;
332
+ configure(config: Record<string, any>): void;
333
+ refreshTracking(): void;
334
+ getDiagnostics(): any;
335
+ getStats(): any;
336
+ isEnabled(): boolean;
337
+ };
338
+ private _heatmapEngine?;
339
+ private _replayEngine?;
340
+ private _autoTracker?;
341
+ constructor(userConfig: SDKConfig);
311
342
  private initializeCore;
312
- /**
313
- * Track page view immediately (core functionality)
314
- */
315
- trackPageView(data?: any): void;
316
- /**
317
- * Track custom event immediately
318
- */
319
- track(eventName: string, data?: any): void;
320
- /**
321
- * Enable advanced features (lazy loading)
322
- */
323
- enableAdvancedFeatures(): Promise<void>;
324
- /**
325
- * Load fingerprinting module
326
- */
327
- private loadFingerprinting;
328
- /**
329
- * Load replay module
330
- */
331
- private loadReplayModule;
332
- /**
333
- * Schedule advanced loading when browser is idle
334
- */
335
- private scheduleAdvancedLoading;
336
- /**
337
- * Send event to backend (simplified)
338
- */
343
+ private scheduleModuleLoading;
344
+ private loadFingerprint;
345
+ private collectFallbackEntropy;
346
+ private loadAntiAdblock;
347
+ private loadAutoTracker;
348
+ private shouldRecord;
349
+ private fetchFeatureFlags;
350
+ private loadReplayEngine;
351
+ private loadHeatmapEngine;
352
+ private createHeatmapProxy;
353
+ private createReplayProxy;
354
+ private createAutoTrackProxy;
355
+ /** Force-load replay engine (bypasses sampling/feature-flag for explicit enable) */
356
+ private loadReplayEngineForced;
357
+ private extractUTMParameters;
339
358
  private sendEvent;
340
359
  /**
341
- * Process queued events
360
+ * Send session replay batch to backend
342
361
  */
362
+ sendReplayBatch(replayData: {
363
+ sessionId: string;
364
+ events: any[];
365
+ metadata: any;
366
+ }): Promise<any>;
367
+ private makeRequest;
368
+ private updateTrackingEnginesSessionId;
343
369
  private processEventQueue;
344
- /**
345
- * Generate temporary session ID
346
- */
370
+ private isLocalhost;
371
+ private isDevEnvironment;
347
372
  private generateTempSessionId;
348
- /**
349
- * Generate temporary visitor ID
350
- */
351
373
  private generateTempVisitorId;
352
- /**
353
- * Get the visitor ID (backend UUID if available, otherwise temp ID)
354
- */
374
+ private generateSessionId;
375
+ track(eventType: string, eventData?: Record<string, any>): void;
376
+ trackCustomEvent(eventName: string, metadata?: Record<string, any>): boolean;
377
+ trackConversion(eventName: string, value?: number, currency?: string, metadata?: Record<string, any>): boolean;
378
+ trackPageView(data?: Partial<PageViewEvent>): void;
379
+ trackSPANavigation(url?: string, title?: string): void;
380
+ trackPurchase(data: {
381
+ value?: number;
382
+ revenue?: number;
383
+ currency?: string;
384
+ quantity?: number;
385
+ productId?: string;
386
+ productName?: string;
387
+ orderId?: string;
388
+ customData?: Record<string, any>;
389
+ }): void;
390
+ trackAddToCart(data?: {
391
+ productId?: string;
392
+ productName?: string;
393
+ price?: number;
394
+ quantity?: number;
395
+ customData?: Record<string, any>;
396
+ }): void;
397
+ trackViewContent(data?: {
398
+ productId?: string;
399
+ productName?: string;
400
+ category?: string;
401
+ customData?: Record<string, any>;
402
+ }): void;
403
+ trackInitiateCheckout(data?: {
404
+ value?: number;
405
+ currency?: string;
406
+ numItems?: number;
407
+ customData?: Record<string, any>;
408
+ }): void;
409
+ trackLead(data?: Record<string, any>): void;
410
+ identify(userData: {
411
+ email?: string;
412
+ phone?: string;
413
+ [key: string]: any;
414
+ }): void;
415
+ startPresenceTracking(): void;
416
+ stopPresenceTracking(): void;
417
+ enableAdvancedFeatures(): Promise<void>;
418
+ enableEnhancedTracking(): boolean;
419
+ disableEnhancedTracking(): void;
420
+ isEnhancedMode(): boolean;
421
+ resetScrollTracking(): void;
355
422
  getVisitorId(): string | null;
356
- /**
357
- * Get client-side user data synchronously (SSR-safe)
358
- */
359
423
  getUserData(): UserData;
360
- /**
361
- * Get full visitor info from backend (async, only fetches when backend UUID is available)
362
- */
363
424
  getVisitorInfo(): Promise<VisitorInfo | null>;
425
+ getVisitorHistory(): Promise<VisitorHistory | null>;
426
+ getConversionLikelihood(): {
427
+ score: number;
428
+ level: string;
429
+ factors: string[];
430
+ };
431
+ getUserSegment(): {
432
+ segment: string;
433
+ confidence: number;
434
+ traits: string[];
435
+ };
364
436
  }
365
- /**
366
- * Factory function for easy initialization
367
- */
368
- declare function initZaplierCore(config: CoreConfig): ZaplierCore;
437
+ declare function initZaplier(config: SDKConfig): ZaplierCore;
438
+ /** @deprecated Use initZaplier instead */
439
+ declare const initZaplierCore: typeof initZaplier;
369
440
 
370
- export { ZaplierCore, ZaplierCore as default, initZaplierCore };
371
- export type { CoreConfig, UserData, VisitorHistory, VisitorInfo };
441
+ export { ZaplierCore, ZaplierCore as default, initZaplier, initZaplierCore };
442
+ export type { UserData, VisitorHistory, VisitorInfo };
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Zaplier SDK v2.0.0 - Performance Optimized
2
+ * Zaplier SDK v3.0.0 - Unified SDK
3
3
  * Advanced privacy-first tracking with code splitting
4
4
  * (c) 2026 Zaplier Team
5
5
  */
6
- class e{constructor(e){if(this.eventQueue=[],this.isInitialized=!1,this.modules=new Map,this.version="2.0.0",this.t=!1,!e.token)throw console.error('[Zaplier] Missing required "token" option. Get your token at https://app.zaplier.com/dashboard/keys'),new Error("Zaplier: token is required");if("string"!=typeof e.token||e.token.trim().length<5)throw console.error('[Zaplier] Invalid token format. Token should be a workspace API key (e.g., "ws_abc123...")'),new Error("Zaplier: invalid token format");this.config={deferAdvanced:!0,loadTimeout:5e3,debug:!1,...e},this.t=this.isDevEnvironment(),this.initializeCore()}isDevEnvironment(){if("undefined"==typeof window)return!1;const e=window.location.hostname;return"localhost"===e||"127.0.0.1"===e||"[::1]"===e||e.endsWith(".local")||e.endsWith(".test")||!0===this.config.debug}initializeCore(){try{this.config.debug&&this.version,this.sessionId=this.generateTempSessionId(),this.visitorId=this.generateTempVisitorId(),this.isInitialized=!0,this.processEventQueue(),this.config.debug,this.config.deferAdvanced||this.scheduleAdvancedLoading()}catch(e){console.error("[Zaplier Core] Initialization failed:",e)}}trackPageView(e={}){this.config.debug;const t={eventType:"page_view",eventName:"page_view",sessionId:this.sessionId,visitorId:this.visitorId,url:window.location.href,referrer:document.referrer,timestamp:(new Date).toISOString(),...e};this.sendEvent(t)}track(e,t={}){this.config.debug;const i={eventType:"custom",eventName:e,sessionId:this.sessionId,visitorId:this.visitorId,timestamp:(new Date).toISOString(),...t};this.sendEvent(i)}async enableAdvancedFeatures(){this.config.debug;try{await this.loadFingerprinting(),this.config.replay&&await this.loadReplayModule(),this.config.debug}catch(e){console.error("[Zaplier Core] Failed to load advanced features:",e)}}async loadFingerprinting(){if(!this.modules.has("fingerprint"))try{const{getCompleteFingerprint:e}=await import("./chunks/fingerprint-FfUEEIAd.min.js").then(function(e){return e.f}),t=await e();t.success&&t.data&&(this.visitorId=t.data.hash||this.visitorId,this.modules.set("fingerprint",t.data),this.config.debug)}catch(e){console.error("[Zaplier Core] Fingerprinting failed:",e)}}async loadReplayModule(){if(!this.modules.has("replay"))try{const{SessionReplayEngine:e}=await import("./chunks/session-replay-MISzVk2N.min.js"),t=new e(this.sessionId,this.visitorId,{sampleRate:this.config.replaySampling||.1});await t.start()&&(this.modules.set("replay",t),this.config.debug)}catch(e){console.error("[Zaplier Core] Replay loading failed:",e)}}scheduleAdvancedLoading(){((e,t=100)=>{"undefined"!=typeof requestIdleCallback?requestIdleCallback(e,{timeout:this.config.loadTimeout}):setTimeout(e,t)})(()=>this.enableAdvancedFeatures())}async sendEvent(e){try{const t={...e,isDev:this.t},i=await fetch(`${this.config.apiEndpoint||"https://api.zaplier.com"}/events?token=${encodeURIComponent(this.config.token)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0});if(this.config.debug&&!i.ok&&console.warn(`[Zaplier Core] Event sending failed: ${i.status}`),i.ok){const e=await i.json().catch(()=>null);(null==e?void 0:e.visitorId)&&(this.backendVisitorId=e.visitorId)}}catch(t){this.eventQueue.push(e),this.config.debug&&console.warn("[Zaplier Core] Event queued for retry:",t)}}processEventQueue(){if(0===this.eventQueue.length)return;const e=[...this.eventQueue];this.eventQueue=[],e.forEach(e=>this.sendEvent(e))}generateTempSessionId(){const e=new Date,t=e.getFullYear()+(e.getMonth()+1).toString().padStart(2,"0")+e.getDate().toString().padStart(2,"0"),i=e.getHours().toString().padStart(2,"0");return`temp_${Date.now()}_${t}_${i}`}generateTempVisitorId(){return`temp_visitor_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}getVisitorId(){var e,t;return null!==(t=null!==(e=this.backendVisitorId)&&void 0!==e?e:this.visitorId)&&void 0!==t?t:null}getUserData(){var e,t,i,n,s,o,r;const a="undefined"!=typeof navigator?{userAgent:navigator.userAgent,language:navigator.language,screen:{width:null!==(t=null===(e=window.screen)||void 0===e?void 0:e.width)&&void 0!==t?t:0,height:null!==(n=null===(i=window.screen)||void 0===i?void 0:i.height)&&void 0!==n?n:0}}:{userAgent:"",language:"",screen:{width:0,height:0}};return{sessionId:null!==(s=this.sessionId)&&void 0!==s?s:"",visitorId:null!==(o=this.getVisitorId())&&void 0!==o?o:void 0,location:{},device:a,journey:[],fingerprint:null===(r=this.modules.get("fingerprint"))||void 0===r?void 0:r.hash}}async getVisitorInfo(){var e;const t=this.backendVisitorId;if(!t)return this.config.debug&&console.warn("[Zaplier Core] No backend visitor ID yet. Track an event first."),null;if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t))return null;if(this.cachedVisitorInfo)return this.cachedVisitorInfo;try{const i=null!==(e=this.config.apiEndpoint)&&void 0!==e?e:"https://api.zaplier.com",n=await fetch(`${i}/tracking/visitor/${t}?token=${encodeURIComponent(this.config.token)}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!n.ok)return null;const s=await n.json();return this.cachedVisitorInfo=s,s}catch{return null}}}function t(t){return new e(t)}if("undefined"!=typeof window){window.Zaplier={init:t,version:"2.0.0"};const e=()=>{const e=document.getElementsByTagName("script");for(const i of Array.from(e))if(i.src&&(i.src.includes("zaplier")||i.src.includes("core.min.js"))&&i.dataset.token){const e=t({token:i.dataset.token,debug:"true"===i.dataset.debug,replay:"true"===i.dataset.replay,deferAdvanced:"false"!==i.dataset.deferAdvanced});return window.Zaplier.instance=e,e.trackPageView(),void(e.config.deferAdvanced&&e.enableAdvancedFeatures())}};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()}export{e as ZaplierCore,e as default,t as initZaplierCore};
6
+ export{Z as ZaplierCore,Z as default,i as initZaplier,a as initZaplierCore}from"./chunks/core-zJiDcx4q.min.js";
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Zaplier SDK v2.0.0 - Performance Optimized
2
+ * Zaplier SDK v3.0.0 - Unified SDK
3
3
  * Advanced privacy-first tracking with code splitting
4
4
  * (c) 2026 Zaplier Team
5
5
  */
6
- class e{constructor(){this.name="fetch",this.available="undefined"!=typeof fetch}async send(e,t){const s=Date.now();try{const n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!n.ok)throw new Error(`HTTP ${n.status}`);return{success:!0,method:this.name,latency:Date.now()-s}}catch(e){return{success:!1,method:this.name,latency:Date.now()-s,error:e instanceof Error?e.message:String(e)}}}}class t{constructor(e){this.name="websocket",this.available="undefined"!=typeof WebSocket,this.connected=!1,this.messageQueue=[],this.baseUrl=e.replace(/^http/,"ws")}async connect(){if(!this.connected&&this.available)return new Promise((e,t)=>{try{this.ws=new WebSocket(`${this.baseUrl}/ws/track`),this.ws.onopen=()=>{this.connected=!0,this.processQueue(),e()},this.ws.onerror=()=>{t(new Error("WebSocket connection failed"))},this.ws.onclose=()=>{this.connected=!1,setTimeout(()=>this.connect().catch(()=>{}),5e3)}}catch(e){t(e)}})}processQueue(){for(;this.messageQueue.length>0&&this.connected;){const e=this.messageQueue.shift();if(e&&this.ws)try{this.ws.send(JSON.stringify(e.data)),e.resolve({success:!0,method:this.name})}catch(t){e.resolve({success:!1,method:this.name,error:t instanceof Error?t.message:String(t)})}}}async send(e,t){const s=Date.now();if(!this.available)return{success:!1,method:this.name,error:"WebSocket not available"};if(!this.connected)try{await this.connect()}catch(e){return{success:!1,method:this.name,error:e instanceof Error?e.message:String(e)}}return new Promise(t=>{if(this.connected&&this.ws)try{this.ws.send(JSON.stringify(e)),t({success:!0,method:this.name,latency:Date.now()-s})}catch(e){t({success:!1,method:this.name,error:e instanceof Error?e.message:String(e)})}else this.messageQueue.push({data:e,resolve:e=>t({...e,latency:Date.now()-s})})})}destroy(){this.ws&&(this.ws.close(),this.connected=!1)}}class s{constructor(e,t){this.name="elysia-websocket",this.available="undefined"!=typeof WebSocket,this.connected=!1,this.baseUrl=e,this.token=t}async send(e,t){const s=Date.now();try{if(!this.token)throw new Error("Missing token for WebSocket connection");if(await this.connect(),!this.ws||!this.connected)throw new Error("WebSocket not connected");return new Promise((t,n)=>{var o,r;const a=e=>{var o,r;try{const n=JSON.parse(e.data);null===(o=this.ws)||void 0===o||o.removeEventListener("message",a),t({success:n.success||!1,method:this.name,latency:Date.now()-s})}catch(e){null===(r=this.ws)||void 0===r||r.removeEventListener("message",a),n(new Error("Failed to parse WebSocket response"))}};null===(o=this.ws)||void 0===o||o.addEventListener("message",a),null===(r=this.ws)||void 0===r||r.send(JSON.stringify({...e,eventId:e.eventId||crypto.randomUUID(),sessionId:e.sessionId||e.s,eventType:e.eventType||e.type||"websocket_event",eventName:e.eventName||e.name,url:e.url,userAgent:e.userAgent||navigator.userAgent,timestamp:(new Date).toISOString(),fingerprintHash:e.fingerprintHash,stableCoreHash:e.stableCoreHash,stableCoreVector:e.stableCoreVector})),setTimeout(()=>{var e;null===(e=this.ws)||void 0===e||e.removeEventListener("message",a),n(new Error("WebSocket response timeout"))},5e3)})}catch(e){return{success:!1,method:this.name,latency:Date.now()-s,error:e instanceof Error?e.message:String(e)}}}async connect(){var e;if(!this.connected||(null===(e=this.ws)||void 0===e?void 0:e.readyState)!==WebSocket.OPEN)return new Promise((e,t)=>{try{const s=new URL(this.baseUrl),n=`${"https:"===s.protocol?"wss:":"ws:"}//${s.host}/ws/track?token=${encodeURIComponent(this.token)}`;this.ws=new WebSocket(n),this.ws.onopen=()=>{this.connected=!0,e()},this.ws.onerror=()=>{this.connected=!1,t(new Error("WebSocket connection failed"))},this.ws.onclose=()=>{this.connected=!1},setTimeout(()=>{var e;this.connected||(null===(e=this.ws)||void 0===e||e.close(),t(new Error("WebSocket connection timeout")))},5e3)}catch(e){t(e)}})}cleanup(){this.ws&&(this.ws.close(),this.connected=!1)}}class n{constructor(){this.name="webrtc",this.available=void 0!==globalThis.RTCPeerConnection,this.connected=!1}async send(e,t){const s=Date.now();if(!this.available)return{success:!1,method:this.name,error:"WebRTC not available"};try{return await this.setupConnection(),this.dataChannel&&this.connected?(this.dataChannel.send(JSON.stringify(e)),{success:!0,method:this.name,latency:Date.now()-s}):{success:!1,method:this.name,error:"DataChannel not ready"}}catch(e){return{success:!1,method:this.name,error:e instanceof Error?e.message:String(e)}}}async setupConnection(){if(!this.connected)return new Promise((e,t)=>{try{this.pc=new globalThis.RTCPeerConnection({iceServers:[{urls:"stun:stun.l.google.com:19302"}]}),this.dataChannel=this.pc.createDataChannel("tracking",{ordered:!1,maxRetransmits:0}),this.dataChannel.onopen=()=>{this.connected=!0,e()},this.dataChannel.onerror=e=>{t(e)}}catch(e){t(e)}})}destroy(){this.dataChannel&&this.dataChannel.close(),this.pc&&this.pc.close(),this.connected=!1}}class o{constructor(e,t,s={}){this.transports=[],this.stats={totalRequests:0,successfulRequests:0,methodSuccess:new Map,methodFailures:new Map},this.baseUrl=e,this.token=t,this.config={enabled:!0,methods:["elysia-websocket","fetch"],fallbackDelay:100,maxRetries:2,debug:!1,...s},this.initializeTransports()}initializeTransports(){const t={"elysia-websocket":()=>new s(this.baseUrl,this.token),fetch:()=>new e,webrtc:()=>new n};this.transports=this.config.methods.map(e=>{var s;return null===(s=t[e])||void 0===s?void 0:s.call(t)}).filter(e=>void 0!==e&&e.available),this.config.debug}async send(e,t="/tracking/event"){if(this.stats.totalRequests++,!this.config.enabled||0===this.transports.length)return{success:!1,method:"none",error:"No transports available"};let s="";for(const n of this.transports){this.config.debug;try{const o=await n.send(e,`${this.baseUrl}${t}`);if(o.success)return this.stats.successfulRequests++,this.updateMethodStats(n.name,!0),this.config.debug,o;this.updateMethodStats(n.name,!1),s=o.error||"Unknown error",this.config.debug}catch(e){s=e instanceof Error?e.message:String(e),this.updateMethodStats(n.name,!1),this.config.debug}this.config.fallbackDelay>0&&await new Promise(e=>setTimeout(e,this.config.fallbackDelay))}return{success:!1,method:"all_failed",error:`All transports failed. Last error: ${s}`}}updateMethodStats(e,t){t?this.stats.methodSuccess.set(e,(this.stats.methodSuccess.get(e)||0)+1):this.stats.methodFailures.set(e,(this.stats.methodFailures.get(e)||0)+1)}getStats(){return{...this.stats}}getSuccessRates(){const e={};for(const t of this.transports){const s=this.stats.methodSuccess.get(t.name)||0,n=s+(this.stats.methodFailures.get(t.name)||0);e[t.name]=n>0?s/n*100:0}return e}destroy(){this.transports.forEach(e=>{e.destroy&&e.destroy()}),this.transports=[]}async testTransports(){const e={},t={test:!0,timestamp:Date.now()};for(const s of this.transports)try{e[s.name]=await s.send(t,`${this.baseUrl}/test`)}catch(t){e[s.name]={success:!1,method:s.name,error:t instanceof Error?t.message:String(t)}}return e}}export{o as AntiAdblockManager,s as ElysiaWebSocketTransport,e as FetchTransport,n as WebRTCTransport,t as WebSocketTransport};
6
+ class e{constructor(){this.name="fetch",this.available="undefined"!=typeof fetch}async send(e,t){const s=Date.now();try{const n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!n.ok)throw new Error(`HTTP ${n.status}`);return{success:!0,method:this.name,latency:Date.now()-s}}catch(e){return{success:!1,method:this.name,latency:Date.now()-s,error:e instanceof Error?e.message:String(e)}}}}class t{constructor(e){this.name="websocket",this.available="undefined"!=typeof WebSocket,this.connected=!1,this.messageQueue=[],this.reconnectAttempts=0,this.MAX_RECONNECT_ATTEMPTS=5,this.MAX_QUEUE_SIZE=50,this.baseUrl=e.replace(/^http/,"ws")}async connect(){if(!this.connected&&this.available)return new Promise((e,t)=>{try{this.ws=new WebSocket(`${this.baseUrl}/ws/track`),this.ws.onopen=()=>{this.connected=!0,this.reconnectAttempts=0,this.processQueue(),e()},this.ws.onerror=()=>{t(new Error("WebSocket connection failed"))},this.ws.onclose=()=>{if(this.connected=!1,this.reconnectAttempts<this.MAX_RECONNECT_ATTEMPTS){const e=Math.min(3e4,1e3*Math.pow(2,this.reconnectAttempts));this.reconnectAttempts++,setTimeout(()=>this.connect().catch(()=>{}),e)}}}catch(e){t(e)}})}processQueue(){for(;this.messageQueue.length>0&&this.connected;){const e=this.messageQueue.shift();if(e&&this.ws)try{this.ws.send(JSON.stringify(e.data)),e.resolve({success:!0,method:this.name})}catch(t){e.resolve({success:!1,method:this.name,error:t instanceof Error?t.message:String(t)})}}}async send(e,t){const s=Date.now();if(!this.available)return{success:!1,method:this.name,error:"WebSocket not available"};if(!this.connected)try{await this.connect()}catch(e){return{success:!1,method:this.name,error:e instanceof Error?e.message:String(e)}}return new Promise(t=>{if(this.connected&&this.ws)try{this.ws.send(JSON.stringify(e)),t({success:!0,method:this.name,latency:Date.now()-s})}catch(e){t({success:!1,method:this.name,error:e instanceof Error?e.message:String(e)})}else this.messageQueue.length>=this.MAX_QUEUE_SIZE&&this.messageQueue.shift(),this.messageQueue.push({data:e,resolve:e=>t({...e,latency:Date.now()-s})})})}destroy(){this.ws&&(this.ws.close(),this.connected=!1)}}class s{constructor(e,t){this.name="elysia-websocket",this.available="undefined"!=typeof WebSocket,this.connected=!1,this.baseUrl=e,this.token=t}async send(e,t){const s=Date.now();try{if(!this.token)throw new Error("Missing token for WebSocket connection");if(await this.connect(),!this.ws||!this.connected)throw new Error("WebSocket not connected");return new Promise((t,n)=>{var o,r;const i=e=>{var o,r;try{const n=JSON.parse(e.data);null===(o=this.ws)||void 0===o||o.removeEventListener("message",i),t({success:n.success||!1,method:this.name,latency:Date.now()-s})}catch(e){null===(r=this.ws)||void 0===r||r.removeEventListener("message",i),n(new Error("Failed to parse WebSocket response"))}};null===(o=this.ws)||void 0===o||o.addEventListener("message",i),null===(r=this.ws)||void 0===r||r.send(JSON.stringify({...e,eventId:e.eventId||crypto.randomUUID(),sessionId:e.sessionId||e.s,eventType:e.eventType||e.type||"websocket_event",eventName:e.eventName||e.name,url:e.url,userAgent:e.userAgent||navigator.userAgent,timestamp:(new Date).toISOString(),fingerprintHash:e.fingerprintHash,stableCoreHash:e.stableCoreHash,stableCoreVector:e.stableCoreVector})),setTimeout(()=>{var e;null===(e=this.ws)||void 0===e||e.removeEventListener("message",i),n(new Error("WebSocket response timeout"))},5e3)})}catch(e){return{success:!1,method:this.name,latency:Date.now()-s,error:e instanceof Error?e.message:String(e)}}}async connect(){var e;if(!this.connected||(null===(e=this.ws)||void 0===e?void 0:e.readyState)!==WebSocket.OPEN)return new Promise((e,t)=>{try{const s=new URL(this.baseUrl),n=`${"https:"===s.protocol?"wss:":"ws:"}//${s.host}/ws/track?token=${encodeURIComponent(this.token)}`;this.ws=new WebSocket(n),this.ws.onopen=()=>{this.connected=!0,e()},this.ws.onerror=()=>{this.connected=!1,t(new Error("WebSocket connection failed"))},this.ws.onclose=()=>{this.connected=!1},setTimeout(()=>{var e;this.connected||(null===(e=this.ws)||void 0===e||e.close(),t(new Error("WebSocket connection timeout")))},5e3)}catch(e){t(e)}})}cleanup(){this.ws&&(this.ws.close(),this.connected=!1)}}class n{constructor(e,t,s={}){this.transports=[],this.stats={totalRequests:0,successfulRequests:0,methodSuccess:new Map,methodFailures:new Map},this.baseUrl=e,this.token=t,this.config={enabled:!0,methods:["elysia-websocket","fetch"],fallbackDelay:100,maxRetries:2,debug:!1,...s},this.initializeTransports()}initializeTransports(){const t={"elysia-websocket":()=>new s(this.baseUrl,this.token),fetch:()=>new e};this.transports=this.config.methods.map(e=>{var s;return null===(s=t[e])||void 0===s?void 0:s.call(t)}).filter(e=>void 0!==e&&e.available),this.config.debug}async send(e,t="/tracking/event"){if(this.stats.totalRequests++,!this.config.enabled||0===this.transports.length)return{success:!1,method:"none",error:"No transports available"};let s="";for(const n of this.transports){this.config.debug;try{const o=await n.send(e,`${this.baseUrl}${t}`);if(o.success)return this.stats.successfulRequests++,this.updateMethodStats(n.name,!0),this.config.debug,o;this.updateMethodStats(n.name,!1),s=o.error||"Unknown error",this.config.debug}catch(e){s=e instanceof Error?e.message:String(e),this.updateMethodStats(n.name,!1),this.config.debug}this.config.fallbackDelay>0&&await new Promise(e=>setTimeout(e,this.config.fallbackDelay))}return{success:!1,method:"all_failed",error:`All transports failed. Last error: ${s}`}}updateMethodStats(e,t){t?this.stats.methodSuccess.set(e,(this.stats.methodSuccess.get(e)||0)+1):this.stats.methodFailures.set(e,(this.stats.methodFailures.get(e)||0)+1)}getStats(){return{...this.stats}}getSuccessRates(){const e={};for(const t of this.transports){const s=this.stats.methodSuccess.get(t.name)||0,n=s+(this.stats.methodFailures.get(t.name)||0);e[t.name]=n>0?s/n*100:0}return e}destroy(){this.transports.forEach(e=>{e.destroy&&e.destroy()}),this.transports=[]}async testTransports(){const e={},t={test:!0,timestamp:Date.now()};for(const s of this.transports)try{e[s.name]=await s.send(t,`${this.baseUrl}/test`)}catch(t){e[s.name]={success:!1,method:s.name,error:t instanceof Error?t.message:String(t)}}return e}}export{n as AntiAdblockManager,s as ElysiaWebSocketTransport,e as FetchTransport,t as WebSocketTransport};
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * Zaplier SDK v3.0.0 - Unified SDK
3
+ * Advanced privacy-first tracking with code splitting
4
+ * (c) 2026 Zaplier Team
5
+ */
6
+ class t{constructor(t,e={}){this.observedElements=new Set,this.scrollThrottle=0,this.isInitialized=!1,this.delegationHandlers=new Map,this.initializationAttempts=0,this.maxInitializationAttempts=3,this.diagnostics={},this.cachedScrollElements=null,this.lastScrollElementsCheck=0,this.sdkInstance=t,this.config={enabled:!0,trackClicks:!0,trackScrolls:!0,trackViews:!0,trackHovers:!0,trackForms:!0,debug:!1,...e}}start(){this.config.enabled&&(this.initializationAttempts++,this.runDiagnostics(),this.config.debug,this.tryInitialization())}runDiagnostics(){var t;this.diagnostics={timestamp:(new Date).toISOString(),attempt:this.initializationAttempts,environment:{domReady:document.readyState,reactDetected:this.detectReact(),reactVersion:this.getReactVersion(),userAgent:navigator.userAgent,isMobile:/Mobile|Android|iPhone|iPad/.test(navigator.userAgent),isSafari:/Safari/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent),protocol:window.location.protocol,isLocalhost:"localhost"===window.location.hostname||"127.0.0.1"===window.location.hostname},dom:{documentElement:!!document.documentElement,body:!!document.body,querySelector:"function"==typeof document.querySelector,addEventListener:"function"==typeof document.addEventListener,elementsFound:this.getElementCounts(),hasReactRoot:this.findReactRoot()},tracking:{sdkInstance:!!this.sdkInstance,trackCustomEvent:"function"==typeof(null===(t=this.sdkInstance)||void 0===t?void 0:t.trackCustomEvent),config:this.config,isInitialized:this.isInitialized,activeHandlers:Array.from(this.delegationHandlers.keys())}}}detectReact(){return!!(window.__REACT_DEVTOOLS_GLOBAL_HOOK__||window.React||document.querySelector("[data-reactroot]")||document.querySelector("#root")||document.querySelector("#__next"))}getReactVersion(){try{const t=window.React;return(null==t?void 0:t.version)||null}catch{return null}}findReactRoot(){const t=document.querySelector("[data-reactroot]")||document.querySelector("#root")||document.querySelector("#__next")||document.querySelector("div[data-react-helmet]");return t?t.tagName+(t.id?"#"+t.id:""):null}getElementCounts(){return{click:document.querySelectorAll("[data-track-click]").length,scroll:document.querySelectorAll("[data-track-scroll]").length,view:document.querySelectorAll("[data-track-view]").length,hover:document.querySelectorAll("[data-track-hover]").length,form:document.querySelectorAll("[data-track-form]").length}}tryInitialization(){const t=[()=>this.immediateInitialization(),()=>this.delayedInitialization(100),()=>this.delayedInitialization(500),()=>this.delayedInitialization(1e3),()=>this.reactReadyInitialization()];"complete"===document.readyState?this.attemptStrategy(0,t):"interactive"===document.readyState?this.attemptStrategy(1,t):document.addEventListener("DOMContentLoaded",()=>{this.attemptStrategy(0,t)},{once:!0})}attemptStrategy(t,e){if(!(t>=e.length||this.isInitialized)){this.config.debug;try{const i=e[t];i&&"function"==typeof i?(i(),setTimeout(()=>{this.verifyInitialization()?this.config.debug:(this.config.debug,this.attemptStrategy(t+1,e))},50)):this.attemptStrategy(t+1,e)}catch(i){this.config.debug,this.attemptStrategy(t+1,e)}}}immediateInitialization(){this.initializeTracking()}delayedInitialization(t){setTimeout(()=>{this.initializeTracking()},t)}reactReadyInitialization(){"function"==typeof window.requestAnimationFrame?window.requestAnimationFrame(()=>{setTimeout(()=>{this.initializeTracking()},0)}):setTimeout(()=>{this.initializeTracking()},16)}verifyInitialization(){const t=this.getElementCounts(),e=Object.values(t).reduce((t,e)=>t+e,0),i=this.delegationHandlers.size>0;return this.config.debug,this.isInitialized&&(e>0||i)}initializeTracking(){this.config.debug,this.observeDOM(),this.processExistingElements(),this.config.trackViews&&this.setupViewTracking(),this.setupEventDelegation(),this.config.debug&&(this.logFoundElements(),setTimeout(()=>{this.logFoundElements()},500),setTimeout(()=>{this.logFoundElements()},2e3))}logFoundElements(){document.querySelectorAll("[data-track-click]");const t=document.querySelectorAll("[data-track-scroll]");document.querySelectorAll("[data-track-view]"),document.querySelectorAll("[data-track-hover]"),document.querySelectorAll("[data-track-form]"),t.length}setupEventDelegation(){this.config.debug;const t=this.getOptimalDelegationTarget();if(this.config.debug,this.config.trackClicks){const e=this.createReactCompatibleClickHandler();this.delegationHandlers.set("click",e),t.addEventListener("click",e,this.getEventOptions("click")),this.config.debug}this.config.trackScrolls&&(this.config.debug,this.setupIntersectionObserverScrollTracking(),this.setupFallbackScrollListener(),this.config.debug),this.setupIntelligentMutationObserver(),this.isInitialized=!0,this.config.debug}getOptimalDelegationTarget(){var t;const e=document.querySelector("#root")||document.querySelector("#__next")||document.querySelector("[data-reactroot]");return e&&(null===(t=this.diagnostics.environment)||void 0===t?void 0:t.reactDetected)?(this.config.debug,e):document}getEventOptions(t){var e,i;null===(e=this.diagnostics.environment)||void 0===e||e.isMobile;const n=null===(i=this.diagnostics.environment)||void 0===i?void 0:i.isSafari;let s={};switch(t){case"click":s={passive:!n,capture:!1};break;case"scroll":s={passive:!0,capture:!1};break;default:s={passive:!0}}return this.config.debug,s}createReactCompatibleClickHandler(){return t=>{try{if(!this.config.trackClicks)return;const e=t.target;if(!e)return;let i=null;if(i=e.closest("[data-track-click]"),!i&&e.hasAttribute&&e.hasAttribute("data-track-click")&&(i=e),i||(i=this.findTrackingElementManually(e,"data-track-click")),!i)return void this.config.debug;const n=i.getAttribute("data-track-click");if(!n)return;const s=this.extractMetadata(i);this.trackEvent(n,{type:"click",element:i.tagName.toLowerCase(),reactCompatible:!0,...s}),this.config.debug}catch(t){this.config.debug}}}findTrackingElementManually(t,e,i=10){let n=t,s=0;for(;n&&n!==document.documentElement&&s<i;){if(n.hasAttribute&&n.hasAttribute(e))return n;n=n.parentElement,s++}return null}setupIntersectionObserverScrollTracking(){if("undefined"==typeof window||!("IntersectionObserver"in window))return void this.config.debug;const t=document.querySelectorAll("[data-track-scroll]");if(0===t.length)return void this.config.debug;const e=new IntersectionObserver(t=>{t.forEach(t=>{const i=t.target,n=i.getAttribute("data-track-scroll"),s=parseFloat(i.getAttribute("data-scroll-threshold")||"0.5"),r="true"===i.getAttribute("data-scroll-triggered");if(!n||r)return;const o=t.intersectionRatio;if(this.config.debug,o>=s){i.setAttribute("data-scroll-triggered","true");const t=this.extractMetadata(i);this.trackEvent(n,{type:"scroll",method:"IntersectionObserver",element:i.tagName.toLowerCase(),threshold:s,visibilityRatio:Math.round(1e3*o)/1e3,enhanced:!0,modern:!0,...t}),this.config.debug,e.unobserve(i)}})},{root:null,rootMargin:"0px",threshold:[0,.1,.25,.5,.75,.9,1]});t.forEach(t=>{e.observe(t),this.config.debug}),this.intersectionObserver=e,this.config.debug}setupFallbackScrollListener(){if("undefined"==typeof window)return;const t=this.createThrottledScrollHandler();[()=>window.addEventListener("scroll",t,{passive:!0}),()=>document.addEventListener("scroll",t,{passive:!0}),()=>window.addEventListener("scroll",t,{passive:!0,capture:!0}),()=>{setTimeout(()=>{window.addEventListener("scroll",t,{passive:!0})},100)},()=>{"complete"===document.readyState?window.addEventListener("scroll",t,{passive:!0}):window.addEventListener("load",()=>{window.addEventListener("scroll",t,{passive:!0})})}].forEach((t,e)=>{try{t(),this.config.debug}catch(t){this.config.debug}}),this.delegationHandlers.set("scroll",t),this.config.debug&&setTimeout(()=>{window.addEventListener("scroll",()=>{},{once:!0,passive:!0});const t=window.scrollY;window.scrollBy(0,1),setTimeout(()=>window.scrollTo(0,t),50)},2e3)}createThrottledScrollHandler(){let t=0,e=!1;return()=>{t=window.scrollY,e||(setTimeout(()=>{this.config.debug,this.processFallbackScroll(t),e=!1},20),e=!0)}}processFallbackScroll(t){const e=document.querySelectorAll('[data-track-scroll]:not([data-scroll-triggered="true"])');0!==e.length&&e.forEach(e=>{const i=e.getAttribute("data-track-scroll"),n=parseFloat(e.getAttribute("data-scroll-threshold")||"0.5");if(!i)return;const s=e.getBoundingClientRect(),r=window.innerHeight,o=s.height;if(o<=0)return;const a=Math.max(s.top,0),c=Math.min(s.bottom,r),l=Math.max(0,c-a)/o;if(l>=n){e.setAttribute("data-scroll-triggered","true");const s=this.extractMetadata(e);this.trackEvent(i,{type:"scroll",method:"fallback_scroll",element:e.tagName.toLowerCase(),threshold:n,visibilityRatio:Math.round(1e3*l)/1e3,scrollPosition:t,fallback:!0,...s}),this.config.debug}})}createEnhancedScrollHandler(){return()=>{var t;try{if(this.config.debug,!this.config.trackScrolls)return void this.config.debug;const e=Date.now(),i=e-this.scrollThrottle,n=(null===(t=this.diagnostics.environment)||void 0===t?void 0:t.isMobile)?150:100;if(this.config.debug,i<n)return void this.config.debug;this.scrollThrottle=e;const s=this.getCachedScrollElements();this.config.debug,s.length>0?(this.config.debug,s.forEach((t,e)=>{this.config.debug,this.processScrollElementEnhanced(t)}),this.config.debug):this.config.debug}catch(t){this.config.debug}}}getCachedScrollElements(){const t=Date.now();return(!this.cachedScrollElements||t-this.lastScrollElementsCheck>2e3)&&(this.cachedScrollElements=document.querySelectorAll("[data-track-scroll]"),this.lastScrollElementsCheck=t,this.config.debug&&Array.from(this.cachedScrollElements).forEach((t,e)=>{})),this.cachedScrollElements}processScrollElementEnhanced(t){try{if("true"===t.getAttribute("data-scroll-triggered"))return void this.config.debug;const e=parseFloat(t.getAttribute("data-scroll-threshold")||"0.5"),i=t.getBoundingClientRect(),n=i.height,s=window.innerHeight;if(n<=0)return void this.config.debug;const r=Math.max(i.top,0),o=Math.min(i.bottom,s),a=Math.max(0,o-r)/n,c=t.getAttribute("data-track-scroll");if(!c)return void this.config.debug;if(this.config.debug,a>=e){t.setAttribute("data-scroll-triggered","true");const i=this.extractMetadata(t),n={type:"scroll",element:t.tagName.toLowerCase(),threshold:e,scrollDepth:window.scrollY,visibilityRatio:Math.round(1e3*a)/1e3,enhanced:!0,...i};this.config.debug,this.trackEvent(c,n),this.config.debug}}catch(t){this.config.debug}}processScrollElement(t){this.processScrollElementEnhanced(t)}setupIntelligentMutationObserver(){if(this.mutationObserver)return;const t=this.debounce(t=>{let e=!1;t.forEach(t=>{t.addedNodes.forEach(t=>{if(t.nodeType===Node.ELEMENT_NODE){const i=t;(this.hasTrackingAttributes(i)||this.hasTrackingDescendants(i))&&(e=!0,this.config.debug)}})}),e&&(this.config.debug,this.processExistingElements())},150);this.mutationObserver=new MutationObserver(t),this.mutationObserver.observe(document.body,{childList:!0,subtree:!0}),this.config.debug}hasTrackingAttributes(t){return t.hasAttribute&&(t.hasAttribute("data-track-click")||t.hasAttribute("data-track-scroll")||t.hasAttribute("data-track-view")||t.hasAttribute("data-track-hover")||t.hasAttribute("data-track-form"))}hasTrackingDescendants(t){return!!t.querySelector&&!!(t.querySelector("[data-track-click]")||t.querySelector("[data-track-scroll]")||t.querySelector("[data-track-view]")||t.querySelector("[data-track-hover]")||t.querySelector("[data-track-form]"))}debounce(t,e){let i;return(...n)=>{clearTimeout(i),i=setTimeout(()=>t.apply(this,n),e)}}stop(){this.config.debug,this.delegationHandlers.forEach((t,e)=>{"click"===e?this.getOptimalDelegationTarget().removeEventListener("click",t):"scroll"===e?(window.removeEventListener("scroll",t),document.removeEventListener("scroll",t),this.config.debug):document.removeEventListener(e,t)}),this.delegationHandlers.clear(),this.intersectionObserver&&(this.intersectionObserver.disconnect(),this.intersectionObserver=void 0),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=void 0),this.observedElements.clear(),this.isInitialized=!1,this.config.debug}observeDOM(){this.config.debug}processExistingElements(){document.querySelectorAll("[data-track-click], [data-track-scroll], [data-track-view], [data-track-hover], [data-track-form]").forEach(t=>{this.processElement(t)})}processElement(t){this.config.trackViews&&t.hasAttribute("data-track-view")&&this.setupElementViewTracking(t),this.config.trackHovers&&t.hasAttribute("data-track-hover")&&this.setupHoverTracking(t),this.config.trackForms&&t.hasAttribute("data-track-form")&&this.setupFormTracking(t)}setupViewTracking(){this.intersectionObserver=new IntersectionObserver(t=>{t.forEach(t=>{var e;if(t.isIntersecting){const i=t.target,n=i.getAttribute("data-track-view");if(!n)return;const s=this.extractMetadata(i);this.trackEvent(n,{type:"view",element:i.tagName.toLowerCase(),intersectionRatio:t.intersectionRatio,...s}),this.config.debug,null===(e=this.intersectionObserver)||void 0===e||e.unobserve(i)}})},{threshold:.5,rootMargin:"0px"})}setupElementViewTracking(t){this.intersectionObserver&&(this.observedElements.has(t)||(this.intersectionObserver.observe(t),this.observedElements.add(t)))}setupHoverTracking(t){let e;const i=parseInt(t.getAttribute("data-hover-time")||"1000");t.addEventListener("mouseenter",()=>{e=Date.now()}),t.addEventListener("mouseleave",()=>{const n=Date.now()-e;if(n>=i){const e=t.getAttribute("data-track-hover");if(!e)return;const s=this.extractMetadata(t);this.trackEvent(e,{type:"hover",element:t.tagName.toLowerCase(),hoverDuration:n,minHoverTime:i,...s}),this.config.debug}})}setupFormTracking(t){"form"===t.tagName.toLowerCase()&&t.addEventListener("submit",e=>{const i=t.getAttribute("data-track-form");if(!i)return;const n=new FormData(t),s=this.extractMetadata(t),r={};for(const[t,e]of n.entries())this.isSensitiveField(t)||(r[t]="string"==typeof e?e.substring(0,100):"file");this.trackEvent(i,{type:"form_submit",element:"form",fieldCount:Array.from(n.entries()).length,fields:r,...s}),this.config.debug})}extractMetadata(t){var e;const i={};Array.from(t.attributes).forEach(t=>{if(t.name.startsWith("data-meta-")){const e=t.name.replace("data-meta-","");i[e]=t.value}}),t.id&&(i.elementId=t.id),t.className&&(i.elementClass=t.className);const n=null===(e=t.textContent)||void 0===e?void 0:e.trim();n&&n.length>0&&(i.textContent=n.substring(0,50));const s=t.getBoundingClientRect();return i.elementPosition={x:Math.round(s.left),y:Math.round(s.top),width:Math.round(s.width),height:Math.round(s.height)},i}isSensitiveField(t){return[/password/i,/pass/i,/pwd/i,/secret/i,/token/i,/api[_-]?key/i,/credit[_-]?card/i,/ssn/i,/social/i,/tax/i].some(e=>e.test(t))}trackEvent(t,e){var i,n;const s=performance.now();if(this.config.debug,this.validateTrackingCall(t,e).isValid)try{const r={autoTracked:!0,enhanced:!0,timestamp:Date.now(),url:window.location.href,userAgent:navigator.userAgent,trackingLatency:Math.round(100*(performance.now()-s))/100,isReactApp:null===(i=this.diagnostics.environment)||void 0===i?void 0:i.reactDetected,isMobile:null===(n=this.diagnostics.environment)||void 0===n?void 0:n.isMobile,...e};if(this.config.debug,!this.sdkInstance)return void this.config.debug;if("function"!=typeof this.sdkInstance.trackCustomEvent)return void this.config.debug;this.sdkInstance.trackCustomEvent(t,r),this.config.debug&&performance.now()}catch(t){this.config.debug}else this.config.debug}validateTrackingCall(t,e){const i=[];return t&&"string"==typeof t||i.push("Event name is required and must be a string"),this.sdkInstance||i.push("SDK instance is null or undefined"),this.sdkInstance&&"function"!=typeof this.sdkInstance.trackCustomEvent&&i.push("trackCustomEvent is not a function: "+typeof this.sdkInstance.trackCustomEvent),window&&"object"==typeof window||i.push("Window object is not available"),{isValid:0===i.length,errors:i}}refreshTracking(){this.isInitialized?(this.config.debug,this.processExistingElements(),this.config.debug&&this.logFoundElements()):this.config.debug}rescan(){this.refreshTracking()}getDiagnostics(){const t={triggerScrollHandler:()=>{this.config.debug;const t=this.delegationHandlers.get("scroll");t&&t(new Event("scroll"))},forceScrollEvent:t=>{const e=document.querySelector(t);e&&e.getAttribute("data-track-scroll")&&(e.removeAttribute("data-scroll-triggered"),this.processScrollElementEnhanced(e))},testTrackEvent:(t="test_event")=>{this.trackEvent(t,{type:"test",source:"manual_diagnostic",timestamp:Date.now()})},testIntersectionObserver:()=>{const t=document.querySelectorAll("[data-track-scroll]");if(this.intersectionObserver&&t.length>0){const e=t[0];e&&(e.removeAttribute("data-scroll-triggered"),this.intersectionObserver.observe(e))}},testScrollFallback:()=>{const t=this.delegationHandlers.get("scroll");t&&t(new Event("scroll"))}};return"undefined"!=typeof window&&(window.autoTrackerTests=t),{initialization:{isInitialized:this.isInitialized,attempts:this.initializationAttempts,maxAttempts:this.maxInitializationAttempts,timestamp:(new Date).toISOString()},eventHandlers:{hasClickHandler:this.delegationHandlers.has("click"),hasScrollHandler:this.delegationHandlers.has("scroll"),activeHandlers:Array.from(this.delegationHandlers.keys()),delegationTarget:this.getOptimalDelegationTarget()===document?"document":"react-root"},observers:{observedElements:this.observedElements.size,hasMutationObserver:!!this.mutationObserver,hasIntersectionObserver:!!this.intersectionObserver,scrollElementsCache:!!this.cachedScrollElements,cacheExpiry:new Date(this.lastScrollElementsCheck+5e3).toISOString()},config:this.config,environment:this.diagnostics.environment||{},dom:this.diagnostics.dom||{},tracking:this.diagnostics.tracking||{},elementsFound:this.getElementCounts(),performance:{lastScrollThrottle:this.scrollThrottle,cacheLastUpdate:this.lastScrollElementsCheck},validation:this.validateTrackingCall("test",{}),recommendations:this.generateRecommendations(),manualTests:{available:!0,usage:{triggerScrollHandler:"window.autoTrackerTests.triggerScrollHandler()",forceScrollEvent:'window.autoTrackerTests.forceScrollEvent("[data-track-scroll]")',testTrackEvent:'window.autoTrackerTests.testTrackEvent("my_event")',testIntersectionObserver:"window.autoTrackerTests.testIntersectionObserver()",testScrollFallback:"window.autoTrackerTests.testScrollFallback()"},description:"Use these functions in the browser console to manually test the AutoTracker"}}}generateRecommendations(){var t,e;const i=[],n=this.getElementCounts(),s=Object.values(n).reduce((t,e)=>t+e,0);return this.isInitialized||i.push("AutoTracker is not initialized. Check console for errors."),0===s&&i.push("No trackable elements found. Ensure data-track-* attributes are present in the DOM."),this.sdkInstance||i.push("SDK instance is missing. Ensure the SDK is properly initialized."),this.sdkInstance&&"function"!=typeof this.sdkInstance.trackCustomEvent&&i.push("trackCustomEvent method is not available on SDK instance."),!(null===(t=this.diagnostics.environment)||void 0===t?void 0:t.reactDetected)&&window.location.hostname.includes("localhost")&&i.push("React not detected. If using React, ensure proper setup and try refreshTracking() after route changes."),(null===(e=this.diagnostics.environment)||void 0===e?void 0:e.isMobile)&&!this.delegationHandlers.has("scroll")&&i.push("Mobile device detected but scroll tracking not active. Check scroll tracking configuration."),this.initializationAttempts>1&&i.push(`AutoTracker required ${this.initializationAttempts} initialization attempts. Consider adding delay before enabling.`),i}configure(t){this.config={...this.config,...t}}getStats(){return{observedElements:this.observedElements.size,config:this.config,isModern:this.isInitialized,diagnostics:this.config.debug?this.getDiagnostics():void 0}}}export{t as AutoTracker};
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * Zaplier SDK v3.0.0 - Unified SDK
3
+ * Advanced privacy-first tracking with code splitting
4
+ * (c) 2026 Zaplier Team
5
+ */
6
+ import{i as e,a as t,b as n}from"./fingerprint-BmsWDNK6.js";function r(){var t;try{return e()&&null!==(t=navigator.pdfViewerEnabled)&&void 0!==t?t:null}catch{return null}}function o(){try{if(!t())return-1;const{ApplePaySession:e}=window;if("function"!=typeof(null==e?void 0:e.canMakePayments))return-1;if(!n())return-2;if(window.self!==window.top)return-3;try{return e.canMakePayments()?1:0}catch(e){if(e instanceof Error&&"InvalidAccessError"===e.name)return-2;throw e}}catch{return-1}}function i(){try{return"attributionReporting"in window||"privateClickMeasurement"in window||null}catch{return null}}function a(){const t={enabled:!1,sameSiteSupport:!1,secureSupport:!1,partitionedSupport:!1};try{if(t.enabled=navigator.cookieEnabled,!t.enabled)return t;t.sameSiteSupport=c("__rb_test_samesite","SameSite=Strict"),n()&&(t.secureSupport=c("__rb_test_secure","Secure")),n()&&e()&&(t.partitionedSupport=c("__rb_test_partitioned","Partitioned; Secure; SameSite=None"))}catch{}return t}function c(e,t){try{const n="1",r=`${e}=${n}; ${t}; path=/`;document.cookie=r;const o=document.cookie.includes(`${e}=${n}`);return u(e),o}catch{return u(e),!1}}function u(e){try{const t=[`${e}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`,`${e}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=${location.hostname}`,`${e}=; max-age=0; path=/`,`${e}=; max-age=0; path=/; domain=${location.hostname}`];for(const e of t)try{document.cookie=e}catch{}setTimeout(()=>{try{document.cookie=`${e}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`}catch{}},100)}catch{}}function s(){try{const e=document.createElement("canvas"),t=e.getContext("webgl")||e.getContext("experimental-webgl");return t?(t.getSupportedExtensions()||[]).sort():[]}catch{return[]}}function l(){try{const e=performance.memory;return e?{usedJSHeapSize:e.usedJSHeapSize,totalJSHeapSize:e.totalJSHeapSize,jsHeapSizeLimit:e.jsHeapSizeLimit}:null}catch{return null}}function p(){try{const e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return e?{effectiveType:e.effectiveType,downlink:e.downlink,rtt:e.rtt,saveData:e.saveData}:null}catch{return null}}function d(){var e;const t={};try{t.webkitTemporaryStorage="webkitTemporaryStorage"in navigator,t.webkitPersistentStorage="webkitPersistentStorage"in navigator,window.safari&&(t.safariObjectTypes=Object.getOwnPropertyNames(window.safari)),t.chromeRuntime=!!(null===(e=window.chrome)||void 0===e?void 0:e.runtime),t.mozInnerScreenX="mozInnerScreenX"in window,t.msCredentials="msCredentials"in navigator}catch{}return t}function m(){return"undefined"!=typeof window&&"undefined"!=typeof navigator}function f(){const e=r(),t=o(),n=i(),c=a(),u=s(),m=l(),f=p(),w=d();let S="unknown";w.chromeRuntime?S="chrome":-1!==t?S="safari":w.mozInnerScreenX?S="firefox":w.msCredentials&&(S="edge");const h=Boolean(e||t>-1||n||m||f),g=[null!==e,-1!==t,null!==n,c.enabled,u.length>0,null!==m,null!==f,Object.keys(w).length>0];return{pdfViewerEnabled:e,applePayState:t,privateClickMeasurement:n,cookieCapabilities:c,webglExtensions:u,performanceMemory:m,connectionInfo:f,vendorProperties:w,browserVendor:S,hasNativeFeatures:h,apiScore:Math.round(g.filter(Boolean).length/g.length*100)}}export{o as getApplePayState,f as getBrowserApisFingerprint,p as getConnectionInfo,a as getCookieCapabilities,r as getPdfViewerEnabled,l as getPerformanceMemory,i as getPrivateClickMeasurement,d as getVendorProperties,s as getWebGLExtensions,m as isBrowserApisDetectionAvailable};
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * Zaplier SDK v3.0.0 - Unified SDK
3
+ * Advanced privacy-first tracking with code splitting
4
+ * (c) 2026 Zaplier Team
5
+ */
6
+ const e={canvas:{stability:.95,entropy:.9,uniqueness:.85,spoofResistance:.8},webgl:{stability:.92,entropy:.88,uniqueness:.82,spoofResistance:.85},audio:{stability:.9,entropy:.85,uniqueness:.8,spoofResistance:.9},hardware:{stability:.98,entropy:.7,uniqueness:.75,spoofResistance:.95},screen:{stability:.85,entropy:.6,uniqueness:.65,spoofResistance:.7},system:{stability:.8,entropy:.65,uniqueness:.7,spoofResistance:.6},browser:{stability:.75,entropy:.6,uniqueness:.65,spoofResistance:.5},fonts:{stability:.7,entropy:.75,uniqueness:.7,spoofResistance:.4},math:{stability:.95,entropy:.8,uniqueness:.9,spoofResistance:.95},storage:{stability:.6,entropy:.5,uniqueness:.6,spoofResistance:.3},incognito:{stability:.5,entropy:.4,uniqueness:.3,spoofResistance:.2},domBlockers:{stability:.8,entropy:.7,uniqueness:.6,spoofResistance:.9},accessibility:{stability:.9,entropy:.6,uniqueness:.7,spoofResistance:.85},browserApis:{stability:.85,entropy:.75,uniqueness:.8,spoofResistance:.7},pluginsEnhanced:{stability:.7,entropy:.65,uniqueness:.75,spoofResistance:.5},mathFingerprint:{stability:.99,entropy:.95,uniqueness:.9,spoofResistance:.98},fontPreferences:{stability:.92,entropy:.88,uniqueness:.85,spoofResistance:.75},dateTimeLocale:{stability:.95,entropy:.7,uniqueness:.75,spoofResistance:.8},accessibilityEnhanced:{stability:.93,entropy:.65,uniqueness:.8,spoofResistance:.9},enhancedFonts:{stability:.88,entropy:.85,uniqueness:.82,spoofResistance:.7},webrtc:{stability:.92,entropy:.85,uniqueness:.8,spoofResistance:.9},permissions:{stability:.88,entropy:.75,uniqueness:.72,spoofResistance:.8},speech:{stability:.9,entropy:.7,uniqueness:.65,spoofResistance:.85},cssFeatures:{stability:.97,entropy:.88,uniqueness:.85,spoofResistance:.95},mediaCodecs:{stability:.95,entropy:.82,uniqueness:.78,spoofResistance:.92},wasmFeatures:{stability:.98,entropy:.7,uniqueness:.72,spoofResistance:.97},mathml:{stability:.9,entropy:.8,uniqueness:.75,spoofResistance:.88},clientHints:{stability:.93,entropy:.92,uniqueness:.9,spoofResistance:.85}},s={domBlockers:{stability:.8,entropy:.7,uniqueness:.6,spoofResistance:.9},accessibility:{stability:.9,entropy:.6,uniqueness:.7,spoofResistance:.85},browserApis:{stability:.85,entropy:.75,uniqueness:.8,spoofResistance:.7}};function n(n){const t=e[n]||s[n];if(!t)return.5;const i=.3*t.stability+.25*t.entropy+.25*t.uniqueness+.2*t.spoofResistance;return Math.max(.1,Math.min(1,i))}function t(t,i={}){const{requireMinimumComponents:o=4,penalizeMissingCore:a=!0,adjustForIncognito:c=!0}=i,r=t.filter(e=>e.success),p=[];r.length<o&&p.push(`Collect at least ${o} components for reliable identification`);let u=0,l=0,y=0,f=0,b=0;const m=["canvas","webgl","audio","hardware"].filter(e=>!r.some(s=>s.component===e));for(const t of r){const i=n(t.component),o=e[t.component]||s[t.component];o&&(u+=i,l+=o.stability*i,y+=o.entropy*i,f+=o.uniqueness*i,b+=o.spoofResistance*i)}const h=u>0?l/u:0,q=u>0?y/u:0,R=u>0?b/u:0;let d,g,w=.35*h+.25*q+.25*(u>0?f/u:0)+.15*R,M=w;return a&&m.length>0&&(M-=.1*m.length,p.push(`Missing core components: ${m.join(", ")}`)),r.length<6&&(M-=.05*(6-r.length)),c&&r.some(e=>"incognito"===e.component)&&(M+=.02),r.filter(e=>["domBlockers","accessibility","browserApis","math"].includes(e.component)).length>=2&&(M+=.05),M=Math.max(0,Math.min(1,M)),M>=.995?(d=.995,g="Very High"):M>=.99?(d=.99,g="High"):M>=.95?(d=.95,g="Medium"):M>=.8?(d=.8,g="Low"):(d=.5,g="Very Low",p.push("Consider implementing additional fingerprinting techniques")),M<.95&&p.push("Enable all available fingerprinting components for better accuracy"),R<.6&&p.push("Include more spoof-resistant components like audio and WebGL"),q<.6&&p.push("Add high-entropy components like canvas and math fingerprinting"),{score:d,level:g,factors:{componentCount:r.length,weightedScore:Math.round(1e3*w)/1e3,stabilityScore:Math.round(1e3*h)/1e3,entropyScore:Math.round(1e3*q)/1e3,spoofResistanceScore:Math.round(1e3*R)/1e3},recommendations:p.slice(0,3)}}export{s as ADVANCED_COMPONENT_CHARACTERISTICS,e as COMPONENT_CHARACTERISTICS,n as calculateComponentWeight,t as calculateConfidence};
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * Zaplier SDK v3.0.0 - Unified SDK
3
+ * Advanced privacy-first tracking with code splitting
4
+ * (c) 2026 Zaplier Team
5
+ */
6
+ function n(){var n,e,t,r;try{const i=screen,c=null!==(n=i.availTop)&&void 0!==n?n:0,u=null!==(e=i.availLeft)&&void 0!==e?e:0,o=null!==(t=i.availWidth)&&void 0!==t?t:i.width,l=null!==(r=i.availHeight)&&void 0!==r?r:i.height,a=c||null,s=i.width-o-u||null,d=i.height-l-c||null,h=u||null;if(null===a&&null===s&&null===d&&null===h)return null;const v=n=>null===n?null:10*Math.round(n/10);return{top:v(a),right:v(s),bottom:v(d),left:v(h)}}catch{return null}}function e(){var n,e,t,r;try{const i=(null===(n=navigator.platform)||void 0===n?void 0:n.toLowerCase())||"",c=(null===(e=navigator.userAgent)||void 0===e?void 0:e.toLowerCase())||"";if(i.includes("win")&&(c.includes("wow64")||c.includes("x64")||c.includes("x86_64")))return 0;if(i.includes("linux")&&(i.includes("x86_64")||c.includes("x86_64")))return 0;if(i.includes("mac")&&(i.includes("intel")||c.includes("intel mac")))return 0;if(i.includes("x86")||i.includes("x64")||i.includes("intel")||i.includes("amd64")||c.includes("x86")||c.includes("amd64"))return 0;if(i.includes("arm")||c.includes("arm")||c.includes("aarch64")||i.includes("aarch64"))return 255;try{const n=document.createElement("canvas"),e=n.getContext("webgl")||n.getContext("experimental-webgl");if(e&&"getExtension"in e&&"getParameter"in e){const n=e.getExtension("WEBGL_debug_renderer_info");if(n){const i=(null===(t=e.getParameter(n.UNMASKED_VENDOR_WEBGL))||void 0===t?void 0:t.toLowerCase())||"",c=(null===(r=e.getParameter(n.UNMASKED_RENDERER_WEBGL))||void 0===r?void 0:r.toLowerCase())||"";if(i.includes("intel")||i.includes("nvidia")||i.includes("amd")||c.includes("intel")||c.includes("nvidia")||c.includes("amd")||c.includes("radeon")||c.includes("geforce")||c.includes("quadro")||c.includes("iris")||c.includes("uhd")||c.includes("hd graphics"))return 0;if(c.includes("mali")||c.includes("adreno")||c.includes("powervr")||c.includes("tegra")||c.includes("apple gpu")||i.includes("arm")||c.includes("videocore"))return 255}}}catch{}try{const n=new Float32Array(1),e=new Uint8Array(n.buffer);n[0]=1/0,n[0]=n[0]-n[0];const t=e[3];return i.includes("linux"),t}catch{return}}catch{return}}function t(){try{const n=navigator;let e=0;void 0!==n.maxTouchPoints?e=n.maxTouchPoints:void 0!==n.msMaxTouchPoints&&(e=n.msMaxTouchPoints);let t=!1;try{document.createEvent("TouchEvent"),t=!0}catch{t=!1}return{maxTouchPoints:e,touchEvent:t,touchStart:"ontouchstart"in window}}catch{return}}function r(){const n=[],e=["chrome","safari","__crWeb","__gCrWeb","yandex","__yb","__ybro","__firefox__","__edgeTrackingPreventionStatistics","webkit","oprt","samsungAr","ucweb","UCShellJava","puffinDevice"];for(const t of e){const e=window[t];e&&"object"==typeof e&&n.push(t)}return n.sort()}function i(){try{const n=navigator.deviceMemory;if("number"==typeof n)return Math.round(n);if("string"==typeof n){const e=parseFloat(n);return isNaN(e)?void 0:Math.round(e)}return}catch{return}}function c(){try{return screen.colorDepth||void 0}catch{return}}function u(){try{for(const n of["rec2020","p3","srgb"])if(window.matchMedia(`(color-gamut: ${n})`).matches)return n;return}catch{return}}function o(){return{screenFrame:n(),hardwareConcurrency:navigator.hardwareConcurrency||void 0,deviceMemory:i(),architecture:e(),touchSupport:t(),vendorFlavors:r(),cpuClass:navigator.cpuClass||void 0,colorDepth:c(),colorGamut:u()}}export{o as collectDeviceSignals};
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * Zaplier SDK v3.0.0 - Unified SDK
3
+ * Advanced privacy-first tracking with code splitting
4
+ * (c) 2026 Zaplier Team
5
+ */
6
+ import{g as e}from"./fingerprint-BmsWDNK6.js";function t(){const e=atob;return{adBlock:["#ad-banner",".advertisement",e("I2FkLWNvbnRhaW5lcg=="),e("LmFkdmVydGlzZW1lbnQ="),e("W2NsYXNzKj0iYWQtIl0=")],uBlockOrigin:["#ublock-stats",".adsbygoogle",e("I2dvb2dsZV9hZHM="),e("LmFkc2J5Z29vZ2xl"),e("LnVibG9jay1ibG9ja2Vk")],adGuardBase:[".BetterJsPopOverlay",e("I2FkXzMwMFgyNTA="),e("I2Jhbm5lcmZsb2F0"),e("I2NhbXBhaWduLWJhbm5lcg=="),e("I0FkLUNvbnRlbnQ=")],adGuardAnnoyances:[".hs-sosyal","#cookieconsentdiv",'div[class^="app_gdpr"]',".as-oil",'[data-cypress="soft-push-notification-modal"]'],easyList:[".yb-floorad",e("LndpZGdldF9wb19hZHNfd2lkZ2V0"),e("LnRyYWZmaWNqdW5reS1hZA=="),".textad_headline",e("LnNwb25zb3JlZC10ZXh0LWxpbmtz")],privacyBadger:["#privacy-badger-popup",".privacy-badger-blocked",e("LnByaXZhY3ktYmFkZ2Vy")],ghostery:["#ghostery-popup",".ghostery-blocking",e("Lmdob3N0ZXJ5LWJsb2NrZWQ=")],brave:["#brave-ads-blocked",".brave-blocked",e("LmJyYXZlLWFkLWJsb2Nr")],facebookContainer:[".facebook-container-blocked",e("LmZiLWJsb2NrZWQ=")],cookieBlockers:[".cookie-notice-blocked","#cookie-banner-hidden",e("LmNvb2tpZS1ibG9ja2Vy")],trackingProtection:[".tracking-blocked","#tracking-protection-enabled",e("LnRyYWNrZXItYmxvY2tlZA==")]}}function r(e){const t=document.createElement("div");if(e.startsWith("#"))t.id=e.substring(1);else if(e.startsWith("."))t.className=e.substring(1);else if(e.includes("["))try{const r=e.match(/\[([^=]+)([*^$|~]?=)"([^"]+)"\]/);if(r&&r[1]&&r[3]){const[,e,o,n]=r;"*="===o?t.setAttribute(e,`test-${n}-test`):t.setAttribute(e,n)}}catch{t.className="test-element"}else t.className=e.replace(/[^a-zA-Z0-9-_]/g,"");return t}function o(e){const t=e.style;t.setProperty("visibility","hidden","important"),t.setProperty("display","block","important"),t.setProperty("position","absolute","important"),t.setProperty("left","-9999px","important"),t.setProperty("width","1px","important"),t.setProperty("height","1px","important"),t.setProperty("pointer-events","none","important"),t.setProperty("z-index","-1","important")}function n(e){return new Promise(t=>setTimeout(t,e))}async function a(e){var t,a;const i=document,s=i.createElement("div"),c=new Array(e.length),l={};o(s);const d=i.createDocumentFragment();for(let n=0;n<e.length;n++){const s=e[n];if(s)try{const e=r(s),l=i.createElement("div");"DIALOG"===e.tagName&&(null===(a=(t=e).show)||void 0===a||a.call(t)),o(l),l.appendChild(e),d.appendChild(l),c[n]=e}catch(e){c[n]=void 0}}s.appendChild(d);let m=0;for(;!i.body&&m<100;)await n(50),m++;if(!i.body)throw new Error("Document body not available for DOM blockers detection");i.body.appendChild(s);try{await n(50),await new Promise(t=>{requestAnimationFrame(()=>{for(let t=0;t<e.length;t++){const r=c[t],o=e[t];r&&o&&!r.offsetParent&&(l[o]=!0)}t()})})}finally{try{s.parentNode&&s.parentNode.removeChild(s)}catch(e){setTimeout(()=>{try{s.parentNode&&s.parentNode.removeChild(s)}catch{}},0)}}return l}async function i(e={}){const{debug:r=!1,timeout:o=5e3}=e;try{if(!s())return"BROWSER_INCOMPATIBLE";if(!document||!document.body)return"DOM_NOT_AVAILABLE";const e=t(),r=Object.keys(e),n=[].concat(...r.map(t=>e[t]||[])),i=new Promise((e,t)=>{setTimeout(()=>t(new Error("DOM blockers detection timeout")),o)}),c=await Promise.race([a(n),i]);return r.filter(t=>{const r=e[t];return!(!r||0===r.length)&&r.map(e=>c[e]).filter(Boolean).length>.6*r.length}).sort()}catch(e){if(e instanceof Error){if(e.message.includes("timeout"))return"TIMEOUT";if("SecurityError"===e.name||e.message.includes("SecurityError"))return"SECURITY_ERROR"}return"NOT_SUPPORTED"}}function s(){return e().canRunDOMBlockers}async function c(e={}){const t=await i(e),r=Array.isArray(t)?t:[];return{activeBlockers:r,blockerCount:r.length,hasAdBlocker:r.some(e=>["adBlock","uBlockOrigin","adGuardBase","easyList"].includes(e)),hasPrivacyExtension:r.some(e=>["privacyBadger","ghostery","brave"].includes(e)),hasTrackingProtection:r.includes("trackingProtection")}}export{a as getBlockedSelectors,t as getBlockerFilters,i as getDomBlockers,c as getDomBlockersFingerprint,s as isDomBlockersDetectionAvailable};