@beworke/pixel 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +163 -0
  3. package/RELEASE_CANDIDATE.md +256 -0
  4. package/dist/PixelLogger-B21lEjep.d.mts +8 -0
  5. package/dist/PixelLogger-B21lEjep.d.ts +8 -0
  6. package/dist/StorageFactory-BhpbB6Jj.d.mts +8 -0
  7. package/dist/StorageFactory-CAkJJqVD.d.ts +8 -0
  8. package/dist/config/index.cjs.js +3 -0
  9. package/dist/config/index.cjs.js.map +1 -0
  10. package/dist/config/index.d.mts +19 -0
  11. package/dist/config/index.d.ts +19 -0
  12. package/dist/config/index.esm.js +3 -0
  13. package/dist/config/index.esm.js.map +1 -0
  14. package/dist/events/index.cjs.js +3 -0
  15. package/dist/events/index.cjs.js.map +1 -0
  16. package/dist/events/index.d.mts +1 -0
  17. package/dist/events/index.d.ts +1 -0
  18. package/dist/events/index.esm.js +3 -0
  19. package/dist/events/index.esm.js.map +1 -0
  20. package/dist/examples/html-script/README.md +71 -0
  21. package/dist/examples/html-script/RELEASE_CANDIDATE.md +121 -0
  22. package/dist/examples/html-script/add-payment-info/README.md +46 -0
  23. package/dist/examples/html-script/add-payment-info/example-add-payment-info-card-autocomplete.html +494 -0
  24. package/dist/examples/html-script/add-payment-info/example-add-payment-info-card-disabled.html +478 -0
  25. package/dist/examples/html-script/add-payment-info/example-add-payment-info-card-fields.html +486 -0
  26. package/dist/examples/html-script/add-payment-info/example-add-payment-info-data-track.html +479 -0
  27. package/dist/examples/html-script/add-payment-info/example-add-payment-info-dedupe.html +492 -0
  28. package/dist/examples/html-script/add-payment-info/example-add-payment-info-manual.html +495 -0
  29. package/dist/examples/html-script/add-payment-info/example-add-payment-info-rules-card.html +469 -0
  30. package/dist/examples/html-script/add-payment-info/example-add-payment-info-security.html +489 -0
  31. package/dist/examples/html-script/add-to-cart/README.md +36 -0
  32. package/dist/examples/html-script/add-to-cart/example-add-to-cart-attribute.html +517 -0
  33. package/dist/examples/html-script/add-to-cart/example-add-to-cart-auto.html +512 -0
  34. package/dist/examples/html-script/add-to-cart/example-add-to-cart-click.html +519 -0
  35. package/dist/examples/html-script/add-to-cart/example-add-to-cart-dedupe.html +514 -0
  36. package/dist/examples/html-script/add-to-cart/example-add-to-cart-manual.html +517 -0
  37. package/dist/examples/html-script/add-to-cart/example-add-to-cart-order-bump.html +527 -0
  38. package/dist/examples/html-script/add-to-cart/example-add-to-cart-text.html +524 -0
  39. package/dist/examples/html-script/example-basic.html +350 -0
  40. package/dist/examples/html-script/example-behavior.html +435 -0
  41. package/dist/examples/html-script/example-conversion.html +479 -0
  42. package/dist/examples/html-script/example-integration.html +709 -0
  43. package/dist/examples/html-script/example-transport.html +748 -0
  44. package/dist/examples/html-script/initiate-checkout/README.md +38 -0
  45. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-attribute.html +485 -0
  46. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-auto.html +491 -0
  47. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-click.html +493 -0
  48. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-manual.html +494 -0
  49. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-snapshot.html +497 -0
  50. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-submit.html +502 -0
  51. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-text.html +496 -0
  52. package/dist/examples/html-script/lead/README.md +25 -0
  53. package/dist/examples/html-script/lead/example-lead-trigger-attribute.html +594 -0
  54. package/dist/examples/html-script/lead/example-lead-trigger-auto.html +431 -0
  55. package/dist/examples/html-script/lead/example-lead-trigger-click.html +587 -0
  56. package/dist/examples/html-script/release-candidate.html +726 -0
  57. package/dist/examples/html-script/remove-from-cart/README.md +36 -0
  58. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-attribute.html +532 -0
  59. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-css.html +524 -0
  60. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-dedupe.html +540 -0
  61. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-manual.html +533 -0
  62. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-multi.html +557 -0
  63. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-state.html +539 -0
  64. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-text.html +524 -0
  65. package/dist/examples/html-script/search/README.md +41 -0
  66. package/dist/examples/html-script/search/example-search-attribute.html +454 -0
  67. package/dist/examples/html-script/search/example-search-button-sync.html +455 -0
  68. package/dist/examples/html-script/search/example-search-dedupe.html +466 -0
  69. package/dist/examples/html-script/search/example-search-input.html +456 -0
  70. package/dist/examples/html-script/search/example-search-manual.html +473 -0
  71. package/dist/examples/html-script/search/example-search-submit.html +450 -0
  72. package/dist/examples/html-script/search/example-search-text.html +441 -0
  73. package/dist/examples/html-script/view-content/README.md +48 -0
  74. package/dist/examples/html-script/view-content/example-view-content-attribute.html +488 -0
  75. package/dist/examples/html-script/view-content/example-view-content-css.html +467 -0
  76. package/dist/examples/html-script/view-content/example-view-content-dedupe.html +485 -0
  77. package/dist/examples/html-script/view-content/example-view-content-empty.html +469 -0
  78. package/dist/examples/html-script/view-content/example-view-content-manual.html +496 -0
  79. package/dist/examples/html-script/view-content/example-view-content-product-card.html +478 -0
  80. package/dist/examples/html-script/view-content/example-view-content-text.html +473 -0
  81. package/dist/examples/release-candidate/README.md +14 -0
  82. package/dist/examples/v2/README.md +33 -0
  83. package/dist/index-DUfFzniE.d.mts +274 -0
  84. package/dist/index-DUfFzniE.d.ts +274 -0
  85. package/dist/index.cjs.js +3 -0
  86. package/dist/index.cjs.js.map +1 -0
  87. package/dist/index.d.mts +364 -0
  88. package/dist/index.d.ts +364 -0
  89. package/dist/index.esm.js +3 -0
  90. package/dist/index.esm.js.map +1 -0
  91. package/dist/logger/index.cjs.js +3 -0
  92. package/dist/logger/index.cjs.js.map +1 -0
  93. package/dist/logger/index.d.mts +12 -0
  94. package/dist/logger/index.d.ts +12 -0
  95. package/dist/logger/index.esm.js +3 -0
  96. package/dist/logger/index.esm.js.map +1 -0
  97. package/dist/pixel-CbeF25mD.d.mts +555 -0
  98. package/dist/pixel-CbeF25mD.d.ts +555 -0
  99. package/dist/pixel-default-config-1VgLFOiL.d.mts +5 -0
  100. package/dist/pixel-default-config-Bxb-Vdd8.d.ts +5 -0
  101. package/dist/runtime/index.cjs.js +3 -0
  102. package/dist/runtime/index.cjs.js.map +1 -0
  103. package/dist/runtime/index.d.mts +48 -0
  104. package/dist/runtime/index.d.ts +48 -0
  105. package/dist/runtime/index.esm.js +3 -0
  106. package/dist/runtime/index.esm.js.map +1 -0
  107. package/dist/services/index.cjs.js +3 -0
  108. package/dist/services/index.cjs.js.map +1 -0
  109. package/dist/services/index.d.mts +169 -0
  110. package/dist/services/index.d.ts +169 -0
  111. package/dist/services/index.esm.js +3 -0
  112. package/dist/services/index.esm.js.map +1 -0
  113. package/dist/types-CTpRvFKZ.d.ts +71 -0
  114. package/dist/types-DGlBdsAy.d.mts +71 -0
  115. package/dist/v2/global.global.js +3 -0
  116. package/dist/v2/global.global.js.map +1 -0
  117. package/dist/v2/index.cjs.js +3 -0
  118. package/dist/v2/index.cjs.js.map +1 -0
  119. package/dist/v2/index.d.mts +7 -0
  120. package/dist/v2/index.d.ts +7 -0
  121. package/dist/v2/index.esm.js +3 -0
  122. package/dist/v2/index.esm.js.map +1 -0
  123. package/package.json +101 -0
