@tagadapay/headless-sdk 1.14.1 → 1.16.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 (81) hide show
  1. package/dist/core/client.d.ts +7 -0
  2. package/dist/core/client.d.ts.map +1 -1
  3. package/dist/core/client.js +10 -3
  4. package/dist/core/client.js.map +1 -1
  5. package/dist/core/index.d.ts +3 -1
  6. package/dist/core/index.d.ts.map +1 -1
  7. package/dist/core/index.js +1 -0
  8. package/dist/core/index.js.map +1 -1
  9. package/dist/core/modules/checkout.d.ts +5 -1
  10. package/dist/core/modules/checkout.d.ts.map +1 -1
  11. package/dist/core/modules/checkout.js +10 -1
  12. package/dist/core/modules/checkout.js.map +1 -1
  13. package/dist/core/modules/payment.d.ts +19 -1
  14. package/dist/core/modules/payment.d.ts.map +1 -1
  15. package/dist/core/modules/payment.js +42 -3
  16. package/dist/core/modules/payment.js.map +1 -1
  17. package/dist/core/modules/rx.d.ts +32 -1
  18. package/dist/core/modules/rx.d.ts.map +1 -1
  19. package/dist/core/modules/rx.js +17 -1
  20. package/dist/core/modules/rx.js.map +1 -1
  21. package/dist/core/modules/track.d.ts +127 -0
  22. package/dist/core/modules/track.d.ts.map +1 -0
  23. package/dist/core/modules/track.js +371 -0
  24. package/dist/core/modules/track.js.map +1 -0
  25. package/dist/core/types.d.ts +2 -0
  26. package/dist/core/types.d.ts.map +1 -1
  27. package/dist/core/version.d.ts +4 -0
  28. package/dist/core/version.d.ts.map +1 -0
  29. package/dist/core/version.js +4 -0
  30. package/dist/core/version.js.map +1 -0
  31. package/dist/pixels/engine.d.ts +56 -0
  32. package/dist/pixels/engine.d.ts.map +1 -0
  33. package/dist/pixels/engine.js +263 -0
  34. package/dist/pixels/engine.js.map +1 -0
  35. package/dist/pixels/index.d.ts +10 -0
  36. package/dist/pixels/index.d.ts.map +1 -0
  37. package/dist/pixels/index.js +5 -0
  38. package/dist/pixels/index.js.map +1 -0
  39. package/dist/pixels/metaEventId.d.ts +15 -0
  40. package/dist/pixels/metaEventId.d.ts.map +1 -0
  41. package/dist/pixels/metaEventId.js +17 -0
  42. package/dist/pixels/metaEventId.js.map +1 -0
  43. package/dist/pixels/pixelIdentity.d.ts +34 -0
  44. package/dist/pixels/pixelIdentity.d.ts.map +1 -0
  45. package/dist/pixels/pixelIdentity.js +65 -0
  46. package/dist/pixels/pixelIdentity.js.map +1 -0
  47. package/dist/pixels/pixelMapping.d.ts +172 -0
  48. package/dist/pixels/pixelMapping.d.ts.map +1 -0
  49. package/dist/pixels/pixelMapping.js +574 -0
  50. package/dist/pixels/pixelMapping.js.map +1 -0
  51. package/dist/pixels/pixelTracker.d.ts +81 -0
  52. package/dist/pixels/pixelTracker.d.ts.map +1 -0
  53. package/dist/pixels/pixelTracker.js +795 -0
  54. package/dist/pixels/pixelTracker.js.map +1 -0
  55. package/dist/pixels/types.d.ts +103 -0
  56. package/dist/pixels/types.d.ts.map +1 -0
  57. package/dist/pixels/types.js +14 -0
  58. package/dist/pixels/types.js.map +1 -0
  59. package/dist/react/hooks/useStep.d.ts +7 -0
  60. package/dist/react/hooks/useStep.d.ts.map +1 -0
  61. package/dist/react/hooks/useStep.js +14 -0
  62. package/dist/react/hooks/useStep.js.map +1 -0
  63. package/dist/react/index.d.ts +1 -0
  64. package/dist/react/index.d.ts.map +1 -1
  65. package/dist/react/index.js +1 -0
  66. package/dist/react/index.js.map +1 -1
  67. package/dist/stripe/index.d.ts +3 -1
  68. package/dist/stripe/index.d.ts.map +1 -1
  69. package/dist/stripe/index.js +13 -6
  70. package/dist/stripe/index.js.map +1 -1
  71. package/dist/stripe/useStripeExpress.d.ts.map +1 -1
  72. package/dist/stripe/useStripeExpress.js +15 -1
  73. package/dist/stripe/useStripeExpress.js.map +1 -1
  74. package/dist/tagada-headless-react.min.js +2 -2
  75. package/dist/tagada-headless-react.min.js.map +4 -4
  76. package/dist/tagada-headless.js +439 -16
  77. package/dist/tagada-headless.min.js +2 -2
  78. package/dist/tagada-headless.min.js.map +4 -4
  79. package/dist/tagada-pixels.min.js +7 -0
  80. package/dist/tagada-pixels.min.js.map +7 -0
  81. package/package.json +8 -1
