@datalyr/web 1.7.5 → 1.7.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +542 -476
- package/dist/attribution-lyr.test.d.ts +2 -0
- package/dist/attribution-lyr.test.d.ts.map +1 -0
- package/dist/attribution-oppref.test.d.ts +2 -0
- package/dist/attribution-oppref.test.d.ts.map +1 -0
- package/dist/attribution.d.ts +4 -0
- package/dist/attribution.d.ts.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/datalyr.cjs.js +1303 -281
- package/dist/datalyr.cjs.js.map +1 -1
- package/dist/datalyr.esm.js +1303 -282
- package/dist/datalyr.esm.js.map +1 -1
- package/dist/datalyr.esm.min.js +1 -1
- package/dist/datalyr.esm.min.js.map +1 -1
- package/dist/datalyr.js +1303 -281
- package/dist/datalyr.js.map +1 -1
- package/dist/datalyr.min.js +1 -1
- package/dist/datalyr.min.js.map +1 -1
- package/dist/identify-dedupe.test.d.ts +2 -0
- package/dist/identify-dedupe.test.d.ts.map +1 -0
- package/dist/identity-pii.test.d.ts +2 -0
- package/dist/identity-pii.test.d.ts.map +1 -0
- package/dist/identity.d.ts +52 -4
- package/dist/identity.d.ts.map +1 -1
- package/dist/index.d.ts +116 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.test.d.ts +3 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/queue-403.test.d.ts +2 -0
- package/dist/queue-403.test.d.ts.map +1 -0
- package/dist/queue.d.ts +32 -4
- package/dist/queue.d.ts.map +1 -1
- package/dist/storage-migration.test.d.ts +2 -0
- package/dist/storage-migration.test.d.ts.map +1 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/stripe-session.d.ts +75 -0
- package/dist/stripe-session.d.ts.map +1 -0
- package/dist/stripe-session.test.d.ts +2 -0
- package/dist/stripe-session.test.d.ts.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +13 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.test.d.ts +2 -1
- package/dist/utils.test.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identify-dedupe.test.d.ts","sourceRoot":"","sources":["../src/identify-dedupe.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-pii.test.d.ts","sourceRoot":"","sources":["../src/identity-pii.test.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,CAAC"}
|
package/dist/identity.d.ts
CHANGED
|
@@ -7,6 +7,9 @@ export declare class IdentityManager {
|
|
|
7
7
|
private userId;
|
|
8
8
|
private sessionId;
|
|
9
9
|
private persistNewId;
|
|
10
|
+
/** WEB-26: bumps whenever the persisted identity changes, so an in-flight
|
|
11
|
+
* encrypted write can tell it has been superseded. */
|
|
12
|
+
private piiGeneration;
|
|
10
13
|
constructor(options?: {
|
|
11
14
|
persistNewId?: boolean;
|
|
12
15
|
});
|
|
@@ -21,11 +24,13 @@ export declare class IdentityManager {
|
|
|
21
24
|
*/
|
|
22
25
|
private persistAnonymousId;
|
|
23
26
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
+
* TR-15 / FSR-107: tracking became allowed mid-session (optIn / consent grant). Start
|
|
28
|
+
* persisting AND flush the current in-memory anon id to the cookie + localStorage now.
|
|
29
|
+
* Without this, a visitor declined at init keeps a memory-only id, so that session's
|
|
30
|
+
* events land under a visitor_id that vanishes on the next page load (attribution
|
|
31
|
+
* fragmentation). Idempotent — a no-op once already persisting.
|
|
27
32
|
*/
|
|
28
|
-
|
|
33
|
+
enablePersistence(): void;
|
|
29
34
|
/**
|
|
30
35
|
* Remove a query param from the current URL via history.replaceState (best-effort).
|
|
31
36
|
* Used so a consumed `_dl_vid` doesn't linger in the address bar and get re-shared.
|
|
@@ -40,6 +45,49 @@ export declare class IdentityManager {
|
|
|
40
45
|
* Get stored user ID from previous session
|
|
41
46
|
*/
|
|
42
47
|
private getStoredUserId;
|
|
48
|
+
/**
|
|
49
|
+
* WEB-22 — is this user id personally identifying, and therefore not
|
|
50
|
+
* something we may write to localStorage in the clear?
|
|
51
|
+
*
|
|
52
|
+
* The auto-identify path calls `identify(email, { email })`, so the raw
|
|
53
|
+
* address became the `user_id` and was written unencrypted to `dl_user_id`.
|
|
54
|
+
* Measured 2026-07-25: on the four workspaces using auto-identify, **every**
|
|
55
|
+
* event carrying a `user_id` had an email in that column (20,502 / 20,502 on
|
|
56
|
+
* `f6260736` over 7 days) — while the surrounding code went to real lengths to
|
|
57
|
+
* encrypt the *same* address in `dl_auto_identified_email`.
|
|
58
|
+
*
|
|
59
|
+
* Deliberately narrow: an email is the case that actually occurs and the one
|
|
60
|
+
* the SDK itself creates. Opaque application ids — the overwhelming majority —
|
|
61
|
+
* keep the existing fast, synchronous, plaintext path with no behaviour change.
|
|
62
|
+
*/
|
|
63
|
+
private static looksLikePII;
|
|
64
|
+
/**
|
|
65
|
+
* Persist the user id, encrypting it when it is PII.
|
|
66
|
+
*
|
|
67
|
+
* Three-way, and the ordering matters:
|
|
68
|
+
* - not PII → plaintext `dl_user_id`, exactly as before (sync, always works)
|
|
69
|
+
* - PII + crypto → encrypted `dl_user_id_pii`, and the plaintext key is REMOVED
|
|
70
|
+
* - PII, no crypto → memory only, and both keys removed
|
|
71
|
+
*
|
|
72
|
+
* That last branch is the deliberate trade. `crypto.subtle` is absent on
|
|
73
|
+
* http:// and old browsers, and index.ts is explicit that encryption is for
|
|
74
|
+
* PII-at-rest only and "must NOT gate event delivery". So we never block an
|
|
75
|
+
* event — `this.userId` is set in memory first and every event still carries
|
|
76
|
+
* it — we only decline to *persist* an address we cannot protect. The cost is
|
|
77
|
+
* that a returning visitor on an insecure origin is re-identified by the next
|
|
78
|
+
* `identify()` call rather than restored from storage; the alternative is
|
|
79
|
+
* writing their email to disk in the clear, which is what this fixes.
|
|
80
|
+
*/
|
|
81
|
+
private persistUserId;
|
|
82
|
+
/**
|
|
83
|
+
* Restore a PII user id that was persisted encrypted. Async by necessity, so
|
|
84
|
+
* it cannot run in the constructor; index.ts calls it during init, right after
|
|
85
|
+
* `dataEncryption.initialize()`.
|
|
86
|
+
*
|
|
87
|
+
* Never overwrites an id already established this page load — an explicit
|
|
88
|
+
* `identify()` that has already run is fresher than anything on disk.
|
|
89
|
+
*/
|
|
90
|
+
hydrateEncryptedUserId(): Promise<void>;
|
|
43
91
|
/**
|
|
44
92
|
* Get the anonymous ID
|
|
45
93
|
*/
|
package/dist/identity.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAuB;IAIxC,OAAO,CAAC,YAAY,CAAU;
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAuB;IAIxC,OAAO,CAAC,YAAY,CAAU;IAC9B;2DACuD;IACvD,OAAO,CAAC,aAAa,CAAK;gBAEd,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO;IAMpD;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;;;;;OAMG;IACH,iBAAiB,IAAI,IAAI;IAMzB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAI3B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,aAAa;IAqCrB;;;;;;;OAOG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC7C;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B;;;OAGG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAwB/E;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAgB/D;;;OAGG;IACH,KAAK,IAAI,IAAI;IAkBb;;OAEG;IACH,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAqBzC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -28,11 +28,23 @@ declare class Datalyr {
|
|
|
28
28
|
private hashchangeHandler?;
|
|
29
29
|
private unloadHandler?;
|
|
30
30
|
private visibilityHandler?;
|
|
31
|
+
private shopifyConsentHandler?;
|
|
31
32
|
private outboundDisposer?;
|
|
32
33
|
private stripeLinksDisposer?;
|
|
34
|
+
private stripeSessionWatcher?;
|
|
33
35
|
private lastSpaPath;
|
|
36
|
+
private initialPageViewReady;
|
|
37
|
+
private initialPageViewSent;
|
|
34
38
|
private initializationPromise;
|
|
35
39
|
constructor();
|
|
40
|
+
/**
|
|
41
|
+
* Return the workspace configured for this instance, or null before init().
|
|
42
|
+
*
|
|
43
|
+
* CDN bootstrap uses this public accessor instead of reaching into the
|
|
44
|
+
* private runtime config when deciding whether an existing global belongs
|
|
45
|
+
* to the requested workspace.
|
|
46
|
+
*/
|
|
47
|
+
getWorkspaceId(): string | null;
|
|
36
48
|
/**
|
|
37
49
|
* Initialize the SDK
|
|
38
50
|
*/
|
|
@@ -67,7 +79,40 @@ declare class Datalyr {
|
|
|
67
79
|
/**
|
|
68
80
|
* Identify a user
|
|
69
81
|
*/
|
|
82
|
+
/**
|
|
83
|
+
* Stable fingerprint of an identity for redundant-emit suppression (WEB-20).
|
|
84
|
+
*
|
|
85
|
+
* Keys are sorted and each value is JSON-serialized, so `{a,b}` and `{b,a}`
|
|
86
|
+
* collapse to one identity while a genuinely changed nested trait does not.
|
|
87
|
+
* (The mobile SDKs use `String(value)`, which flattens every object to
|
|
88
|
+
* `[object Object]` and can swallow a real change; web traits are plain JSON,
|
|
89
|
+
* so it can afford to be exact.)
|
|
90
|
+
*
|
|
91
|
+
* Hashed rather than stored raw so the key does not become another copy of the
|
|
92
|
+
* user's traits at rest. Being honest about the strength: a 32-bit
|
|
93
|
+
* non-cryptographic digest sitting beside a readable `dl_dl_anonymous_id` is
|
|
94
|
+
* NOT protection against a determined reader — it defeats casual inspection
|
|
95
|
+
* and bulk scraping, nothing more. The PII that matters is handled properly
|
|
96
|
+
* (encrypted `dl_user_id_pii`, encrypted `dl_user_traits`). 32 bits also means
|
|
97
|
+
* a ~1-in-4.3e9 chance per identity that a genuine change is suppressed;
|
|
98
|
+
* acceptable for change detection, which is all this is.
|
|
99
|
+
*/
|
|
100
|
+
private identityFingerprint;
|
|
70
101
|
identify(userId: string, traits?: UserTraits): void;
|
|
102
|
+
/**
|
|
103
|
+
* WEB-27: queue health, including events the SDK gave up on.
|
|
104
|
+
*
|
|
105
|
+
* `getStats()` existed on EventQueue but was unreachable — `queue` is private
|
|
106
|
+
* and nothing exposed it, so the observability fix could not actually be
|
|
107
|
+
* observed. A non-zero `droppedEvents` means data was lost.
|
|
108
|
+
*/
|
|
109
|
+
getQueueStats(): {
|
|
110
|
+
queued: number;
|
|
111
|
+
offline: number;
|
|
112
|
+
droppedEvents: number;
|
|
113
|
+
lastDropStatus: number | null;
|
|
114
|
+
backoffUntil: number;
|
|
115
|
+
} | null;
|
|
71
116
|
/**
|
|
72
117
|
* Track a page view
|
|
73
118
|
*/
|
|
@@ -177,6 +222,15 @@ declare class Datalyr {
|
|
|
177
222
|
/**
|
|
178
223
|
* Opt out of tracking
|
|
179
224
|
*/
|
|
225
|
+
/**
|
|
226
|
+
* X-1 (consent): stop the Stripe Payment Link + CheckoutChamp outbound-link decorators from
|
|
227
|
+
* stamping `client_reference_id`/`prefilled_email` onto <a> hrefs once consent/marketing is
|
|
228
|
+
* withdrawn. Their MutationObservers otherwise keep rewriting links after a CMP or Shopify
|
|
229
|
+
* decline — and the server still reads the stamped `client_reference_id` — so attribution
|
|
230
|
+
* continues post-withdrawal. Idempotent; decorators re-init on the next load if consent returns
|
|
231
|
+
* (same convention as pixels/auto-identify).
|
|
232
|
+
*/
|
|
233
|
+
private disposeMarketingLinkDecorators;
|
|
180
234
|
optOut(): void;
|
|
181
235
|
/**
|
|
182
236
|
* Opt in to tracking
|
|
@@ -216,17 +270,7 @@ declare class Datalyr {
|
|
|
216
270
|
* Merges via Shopify's /cart/update.js (does not clobber other cart attributes).
|
|
217
271
|
*/
|
|
218
272
|
private syncShopifyCartAttributes;
|
|
219
|
-
/**
|
|
220
|
-
* Restore _dl_* URL bridge params on a Checkout Champ funnel page.
|
|
221
|
-
* Runs BEFORE IdentityManager so the storefront's visitor_id wins over a
|
|
222
|
-
* freshly auto-generated one. Also restores _fbc / _fbp cookies and the
|
|
223
|
-
* fbclid click time so server-side rebuilds carry the real click moment.
|
|
224
|
-
*
|
|
225
|
-
* Strategy: stamp matching cookies (without clobbering pre-existing values),
|
|
226
|
-
* then rewrite the URL so `_dl_fbclid` becomes `fbclid` — that way the rest
|
|
227
|
-
* of the SDK's attribution layer (which reads `params.fbclid`) works
|
|
228
|
-
* unchanged, and any merchant analytics also see the canonical click ID.
|
|
229
|
-
*/
|
|
273
|
+
/** Strip the retired unsigned Checkout Champ bridge parameters. */
|
|
230
274
|
private restoreFromURL;
|
|
231
275
|
/**
|
|
232
276
|
* Checkout Champ Meta Pixel ⇄ CAPI deduplication.
|
|
@@ -262,14 +306,7 @@ declare class Datalyr {
|
|
|
262
306
|
* shape confirmed on a live funnel first — tracked as a follow-up.
|
|
263
307
|
*/
|
|
264
308
|
private fireCheckoutChampPurchasePixel;
|
|
265
|
-
/**
|
|
266
|
-
* Storefront → Checkout Champ link stamping. Finds every `<a href>` whose host
|
|
267
|
-
* matches the configured CC domain list and appends `?_dl_vid=…&_dl_fbc=…&
|
|
268
|
-
* _dl_fbp=…&_dl_fbclid=…&_dl_fbclid_at=…&_dl_gclid=…` so the user's
|
|
269
|
-
* visitor_id + Meta click signals cross the domain. MutationObserver watches
|
|
270
|
-
* for dynamically-injected links. On click, force-flush the event queue so
|
|
271
|
-
* any pending track() events land before the browser navigates away.
|
|
272
|
-
*/
|
|
309
|
+
/** Checkout Champ identity bridging remains disabled pending signed tokens. */
|
|
273
310
|
private syncOutboundLinkParams;
|
|
274
311
|
/**
|
|
275
312
|
* Stripe Payment Link auto-decoration (D1). Structurally mirrors
|
|
@@ -296,6 +333,20 @@ declare class Datalyr {
|
|
|
296
333
|
* changes. window.open(paymentLink) is not covered (use getVisitorId()
|
|
297
334
|
* manually); iframe/shadow-DOM links are unreachable from document.
|
|
298
335
|
*/
|
|
336
|
+
/**
|
|
337
|
+
* Observe Stripe Checkout Session ids and report each one once.
|
|
338
|
+
*
|
|
339
|
+
* The event is what carries the pairing: the server stores
|
|
340
|
+
* (stripe_session_id -> visitor_id) and, when checkout.session.completed
|
|
341
|
+
* arrives without a client_reference_id, joins on session.id and feeds the
|
|
342
|
+
* SAME cacheCustomerVisitor path the Payment Link flow already uses — so
|
|
343
|
+
* every later invoice for that customer inherits the visitor too.
|
|
344
|
+
*
|
|
345
|
+
* Consent is re-checked at emit time, not just at init: a visitor can
|
|
346
|
+
* withdraw between page load and checkout, and this pairing is exactly the
|
|
347
|
+
* kind of identity link that must stop when they do.
|
|
348
|
+
*/
|
|
349
|
+
private startStripeSessionCapture;
|
|
299
350
|
private syncStripePaymentLinks;
|
|
300
351
|
/**
|
|
301
352
|
* Create event payload
|
|
@@ -311,6 +362,44 @@ declare class Datalyr {
|
|
|
311
362
|
* pixels (which share data). No consent set = allowed (default).
|
|
312
363
|
*/
|
|
313
364
|
private consentAllowsMarketing;
|
|
365
|
+
/**
|
|
366
|
+
* Shopify Customer Privacy API handle (9.A.1), or null when it doesn't apply.
|
|
367
|
+
*
|
|
368
|
+
* X-2 (LEGAL): gated on RUNTIME detection of `window.Shopify.customerPrivacy`, NOT on
|
|
369
|
+
* `config.platform === 'shopify'`. A Shopify merchant who installs via a plain <script>
|
|
370
|
+
* snippet or a headless storefront (no `platform:'shopify'`) still exposes customerPrivacy;
|
|
371
|
+
* gating on config.platform meant a shopper who DECLINED the native banner (with no
|
|
372
|
+
* setConsent() wired) was fully tracked — nullifying the consent feature for a whole install
|
|
373
|
+
* class, and unfixable server-side (platform is install-time only). Every access is wrapped —
|
|
374
|
+
* a Shopify API shape change (or a non-Shopify site) must NEVER break tracking (→ null = fail open).
|
|
375
|
+
*/
|
|
376
|
+
private getShopifyCustomerPrivacy;
|
|
377
|
+
private isShopifyStorefront;
|
|
378
|
+
/**
|
|
379
|
+
* Shopify's analytics-consent signal: true/false when the Customer Privacy API is
|
|
380
|
+
* present and answers, null when there's no signal (API absent / unexpected shape)
|
|
381
|
+
* — null means "no restriction from Shopify", i.e. today's behavior.
|
|
382
|
+
*/
|
|
383
|
+
private shopifyAnalyticsConsent;
|
|
384
|
+
/**
|
|
385
|
+
* Shopify's marketing-consent signal (gates pixels, click-id/email → CAPI, cart
|
|
386
|
+
* attribute stamping, auto-identify email capture). Same null semantics as
|
|
387
|
+
* shopifyAnalyticsConsent().
|
|
388
|
+
*/
|
|
389
|
+
private shopifyMarketingConsent;
|
|
390
|
+
/**
|
|
391
|
+
* Listen for Shopify's `visitorConsentCollected` document event (9.A.1) so a
|
|
392
|
+
* consent decision made mid-session takes effect without a reload. Revocation is
|
|
393
|
+
* enforced immediately, mirroring setConsent(): queue gated + purged, pixels torn
|
|
394
|
+
* down, auto-identify (email capture + /account.json polling) destroyed. On grant
|
|
395
|
+
* the queue re-enables (track() re-checks shouldTrack() per event anyway) and cart
|
|
396
|
+
* attribute stamping runs; pixels / auto-identify resume on the next page load —
|
|
397
|
+
* the same convention as optIn().
|
|
398
|
+
*/
|
|
399
|
+
private setupShopifyConsentListener;
|
|
400
|
+
private onShopifyConsentChanged;
|
|
401
|
+
/** Release the automatic landing pageview once, after init and consent. */
|
|
402
|
+
private trackInitialPageViewOnce;
|
|
314
403
|
/**
|
|
315
404
|
* Setup SPA tracking
|
|
316
405
|
* Fixed Issue #15: Store original methods for cleanup
|
|
@@ -361,6 +450,14 @@ declare class Datalyr {
|
|
|
361
450
|
*/
|
|
362
451
|
destroy(): void;
|
|
363
452
|
}
|
|
453
|
+
/**
|
|
454
|
+
* Create an independent SDK instance without reading or mutating window.
|
|
455
|
+
*
|
|
456
|
+
* The CDN bootstrap uses this when an existing global is configured for a
|
|
457
|
+
* different workspace. Package consumers can also opt into multiple explicit
|
|
458
|
+
* instances without changing the default singleton contract below.
|
|
459
|
+
*/
|
|
460
|
+
export declare function createDatalyrInstance(): Datalyr;
|
|
364
461
|
declare const datalyr: Datalyr;
|
|
365
462
|
export { datalyr };
|
|
366
463
|
export default datalyr;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,cAAc,SAAS,CAAC,CAAC;AAE1C,iBAAS,OAAO,IAAI,SAAS,CAO5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-403.test.d.ts","sourceRoot":"","sources":["../src/queue-403.test.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC"}
|
package/dist/queue.d.ts
CHANGED
|
@@ -18,7 +18,10 @@ export declare class EventQueue {
|
|
|
18
18
|
private offlineProcessing;
|
|
19
19
|
private inFlight;
|
|
20
20
|
private enabled;
|
|
21
|
+
private consentCheck?;
|
|
21
22
|
private rateLimitedUntil;
|
|
23
|
+
private droppedEventCount;
|
|
24
|
+
private lastDropStatus;
|
|
22
25
|
constructor(config: any);
|
|
23
26
|
/**
|
|
24
27
|
* Add event to queue
|
|
@@ -101,6 +104,21 @@ export declare class EventQueue {
|
|
|
101
104
|
* Get offline queue size
|
|
102
105
|
*/
|
|
103
106
|
getOfflineQueueSize(): number;
|
|
107
|
+
/**
|
|
108
|
+
* WEB-23: queue health, including events the SDK gave up on.
|
|
109
|
+
*
|
|
110
|
+
* `droppedEvents` is the number this session discarded as permanently rejected
|
|
111
|
+
* (a 400/401). It exists because a silent drop is precisely the failure mode
|
|
112
|
+
* that let the 2026-07-13 `allowed_origins` outage run for eleven days looking
|
|
113
|
+
* exactly like a healthy queue. A non-zero value here means data was lost.
|
|
114
|
+
*/
|
|
115
|
+
getStats(): {
|
|
116
|
+
queued: number;
|
|
117
|
+
offline: number;
|
|
118
|
+
droppedEvents: number;
|
|
119
|
+
lastDropStatus: number | null;
|
|
120
|
+
backoffUntil: number;
|
|
121
|
+
};
|
|
104
122
|
/**
|
|
105
123
|
* Get network status
|
|
106
124
|
*/
|
|
@@ -125,10 +143,13 @@ export declare class EventQueue {
|
|
|
125
143
|
* - Non-terminal (tab switch): deliver the LIVE queue via a response-checked keepalive
|
|
126
144
|
* fetch (flush) and response-check-drain the offline backlog (processOfflineQueue) —
|
|
127
145
|
* neither erases the backlog on failure. The destructive beacon path is not used.
|
|
128
|
-
* - Terminal (unload):
|
|
129
|
-
* and NEVER storage.remove() on a mere beacon enqueue.
|
|
130
|
-
*
|
|
131
|
-
*
|
|
146
|
+
* - Terminal (unload): PERSIST everything first (live + the already-persisted offline
|
|
147
|
+
* backlog) and NEVER storage.remove() on a mere beacon enqueue. Beacon ONLY the LIVE
|
|
148
|
+
* queue best-effort — NOT the offline backlog (TR-13): the backlog is already durable and
|
|
149
|
+
* the next-load drain delivers it exactly once, so beaconing it here too risked a
|
|
150
|
+
* delivered-now-AND-re-drained-next-load double-send that, when >6h apart, outlives
|
|
151
|
+
* ingest's dedup window → a duplicate purchase. The next page load's response-checked
|
|
152
|
+
* drain (normal fetch, no 64KB cap) is the source of truth and clears the copy.
|
|
132
153
|
* - Both paths honor rateLimitedUntil (don't beacon/flush into the backoff window).
|
|
133
154
|
*
|
|
134
155
|
* Still excludes the in-flight _flush batch (its keepalive fetch already carries it,
|
|
@@ -146,6 +167,13 @@ export declare class EventQueue {
|
|
|
146
167
|
* the on-load drain both honor this).
|
|
147
168
|
*/
|
|
148
169
|
setEnabled(enabled: boolean): void;
|
|
170
|
+
/**
|
|
171
|
+
* TR-15: register a live consent predicate the offline drain re-evaluates at drain time.
|
|
172
|
+
* `enabled` is latched at init to a fail-open value (Shopify's customerPrivacy loads
|
|
173
|
+
* async), and a returning DECLINED visitor fires no visitorConsentCollected event — so
|
|
174
|
+
* without this, their persisted backlog would drain before the decline is known.
|
|
175
|
+
*/
|
|
176
|
+
setConsentCheck(fn: () => boolean): void;
|
|
149
177
|
/**
|
|
150
178
|
* Clear the offline queue and its persisted copy (used by opt-out to purge any
|
|
151
179
|
* PII-bearing events that were parked before the user opted out).
|
package/dist/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAsB,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAsB,aAAa,EAAE,MAAM,SAAS,CAAC;AA6BrF,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,qBAAqB,CAA+C;IAC5E,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAYZ;IACF,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,oBAAoB,CAAQ;IACpC,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,YAAY,CAAC,CAAgB;IACrC,OAAO,CAAC,gBAAgB,CAAK;IAI7B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAAuB;gBAEjC,MAAM,EAAE,GAAG;IAyCvB;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAsDxC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAwBnB;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB5B;;;OAGG;YACW,MAAM;IA+DpB;;OAEG;YACW,SAAS;IAgHvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IA0D1B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAW9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;OAEG;YACW,mBAAmB;IAqEjC;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;;;;;;OAOG;IACH,QAAQ,IAAI;QACV,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,YAAY,EAAE,MAAM,CAAC;KACtB;IAUD;;OAEG;IACH,gBAAgB,IAAI,aAAa;IAIjC;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACG,UAAU,CAAC,UAAU,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoFnD;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;;;OAIG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,OAAO,GAAG,IAAI;IAIxC;;;OAGG;IACH,YAAY,IAAI,IAAI;IAKpB;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,OAAO,IAAI,IAAI;CAWhB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-migration.test.d.ts","sourceRoot":"","sources":["../src/storage-migration.test.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC"}
|
package/dist/storage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,UAAU,cAAc;IACtB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IACpE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC;IACtC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,IAAI,IAAI,MAAM,EAAE,CAAC;IAEjB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5D,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD;AAED,cAAM,WAAY,YAAW,cAAc;IACzC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,CAAC,EAAE,OAAO;IAmB7B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,GAAE,GAAU,GAAG,GAAG;IA6B/C;;;;;;;;OAQG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,GAAG,IAAI;IAwBzE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO;IAqBrC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAgB5B,IAAI,IAAI,MAAM,EAAE;IAqBhB;;;;;;;OAOG;IACH,uBAAuB,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,UAAU,cAAc;IACtB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IACpE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC;IACtC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,IAAI,IAAI,MAAM,EAAE,CAAC;IAEjB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5D,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD;AAED,cAAM,WAAY,YAAW,cAAc;IACzC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,CAAC,EAAE,OAAO;IAmB7B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,GAAE,GAAU,GAAG,GAAG;IA6B/C;;;;;;;;OAQG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,GAAG,IAAI;IAwBzE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO;IAqBrC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAgB5B,IAAI,IAAI,MAAM,EAAE;IAqBhB;;;;;;;OAOG;IACH,uBAAuB,IAAI,MAAM;IAmEjC;;;;;;OAMG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,GAAE,GAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IA2BvE;;;;;;;;;OASG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;CAe9D;AAGD,cAAM,aAAa;IACjB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,MAAM,CAAmB;gBAErB,OAAO,GAAE;QACnB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;QACrC,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;KACtB;IAON,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA2BhC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAgCxD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAuB7B;;OAEG;IACH,OAAO,CAAC,aAAa;CA8BtB;AAaD,eAAO,MAAM,OAAO,aAAuC,CAAC;AAC5D,eAAO,MAAM,cAAc,aAAyC,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAE,CAAC;AAGzB,eAAO,MAAM,OAAO,eAAsB,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stripe Checkout Session capture.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS
|
|
5
|
+
* syncStripePaymentLinks stamps `client_reference_id` onto buy.stripe.com
|
|
6
|
+
* anchors, and deliberately never onto checkout.stripe.com — a Checkout Session
|
|
7
|
+
* URL ignores the param because the session already exists server-side. That
|
|
8
|
+
* leaves the single most common SaaS pattern uncovered: the merchant's backend
|
|
9
|
+
* creates a Session and the browser is sent to checkout.stripe.com/c/pay/cs_...
|
|
10
|
+
* The payment then reaches our webhook with no visitor at all.
|
|
11
|
+
*
|
|
12
|
+
* Measured 2026-07-25, 30d: of payers arriving via Stripe webhooks, 0.5% (one
|
|
13
|
+
* tenant, 128/28,187) and 13.3% (another, 13/98) had ANY web pageview on the
|
|
14
|
+
* same visitor. Not a misconfiguration — no tenant is wired, because being
|
|
15
|
+
* wired currently requires the merchant to hand-write client_reference_id.
|
|
16
|
+
*
|
|
17
|
+
* WHAT THIS DOES
|
|
18
|
+
* The session id must reach the browser for the redirect to happen at all, so
|
|
19
|
+
* we observe it rather than trying to inject anything:
|
|
20
|
+
* 1. fetch/XHR response bodies — `{url}` or `{sessionId}` from the
|
|
21
|
+
* merchant's own create-session endpoint
|
|
22
|
+
* 2. anchor clicks + window.open — direct links to checkout.stripe.com
|
|
23
|
+
* A server-side 302 straight to Stripe never exposes the id to JS and is NOT
|
|
24
|
+
* covered here; that case falls back to the email bridge.
|
|
25
|
+
*
|
|
26
|
+
* WHY THIS IS SAFE TO DEFAULT ON, WHEN autoIdentifyAPI IS NOT
|
|
27
|
+
* autoIdentifyAPI scans the same traffic for EMAILS, which is why it defaults
|
|
28
|
+
* off: an admin viewing a customer record gets identified as that customer, and
|
|
29
|
+
* a wrong email propagates into Meta advanced matching. A `cs_live_...` token is
|
|
30
|
+
* unambiguous, belongs to exactly one checkout, and is not PII. There is no
|
|
31
|
+
* mis-identification failure mode to guard against — only the wrapper itself,
|
|
32
|
+
* which is why every hook below is transparent and failure-isolated.
|
|
33
|
+
*/
|
|
34
|
+
export type StripeSessionSink = (sessionId: string) => void;
|
|
35
|
+
export interface StripeSessionWatcherOptions {
|
|
36
|
+
/** Emit at most this many distinct session ids per page. */
|
|
37
|
+
maxSessions?: number;
|
|
38
|
+
/** Test seam. */
|
|
39
|
+
maxScanBytes?: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function extractSessionId(text: string | null | undefined): string | null;
|
|
42
|
+
/**
|
|
43
|
+
* True when `href` points at a Stripe-hosted checkout. Uses the URL API and
|
|
44
|
+
* exact host equality — `a[href*="checkout.stripe.com"]` would match
|
|
45
|
+
* `evil.com/checkout.stripe.com/x` and `checkout.stripe.com.evil.com`.
|
|
46
|
+
*/
|
|
47
|
+
export declare function isCheckoutUrl(href: string, base?: string): boolean;
|
|
48
|
+
export declare class StripeSessionWatcher {
|
|
49
|
+
private sink?;
|
|
50
|
+
private seen;
|
|
51
|
+
private disposers;
|
|
52
|
+
private started;
|
|
53
|
+
private readonly maxSessions;
|
|
54
|
+
private readonly maxScanBytes;
|
|
55
|
+
constructor(options?: StripeSessionWatcherOptions);
|
|
56
|
+
start(sink: StripeSessionSink): void;
|
|
57
|
+
stop(): void;
|
|
58
|
+
/** Report a session id at most once, and never more than maxSessions per page. */
|
|
59
|
+
private emit;
|
|
60
|
+
/**
|
|
61
|
+
* Scan a Response WITHOUT disturbing the merchant's own read. `clone()` must
|
|
62
|
+
* happen synchronously, before the caller can consume the body; the read of
|
|
63
|
+
* the clone is deliberately not awaited by the caller.
|
|
64
|
+
*/
|
|
65
|
+
private scanResponse;
|
|
66
|
+
private hookFetch;
|
|
67
|
+
private hookXhr;
|
|
68
|
+
/**
|
|
69
|
+
* Direct links to checkout.stripe.com. Capture phase so we still see the click
|
|
70
|
+
* when the merchant's own handler calls stopPropagation().
|
|
71
|
+
*/
|
|
72
|
+
private hookClicks;
|
|
73
|
+
private hookWindowOpen;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=stripe-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripe-session.d.ts","sourceRoot":"","sources":["../src/stripe-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAkBH,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;AAE5D,MAAM,WAAW,2BAA2B;IAC1C,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAI/E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAUlE;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAoB;IACjC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,GAAE,2BAAgC;IAKrD,KAAK,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAUpC,IAAI,IAAI,IAAI;IAcZ,kFAAkF;IAClF,OAAO,CAAC,IAAI;IAWZ;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,SAAS;IAuBjB,OAAO,CAAC,OAAO;IA8Bf;;;OAGG;IACH,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,cAAc;CAmBvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripe-session.test.d.ts","sourceRoot":"","sources":["../src/stripe-session.test.ts"],"names":[],"mappings":""}
|
package/dist/types.d.ts
CHANGED
|
@@ -38,6 +38,7 @@ export interface DatalyrConfig {
|
|
|
38
38
|
shopifyCartAttributes?: boolean;
|
|
39
39
|
platform?: 'shopify' | 'checkoutchamp' | 'generic';
|
|
40
40
|
checkoutChampDomains?: string[];
|
|
41
|
+
stripeCheckoutSessions?: boolean;
|
|
41
42
|
stripePaymentLinks?: boolean;
|
|
42
43
|
stripeLinkDomains?: string[];
|
|
43
44
|
fallbackEndpoints?: string[];
|
|
@@ -168,6 +169,7 @@ export interface IngestEventPayload {
|
|
|
168
169
|
received_at?: string;
|
|
169
170
|
sdk_version?: string;
|
|
170
171
|
sdk_name?: string;
|
|
172
|
+
schema_version?: number;
|
|
171
173
|
}
|
|
172
174
|
export interface IngestBatchPayload {
|
|
173
175
|
events: IngestEventPayload[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAE5B,WAAW,EAAE,MAAM,CAAC;IAGpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAGhB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAGzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,WAAW,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IAGpC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAG/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAG1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC;IACtC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAUhC,QAAQ,CAAC,EAAE,SAAS,GAAG,eAAe,GAAG,SAAS,CAAC;IACnD,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -31,6 +31,19 @@ export declare function getAllQueryParams(search?: string): Record<string, strin
|
|
|
31
31
|
* Sanitize event data (remove sensitive keys, DOM elements, functions)
|
|
32
32
|
*/
|
|
33
33
|
export declare function sanitizeEventData(data: any, maxDepth?: number, currentDepth?: number): any;
|
|
34
|
+
/**
|
|
35
|
+
* Redact secret/PII param VALUES in a URL (9.A.4). The param NAME is kept
|
|
36
|
+
* (value → `__redacted__`) so funnel steps that match on the param's presence still
|
|
37
|
+
* work; every other param — click IDs (fbclid/gclid/…) and utm_* — survives untouched.
|
|
38
|
+
* Both the query string AND a k=v fragment are rewritten: TR-04 — OAuth-implicit /
|
|
39
|
+
* Supabase magic links carry the session in the FRAGMENT (`/welcome#access_token=eyJ…`),
|
|
40
|
+
* with no query string at all; the old code returned early on a missing `?` and reattached
|
|
41
|
+
* the fragment verbatim, leaking the full JWT into `url` / `landingPage` / `dl_first_touch`
|
|
42
|
+
* (90d) and onward to ad platforms. Non-k=v fragments (`#section`, `#/spa-route`) keep their
|
|
43
|
+
* shape. Returns the input unchanged when nothing sensitive matched or on any parse
|
|
44
|
+
* failure — redaction must never break tracking.
|
|
45
|
+
*/
|
|
46
|
+
export declare function redactUrl(url: string): string;
|
|
34
47
|
/**
|
|
35
48
|
* Deep merge objects
|
|
36
49
|
*/
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYrE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAYrC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAyB,GAAG,MAAM,GAAG,IAAI,CAsB1F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,SAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BzF;AAgCD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,SAAI,EAAE,YAAY,SAAI,GAAG,GAAG,CA2DhF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAgB7D;AAMD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,MAAM,GACX,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAOlC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,MAAM,CAI7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAI7C;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAGvD;AAkCD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmB7D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CActC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYrE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAYrC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAyB,GAAG,MAAM,GAAG,IAAI,CAsB1F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,SAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BzF;AAgCD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,SAAI,EAAE,YAAY,SAAI,GAAG,GAAG,CA2DhF;AA2DD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA4C7C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAgB7D;AAMD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,MAAM,GACX,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAOlC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,MAAM,CAI7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAI7C;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAGvD;AAkCD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmB7D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CActC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAkBrD"}
|
package/dist/utils.test.d.ts
CHANGED
package/dist/utils.test.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datalyr/web",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.8",
|
|
4
4
|
"description": "Datalyr Web SDK - Modern attribution tracking for web applications",
|
|
5
5
|
"main": "dist/datalyr.js",
|
|
6
6
|
"module": "dist/datalyr.esm.js",
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@rollup/plugin-commonjs": "^25.0.7",
|
|
43
43
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
44
|
+
"@rollup/plugin-replace": "^6.0.3",
|
|
44
45
|
"@rollup/plugin-terser": "^0.4.4",
|
|
45
46
|
"@rollup/plugin-typescript": "^11.1.5",
|
|
46
47
|
"@types/jest": "^29.5.11",
|