@@ -0,0 +1,169 @@
1
+ import { a as StorageService, D as DispatcherService, S as StorageAdapter, F as FingerprintService, b as SessionService, c as SessionData, E as EnsureSessionResult, V as VisitorService } from '../types-DGlBdsAy.mjs';
2
+ export { P as PixelRuntimeServices } from '../types-DGlBdsAy.mjs';
3
+ import { A as AttributionService, b as AttributionConfig, c as AttributionIdentifiers, B as BrowserMetadataService, d as BrowserMetadata, P as PixelEvent } from '../index-DUfFzniE.mjs';
4
+ export { h as ATTRIBUTION_STORAGE_KEY, e as BasePixelEvent, D as DEFAULT_ATTRIBUTION_CONFIG, f as PageViewEvent, g as SessionExpiredEvent, S as SessionRenewedEvent } from '../index-DUfFzniE.mjs';
5
+ import { P as PixelConfig } from '../pixel-CbeF25mD.mjs';
6
+ export { S as StoragePersistence, c as createStorageAdapter, r as resolveStorageAdapterName } from '../StorageFactory-BhpbB6Jj.mjs';
7
+
8
+ declare class AttributionServiceImpl implements AttributionService {
9
+ private readonly store;
10
+ private readonly collector;
11
+ private readonly enabled;
12
+ private snapshot;
13
+ private active;
14
+ constructor(storage: StorageService, config?: AttributionConfig);
15
+ init(): void;
16
+ destroy(): void;
17
+ collect(): AttributionIdentifiers;
18
+ getSnapshot(): AttributionIdentifiers;
19
+ update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers;
20
+ clear(): void;
21
+ }
22
+
23
+ /**
24
+ * Collects attribution signals from URL + cookies and merges them.
25
+ */
26
+ declare class AttributionCollector {
27
+ private readonly clickIdParser;
28
+ private readonly cookieCollector;
29
+ private readonly customParams;
30
+ private readonly captureUrlParams;
31
+ private readonly captureCookies;
32
+ constructor(options?: {
33
+ customParams?: readonly string[];
34
+ captureUrlParams?: boolean;
35
+ captureCookies?: boolean;
36
+ });
37
+ collectFresh(): Partial<AttributionIdentifiers>;
38
+ /**
39
+ * Merge: never overwrite existing defined values with undefined.
40
+ */
41
+ merge(existing: AttributionIdentifiers, incoming: Partial<AttributionIdentifiers>): AttributionIdentifiers;
42
+ }
43
+
44
+ /**
45
+ * Persists AttributionIdentifiers via StorageService only (no direct localStorage).
46
+ */
47
+ declare class AttributionStore {
48
+ private readonly storage;
49
+ private readonly persist;
50
+ private readonly ttlMs;
51
+ private readonly storageKey;
52
+ constructor(storage: StorageService, options: {
53
+ persist: boolean;
54
+ ttlDays: number;
55
+ storageKey?: string;
56
+ });
57
+ load(): AttributionIdentifiers | null;
58
+ save(snapshot: AttributionIdentifiers): void;
59
+ clear(): void;
60
+ private isExpired;
61
+ }
62
+
63
+ /**
64
+ * Parses click IDs from URL search params and maps to AttributionIdentifiers fields.
65
+ */
66
+ declare class ClickIdParser {
67
+ parse(customParams?: readonly string[]): Partial<AttributionIdentifiers>;
68
+ /**
69
+ * Meta convention: when fbclid is present and _fbc cookie is missing,
70
+ * synthesize fbc = fb.1.<timestamp_ms>.<fbclid>
71
+ */
72
+ synthesizeFbc(fbclid: string, existingFbc?: string): string | undefined;
73
+ }
74
+
75
+ /**
76
+ * SSR-safe cookie reader for attribution identifiers.
77
+ */
78
+ declare class CookieCollector {
79
+ collectKnown(): Readonly<Record<string, string>>;
80
+ private parseCookies;
81
+ }
82
+
83
+ declare class BrowserMetadataServiceImpl implements BrowserMetadataService {
84
+ getMetadata(): BrowserMetadata;
85
+ }
86
+
87
+ declare class DispatcherServiceImpl implements DispatcherService {
88
+ private readonly listeners;
89
+ private lastEvent;
90
+ dispatch(event: PixelEvent): void;
91
+ subscribe(listener: (event: PixelEvent) => void): () => void;
92
+ clear(): void;
93
+ getListenerCount(): number;
94
+ getLastEvent(): PixelEvent | null;
95
+ }
96
+
97
+ declare class BrowserStorageAdapter implements StorageAdapter {
98
+ private readonly storage;
99
+ private readonly memoryFallback;
100
+ constructor(storage: Storage);
101
+ get(key: string): string | null;
102
+ set(key: string, value: string): void;
103
+ remove(key: string): void;
104
+ clear(): void;
105
+ removeKeysMatching(predicate: (key: string) => boolean): void;
106
+ }
107
+
108
+ declare class MemoryStorageAdapter implements StorageAdapter {
109
+ private readonly store;
110
+ get(key: string): string | null;
111
+ set(key: string, value: string): void;
112
+ remove(key: string): void;
113
+ clear(): void;
114
+ removeKeysMatching(predicate: (key: string) => boolean): void;
115
+ }
116
+
117
+ declare class StorageServiceImpl implements StorageService {
118
+ private readonly adapter;
119
+ private readonly namespace;
120
+ private readonly prefix?;
121
+ constructor(adapter: StorageAdapter, namespace: string, prefix?: string);
122
+ get<T>(key: string): T | null;
123
+ set<T>(key: string, value: T): void;
124
+ remove(key: string): void;
125
+ has(key: string): boolean;
126
+ clear(): void;
127
+ createKey(key: string): string;
128
+ private getNamespaceKeyPrefix;
129
+ }
130
+
131
+ declare class FingerprintServiceImpl implements FingerprintService {
132
+ private readonly storage;
133
+ private readonly storageKey;
134
+ private readonly metadataService;
135
+ constructor(storage: StorageService, config: PixelConfig, metadataService: BrowserMetadataService);
136
+ getFingerprint(): string | null;
137
+ ensureFingerprint(): string;
138
+ }
139
+
140
+ declare class SessionServiceImpl implements SessionService {
141
+ private readonly storage;
142
+ private readonly storageKey;
143
+ constructor(storage: StorageService, config: PixelConfig);
144
+ getSessionId(): string | null;
145
+ getSessionData(): SessionData | null;
146
+ getLastActivityAt(): number | null;
147
+ isExpired(ttlMs: number): boolean;
148
+ ensureSession(ttlMs: number): EnsureSessionResult;
149
+ ensureSessionId(): string;
150
+ touchActivity(): void;
151
+ renew(): string;
152
+ clear(): void;
153
+ private writeSessionData;
154
+ }
155
+
156
+ declare class VisitorServiceImpl implements VisitorService {
157
+ private readonly storage;
158
+ private readonly storageKey;
159
+ constructor(storage: StorageService, config: PixelConfig);
160
+ getVisitorId(): string | null;
161
+ ensureVisitorId(): string;
162
+ clearVisitorId(): void;
163
+ }
164
+
165
+ declare function generateVisitorId(): string;
166
+
167
+ declare function generateSessionId(): string;
168
+
169
+ export { AttributionCollector, AttributionConfig, AttributionIdentifiers, AttributionService, AttributionServiceImpl, AttributionStore, BrowserMetadata, BrowserMetadataService, BrowserMetadataServiceImpl, BrowserStorageAdapter, ClickIdParser, CookieCollector, DispatcherService, DispatcherServiceImpl, FingerprintService, FingerprintServiceImpl, MemoryStorageAdapter, PixelEvent, SessionService, SessionServiceImpl, StorageAdapter, StorageService, StorageServiceImpl, VisitorService, VisitorServiceImpl, generateSessionId, generateVisitorId };
@@ -0,0 +1,169 @@
1
+ import { a as StorageService, D as DispatcherService, S as StorageAdapter, F as FingerprintService, b as SessionService, c as SessionData, E as EnsureSessionResult, V as VisitorService } from '../types-CTpRvFKZ.js';
2
+ export { P as PixelRuntimeServices } from '../types-CTpRvFKZ.js';
3
+ import { A as AttributionService, b as AttributionConfig, c as AttributionIdentifiers, B as BrowserMetadataService, d as BrowserMetadata, P as PixelEvent } from '../index-DUfFzniE.js';
4
+ export { h as ATTRIBUTION_STORAGE_KEY, e as BasePixelEvent, D as DEFAULT_ATTRIBUTION_CONFIG, f as PageViewEvent, g as SessionExpiredEvent, S as SessionRenewedEvent } from '../index-DUfFzniE.js';
5
+ import { P as PixelConfig } from '../pixel-CbeF25mD.js';
6
+ export { S as StoragePersistence, c as createStorageAdapter, r as resolveStorageAdapterName } from '../StorageFactory-CAkJJqVD.js';
7
+
8
+ declare class AttributionServiceImpl implements AttributionService {
9
+ private readonly store;
10
+ private readonly collector;
11
+ private readonly enabled;
12
+ private snapshot;
13
+ private active;
14
+ constructor(storage: StorageService, config?: AttributionConfig);
15
+ init(): void;
16
+ destroy(): void;
17
+ collect(): AttributionIdentifiers;
18
+ getSnapshot(): AttributionIdentifiers;
19
+ update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers;
20
+ clear(): void;
21
+ }
22
+
23
+ /**
24
+ * Collects attribution signals from URL + cookies and merges them.
25
+ */
26
+ declare class AttributionCollector {
27
+ private readonly clickIdParser;
28
+ private readonly cookieCollector;
29
+ private readonly customParams;
30
+ private readonly captureUrlParams;
31
+ private readonly captureCookies;
32
+ constructor(options?: {
33
+ customParams?: readonly string[];
34
+ captureUrlParams?: boolean;
35
+ captureCookies?: boolean;
36
+ });
37
+ collectFresh(): Partial<AttributionIdentifiers>;
38
+ /**
39
+ * Merge: never overwrite existing defined values with undefined.
40
+ */
41
+ merge(existing: AttributionIdentifiers, incoming: Partial<AttributionIdentifiers>): AttributionIdentifiers;
42
+ }
43
+
44
+ /**
45
+ * Persists AttributionIdentifiers via StorageService only (no direct localStorage).
46
+ */
47
+ declare class AttributionStore {
48
+ private readonly storage;
49
+ private readonly persist;
50
+ private readonly ttlMs;
51
+ private readonly storageKey;
52
+ constructor(storage: StorageService, options: {
53
+ persist: boolean;
54
+ ttlDays: number;
55
+ storageKey?: string;
56
+ });
57
+ load(): AttributionIdentifiers | null;
58
+ save(snapshot: AttributionIdentifiers): void;
59
+ clear(): void;
60
+ private isExpired;
61
+ }
62
+
63
+ /**
64
+ * Parses click IDs from URL search params and maps to AttributionIdentifiers fields.
65
+ */
66
+ declare class ClickIdParser {
67
+ parse(customParams?: readonly string[]): Partial<AttributionIdentifiers>;
68
+ /**
69
+ * Meta convention: when fbclid is present and _fbc cookie is missing,
70
+ * synthesize fbc = fb.1.<timestamp_ms>.<fbclid>
71
+ */
72
+ synthesizeFbc(fbclid: string, existingFbc?: string): string | undefined;
73
+ }
74
+
75
+ /**
76
+ * SSR-safe cookie reader for attribution identifiers.
77
+ */
78
+ declare class CookieCollector {
79
+ collectKnown(): Readonly<Record<string, string>>;
80
+ private parseCookies;
81
+ }
82
+
83
+ declare class BrowserMetadataServiceImpl implements BrowserMetadataService {
84
+ getMetadata(): BrowserMetadata;
85
+ }
86
+
87
+ declare class DispatcherServiceImpl implements DispatcherService {
88
+ private readonly listeners;
89
+ private lastEvent;
90
+ dispatch(event: PixelEvent): void;
91
+ subscribe(listener: (event: PixelEvent) => void): () => void;
92
+ clear(): void;
93
+ getListenerCount(): number;
94
+ getLastEvent(): PixelEvent | null;
95
+ }
96
+
97
+ declare class BrowserStorageAdapter implements StorageAdapter {
98
+ private readonly storage;
99
+ private readonly memoryFallback;
100
+ constructor(storage: Storage);
101
+ get(key: string): string | null;
102
+ set(key: string, value: string): void;
103
+ remove(key: string): void;
104
+ clear(): void;
105
+ removeKeysMatching(predicate: (key: string) => boolean): void;
106
+ }
107
+
108
+ declare class MemoryStorageAdapter implements StorageAdapter {
109
+ private readonly store;
110
+ get(key: string): string | null;
111
+ set(key: string, value: string): void;
112
+ remove(key: string): void;
113
+ clear(): void;
114
+ removeKeysMatching(predicate: (key: string) => boolean): void;
115
+ }
116
+
117
+ declare class StorageServiceImpl implements StorageService {
118
+ private readonly adapter;
119
+ private readonly namespace;
120
+ private readonly prefix?;
121
+ constructor(adapter: StorageAdapter, namespace: string, prefix?: string);
122
+ get<T>(key: string): T | null;
123
+ set<T>(key: string, value: T): void;
124
+ remove(key: string): void;
125
+ has(key: string): boolean;
126
+ clear(): void;
127
+ createKey(key: string): string;
128
+ private getNamespaceKeyPrefix;
129
+ }
130
+
131
+ declare class FingerprintServiceImpl implements FingerprintService {
132
+ private readonly storage;
133
+ private readonly storageKey;
134
+ private readonly metadataService;
135
+ constructor(storage: StorageService, config: PixelConfig, metadataService: BrowserMetadataService);
136
+ getFingerprint(): string | null;
137
+ ensureFingerprint(): string;
138
+ }
139
+
140
+ declare class SessionServiceImpl implements SessionService {
141
+ private readonly storage;
142
+ private readonly storageKey;
143
+ constructor(storage: StorageService, config: PixelConfig);
144
+ getSessionId(): string | null;
145
+ getSessionData(): SessionData | null;
146
+ getLastActivityAt(): number | null;
147
+ isExpired(ttlMs: number): boolean;
148
+ ensureSession(ttlMs: number): EnsureSessionResult;
149
+ ensureSessionId(): string;
150
+ touchActivity(): void;
151
+ renew(): string;
152
+ clear(): void;
153
+ private writeSessionData;
154
+ }
155
+
156
+ declare class VisitorServiceImpl implements VisitorService {
157
+ private readonly storage;
158
+ private readonly storageKey;
159
+ constructor(storage: StorageService, config: PixelConfig);
160
+ getVisitorId(): string | null;
161
+ ensureVisitorId(): string;
162
+ clearVisitorId(): void;
163
+ }
164
+
165
+ declare function generateVisitorId(): string;
166
+
167
+ declare function generateSessionId(): string;
168
+
169
+ export { AttributionCollector, AttributionConfig, AttributionIdentifiers, AttributionService, AttributionServiceImpl, AttributionStore, BrowserMetadata, BrowserMetadataService, BrowserMetadataServiceImpl, BrowserStorageAdapter, ClickIdParser, CookieCollector, DispatcherService, DispatcherServiceImpl, FingerprintService, FingerprintServiceImpl, MemoryStorageAdapter, PixelEvent, SessionService, SessionServiceImpl, StorageAdapter, StorageService, StorageServiceImpl, VisitorService, VisitorServiceImpl, generateSessionId, generateVisitorId };
@@ -0,0 +1,3 @@
1
+ /* Pixel v2 — SDK de analytics e conversão */
2
+ var h=class{constructor(){this.listeners=new Set;this.lastEvent=null}dispatch(e){this.lastEvent=e;for(let t of this.listeners)t(e)}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}clear(){this.listeners.clear(),this.lastEvent=null}getListenerCount(){return this.listeners.size}getLastEvent(){return this.lastEvent}};var v=class{getMetadata(){if(typeof window>"u")return{};let e=(()=>{try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}})();return{url:location.href,path:location.pathname,hostname:location.hostname,origin:location.origin,title:typeof document<"u"?document.title:void 0,referrer:typeof document<"u"?document.referrer:void 0,language:navigator.language,timezone:e,userAgent:navigator.userAgent,platform:navigator.platform,screenWidth:screen.width,screenHeight:screen.height,colorDepth:screen.colorDepth}}};var w="fingerprint";function k(s){let e=0;for(let i=0;i<s.length;i++)e=(e<<5)-e+s.charCodeAt(i),e|=0;let t=Math.abs(e).toString(16).padStart(8,"0"),r=0;for(let i=s.length-1;i>=0;i--)r=(r<<5)-r+s.charCodeAt(i),r|=0;return`fp_${t}${Math.abs(r).toString(16).padStart(8,"0")}`}function C(s){let e=s.getMetadata(),t=[e.userAgent??"",e.language??"",e.platform??"",String(e.screenWidth??""),String(e.screenHeight??""),String(e.colorDepth??""),e.timezone??""];return k(t.join("|"))}var S=class{constructor(e,t,r){this.storage=e,this.storageKey=t.storage.keys?.fingerprint??w,this.metadataService=r}getFingerprint(){return this.storage.get(this.storageKey)}ensureFingerprint(){let e=this.getFingerprint();if(e)return e;let t=C(this.metadataService);return this.storage.set(this.storageKey,t),t}};function P(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID().replace(/-/g,""):`${Date.now()}${Math.random().toString(36).slice(2)}`}function u(){return`ses_${P()}`}var D="session",A=class{constructor(e,t){this.storage=e,this.storageKey=t.storage.keys?.session??D}getSessionId(){return this.getSessionData()?.sessionId??null}getSessionData(){let e=this.storage.get(this.storageKey);if(!e)return null;if(typeof e=="string"){let t=Date.now();return{sessionId:e,lastActivityAt:t,createdAt:t}}return e}getLastActivityAt(){return this.getSessionData()?.lastActivityAt??null}isExpired(e){let t=this.getSessionData();return t?Date.now()-t.lastActivityAt>e:!0}ensureSession(e){let t=this.getSessionData(),r=Date.now();if(!t){let i=u();return this.writeSessionData({sessionId:i,lastActivityAt:r,createdAt:r}),{sessionId:i,expired:!1,created:!0}}if(r-t.lastActivityAt>e){let i=t.sessionId,o=u();return this.writeSessionData({sessionId:o,lastActivityAt:r,createdAt:r}),{sessionId:o,expired:!0,previousSessionId:i,created:!1}}return{sessionId:t.sessionId,expired:!1,created:!1}}ensureSessionId(){return this.ensureSession(Number.MAX_SAFE_INTEGER).sessionId}touchActivity(){let e=this.getSessionData();e&&this.writeSessionData({...e,lastActivityAt:Date.now()})}renew(){let e=Date.now(),t=u();return this.writeSessionData({sessionId:t,lastActivityAt:e,createdAt:e}),t}clear(){this.storage.remove(this.storageKey)}writeSessionData(e){this.storage.set(this.storageKey,e)}};var c=class{constructor(e){this.memoryFallback=new Map;this.storage=typeof window>"u"?null:e}get(e){return this.storage?this.storage.getItem(e):this.memoryFallback.get(e)??null}set(e,t){if(this.storage){this.storage.setItem(e,t);return}this.memoryFallback.set(e,t)}remove(e){if(this.storage){this.storage.removeItem(e);return}this.memoryFallback.delete(e)}clear(){this.storage||this.memoryFallback.clear()}removeKeysMatching(e){if(this.storage){let t=[];for(let r=0;r<this.storage.length;r++){let i=this.storage.key(r);i&&e(i)&&t.push(i)}for(let r of t)this.storage.removeItem(r);return}for(let t of this.memoryFallback.keys())e(t)&&this.memoryFallback.delete(t)}};var a=class{constructor(){this.store=new Map}get(e){return this.store.get(e)??null}set(e,t){this.store.set(e,t)}remove(e){this.store.delete(e)}clear(){this.store.clear()}removeKeysMatching(e){for(let t of this.store.keys())e(t)&&this.store.delete(t)}};function E(s){return"removeKeysMatching"in s&&typeof s.removeKeysMatching=="function"}var b=class{constructor(e,t,r){this.adapter=e,this.namespace=t,this.prefix=r}get(e){let t=this.adapter.get(this.createKey(e));if(t===null)return null;try{return JSON.parse(t)}catch{return null}}set(e,t){this.adapter.set(this.createKey(e),JSON.stringify(t))}remove(e){this.adapter.remove(this.createKey(e))}has(e){return this.adapter.get(this.createKey(e))!==null}clear(){let e=this.getNamespaceKeyPrefix();if(E(this.adapter)){this.adapter.removeKeysMatching(t=>t.startsWith(e));return}this.adapter.clear()}createKey(e){return this.prefix?`${this.prefix}:${this.namespace}:${e}`:`${this.namespace}:${e}`}getNamespaceKeyPrefix(){return this.prefix?`${this.prefix}:${this.namespace}:`:`${this.namespace}:`}};function K(s){let e=s??"memory";if(typeof window>"u")return new a;switch(e){case"memory":return new a;case"localStorage":return new c(window.localStorage);case"sessionStorage":return new c(window.sessionStorage);case"cookie_localStorage":return new c(window.localStorage);case"cookie":return new a;case"indexedDB":return new a;default:return new a}}function T(s){switch(s??"memory"){case"localStorage":case"sessionStorage":case"cookie_localStorage":return"BrowserStorageAdapter";default:return"MemoryStorageAdapter"}}function _(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID().replace(/-/g,""):`${Date.now()}${Math.random().toString(36).slice(2)}`}function I(){return`vst_${_()}`}var R="visitor",x=class{constructor(e,t){this.storage=e,this.storageKey=t.storage.keys?.visitor??R}getVisitorId(){return this.storage.get(this.storageKey)}ensureVisitorId(){let e=this.getVisitorId();if(e)return e;let t=I();return this.storage.set(this.storageKey,t),t}clearVisitorId(){this.storage.remove(this.storageKey)}};var f={enabled:!0,ttlDays:90,persist:!0,captureUrlParams:!0,captureCookies:!0,customClickIdParams:[]},m="attribution";var U=["fbclid","gclid","gbraid","wbraid","ttclid","msclkid","epik","li_fat_id"],l=class{parse(e=[]){if(typeof window>"u"||!window.location?.search)return{};try{let t=new URLSearchParams(window.location.search),r={},i={};for(let o of U){let n=t.get(o);n&&(o==="li_fat_id"?r.liFatId=n:r[o]=n)}for(let o of e){let n=t.get(o);n&&(i[o]=n)}return Object.keys(i).length>0&&(r.customClickIds=i),r}catch{return{}}}synthesizeFbc(e,t){if(t)return t;if(e)return`fb.1.${Date.now()}.${e}`}};var d=class{collectKnown(){if(typeof document>"u")return{};let e=this.parseCookies(),t={},r={_fbp:"fbp",_fbc:"fbc",_ga:"ga",_gid:"gid",_gcl_au:"gclAu",_ttp:"ttp",li_fat_id:"liFatId",epik:"epik"};for(let[i,o]of Object.entries(r)){let n=e[i];n&&(t[o]=n)}return t}parseCookies(){if(typeof document>"u")return{};try{return document.cookie.split(";").reduce((e,t)=>{let[r,...i]=t.trim().split("=");return r&&(e[r]=decodeURIComponent(i.join("=")||"")),e},{})}catch{return{}}}};var p=class{constructor(e={}){this.clickIdParser=new l;this.cookieCollector=new d;this.customParams=e.customParams??[],this.captureUrlParams=e.captureUrlParams!==!1,this.captureCookies=e.captureCookies!==!1}collectFresh(){let e=this.captureUrlParams?this.clickIdParser.parse(this.customParams):{},t=this.captureCookies?this.cookieCollector.collectKnown():{},r={...t,...e},i={...t.customClickIds??{},...e.customClickIds??{}};if(Object.keys(i).length>0&&(r.customClickIds=i),typeof r.fbclid=="string"&&r.fbclid){let o=this.clickIdParser.synthesizeFbc(r.fbclid,typeof r.fbc=="string"?r.fbc:void 0);o&&(r.fbc=o)}if(typeof window<"u")try{r.landingUrl=window.location.href}catch{}if(typeof document<"u")try{document.referrer&&(r.referrer=document.referrer)}catch{}return r}merge(e,t){let r={...e};for(let[o,n]of Object.entries(t))if(!(n==null||n==="")){if(o==="customClickIds"&&typeof n=="object"){r.customClickIds={...e.customClickIds??{},...n};continue}r[o]=n}let i=Date.now();return e.firstCollectedAt||(r.firstCollectedAt=i),r.lastCollectedAt=i,r}};var g=class{constructor(e,t){this.storage=e,this.persist=t.persist,this.ttlMs=t.ttlDays*24*60*60*1e3,this.storageKey=t.storageKey??m}load(){if(!this.persist)return null;try{let e=this.storage.get(this.storageKey);return e?this.isExpired(e)?(this.clear(),null):e:null}catch{return null}}save(e){if(this.persist)try{this.storage.set(this.storageKey,e)}catch{}}clear(){try{this.storage.remove(this.storageKey)}catch{}}isExpired(e){let t=e.lastCollectedAt??e.firstCollectedAt;return t?Date.now()-t>this.ttlMs:!1}};var y=class{constructor(e,t=f){this.snapshot={};this.active=!1;this.enabled=t.enabled!==!1,this.store=new g(e,{persist:t.persist!==!1,ttlDays:t.ttlDays??90}),this.collector=new p({customParams:t.customClickIdParams??[],captureUrlParams:t.captureUrlParams!==!1,captureCookies:t.captureCookies!==!1})}init(){if(this.active||(this.active=!0,!this.enabled))return;let e=this.store.load();e&&(this.snapshot=e),this.collect()}destroy(){this.active&&(this.active=!1)}collect(){if(!this.enabled)return this.snapshot;let e=this.collector.collectFresh();return this.snapshot=this.collector.merge(this.snapshot,e),this.store.save(this.snapshot),this.snapshot}getSnapshot(){return{...this.snapshot}}update(e){return this.snapshot=this.collector.merge(this.snapshot,e),this.store.save(this.snapshot),this.getSnapshot()}clear(){this.snapshot={},this.store.clear()}};export{m as ATTRIBUTION_STORAGE_KEY,p as AttributionCollector,y as AttributionServiceImpl,g as AttributionStore,v as BrowserMetadataServiceImpl,c as BrowserStorageAdapter,l as ClickIdParser,d as CookieCollector,f as DEFAULT_ATTRIBUTION_CONFIG,h as DispatcherServiceImpl,S as FingerprintServiceImpl,a as MemoryStorageAdapter,A as SessionServiceImpl,b as StorageServiceImpl,x as VisitorServiceImpl,K as createStorageAdapter,u as generateSessionId,I as generateVisitorId,T as resolveStorageAdapterName};
3
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/dispatcher/DispatcherService.ts","../../src/services/browser-metadata/BrowserMetadataService.ts","../../src/services/fingerprint/FingerprintService.ts","../../src/services/session/session-id.ts","../../src/services/session/SessionService.ts","../../src/services/storage/BrowserStorageAdapter.ts","../../src/services/storage/MemoryStorageAdapter.ts","../../src/services/storage/StorageService.ts","../../src/services/storage/StorageFactory.ts","../../src/services/visitor/visitor-id.ts","../../src/services/visitor/VisitorService.ts","../../src/services/attribution/types.ts","../../src/services/attribution/ClickIdParser.ts","../../src/services/attribution/CookieCollector.ts","../../src/services/attribution/AttributionCollector.ts","../../src/services/attribution/AttributionStore.ts","../../src/services/attribution/AttributionService.ts"],"sourcesContent":["import type { PixelEvent } from '@/events';\n\nimport type { DispatcherService } from './types';\n\ntype EventListener = (event: PixelEvent) => void;\n\nexport class DispatcherServiceImpl implements DispatcherService {\n private readonly listeners = new Set<EventListener>();\n\n private lastEvent: PixelEvent | null = null;\n\n dispatch(event: PixelEvent): void {\n this.lastEvent = event;\n\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n\n subscribe(listener: (event: PixelEvent) => void): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n clear(): void {\n this.listeners.clear();\n this.lastEvent = null;\n }\n\n getListenerCount(): number {\n return this.listeners.size;\n }\n\n getLastEvent(): PixelEvent | null {\n return this.lastEvent;\n }\n}\n","import type { BrowserMetadata, BrowserMetadataService } from './types';\n\nexport class BrowserMetadataServiceImpl implements BrowserMetadataService {\n getMetadata(): BrowserMetadata {\n if (typeof window === 'undefined') {\n return {};\n }\n\n const timezone = (() => {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return undefined;\n }\n })();\n\n return {\n url: location.href,\n path: location.pathname,\n hostname: location.hostname,\n origin: location.origin,\n title: typeof document !== 'undefined' ? document.title : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n language: navigator.language,\n timezone,\n userAgent: navigator.userAgent,\n platform: navigator.platform,\n screenWidth: screen.width,\n screenHeight: screen.height,\n colorDepth: screen.colorDepth,\n };\n }\n}\n","import type { PixelConfig } from '@/config';\nimport type { BrowserMetadataService } from '@/services/browser-metadata';\nimport type { StorageService } from '@/services/storage';\n\nimport type { FingerprintService } from './types';\n\nconst DEFAULT_FINGERPRINT_KEY = 'fingerprint';\n\nfunction hashFingerprintInput(input: string): string {\n let hash = 0;\n\n for (let index = 0; index < input.length; index++) {\n hash = (hash << 5) - hash + input.charCodeAt(index);\n hash |= 0;\n }\n\n const positiveHash = Math.abs(hash).toString(16).padStart(8, '0');\n let secondaryHash = 0;\n\n for (let index = input.length - 1; index >= 0; index--) {\n secondaryHash = (secondaryHash << 5) - secondaryHash + input.charCodeAt(index);\n secondaryHash |= 0;\n }\n\n return `fp_${positiveHash}${Math.abs(secondaryHash).toString(16).padStart(8, '0')}`;\n}\n\nfunction computeLightFingerprint(\n metadataService: BrowserMetadataService\n): string {\n const metadata = metadataService.getMetadata();\n\n const components = [\n metadata.userAgent ?? '',\n metadata.language ?? '',\n metadata.platform ?? '',\n String(metadata.screenWidth ?? ''),\n String(metadata.screenHeight ?? ''),\n String(metadata.colorDepth ?? ''),\n metadata.timezone ?? '',\n ];\n\n return hashFingerprintInput(components.join('|'));\n}\n\nexport class FingerprintServiceImpl implements FingerprintService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n private readonly metadataService: BrowserMetadataService;\n\n constructor(\n storage: StorageService,\n config: PixelConfig,\n metadataService: BrowserMetadataService\n ) {\n this.storage = storage;\n this.storageKey =\n config.storage.keys?.fingerprint ?? DEFAULT_FINGERPRINT_KEY;\n this.metadataService = metadataService;\n }\n\n getFingerprint(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureFingerprint(): string {\n const existing = this.getFingerprint();\n if (existing) return existing;\n\n const fingerprint = computeLightFingerprint(this.metadataService);\n this.storage.set(this.storageKey, fingerprint);\n return fingerprint;\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateSessionId(): string {\n return `ses_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { EnsureSessionResult, SessionData, SessionService } from './types';\nimport { generateSessionId } from './session-id';\n\nconst DEFAULT_SESSION_KEY = 'session';\n\nexport class SessionServiceImpl implements SessionService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.session ?? DEFAULT_SESSION_KEY;\n }\n\n getSessionId(): string | null {\n return this.getSessionData()?.sessionId ?? null;\n }\n\n getSessionData(): SessionData | null {\n const raw = this.storage.get<SessionData | string>(this.storageKey);\n if (!raw) return null;\n\n if (typeof raw === 'string') {\n const now = Date.now();\n return {\n sessionId: raw,\n lastActivityAt: now,\n createdAt: now,\n };\n }\n\n return raw;\n }\n\n getLastActivityAt(): number | null {\n return this.getSessionData()?.lastActivityAt ?? null;\n }\n\n isExpired(ttlMs: number): boolean {\n const data = this.getSessionData();\n if (!data) return true;\n\n return Date.now() - data.lastActivityAt > ttlMs;\n }\n\n ensureSession(ttlMs: number): EnsureSessionResult {\n const data = this.getSessionData();\n const now = Date.now();\n\n if (!data) {\n const sessionId = generateSessionId();\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: false,\n created: true,\n };\n }\n\n if (now - data.lastActivityAt > ttlMs) {\n const previousSessionId = data.sessionId;\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: true,\n previousSessionId,\n created: false,\n };\n }\n\n return {\n sessionId: data.sessionId,\n expired: false,\n created: false,\n };\n }\n\n ensureSessionId(): string {\n return this.ensureSession(Number.MAX_SAFE_INTEGER).sessionId;\n }\n\n touchActivity(): void {\n const data = this.getSessionData();\n if (!data) return;\n\n this.writeSessionData({\n ...data,\n lastActivityAt: Date.now(),\n });\n }\n\n renew(): string {\n const now = Date.now();\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return sessionId;\n }\n\n clear(): void {\n this.storage.remove(this.storageKey);\n }\n\n private writeSessionData(data: SessionData): void {\n this.storage.set(this.storageKey, data);\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class BrowserStorageAdapter implements StorageAdapter {\n private readonly storage: Storage | null;\n\n private readonly memoryFallback = new Map<string, string>();\n\n constructor(storage: Storage) {\n this.storage = typeof window === 'undefined' ? null : storage;\n }\n\n get(key: string): string | null {\n if (this.storage) {\n return this.storage.getItem(key);\n }\n\n return this.memoryFallback.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n if (this.storage) {\n this.storage.setItem(key, value);\n return;\n }\n\n this.memoryFallback.set(key, value);\n }\n\n remove(key: string): void {\n if (this.storage) {\n this.storage.removeItem(key);\n return;\n }\n\n this.memoryFallback.delete(key);\n }\n\n clear(): void {\n // Never clear entire browser storage — namespace removal uses removeKeysMatching.\n if (!this.storage) {\n this.memoryFallback.clear();\n }\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n if (this.storage) {\n const keysToRemove: string[] = [];\n\n for (let index = 0; index < this.storage.length; index++) {\n const key = this.storage.key(index);\n if (key && predicate(key)) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n this.storage.removeItem(key);\n }\n\n return;\n }\n\n for (const key of this.memoryFallback.keys()) {\n if (predicate(key)) {\n this.memoryFallback.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n for (const key of this.store.keys()) {\n if (predicate(key)) {\n this.store.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter, StorageService } from './types';\n\ntype NamespaceClearableAdapter = StorageAdapter & {\n removeKeysMatching(predicate: (key: string) => boolean): void;\n};\n\nfunction supportsNamespaceClear(\n adapter: StorageAdapter\n): adapter is NamespaceClearableAdapter {\n return (\n 'removeKeysMatching' in adapter &&\n typeof adapter.removeKeysMatching === 'function'\n );\n}\n\nexport class StorageServiceImpl implements StorageService {\n private readonly adapter: StorageAdapter;\n\n private readonly namespace: string;\n\n private readonly prefix?: string;\n\n constructor(adapter: StorageAdapter, namespace: string, prefix?: string) {\n this.adapter = adapter;\n this.namespace = namespace;\n this.prefix = prefix;\n }\n\n get<T>(key: string): T | null {\n const raw = this.adapter.get(this.createKey(key));\n if (raw === null) return null;\n\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n }\n\n set<T>(key: string, value: T): void {\n this.adapter.set(this.createKey(key), JSON.stringify(value));\n }\n\n remove(key: string): void {\n this.adapter.remove(this.createKey(key));\n }\n\n has(key: string): boolean {\n return this.adapter.get(this.createKey(key)) !== null;\n }\n\n clear(): void {\n const namespaceKeyPrefix = this.getNamespaceKeyPrefix();\n\n if (supportsNamespaceClear(this.adapter)) {\n this.adapter.removeKeysMatching(key =>\n key.startsWith(namespaceKeyPrefix)\n );\n return;\n }\n\n this.adapter.clear();\n }\n\n createKey(key: string): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:${key}`;\n }\n\n return `${this.namespace}:${key}`;\n }\n\n private getNamespaceKeyPrefix(): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:`;\n }\n\n return `${this.namespace}:`;\n }\n}\n","import type {\n AttributionStoragePersistence,\n QueueStoragePersistence,\n SessionStoragePersistence,\n VisitorStoragePersistence,\n} from '@/config/shared/persistence';\n\nimport { BrowserStorageAdapter } from './BrowserStorageAdapter';\nimport { MemoryStorageAdapter } from './MemoryStorageAdapter';\nimport type { StorageAdapter } from './types';\n\nexport type StoragePersistence =\n | VisitorStoragePersistence\n | SessionStoragePersistence\n | AttributionStoragePersistence\n | QueueStoragePersistence;\n\nexport function createStorageAdapter(\n persistence?: StoragePersistence\n): StorageAdapter {\n const mode = persistence ?? 'memory';\n\n if (typeof window === 'undefined') {\n return new MemoryStorageAdapter();\n }\n\n switch (mode) {\n case 'memory':\n return new MemoryStorageAdapter();\n case 'localStorage':\n return new BrowserStorageAdapter(window.localStorage);\n case 'sessionStorage':\n return new BrowserStorageAdapter(window.sessionStorage);\n case 'cookie_localStorage':\n // TODO: implementar cookie fallback.\n return new BrowserStorageAdapter(window.localStorage);\n case 'cookie':\n return new MemoryStorageAdapter();\n case 'indexedDB':\n return new MemoryStorageAdapter();\n default:\n return new MemoryStorageAdapter();\n }\n}\n\nexport function resolveStorageAdapterName(\n persistence?: StoragePersistence\n): string {\n const mode = persistence ?? 'memory';\n\n switch (mode) {\n case 'localStorage':\n case 'sessionStorage':\n case 'cookie_localStorage':\n return 'BrowserStorageAdapter';\n default:\n return 'MemoryStorageAdapter';\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateVisitorId(): string {\n return `vst_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { VisitorService } from './types';\nimport { generateVisitorId } from './visitor-id';\n\nconst DEFAULT_VISITOR_KEY = 'visitor';\n\nexport class VisitorServiceImpl implements VisitorService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.visitor ?? DEFAULT_VISITOR_KEY;\n }\n\n getVisitorId(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureVisitorId(): string {\n const existing = this.getVisitorId();\n if (existing) return existing;\n\n const visitorId = generateVisitorId();\n this.storage.set(this.storageKey, visitorId);\n return visitorId;\n }\n\n clearVisitorId(): void {\n this.storage.remove(this.storageKey);\n }\n}\n","export type AttributionIdentifiers = {\n readonly fbclid?: string;\n readonly fbp?: string;\n readonly fbc?: string;\n\n readonly gclid?: string;\n readonly gbraid?: string;\n readonly wbraid?: string;\n readonly ga?: string;\n readonly gid?: string;\n readonly gclAu?: string;\n\n readonly ttclid?: string;\n readonly ttp?: string;\n\n readonly msclkid?: string;\n readonly liFatId?: string;\n readonly epik?: string;\n\n readonly customClickIds?: Readonly<Record<string, string>>;\n\n readonly firstCollectedAt?: number;\n readonly lastCollectedAt?: number;\n readonly landingUrl?: string;\n readonly referrer?: string;\n};\n\nexport type AttributionConfig = {\n readonly enabled: boolean;\n readonly ttlDays?: number;\n readonly persist?: boolean;\n readonly captureUrlParams?: boolean;\n readonly captureCookies?: boolean;\n readonly customClickIdParams?: string[];\n};\n\nexport const DEFAULT_ATTRIBUTION_CONFIG: AttributionConfig = {\n enabled: true,\n ttlDays: 90,\n persist: true,\n captureUrlParams: true,\n captureCookies: true,\n customClickIdParams: [],\n};\n\nexport const ATTRIBUTION_STORAGE_KEY = 'attribution';\n\nexport interface AttributionService {\n init(): void;\n destroy(): void;\n collect(): AttributionIdentifiers;\n getSnapshot(): AttributionIdentifiers;\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers;\n clear(): void;\n}\n","import type { AttributionIdentifiers } from './types';\n\nconst BUILTIN_CLICK_PARAMS = [\n 'fbclid',\n 'gclid',\n 'gbraid',\n 'wbraid',\n 'ttclid',\n 'msclkid',\n 'epik',\n 'li_fat_id',\n] as const;\n\n/**\n * Parses click IDs from URL search params and maps to AttributionIdentifiers fields.\n */\nexport class ClickIdParser {\n parse(\n customParams: readonly string[] = []\n ): Partial<AttributionIdentifiers> {\n if (typeof window === 'undefined' || !window.location?.search) {\n return {};\n }\n\n try {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, unknown> = {};\n const customClickIds: Record<string, string> = {};\n\n for (const key of BUILTIN_CLICK_PARAMS) {\n const value = params.get(key);\n if (!value) continue;\n\n if (key === 'li_fat_id') {\n result.liFatId = value;\n } else {\n result[key] = value;\n }\n }\n\n for (const key of customParams) {\n const value = params.get(key);\n if (value) customClickIds[key] = value;\n }\n\n if (Object.keys(customClickIds).length > 0) {\n result.customClickIds = customClickIds;\n }\n\n return result as Partial<AttributionIdentifiers>;\n } catch {\n return {};\n }\n }\n\n /**\n * Meta convention: when fbclid is present and _fbc cookie is missing,\n * synthesize fbc = fb.1.<timestamp_ms>.<fbclid>\n */\n synthesizeFbc(fbclid: string, existingFbc?: string): string | undefined {\n if (existingFbc) return existingFbc;\n if (!fbclid) return undefined;\n return `fb.1.${Date.now()}.${fbclid}`;\n }\n}\n","/**\n * SSR-safe cookie reader for attribution identifiers.\n */\nexport class CookieCollector {\n collectKnown(): Readonly<Record<string, string>> {\n if (typeof document === 'undefined') return {};\n\n const cookies = this.parseCookies();\n const result: Record<string, string> = {};\n\n const map: Record<string, string> = {\n _fbp: 'fbp',\n _fbc: 'fbc',\n _ga: 'ga',\n _gid: 'gid',\n _gcl_au: 'gclAu',\n _ttp: 'ttp',\n li_fat_id: 'liFatId',\n epik: 'epik',\n };\n\n for (const [cookieName, field] of Object.entries(map)) {\n const value = cookies[cookieName];\n if (value) result[field] = value;\n }\n\n return result;\n }\n\n private parseCookies(): Record<string, string> {\n if (typeof document === 'undefined') return {};\n\n try {\n return document.cookie.split(';').reduce(\n (acc, part) => {\n const [rawKey, ...rest] = part.trim().split('=');\n if (!rawKey) return acc;\n acc[rawKey] = decodeURIComponent(rest.join('=') || '');\n return acc;\n },\n {} as Record<string, string>\n );\n } catch {\n return {};\n }\n }\n}\n","import type { AttributionIdentifiers } from './types';\nimport { ClickIdParser } from './ClickIdParser';\nimport { CookieCollector } from './CookieCollector';\n\n/**\n * Collects attribution signals from URL + cookies and merges them.\n */\nexport class AttributionCollector {\n private readonly clickIdParser = new ClickIdParser();\n\n private readonly cookieCollector = new CookieCollector();\n\n private readonly customParams: readonly string[];\n\n private readonly captureUrlParams: boolean;\n\n private readonly captureCookies: boolean;\n\n constructor(\n options: {\n customParams?: readonly string[];\n captureUrlParams?: boolean;\n captureCookies?: boolean;\n } = {}\n ) {\n this.customParams = options.customParams ?? [];\n this.captureUrlParams = options.captureUrlParams !== false;\n this.captureCookies = options.captureCookies !== false;\n }\n\n collectFresh(): Partial<AttributionIdentifiers> {\n const fromUrl = this.captureUrlParams\n ? this.clickIdParser.parse(this.customParams)\n : {};\n const fromCookies = this.captureCookies\n ? this.cookieCollector.collectKnown()\n : {};\n\n const merged: Record<string, unknown> = {\n ...fromCookies,\n ...fromUrl,\n };\n\n const customClickIds = {\n ...((fromCookies as AttributionIdentifiers).customClickIds ?? {}),\n ...(fromUrl.customClickIds ?? {}),\n };\n if (Object.keys(customClickIds).length > 0) {\n merged.customClickIds = customClickIds;\n }\n\n if (typeof merged.fbclid === 'string' && merged.fbclid) {\n const fbc = this.clickIdParser.synthesizeFbc(\n merged.fbclid,\n typeof merged.fbc === 'string' ? merged.fbc : undefined\n );\n if (fbc) merged.fbc = fbc;\n }\n\n if (typeof window !== 'undefined') {\n try {\n merged.landingUrl = window.location.href;\n } catch {\n // ignore\n }\n }\n\n if (typeof document !== 'undefined') {\n try {\n if (document.referrer) merged.referrer = document.referrer;\n } catch {\n // ignore\n }\n }\n\n return merged as Partial<AttributionIdentifiers>;\n }\n\n /**\n * Merge: never overwrite existing defined values with undefined.\n */\n merge(\n existing: AttributionIdentifiers,\n incoming: Partial<AttributionIdentifiers>\n ): AttributionIdentifiers {\n const next: Record<string, unknown> = { ...existing };\n\n for (const [key, value] of Object.entries(incoming)) {\n if (value === undefined || value === null || value === '') continue;\n\n if (key === 'customClickIds' && typeof value === 'object') {\n next.customClickIds = {\n ...((existing.customClickIds as Record<string, string>) ?? {}),\n ...(value as Record<string, string>),\n };\n continue;\n }\n\n next[key] = value;\n }\n\n const now = Date.now();\n if (!existing.firstCollectedAt) {\n next.firstCollectedAt = now;\n }\n next.lastCollectedAt = now;\n\n return next as AttributionIdentifiers;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { ATTRIBUTION_STORAGE_KEY, type AttributionIdentifiers } from './types';\n\n/**\n * Persists AttributionIdentifiers via StorageService only (no direct localStorage).\n */\nexport class AttributionStore {\n private readonly storage: StorageService;\n\n private readonly persist: boolean;\n\n private readonly ttlMs: number;\n\n private readonly storageKey: string;\n\n constructor(\n storage: StorageService,\n options: { persist: boolean; ttlDays: number; storageKey?: string }\n ) {\n this.storage = storage;\n this.persist = options.persist;\n this.ttlMs = options.ttlDays * 24 * 60 * 60 * 1000;\n this.storageKey = options.storageKey ?? ATTRIBUTION_STORAGE_KEY;\n }\n\n load(): AttributionIdentifiers | null {\n if (!this.persist) return null;\n\n try {\n const snapshot = this.storage.get<AttributionIdentifiers>(this.storageKey);\n if (!snapshot) return null;\n\n if (this.isExpired(snapshot)) {\n this.clear();\n return null;\n }\n\n return snapshot;\n } catch {\n return null;\n }\n }\n\n save(snapshot: AttributionIdentifiers): void {\n if (!this.persist) return;\n\n try {\n this.storage.set(this.storageKey, snapshot);\n } catch {\n // quota / SSR — keep in-memory only\n }\n }\n\n clear(): void {\n try {\n this.storage.remove(this.storageKey);\n } catch {\n // ignore\n }\n }\n\n private isExpired(snapshot: AttributionIdentifiers): boolean {\n const anchor = snapshot.lastCollectedAt ?? snapshot.firstCollectedAt;\n if (!anchor) return false;\n return Date.now() - anchor > this.ttlMs;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { AttributionCollector } from './AttributionCollector';\nimport { AttributionStore } from './AttributionStore';\nimport {\n DEFAULT_ATTRIBUTION_CONFIG,\n type AttributionConfig,\n type AttributionIdentifiers,\n type AttributionService,\n} from './types';\n\nexport class AttributionServiceImpl implements AttributionService {\n private readonly store: AttributionStore;\n\n private readonly collector: AttributionCollector;\n\n private readonly enabled: boolean;\n\n private snapshot: AttributionIdentifiers = {};\n\n private active = false;\n\n constructor(storage: StorageService, config: AttributionConfig = DEFAULT_ATTRIBUTION_CONFIG) {\n this.enabled = config.enabled !== false;\n this.store = new AttributionStore(storage, {\n persist: config.persist !== false,\n ttlDays: config.ttlDays ?? 90,\n });\n this.collector = new AttributionCollector({\n customParams: config.customClickIdParams ?? [],\n captureUrlParams: config.captureUrlParams !== false,\n captureCookies: config.captureCookies !== false,\n });\n }\n\n init(): void {\n if (this.active) return;\n this.active = true;\n\n if (!this.enabled) return;\n\n const stored = this.store.load();\n if (stored) {\n this.snapshot = stored;\n }\n\n this.collect();\n }\n\n destroy(): void {\n if (!this.active) return;\n this.active = false;\n }\n\n collect(): AttributionIdentifiers {\n if (!this.enabled) return this.snapshot;\n\n const fresh = this.collector.collectFresh();\n this.snapshot = this.collector.merge(this.snapshot, fresh);\n this.store.save(this.snapshot);\n return this.snapshot;\n }\n\n getSnapshot(): AttributionIdentifiers {\n return { ...this.snapshot };\n }\n\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers {\n this.snapshot = this.collector.merge(this.snapshot, partial);\n this.store.save(this.snapshot);\n return this.getSnapshot();\n }\n\n clear(): void {\n this.snapshot = {};\n this.store.clear();\n }\n}\n"],"mappings":"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","names":["DispatcherServiceImpl","event","listener","BrowserMetadataServiceImpl","timezone","DEFAULT_FINGERPRINT_KEY","hashFingerprintInput","input","hash","index","positiveHash","secondaryHash","computeLightFingerprint","metadataService","metadata","components","FingerprintServiceImpl","storage","config","existing","fingerprint","createRandomSuffix","generateSessionId","DEFAULT_SESSION_KEY","SessionServiceImpl","storage","config","raw","now","ttlMs","data","sessionId","generateSessionId","previousSessionId","BrowserStorageAdapter","storage","key","value","predicate","keysToRemove","index","MemoryStorageAdapter","key","value","predicate","supportsNamespaceClear","adapter","StorageServiceImpl","namespace","prefix","key","raw","value","namespaceKeyPrefix","createStorageAdapter","persistence","mode","MemoryStorageAdapter","BrowserStorageAdapter","resolveStorageAdapterName","createRandomSuffix","generateVisitorId","DEFAULT_VISITOR_KEY","VisitorServiceImpl","storage","config","existing","visitorId","generateVisitorId","DEFAULT_ATTRIBUTION_CONFIG","ATTRIBUTION_STORAGE_KEY","BUILTIN_CLICK_PARAMS","ClickIdParser","customParams","params","result","customClickIds","key","value","fbclid","existingFbc","CookieCollector","cookies","result","map","cookieName","field","value","acc","part","rawKey","rest","AttributionCollector","options","ClickIdParser","CookieCollector","fromUrl","fromCookies","merged","customClickIds","fbc","existing","incoming","next","key","value","now","AttributionStore","storage","options","ATTRIBUTION_STORAGE_KEY","snapshot","anchor","AttributionServiceImpl","storage","config","DEFAULT_ATTRIBUTION_CONFIG","AttributionStore","AttributionCollector","stored","fresh","partial"]}
@@ -0,0 +1,71 @@
1
+ import { P as PixelEvent, B as BrowserMetadataService, a as BaseEventBuilder, A as AttributionService } from './index-DUfFzniE.js';
2
+
3
+ interface StorageAdapter {
4
+ get(key: string): string | null;
5
+ set(key: string, value: string): void;
6
+ remove(key: string): void;
7
+ clear(): void;
8
+ }
9
+ interface StorageService {
10
+ get<T>(key: string): T | null;
11
+ set<T>(key: string, value: T): void;
12
+ remove(key: string): void;
13
+ has(key: string): boolean;
14
+ clear(): void;
15
+ createKey(key: string): string;
16
+ }
17
+
18
+ interface DispatcherService {
19
+ dispatch(event: PixelEvent): void;
20
+ subscribe(listener: (event: PixelEvent) => void): () => void;
21
+ clear(): void;
22
+ getListenerCount(): number;
23
+ getLastEvent(): PixelEvent | null;
24
+ }
25
+
26
+ interface FingerprintService {
27
+ getFingerprint(): string | null;
28
+ ensureFingerprint(): string;
29
+ }
30
+
31
+ interface SessionData {
32
+ readonly sessionId: string;
33
+ readonly lastActivityAt: number;
34
+ readonly createdAt: number;
35
+ }
36
+ type EnsureSessionResult = {
37
+ readonly sessionId: string;
38
+ readonly expired: boolean;
39
+ readonly previousSessionId?: string;
40
+ readonly created: boolean;
41
+ };
42
+ interface SessionService {
43
+ getSessionId(): string | null;
44
+ getSessionData(): SessionData | null;
45
+ getLastActivityAt(): number | null;
46
+ isExpired(ttlMs: number): boolean;
47
+ ensureSession(ttlMs: number): EnsureSessionResult;
48
+ ensureSessionId(): string;
49
+ touchActivity(): void;
50
+ renew(): string;
51
+ clear(): void;
52
+ }
53
+
54
+ interface VisitorService {
55
+ getVisitorId(): string | null;
56
+ ensureVisitorId(): string;
57
+ clearVisitorId(): void;
58
+ }
59
+
60
+ type PixelRuntimeServices = {
61
+ readonly storage: StorageService;
62
+ readonly visitor: VisitorService;
63
+ readonly session: SessionService;
64
+ readonly fingerprint: FingerprintService;
65
+ readonly dispatcher: DispatcherService;
66
+ readonly browserMetadata: BrowserMetadataService;
67
+ readonly eventBuilder: BaseEventBuilder;
68
+ readonly attribution: AttributionService;
69
+ };
70
+
71
+ export type { DispatcherService as D, EnsureSessionResult as E, FingerprintService as F, PixelRuntimeServices as P, StorageAdapter as S, VisitorService as V, StorageService as a, SessionService as b, SessionData as c };
@@ -0,0 +1,71 @@
1
+ import { P as PixelEvent, B as BrowserMetadataService, a as BaseEventBuilder, A as AttributionService } from './index-DUfFzniE.mjs';
2
+
3
+ interface StorageAdapter {
4
+ get(key: string): string | null;
5
+ set(key: string, value: string): void;
6
+ remove(key: string): void;
7
+ clear(): void;
8
+ }
9
+ interface StorageService {
10
+ get<T>(key: string): T | null;
11
+ set<T>(key: string, value: T): void;
12
+ remove(key: string): void;
13
+ has(key: string): boolean;
14
+ clear(): void;
15
+ createKey(key: string): string;
16
+ }
17
+
18
+ interface DispatcherService {
19
+ dispatch(event: PixelEvent): void;
20
+ subscribe(listener: (event: PixelEvent) => void): () => void;
21
+ clear(): void;
22
+ getListenerCount(): number;
23
+ getLastEvent(): PixelEvent | null;
24
+ }
25
+
26
+ interface FingerprintService {
27
+ getFingerprint(): string | null;
28
+ ensureFingerprint(): string;
29
+ }
30
+
31
+ interface SessionData {
32
+ readonly sessionId: string;
33
+ readonly lastActivityAt: number;
34
+ readonly createdAt: number;
35
+ }
36
+ type EnsureSessionResult = {
37
+ readonly sessionId: string;
38
+ readonly expired: boolean;
39
+ readonly previousSessionId?: string;
40
+ readonly created: boolean;
41
+ };
42
+ interface SessionService {
43
+ getSessionId(): string | null;
44
+ getSessionData(): SessionData | null;
45
+ getLastActivityAt(): number | null;
46
+ isExpired(ttlMs: number): boolean;
47
+ ensureSession(ttlMs: number): EnsureSessionResult;
48
+ ensureSessionId(): string;
49
+ touchActivity(): void;
50
+ renew(): string;
51
+ clear(): void;
52
+ }
53
+
54
+ interface VisitorService {
55
+ getVisitorId(): string | null;
56
+ ensureVisitorId(): string;
57
+ clearVisitorId(): void;
58
+ }
59
+
60
+ type PixelRuntimeServices = {
61
+ readonly storage: StorageService;
62
+ readonly visitor: VisitorService;
63
+ readonly session: SessionService;
64
+ readonly fingerprint: FingerprintService;
65
+ readonly dispatcher: DispatcherService;
66
+ readonly browserMetadata: BrowserMetadataService;
67
+ readonly eventBuilder: BaseEventBuilder;
68
+ readonly attribution: AttributionService;
69
+ };
70
+
71
+ export type { DispatcherService as D, EnsureSessionResult as E, FingerprintService as F, PixelRuntimeServices as P, StorageAdapter as S, VisitorService as V, StorageService as a, SessionService as b, SessionData as c };