@@ -0,0 +1,56 @@
1
+ /**
2
+ * The browser pixel engine.
3
+ *
4
+ * It wraps the lifted `createPixelTracker` with three things the hosted runtime
5
+ * does not need: it stays inert until `init()`, it gates every fire on the
6
+ * per-step configuration served by the SDK config route, and it reports what it
7
+ * could not do (a pixel already on the page, a pixel blocked by the CSP).
8
+ */
9
+ import type { PixelRawIdentity } from './pixelIdentity.js';
10
+ import type { PixelProviderKey, StandardPixelEvent } from './pixelMapping.js';
11
+ import type { PixelsConfig } from './types.js';
12
+ export type PixelSignalKind = 'pixel_blocked' | 'pixel_duplicate';
13
+ export interface PixelSignal {
14
+ kind: PixelSignalKind;
15
+ provider: PixelProviderKey;
16
+ detail: Record<string, string>;
17
+ }
18
+ export type SdkPixelProvider = 'facebook' | 'tiktok' | 'snapchat' | 'gtm' | 'clarity';
19
+ export declare const SDK_PIXEL_PROVIDERS: readonly SdkPixelProvider[];
20
+ export interface PixelEngineConfig {
21
+ pixels: PixelsConfig;
22
+ /** Keyed by the MANIFEST step id (`sdk_steps.key`, e.g. `paywall`) — the id the merchant passes to
23
+ `track.step()` — never the `sdkstep_…` node id. R4 re-keys onto it server-side (contract §6). */
24
+ steps?: Record<string, {
25
+ type?: string;
26
+ events: Record<string, PixelProviderKey[]>;
27
+ }>;
28
+ checkout?: {
29
+ InitiateCheckout?: PixelProviderKey[];
30
+ Purchase?: PixelProviderKey[];
31
+ };
32
+ requireConsent?: boolean;
33
+ onSignal?: (signal: PixelSignal) => void;
34
+ }
35
+ export interface PixelEngine {
36
+ init(): Promise<void>;
37
+ pageView(path: string, options?: {
38
+ stepId?: string;
39
+ }): void;
40
+ track(event: StandardPixelEvent, data?: Record<string, unknown>, options?: {
41
+ eventId?: string;
42
+ stepId?: string;
43
+ }): void;
44
+ trackCustom(name: string, data?: Record<string, unknown>, options?: {
45
+ stepId?: string;
46
+ }): void;
47
+ identify(identity: PixelRawIdentity): void;
48
+ consent(state: {
49
+ marketing: boolean;
50
+ }): void;
51
+ destroy(): void;
52
+ }
53
+ /** The single origin each provider's loader fetches its script from; the drift test pins it. */
54
+ export declare const SCRIPT_ORIGINS: Record<SdkPixelProvider, string>;
55
+ export declare function createPixelEngine(config: PixelEngineConfig): PixelEngine;
56
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/pixels/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG9E,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,iBAAiB,CAAC;AAClE,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;AAClH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;AACtF,eAAO,MAAM,mBAAmB,EAAE,SAAS,gBAAgB,EAAyD,CAAC;AAErH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB;wGACoG;IACpG,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IACtF,QAAQ,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IACpF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,KAAK,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACxH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/F,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,OAAO,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,gGAAgG;AAChG,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAI3D,CAAC;AAwCF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CA+KxE"}
@@ -0,0 +1,263 @@
1
+ import { pixelIdKeyOf } from './pixelMapping.js';
2
+ import { createPixelTracker, isSafePixelId } from './pixelTracker.js';
3
+ export const SDK_PIXEL_PROVIDERS = ['facebook', 'tiktok', 'snapchat', 'gtm', 'clarity'];
4
+ /** The single origin each provider's loader fetches its script from; the drift test pins it. */
5
+ export const SCRIPT_ORIGINS = {
6
+ facebook: 'https://connect.facebook.net', tiktok: 'https://analytics.tiktok.com',
7
+ snapchat: 'https://sc-static.net', gtm: 'https://www.googletagmanager.com',
8
+ clarity: 'https://www.clarity.ms',
9
+ };
10
+ /** The global a provider's own script installs; its presence means a second tag is on the page. */
11
+ const PROVIDER_GLOBALS = {
12
+ facebook: 'fbq', tiktok: 'ttq', snapchat: 'snaptr', gtm: 'dataLayer', clarity: 'clarity',
13
+ };
14
+ /* eslint-enable @typescript-eslint/no-explicit-any */
15
+ const QUEUE_LIMIT = 50;
16
+ /** Same window as the SDK's own step dedup: React StrictMode double-renders, nothing more. */
17
+ const PAGE_VIEW_DEDUP_MS = 1000;
18
+ function isSdkProvider(provider) {
19
+ return SDK_PIXEL_PROVIDERS.includes(provider);
20
+ }
21
+ /** The five SDK providers and nothing else, copied key by key: a spread would carry `pinterest` through. */
22
+ function filterPixels(pixels) {
23
+ const out = {};
24
+ if (pixels.facebook)
25
+ out.facebook = pixels.facebook;
26
+ if (pixels.tiktok)
27
+ out.tiktok = pixels.tiktok;
28
+ if (pixels.snapchat)
29
+ out.snapchat = pixels.snapchat;
30
+ if (pixels.gtm)
31
+ out.gtm = pixels.gtm;
32
+ if (pixels.clarity)
33
+ out.clarity = pixels.clarity;
34
+ return out;
35
+ }
36
+ function entriesOf(pixels, provider) {
37
+ const list = pixels[provider];
38
+ return Array.isArray(list) ? list : [];
39
+ }
40
+ function usableIdOf(pixel) {
41
+ const value = pixel[pixelIdKeyOf(pixel)];
42
+ return isSafePixelId(value) ? value.trim() : null;
43
+ }
44
+ export function createPixelEngine(config) {
45
+ const pixels = filterPixels(config.pixels);
46
+ const trackers = new Map();
47
+ /** `stepId|path` → when it last fired. A window, not a page-lifetime latch: an SPA that comes
48
+ back to a step later in the session must count as a second page view. */
49
+ const seen = new Map();
50
+ const signalled = new Set();
51
+ const queue = [];
52
+ let granted = config.requireConsent !== true;
53
+ let latchedOff = false;
54
+ let started = false;
55
+ let cspHandler = null;
56
+ const signal = (kind, provider, detail) => {
57
+ const key = `${provider}|${kind}`;
58
+ if (signalled.has(key))
59
+ return;
60
+ signalled.add(key);
61
+ try {
62
+ config.onSignal?.({ kind, provider, detail });
63
+ }
64
+ catch { /* a consumer callback never breaks a page */ }
65
+ };
66
+ const configuredProviders = () => SDK_PIXEL_PROVIDERS.filter((provider) => entriesOf(pixels, provider).length > 0);
67
+ const gateFor = (event, stepId) => {
68
+ const raw = event === 'InitiateCheckout' || event === 'Purchase'
69
+ ? config.checkout?.[event] ?? []
70
+ : config.steps?.[stepId ?? '']?.events?.[event] ?? [];
71
+ return raw.filter(isSdkProvider);
72
+ };
73
+ const detectDuplicates = (win) => {
74
+ for (const provider of configuredProviders()) {
75
+ const host = typeof win.location?.host === 'string' ? win.location.host : '';
76
+ if (provider === 'gtm') {
77
+ const loaded = win.google_tag_manager;
78
+ const clash = entriesOf(pixels, 'gtm').some((px) => {
79
+ const id = usableIdOf(px);
80
+ return id !== null && loaded?.[id] !== undefined;
81
+ });
82
+ if (clash)
83
+ signal('pixel_duplicate', 'gtm', { origin: host });
84
+ continue;
85
+ }
86
+ if (win[PROVIDER_GLOBALS[provider]] !== undefined)
87
+ signal('pixel_duplicate', provider, { origin: host });
88
+ }
89
+ };
90
+ const watchCsp = (win) => {
91
+ cspHandler = (event) => {
92
+ const violation = event;
93
+ const blocked = typeof violation.blockedURI === 'string' ? violation.blockedURI : '';
94
+ for (const provider of SDK_PIXEL_PROVIDERS) {
95
+ if (!blocked.startsWith(SCRIPT_ORIGINS[provider]))
96
+ continue;
97
+ signal('pixel_blocked', provider, { reason: 'csp', directive: violation.violatedDirective ?? '' });
98
+ return;
99
+ }
100
+ };
101
+ win.addEventListener('securitypolicyviolation', cspHandler);
102
+ };
103
+ const enqueue = (run) => {
104
+ if (latchedOff)
105
+ return;
106
+ if (queue.length >= QUEUE_LIMIT)
107
+ queue.shift();
108
+ queue.push(run);
109
+ };
110
+ const guardEventId = (eventId) => {
111
+ try {
112
+ if (sessionStorage.getItem(`__tgd_px:${eventId}`))
113
+ return false;
114
+ }
115
+ catch { /* private mode */ }
116
+ return true;
117
+ };
118
+ const markEventId = (eventId) => {
119
+ try {
120
+ sessionStorage.setItem(`__tgd_px:${eventId}`, '1');
121
+ }
122
+ catch { /* private mode */ }
123
+ };
124
+ const engine = {
125
+ async init() {
126
+ if (started || typeof window === 'undefined')
127
+ return;
128
+ if (!granted)
129
+ return;
130
+ started = true;
131
+ const win = window;
132
+ detectDuplicates(win);
133
+ watchCsp(win);
134
+ const ready = [];
135
+ for (const provider of configuredProviders()) {
136
+ // One tracker per provider: the lifted tracker fires to every provider of its own
137
+ // config, so a per-provider gate needs a per-provider tracker.
138
+ const tracker = createPixelTracker({ [provider]: entriesOf(pixels, provider) }, { autoPageView: false });
139
+ trackers.set(provider, tracker);
140
+ ready.push(tracker.initPromise);
141
+ }
142
+ // `track()` no-ops until `pixelsInitialized` flips, which only happens when these settle.
143
+ await Promise.all(ready);
144
+ },
145
+ pageView(path, options) {
146
+ if (typeof window === 'undefined')
147
+ return;
148
+ if (!granted) {
149
+ enqueue(() => engine.pageView(path, options));
150
+ return;
151
+ }
152
+ const key = `${options?.stepId ?? ''}|${path}`;
153
+ const now = Date.now();
154
+ const previous = seen.get(key);
155
+ if (previous !== undefined && now - previous < PAGE_VIEW_DEDUP_MS)
156
+ return;
157
+ for (const [other, when] of seen)
158
+ if (now - when >= PAGE_VIEW_DEDUP_MS)
159
+ seen.delete(other);
160
+ seen.set(key, now);
161
+ const allowed = gateFor('PageView', options?.stepId);
162
+ if (allowed.length === 0)
163
+ return;
164
+ // A per-step id, and a per-fire one: two steps on one path would otherwise collapse into a
165
+ // single fire inside the tracker's own 5 s duplicate guard, and so would a genuine return
166
+ // to the same step later in the session.
167
+ for (const provider of allowed)
168
+ trackers.get(provider)?.track('PageView', { path }, { eventId: `PageView_${key}|${now}` });
169
+ },
170
+ track(event, data, options) {
171
+ if (typeof window === 'undefined')
172
+ return;
173
+ if (!granted) {
174
+ enqueue(() => engine.track(event, data, options));
175
+ return;
176
+ }
177
+ if (event === 'InitiateCheckout' || event === 'Purchase') {
178
+ if (!options?.eventId)
179
+ return;
180
+ if (!guardEventId(options.eventId))
181
+ return;
182
+ }
183
+ const allowed = gateFor(event, options?.stepId);
184
+ if (allowed.length === 0)
185
+ return;
186
+ for (const provider of allowed) {
187
+ trackers.get(provider)?.track(event, data ?? {}, options?.eventId ? { eventId: options.eventId } : undefined);
188
+ }
189
+ if (options?.eventId)
190
+ markEventId(options.eventId);
191
+ },
192
+ trackCustom(name, data, options) {
193
+ if (typeof window === 'undefined')
194
+ return;
195
+ if (!granted) {
196
+ enqueue(() => engine.trackCustom(name, data, options));
197
+ return;
198
+ }
199
+ const win = window;
200
+ const params = data ?? {};
201
+ for (const provider of gateFor(name, options?.stepId)) {
202
+ for (const px of entriesOf(pixels, provider)) {
203
+ if (!px.enabled)
204
+ continue;
205
+ const id = usableIdOf(px);
206
+ if (id === null)
207
+ continue;
208
+ switch (provider) {
209
+ // `trackSingle` with a custom name is read by Meta as an unknown standard event.
210
+ case 'facebook':
211
+ win.fbq?.('trackSingleCustom', id, name, params);
212
+ break;
213
+ case 'tiktok':
214
+ win.ttq?.instance?.(id)?.track?.(name, params);
215
+ break;
216
+ // Snap offers no per-pixel target: the global broadcasts to every Snap pixel.
217
+ case 'snapchat':
218
+ win.snaptr?.('track', name, params);
219
+ break;
220
+ case 'gtm':
221
+ win.gtag?.('event', name, params);
222
+ break;
223
+ case 'clarity':
224
+ win.clarity?.('event', name);
225
+ break;
226
+ }
227
+ }
228
+ }
229
+ },
230
+ identify(identity) {
231
+ if (typeof window === 'undefined')
232
+ return;
233
+ for (const tracker of trackers.values())
234
+ tracker.identify(identity);
235
+ },
236
+ consent(state) {
237
+ if (!state.marketing) {
238
+ queue.length = 0;
239
+ latchedOff = true;
240
+ granted = false;
241
+ return;
242
+ }
243
+ if (latchedOff || granted)
244
+ return;
245
+ granted = true;
246
+ void engine.init().then(() => {
247
+ const pending = queue.splice(0, queue.length);
248
+ for (const run of pending)
249
+ run();
250
+ });
251
+ },
252
+ destroy() {
253
+ queue.length = 0;
254
+ if (cspHandler && typeof window !== 'undefined') {
255
+ window.removeEventListener('securitypolicyviolation', cspHandler);
256
+ }
257
+ cspHandler = null;
258
+ trackers.clear();
259
+ },
260
+ };
261
+ return engine;
262
+ }
263
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/pixels/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { createPixelEngine, SDK_PIXEL_PROVIDERS } from './engine.js';
2
+ export type { PixelEngine, PixelEngineConfig, PixelSignal, PixelSignalKind, SdkPixelProvider, } from './engine.js';
3
+ export { makeMetaEventId } from './metaEventId.js';
4
+ export { bootstrapPixelTrackerFromWindow, createPixelTracker, isSafePixelId } from './pixelTracker.js';
5
+ export type { PixelTracker, TrackOptions } from './pixelTracker.js';
6
+ export { buildGa4PurchasePayload, getEligiblePixels, isEventEnabled, pixelIdKeyOf, resolvePixelEvents } from './pixelMapping.js';
7
+ export type { PixelProviderKey, StandardPixelEvent } from './pixelMapping.js';
8
+ export type { PixelRawIdentity } from './pixelIdentity.js';
9
+ export type { PixelConfig, PixelsConfig } from './types.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pixels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrE,YAAY,EACV,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,GAC/E,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvG,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACjI,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { createPixelEngine, SDK_PIXEL_PROVIDERS } from './engine.js';
2
+ export { makeMetaEventId } from './metaEventId.js';
3
+ export { bootstrapPixelTrackerFromWindow, createPixelTracker, isSafePixelId } from './pixelTracker.js';
4
+ export { buildGa4PurchasePayload, getEligiblePixels, isEventEnabled, pixelIdKeyOf, resolvePixelEvents } from './pixelMapping.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pixels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKrE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvG,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Stable event_id helper for Meta CAPI / browser pixel deduplication.
3
+ *
4
+ * The browser side (`fbq('track', name, params, { eventID })`) and the server
5
+ * side (`ServerEvent.setEventId(...)`) must publish the same value to let Meta
6
+ * dedup. This helper is the single source of truth for the formula, mirrored
7
+ * on the server in `src/app/services/meta/meta-event-id.ts`. A parity test in
8
+ * the server package keeps them byte-identical.
9
+ *
10
+ * Convention: `${eventName}_${entityId}`. Different event names get different
11
+ * IDs even when fired for the same entity (e.g. a Purchase + Subscribe pair on
12
+ * the same order), so each dedups independently.
13
+ */
14
+ export declare function makeMetaEventId(eventName: string, entityId: string): string;
15
+ //# sourceMappingURL=metaEventId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metaEventId.d.ts","sourceRoot":"","sources":["../../src/pixels/metaEventId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3E"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Stable event_id helper for Meta CAPI / browser pixel deduplication.
3
+ *
4
+ * The browser side (`fbq('track', name, params, { eventID })`) and the server
5
+ * side (`ServerEvent.setEventId(...)`) must publish the same value to let Meta
6
+ * dedup. This helper is the single source of truth for the formula, mirrored
7
+ * on the server in `src/app/services/meta/meta-event-id.ts`. A parity test in
8
+ * the server package keeps them byte-identical.
9
+ *
10
+ * Convention: `${eventName}_${entityId}`. Different event names get different
11
+ * IDs even when fired for the same entity (e.g. a Purchase + Subscribe pair on
12
+ * the same order), so each dedups independently.
13
+ */
14
+ export function makeMetaEventId(eventName, entityId) {
15
+ return `${eventName}_${entityId}`;
16
+ }
17
+ //# sourceMappingURL=metaEventId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metaEventId.js","sourceRoot":"","sources":["../../src/pixels/metaEventId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,QAAgB;IACjE,OAAO,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Client-side identity hashing for pixel advanced matching.
3
+ *
4
+ * Framework-agnostic (no DOM). Normalizes + SHA-256-hashes the customer
5
+ * identifiers (email / phone / external id) so the tracker can feed match
6
+ * keys to Snapchat (`user_hashed_email`/`user_hashed_phone_number`) and TikTok
7
+ * (`ttq.identify`). We hash in the browser ourselves so raw PII never leaves
8
+ * the page — TikTok requires pre-hashed values anyway, and Snap/Meta accept
9
+ * pre-hashed too.
10
+ */
11
+ export interface PixelRawIdentity {
12
+ /** Raw email (any case). */
13
+ email?: string;
14
+ /** Raw phone in any format. */
15
+ phone?: string;
16
+ /** Stable external id (e.g. Tagada customer id). */
17
+ externalId?: string;
18
+ }
19
+ export interface PixelHashedIdentity {
20
+ /** SHA-256 hex of the normalized email. */
21
+ email?: string;
22
+ /** SHA-256 hex of the E.164-normalized phone. */
23
+ phone?: string;
24
+ /** SHA-256 hex of the trimmed external id. */
25
+ externalId?: string;
26
+ }
27
+ /** True when SubtleCrypto is usable (secure context). */
28
+ export declare function canHashIdentity(): boolean;
29
+ /**
30
+ * Hash whichever identifiers are present. Empty/whitespace-only fields are
31
+ * skipped so we never emit a hash of "". Returns `{}` when nothing usable.
32
+ */
33
+ export declare function buildHashedIdentity(id: PixelRawIdentity): Promise<PixelHashedIdentity>;
34
+ //# sourceMappingURL=pixelIdentity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixelIdentity.d.ts","sourceRoot":"","sources":["../../src/pixels/pixelIdentity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA6BD,yDAAyD;AACzD,wBAAgB,eAAe,IAAI,OAAO,CAMzC;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiB5F"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Client-side identity hashing for pixel advanced matching.
3
+ *
4
+ * Framework-agnostic (no DOM). Normalizes + SHA-256-hashes the customer
5
+ * identifiers (email / phone / external id) so the tracker can feed match
6
+ * keys to Snapchat (`user_hashed_email`/`user_hashed_phone_number`) and TikTok
7
+ * (`ttq.identify`). We hash in the browser ourselves so raw PII never leaves
8
+ * the page — TikTok requires pre-hashed values anyway, and Snap/Meta accept
9
+ * pre-hashed too.
10
+ */
11
+ /** Lowercase + trim — the normalization Meta/Snap/TikTok all expect for email. */
12
+ function normalizeEmail(email) {
13
+ return email.trim().toLowerCase();
14
+ }
15
+ /**
16
+ * Normalize to E.164-ish: keep a single leading `+` (if present) and digits.
17
+ * Snap and TikTok both expect E.164 with the country-code `+`, so a single
18
+ * hash satisfies both. (Meta wants digits-only — add a per-provider variant
19
+ * here if Meta browser matching is added later.)
20
+ */
21
+ function normalizePhone(phone) {
22
+ const trimmed = phone.trim();
23
+ const hasPlus = trimmed.startsWith('+');
24
+ const digits = trimmed.replace(/[^0-9]/g, '');
25
+ if (!digits)
26
+ return '';
27
+ return (hasPlus ? '+' : '') + digits;
28
+ }
29
+ async function sha256Hex(input) {
30
+ const data = new TextEncoder().encode(input);
31
+ const buf = await crypto.subtle.digest('SHA-256', data);
32
+ return Array.from(new Uint8Array(buf))
33
+ .map((b) => b.toString(16).padStart(2, '0'))
34
+ .join('');
35
+ }
36
+ /** True when SubtleCrypto is usable (secure context). */
37
+ export function canHashIdentity() {
38
+ return (typeof crypto !== 'undefined' &&
39
+ typeof crypto.subtle !== 'undefined' &&
40
+ typeof crypto.subtle.digest === 'function');
41
+ }
42
+ /**
43
+ * Hash whichever identifiers are present. Empty/whitespace-only fields are
44
+ * skipped so we never emit a hash of "". Returns `{}` when nothing usable.
45
+ */
46
+ export async function buildHashedIdentity(id) {
47
+ const out = {};
48
+ if (id.email) {
49
+ const n = normalizeEmail(id.email);
50
+ if (n)
51
+ out.email = await sha256Hex(n);
52
+ }
53
+ if (id.phone) {
54
+ const n = normalizePhone(id.phone);
55
+ if (n)
56
+ out.phone = await sha256Hex(n);
57
+ }
58
+ if (id.externalId) {
59
+ const n = id.externalId.trim();
60
+ if (n)
61
+ out.externalId = await sha256Hex(n);
62
+ }
63
+ return out;
64
+ }
65
+ //# sourceMappingURL=pixelIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixelIdentity.js","sourceRoot":"","sources":["../../src/pixels/pixelIdentity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoBH,kFAAkF;AAClF,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAAa;IACpC,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;SACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,eAAe;IAC7B,OAAO,CACL,OAAO,MAAM,KAAK,WAAW;QAC7B,OAAO,MAAM,CAAC,MAAM,KAAK,WAAW;QACpC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAC3C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAoB;IAC5D,MAAM,GAAG,GAAwB,EAAE,CAAC;IAEpC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC;YAAE,GAAG,CAAC,KAAK,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC;YAAE,GAAG,CAAC,KAAK,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC;YAAE,GAAG,CAAC,UAAU,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}