@neowhale/storefront 0.2.12 → 0.2.19
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/dist/chunk-7KXJLHGA.cjs +160 -0
- package/dist/chunk-7KXJLHGA.cjs.map +1 -0
- package/dist/{chunk-3VKRKDPL.cjs → chunk-CQCCXDUS.cjs} +52 -11
- package/dist/chunk-CQCCXDUS.cjs.map +1 -0
- package/dist/chunk-PXS2DPVL.js +158 -0
- package/dist/chunk-PXS2DPVL.js.map +1 -0
- package/dist/{chunk-M2MR6C55.js → chunk-XHWAUMWS.js} +52 -11
- package/dist/chunk-XHWAUMWS.js.map +1 -0
- package/dist/{client-T1eA5Xs-.d.cts → client-D1XVKpFt.d.cts} +78 -4
- package/dist/{client-T1eA5Xs-.d.ts → client-D1XVKpFt.d.ts} +78 -4
- package/dist/index.cjs +5 -5
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/next/index.cjs +7 -6
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.d.cts +1 -1
- package/dist/next/index.d.ts +1 -1
- package/dist/next/index.js +5 -4
- package/dist/next/index.js.map +1 -1
- package/dist/{pixel-manager-1C6-h9Rp.d.ts → pixel-manager-C6PAp7vQ.d.ts} +1 -1
- package/dist/{pixel-manager-BHE1nZ90.d.cts → pixel-manager-DZwpn_x2.d.cts} +1 -1
- package/dist/react/index.cjs +1290 -56
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +54 -7
- package/dist/react/index.d.ts +54 -7
- package/dist/react/index.js +1284 -55
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-3VKRKDPL.cjs.map +0 -1
- package/dist/chunk-BTGOSNMP.cjs +0 -95
- package/dist/chunk-BTGOSNMP.cjs.map +0 -1
- package/dist/chunk-M2MR6C55.js.map +0 -1
- package/dist/chunk-NLH3W6JA.js +0 -93
- package/dist/chunk-NLH3W6JA.js.map +0 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/pixels/meta-pixel.ts
|
|
4
|
+
var EVENT_MAP = {
|
|
5
|
+
page_view: "PageView",
|
|
6
|
+
product_view: "ViewContent",
|
|
7
|
+
add_to_cart: "AddToCart",
|
|
8
|
+
remove_from_cart: "RemoveFromCart",
|
|
9
|
+
begin_checkout: "InitiateCheckout",
|
|
10
|
+
purchase: "Purchase",
|
|
11
|
+
search: "Search",
|
|
12
|
+
category_view: "ViewContent"
|
|
13
|
+
};
|
|
14
|
+
var MetaPixelProvider = class {
|
|
15
|
+
constructor(pixelId) {
|
|
16
|
+
this.name = "meta";
|
|
17
|
+
this.loaded = false;
|
|
18
|
+
this.pixelId = pixelId;
|
|
19
|
+
}
|
|
20
|
+
async load() {
|
|
21
|
+
if (typeof window === "undefined") return;
|
|
22
|
+
if (this.loaded) return;
|
|
23
|
+
const w = window;
|
|
24
|
+
if (!w.fbq) {
|
|
25
|
+
const n = w.fbq = function(...args) {
|
|
26
|
+
n.callMethod ? n.callMethod.apply(n, args) : n.queue.push(args);
|
|
27
|
+
};
|
|
28
|
+
if (!w._fbq) w._fbq = n;
|
|
29
|
+
n.push = n;
|
|
30
|
+
n.loaded = true;
|
|
31
|
+
n.version = "2.0";
|
|
32
|
+
n.queue = [];
|
|
33
|
+
}
|
|
34
|
+
await new Promise((resolve) => {
|
|
35
|
+
const script = document.createElement("script");
|
|
36
|
+
script.async = true;
|
|
37
|
+
script.src = "https://connect.facebook.net/en_US/fbevents.js";
|
|
38
|
+
script.onload = () => resolve();
|
|
39
|
+
script.onerror = () => resolve();
|
|
40
|
+
const first = document.getElementsByTagName("script")[0];
|
|
41
|
+
first?.parentNode?.insertBefore(script, first);
|
|
42
|
+
});
|
|
43
|
+
w.fbq("init", this.pixelId);
|
|
44
|
+
w.fbq("track", "PageView");
|
|
45
|
+
this.loaded = true;
|
|
46
|
+
}
|
|
47
|
+
track(event, params) {
|
|
48
|
+
if (typeof window === "undefined") return;
|
|
49
|
+
const w = window;
|
|
50
|
+
if (typeof w.fbq !== "function") return;
|
|
51
|
+
const metaEvent = EVENT_MAP[event];
|
|
52
|
+
if (!metaEvent) return;
|
|
53
|
+
const { eventID, ...rest } = params ?? {};
|
|
54
|
+
const hasParams = Object.keys(rest).length > 0;
|
|
55
|
+
const options = eventID ? { eventID } : void 0;
|
|
56
|
+
if (hasParams) {
|
|
57
|
+
w.fbq("track", metaEvent, rest, options);
|
|
58
|
+
} else {
|
|
59
|
+
w.fbq("track", metaEvent, {}, options);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
isLoaded() {
|
|
63
|
+
return this.loaded;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// src/pixels/google-pixel.ts
|
|
68
|
+
var EVENT_MAP2 = {
|
|
69
|
+
page_view: "page_view",
|
|
70
|
+
product_view: "view_item",
|
|
71
|
+
add_to_cart: "add_to_cart",
|
|
72
|
+
remove_from_cart: "remove_from_cart",
|
|
73
|
+
begin_checkout: "begin_checkout",
|
|
74
|
+
purchase: "purchase",
|
|
75
|
+
search: "search",
|
|
76
|
+
category_view: "view_item_list"
|
|
77
|
+
};
|
|
78
|
+
var GooglePixelProvider = class {
|
|
79
|
+
constructor(measurementId) {
|
|
80
|
+
this.name = "google";
|
|
81
|
+
this.loaded = false;
|
|
82
|
+
this.measurementId = measurementId;
|
|
83
|
+
}
|
|
84
|
+
async load() {
|
|
85
|
+
if (typeof window === "undefined") return;
|
|
86
|
+
if (this.loaded) return;
|
|
87
|
+
const w = window;
|
|
88
|
+
w.dataLayer = w.dataLayer || [];
|
|
89
|
+
if (!w.gtag) {
|
|
90
|
+
w.gtag = function(...args) {
|
|
91
|
+
w.dataLayer.push(arguments);
|
|
92
|
+
};
|
|
93
|
+
w.gtag("js", /* @__PURE__ */ new Date());
|
|
94
|
+
w.gtag("config", this.measurementId);
|
|
95
|
+
}
|
|
96
|
+
await new Promise((resolve) => {
|
|
97
|
+
const script = document.createElement("script");
|
|
98
|
+
script.async = true;
|
|
99
|
+
script.src = `https://www.googletagmanager.com/gtag/js?id=${this.measurementId}`;
|
|
100
|
+
script.onload = () => resolve();
|
|
101
|
+
script.onerror = () => resolve();
|
|
102
|
+
document.head.appendChild(script);
|
|
103
|
+
});
|
|
104
|
+
this.loaded = true;
|
|
105
|
+
}
|
|
106
|
+
track(event, params) {
|
|
107
|
+
if (typeof window === "undefined") return;
|
|
108
|
+
const w = window;
|
|
109
|
+
if (typeof w.gtag !== "function") return;
|
|
110
|
+
const ga4Event = EVENT_MAP2[event];
|
|
111
|
+
if (!ga4Event) return;
|
|
112
|
+
const { eventID, product_id, product_name, quantity, price, tier, total, order_id, order_number, cart_id, item_count, query, result_count, ...rest } = params ?? {};
|
|
113
|
+
const ga4Params = { ...rest };
|
|
114
|
+
if (total !== void 0) ga4Params.value = total;
|
|
115
|
+
if (order_id) ga4Params.transaction_id = order_id;
|
|
116
|
+
if (query) ga4Params.search_term = query;
|
|
117
|
+
if (product_id) {
|
|
118
|
+
ga4Params.items = [{
|
|
119
|
+
item_id: product_id,
|
|
120
|
+
item_name: product_name,
|
|
121
|
+
quantity: quantity ?? 1,
|
|
122
|
+
price,
|
|
123
|
+
item_variant: tier
|
|
124
|
+
}];
|
|
125
|
+
}
|
|
126
|
+
ga4Params.currency = "USD";
|
|
127
|
+
w.gtag("event", ga4Event, ga4Params);
|
|
128
|
+
}
|
|
129
|
+
isLoaded() {
|
|
130
|
+
return this.loaded;
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// src/pixels/pixel-manager.ts
|
|
135
|
+
var PixelManager = class {
|
|
136
|
+
constructor(configs) {
|
|
137
|
+
this.providers = [];
|
|
138
|
+
for (const config of configs) {
|
|
139
|
+
if (config.provider === "meta" && config.pixel_id) {
|
|
140
|
+
this.providers.push(new MetaPixelProvider(config.pixel_id));
|
|
141
|
+
} else if (config.provider === "google" && config.measurement_id) {
|
|
142
|
+
this.providers.push(new GooglePixelProvider(config.measurement_id));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async initialize() {
|
|
147
|
+
await Promise.all(this.providers.map((p) => p.load()));
|
|
148
|
+
}
|
|
149
|
+
track(event, params) {
|
|
150
|
+
for (const provider of this.providers) {
|
|
151
|
+
if (provider.isLoaded()) {
|
|
152
|
+
provider.track(event, params);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
exports.PixelManager = PixelManager;
|
|
159
|
+
//# sourceMappingURL=chunk-7KXJLHGA.cjs.map
|
|
160
|
+
//# sourceMappingURL=chunk-7KXJLHGA.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pixels/meta-pixel.ts","../src/pixels/google-pixel.ts","../src/pixels/pixel-manager.ts"],"names":["EVENT_MAP"],"mappings":"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","file":"chunk-7KXJLHGA.cjs","sourcesContent":["import type { PixelProvider } from './types.js'\n\n/** Map SDK event names → Meta standard event names */\nconst EVENT_MAP: Record<string, string> = {\n page_view: 'PageView',\n product_view: 'ViewContent',\n add_to_cart: 'AddToCart',\n remove_from_cart: 'RemoveFromCart',\n begin_checkout: 'InitiateCheckout',\n purchase: 'Purchase',\n search: 'Search',\n category_view: 'ViewContent',\n}\n\nexport class MetaPixelProvider implements PixelProvider {\n readonly name = 'meta'\n private pixelId: string\n private loaded = false\n\n constructor(pixelId: string) {\n this.pixelId = pixelId\n }\n\n async load(): Promise<void> {\n if (typeof window === 'undefined') return\n if (this.loaded) return\n\n // Initialize fbq queue\n const w = window as any\n if (!w.fbq) {\n const n: any = (w.fbq = function (...args: any[]) {\n n.callMethod ? n.callMethod.apply(n, args) : n.queue.push(args)\n })\n if (!w._fbq) w._fbq = n\n n.push = n\n n.loaded = true\n n.version = '2.0'\n n.queue = []\n }\n\n // Inject script\n await new Promise<void>((resolve) => {\n const script = document.createElement('script')\n script.async = true\n script.src = 'https://connect.facebook.net/en_US/fbevents.js'\n script.onload = () => resolve()\n script.onerror = () => resolve() // don't block on load failure\n const first = document.getElementsByTagName('script')[0]\n first?.parentNode?.insertBefore(script, first)\n })\n\n w.fbq('init', this.pixelId)\n w.fbq('track', 'PageView')\n this.loaded = true\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n if (typeof window === 'undefined') return\n const w = window as any\n if (typeof w.fbq !== 'function') return\n\n const metaEvent = EVENT_MAP[event]\n if (!metaEvent) return\n\n // Extract eventID for Meta dedup (fbq 4th arg), pass remaining as event params\n const { eventID, ...rest } = params ?? {}\n const hasParams = Object.keys(rest).length > 0\n const options = eventID ? { eventID } : undefined\n\n if (hasParams) {\n w.fbq('track', metaEvent, rest, options)\n } else {\n w.fbq('track', metaEvent, {}, options)\n }\n }\n\n isLoaded(): boolean {\n return this.loaded\n }\n}\n","import type { PixelProvider } from './types.js'\n\n/** Map SDK event names → GA4 recommended event names */\nconst EVENT_MAP: Record<string, string> = {\n page_view: 'page_view',\n product_view: 'view_item',\n add_to_cart: 'add_to_cart',\n remove_from_cart: 'remove_from_cart',\n begin_checkout: 'begin_checkout',\n purchase: 'purchase',\n search: 'search',\n category_view: 'view_item_list',\n}\n\nexport class GooglePixelProvider implements PixelProvider {\n readonly name = 'google'\n private measurementId: string\n private loaded = false\n\n constructor(measurementId: string) {\n this.measurementId = measurementId\n }\n\n async load(): Promise<void> {\n if (typeof window === 'undefined') return\n if (this.loaded) return\n\n const w = window as any\n\n // Initialize dataLayer\n w.dataLayer = w.dataLayer || []\n if (!w.gtag) {\n w.gtag = function (...args: any[]) {\n w.dataLayer.push(arguments)\n }\n w.gtag('js', new Date())\n w.gtag('config', this.measurementId)\n }\n\n // Inject gtag.js script\n await new Promise<void>((resolve) => {\n const script = document.createElement('script')\n script.async = true\n script.src = `https://www.googletagmanager.com/gtag/js?id=${this.measurementId}`\n script.onload = () => resolve()\n script.onerror = () => resolve()\n document.head.appendChild(script)\n })\n\n this.loaded = true\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n if (typeof window === 'undefined') return\n const w = window as any\n if (typeof w.gtag !== 'function') return\n\n const ga4Event = EVENT_MAP[event]\n if (!ga4Event) return\n\n // Strip eventID (Meta-specific), map to GA4 params\n const { eventID, product_id, product_name, quantity, price, tier, total, order_id, order_number, cart_id, item_count, query, result_count, ...rest } = params ?? {}\n\n const ga4Params: Record<string, unknown> = { ...rest }\n\n if (total !== undefined) ga4Params.value = total\n if (order_id) ga4Params.transaction_id = order_id\n if (query) ga4Params.search_term = query\n\n // Build items array for e-commerce events\n if (product_id) {\n ga4Params.items = [{\n item_id: product_id,\n item_name: product_name,\n quantity: quantity ?? 1,\n price,\n item_variant: tier,\n }]\n }\n\n ga4Params.currency = 'USD'\n\n w.gtag('event', ga4Event, ga4Params)\n }\n\n isLoaded(): boolean {\n return this.loaded\n }\n}\n","import type { PixelConfig, PixelProvider } from './types.js'\nimport { MetaPixelProvider } from './meta-pixel.js'\nimport { GooglePixelProvider } from './google-pixel.js'\n\nexport class PixelManager {\n private providers: PixelProvider[] = []\n\n constructor(configs: PixelConfig[]) {\n for (const config of configs) {\n if (config.provider === 'meta' && config.pixel_id) {\n this.providers.push(new MetaPixelProvider(config.pixel_id))\n } else if (config.provider === 'google' && config.measurement_id) {\n this.providers.push(new GooglePixelProvider(config.measurement_id))\n }\n }\n }\n\n async initialize(): Promise<void> {\n await Promise.all(this.providers.map((p) => p.load()))\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n for (const provider of this.providers) {\n if (provider.isLoaded()) {\n provider.track(event, params)\n }\n }\n }\n}\n"]}
|
|
@@ -200,12 +200,13 @@ var WhaleClient = class {
|
|
|
200
200
|
return this.request(`/cart/${cartId}/items/${itemId}`, { method: "DELETE" });
|
|
201
201
|
}
|
|
202
202
|
// -- Checkout --
|
|
203
|
-
async checkout(cartId, customerEmail, payment) {
|
|
203
|
+
async checkout(cartId, customerEmail, payment, referralCode) {
|
|
204
204
|
return this.request("/checkout", {
|
|
205
205
|
method: "POST",
|
|
206
206
|
body: JSON.stringify({
|
|
207
207
|
cart_id: cartId,
|
|
208
208
|
...customerEmail && { customer_email: customerEmail },
|
|
209
|
+
...referralCode && { referral_code: referralCode },
|
|
209
210
|
...payment && {
|
|
210
211
|
payment_method: payment.payment_method,
|
|
211
212
|
...payment.opaque_data && { opaque_data: payment.opaque_data },
|
|
@@ -227,6 +228,12 @@ var WhaleClient = class {
|
|
|
227
228
|
async createCustomer(data) {
|
|
228
229
|
return this.request("/customers", { method: "POST", body: JSON.stringify(data) });
|
|
229
230
|
}
|
|
231
|
+
async updateProfile(customerId, data) {
|
|
232
|
+
return this.request("/storefront/profile", {
|
|
233
|
+
method: "PATCH",
|
|
234
|
+
body: JSON.stringify({ customer_id: customerId, ...data })
|
|
235
|
+
});
|
|
236
|
+
}
|
|
230
237
|
// -- Orders --
|
|
231
238
|
async listOrders(params) {
|
|
232
239
|
const sp = new URLSearchParams();
|
|
@@ -300,7 +307,13 @@ var WhaleClient = class {
|
|
|
300
307
|
"x-api-key": this.apiKey
|
|
301
308
|
};
|
|
302
309
|
if (this._sessionToken) headers["Authorization"] = `Bearer ${this._sessionToken}`;
|
|
303
|
-
|
|
310
|
+
const payload = {
|
|
311
|
+
event_name: params.event_type,
|
|
312
|
+
session_id: params.session_id,
|
|
313
|
+
event_properties: params.event_data
|
|
314
|
+
};
|
|
315
|
+
if (params.visitor_id) payload.visitor_id = params.visitor_id;
|
|
316
|
+
await resilientSend(url, payload, headers);
|
|
304
317
|
}
|
|
305
318
|
// -- Checkout Sessions --
|
|
306
319
|
async createCheckoutSession(params) {
|
|
@@ -429,23 +442,51 @@ var WhaleClient = class {
|
|
|
429
442
|
body: JSON.stringify(params)
|
|
430
443
|
});
|
|
431
444
|
}
|
|
432
|
-
// --
|
|
433
|
-
async
|
|
445
|
+
// -- Deals (discount codes) --
|
|
446
|
+
async validateDeal(code, params) {
|
|
434
447
|
const sp = new URLSearchParams({ code });
|
|
435
448
|
if (params?.cart_id) sp.set("cart_id", params.cart_id);
|
|
436
|
-
return this.request(`/storefront/
|
|
449
|
+
return this.request(`/storefront/deals/validate?${sp}`);
|
|
437
450
|
}
|
|
438
|
-
async
|
|
439
|
-
return this.request(`/cart/${cartId}/
|
|
451
|
+
async applyDeal(cartId, code) {
|
|
452
|
+
return this.request(`/cart/${cartId}/deal`, {
|
|
440
453
|
method: "POST",
|
|
441
454
|
body: JSON.stringify({ code })
|
|
442
455
|
});
|
|
443
456
|
}
|
|
444
|
-
async
|
|
445
|
-
return this.request(`/cart/${cartId}/
|
|
457
|
+
async removeDeal(cartId) {
|
|
458
|
+
return this.request(`/cart/${cartId}/deal`, {
|
|
446
459
|
method: "DELETE"
|
|
447
460
|
});
|
|
448
461
|
}
|
|
462
|
+
/** @deprecated Use validateDeal instead */
|
|
463
|
+
async validateCoupon(code, params) {
|
|
464
|
+
return this.validateDeal(code, params);
|
|
465
|
+
}
|
|
466
|
+
/** @deprecated Use applyDeal instead */
|
|
467
|
+
async applyCoupon(cartId, code) {
|
|
468
|
+
return this.applyDeal(cartId, code);
|
|
469
|
+
}
|
|
470
|
+
/** @deprecated Use removeDeal instead */
|
|
471
|
+
async removeCoupon(cartId) {
|
|
472
|
+
return this.removeDeal(cartId);
|
|
473
|
+
}
|
|
474
|
+
// -- Referrals --
|
|
475
|
+
async enrollReferral(customerId) {
|
|
476
|
+
return this.request("/storefront/referrals/enroll", {
|
|
477
|
+
method: "POST",
|
|
478
|
+
body: JSON.stringify({ customer_id: customerId })
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
async getReferralStatus(customerId) {
|
|
482
|
+
return this.request(`/storefront/referrals/status?customer_id=${customerId}`);
|
|
483
|
+
}
|
|
484
|
+
async attributeReferral(customerId, referralCode) {
|
|
485
|
+
return this.request("/storefront/referrals/attribute", {
|
|
486
|
+
method: "POST",
|
|
487
|
+
body: JSON.stringify({ customer_id: customerId, referral_code: referralCode })
|
|
488
|
+
});
|
|
489
|
+
}
|
|
449
490
|
};
|
|
450
491
|
// -- Static Media Utilities --
|
|
451
492
|
WhaleClient.encodeBase64Url = encodeBase64Url;
|
|
@@ -453,5 +494,5 @@ WhaleClient.signMedia = signMedia;
|
|
|
453
494
|
|
|
454
495
|
exports.WhaleClient = WhaleClient;
|
|
455
496
|
exports.resilientSend = resilientSend;
|
|
456
|
-
//# sourceMappingURL=chunk-
|
|
457
|
-
//# sourceMappingURL=chunk-
|
|
497
|
+
//# sourceMappingURL=chunk-CQCCXDUS.cjs.map
|
|
498
|
+
//# sourceMappingURL=chunk-CQCCXDUS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resilient-send.ts","../src/client-queries.ts","../src/client.ts"],"names":[],"mappings":"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","file":"chunk-CQCCXDUS.cjs","sourcesContent":["/**\n * Resilient HTTP sender for analytics/event payloads.\n *\n * Retries transient (5xx / network) failures with linear back-off,\n * then falls back to navigator.sendBeacon so the event still lands\n * even when the tab is being unloaded.\n *\n * 4xx responses are NOT retried — they indicate a client error that\n * won't resolve by resending.\n */\n\nconst MAX_RETRIES = 2\nconst RETRY_DELAY_MS = 1000\n\nexport async function resilientSend(\n url: string,\n payload: object,\n headers: Record<string, string>,\n): Promise<void> {\n const body = JSON.stringify(payload)\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers,\n body,\n keepalive: true,\n })\n // Success or client-error (4xx) — don't retry\n if (res.ok || res.status < 500) return\n } catch {\n // Network error — retry\n }\n\n if (attempt < MAX_RETRIES) {\n await new Promise<void>((r) => setTimeout(r, RETRY_DELAY_MS * (attempt + 1)))\n }\n }\n\n // All retries exhausted — fire-and-forget via sendBeacon\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\n navigator.sendBeacon(url, body)\n }\n}\n","/**\n * Extended query methods and static utilities for WhaleClient.\n * Extracted from client.ts to keep the core under 300 lines.\n */\n\nimport type {\n Customer,\n CustomerAnalytics,\n ListResponse,\n Location,\n Order,\n SendCodeResponse,\n StorefrontSession,\n VerifyCodeResponse,\n EventType,\n} from './types.js'\n\n/**\n * Paginate through all customer orders.\n */\nexport async function fetchAllCustomerOrders(\n requestFn: <T>(path: string, opts?: RequestInit) => Promise<T>,\n customerId: string\n): Promise<Order[]> {\n const encoded = encodeURIComponent(customerId)\n const all: Order[] = []\n let cursor: string | undefined\n let hasMore = true\n\n while (hasMore) {\n const params = new URLSearchParams({ customer_id: encoded, limit: '100' })\n if (cursor) params.set('starting_after', cursor)\n\n const res = await requestFn<ListResponse<Order>>(`/orders?${params}`)\n const items = res?.data ?? []\n if (items.length === 0) break\n\n all.push(...items)\n cursor = items[items.length - 1].id\n hasMore = res.has_more ?? false\n }\n\n return all\n}\n\n/**\n * Find customer analytics by ID or name (fallback).\n */\nexport async function findCustomerAnalytics(\n requestFn: <T>(path: string) => Promise<T>,\n customerId: string,\n customerName?: string\n): Promise<CustomerAnalytics | null> {\n try {\n const res = await requestFn<{ customers: CustomerAnalytics[] }>(\n '/analytics/customers?limit=200'\n )\n const byId = res.customers?.find((c) => c.customer_id === customerId)\n if (byId) return byId\n if (customerName) {\n const normalized = customerName.toLowerCase().trim()\n return (\n res.customers?.find(\n (c) => c.customer_name?.toLowerCase().trim() === normalized\n ) ?? null\n )\n }\n return null\n } catch {\n return null\n }\n}\n\n/**\n * Base64url-encode a URL string (works in both Node and browser).\n */\nexport function encodeBase64Url(url: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(url, 'utf-8')\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '')\n }\n return btoa(url)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '')\n}\n\n/**\n * Quad-FNV (128-bit) media signing — matches gateway's media-signature.ts.\n */\nexport function signMedia(\n signingSecret: string,\n encodedUrl: string,\n w: string,\n q: string,\n f: string\n): string {\n const payload = `${signingSecret}|${encodedUrl}|${w}|${q}|${f}`\n let h1 = 0x811c9dc5, h2 = 0xcbf29ce4, h3 = 0x1a47e90b, h4 = 0xe5c4a7d2\n for (let i = 0; i < payload.length; i++) {\n const c = payload.charCodeAt(i)\n h1 ^= c; h1 = Math.imul(h1, 0x01000193)\n h2 ^= c; h2 = Math.imul(h2, 0x0100019d)\n h3 ^= c; h3 = Math.imul(h3, 0x010001a5)\n h4 ^= c; h4 = Math.imul(h4, 0x010001cf)\n }\n return (\n (h1 >>> 0).toString(16).padStart(8, '0') +\n (h2 >>> 0).toString(16).padStart(8, '0') +\n (h3 >>> 0).toString(16).padStart(8, '0') +\n (h4 >>> 0).toString(16).padStart(8, '0')\n ).slice(0, 32)\n}\n","import type {\n Cart,\n CartItem,\n Category,\n CategoryTreeNode,\n CheckoutSession,\n DealValidation,\n Customer,\n CustomerAnalytics,\n ListResponse,\n Location,\n LoyaltyAccount,\n LoyaltyReward,\n LoyaltyTransaction,\n Order,\n PaymentData,\n Product,\n Recommendation,\n ReferralEnrollment,\n ReferralStatus,\n Review,\n ReviewSummary,\n SendCodeResponse,\n ShippingMethod,\n ShippingRate,\n StorefrontSession,\n VerifyCodeResponse,\n WhaleStorefrontConfig,\n WishlistItem,\n EventType,\n QRLandingData,\n} from './types.js'\n\nimport type { StorefrontConfig } from './pixels/types.js'\n\nimport {\n fetchAllCustomerOrders,\n findCustomerAnalytics,\n encodeBase64Url,\n signMedia,\n} from './client-queries.js'\n\nimport { resilientSend } from './resilient-send.js'\n\n// -- WhaleClient --\n// Stateless HTTP wrapper around whale-gateway. Works server-side and client-side.\n// No React, no browser APIs (except fetch).\n\nexport class WhaleClient {\n readonly storeId: string\n readonly apiKey: string\n readonly gatewayUrl: string\n readonly proxyPath: string\n\n private _sessionToken: string | null = null\n\n constructor(config: WhaleStorefrontConfig) {\n this.storeId = config.storeId\n this.apiKey = config.apiKey\n this.gatewayUrl = config.gatewayUrl || 'https://whale-gateway.fly.dev'\n this.proxyPath = config.proxyPath || '/api/gw'\n }\n\n // -- Token Management --\n\n setSessionToken(token: string | null): void { this._sessionToken = token }\n getSessionToken(): string | null { return this._sessionToken }\n\n // -- Base URL --\n\n private get baseUrl(): string {\n return typeof window === 'undefined' ? this.gatewayUrl : this.proxyPath\n }\n\n // -- Base Fetcher --\n\n private async request<T = unknown>(\n path: string, options: RequestInit = {}, opts?: { revalidate?: number }\n ): Promise<T> {\n const url = `${this.baseUrl}/v1/stores/${this.storeId}${path}`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n }\n if (this._sessionToken) headers['Authorization'] = `Bearer ${this._sessionToken}`\n\n const fetchOptions: RequestInit & { next?: { revalidate?: number } } = {\n ...options,\n headers: { ...headers, ...((options.headers as Record<string, string>) ?? {}) },\n }\n if (opts?.revalidate !== undefined) fetchOptions.next = { revalidate: opts.revalidate }\n\n const res = await fetch(url, fetchOptions)\n if (!res.ok) {\n let message = `Gateway error ${res.status}: ${res.statusText}`\n try {\n const body = await res.json()\n if (body?.message) message = body.message\n else if (typeof body?.error === 'string') message = body.error\n else if (body?.error?.message) message = body.error.message\n } catch { /* ignore parse errors */ }\n const err = new Error(message) as Error & { status: number }\n err.status = res.status\n throw err\n }\n if (res.status === 204) return undefined as T\n return res.json() as Promise<T>\n }\n\n // -- Products --\n\n async listProducts(params?: { limit?: number; starting_after?: string; status?: string }): Promise<ListResponse<Product>> {\n const sp = new URLSearchParams()\n if (params?.limit) sp.set('limit', String(params.limit))\n if (params?.starting_after) sp.set('starting_after', params.starting_after)\n if (params?.status) sp.set('status', params.status)\n const qs = sp.toString()\n return this.request<ListResponse<Product>>(`/products${qs ? `?${qs}` : ''}`)\n }\n\n async getProduct(id: string): Promise<Product> {\n return this.request<Product>(`/products/${id}`)\n }\n\n async getAllProducts(options?: {\n status?: string; maxPages?: number; revalidate?: number; filter?: (product: Product) => boolean\n }): Promise<Product[]> {\n const all: Product[] = []\n let cursor: string | undefined\n let hasMore = true\n let pages = 0\n const maxPages = options?.maxPages ?? 20\n\n while (hasMore && pages < maxPages) {\n const params = new URLSearchParams({ limit: '100' })\n if (options?.status) params.set('status', options.status)\n else params.set('status', 'published')\n if (cursor) params.set('starting_after', cursor)\n\n const data = await this.request<ListResponse<Product>>(\n `/products?${params}`, {},\n options?.revalidate !== undefined ? { revalidate: options.revalidate } : undefined\n )\n if (!data.data || data.data.length === 0) break\n for (const p of data.data) {\n if (!options?.filter || options.filter(p)) all.push(p)\n cursor = p.id\n }\n hasMore = data.has_more\n pages++\n }\n return all\n }\n\n // -- Cart --\n\n async createCart(customerEmail?: string): Promise<Cart> {\n return this.request<Cart>('/cart', {\n method: 'POST',\n body: JSON.stringify(customerEmail ? { customer_email: customerEmail } : {}),\n })\n }\n\n async getCart(cartId: string): Promise<Cart> {\n return this.request<Cart>(`/cart/${cartId}`)\n }\n\n async addToCart(cartId: string, productId: string, quantity: number, options?: { tier?: string; unitPrice?: number }): Promise<CartItem> {\n return this.request<CartItem>(`/cart/${cartId}/items`, {\n method: 'POST',\n body: JSON.stringify({\n product_id: productId, quantity,\n ...(options?.tier !== undefined && { tier: options.tier }),\n ...(options?.unitPrice !== undefined && { unit_price: options.unitPrice }),\n }),\n })\n }\n\n async updateCartItem(cartId: string, itemId: string, quantity: number): Promise<Cart> {\n return this.request<Cart>(`/cart/${cartId}/items/${itemId}`, { method: 'PATCH', body: JSON.stringify({ quantity }) })\n }\n\n async removeCartItem(cartId: string, itemId: string): Promise<void> {\n return this.request<void>(`/cart/${cartId}/items/${itemId}`, { method: 'DELETE' })\n }\n\n // -- Checkout --\n\n async checkout(cartId: string, customerEmail?: string, payment?: PaymentData, referralCode?: string): Promise<Order> {\n return this.request<Order>('/checkout', {\n method: 'POST',\n body: JSON.stringify({\n cart_id: cartId,\n ...(customerEmail && { customer_email: customerEmail }),\n ...(referralCode && { referral_code: referralCode }),\n ...(payment && {\n payment_method: payment.payment_method,\n ...(payment.opaque_data && { opaque_data: payment.opaque_data }),\n ...(payment.billTo && { bill_to: payment.billTo }),\n ...(payment.shipTo && { ship_to: payment.shipTo }),\n }),\n }),\n })\n }\n\n // -- Customers --\n\n async findCustomer(query: string): Promise<Customer[]> {\n const encoded = encodeURIComponent(query)\n const res = await this.request<{ data: Customer[] } | Customer[]>(`/customers?query=${encoded}`)\n return Array.isArray(res) ? res : res?.data ?? []\n }\n\n async getCustomer(id: string): Promise<Customer> { return this.request<Customer>(`/customers/${id}`) }\n\n async createCustomer(data: { first_name: string; last_name: string; email: string; phone?: string }): Promise<Customer> {\n return this.request<Customer>('/customers', { method: 'POST', body: JSON.stringify(data) })\n }\n\n async updateProfile(customerId: string, data: { first_name: string; last_name: string; phone?: string; date_of_birth?: string }): Promise<Customer> {\n return this.request<Customer>('/storefront/profile', {\n method: 'PATCH',\n body: JSON.stringify({ customer_id: customerId, ...data }),\n })\n }\n\n // -- Orders --\n\n async listOrders(params?: { customer_id?: string; limit?: number; starting_after?: string }): Promise<ListResponse<Order>> {\n const sp = new URLSearchParams()\n if (params?.customer_id) sp.set('customer_id', params.customer_id)\n if (params?.limit) sp.set('limit', String(params.limit))\n if (params?.starting_after) sp.set('starting_after', params.starting_after)\n const qs = sp.toString()\n return this.request<ListResponse<Order>>(`/orders${qs ? `?${qs}` : ''}`)\n }\n\n async getOrder(id: string): Promise<Order> { return this.request<Order>(`/orders/${id}`) }\n\n async getCustomerOrders(customerId: string): Promise<Order[]> {\n return fetchAllCustomerOrders((path, opts) => this.request(path, opts), customerId)\n }\n\n // -- Auth (OTP) --\n\n async sendCode(email: string): Promise<SendCodeResponse> {\n return this.request<SendCodeResponse>('/storefront/auth/send-code', { method: 'POST', body: JSON.stringify({ email }) })\n }\n\n async verifyCode(email: string, code: string): Promise<VerifyCodeResponse> {\n return this.request<VerifyCodeResponse>('/storefront/auth/verify-code', { method: 'POST', body: JSON.stringify({ email, code }) })\n }\n\n // -- Customer Analytics --\n\n async getCustomerAnalytics(customerId: string, customerName?: string): Promise<CustomerAnalytics | null> {\n return findCustomerAnalytics((path) => this.request(path), customerId, customerName)\n }\n\n // -- Locations --\n\n async listLocations(): Promise<ListResponse<Location>> { return this.request<ListResponse<Location>>('/locations') }\n\n // -- COA --\n\n getCOAEmbedUrl(productId: string): string {\n return `${this.baseUrl}/v1/stores/${this.storeId}/coa/${productId}/embed`\n }\n\n // -- Storefront Config --\n\n async fetchStorefrontConfig(): Promise<StorefrontConfig> {\n return this.request<StorefrontConfig>('/storefront/config')\n }\n\n // -- QR Landing Page --\n\n /** Fetch QR landing page data (public, no auth needed). */\n async fetchQRLandingData(code: string): Promise<QRLandingData> {\n // Public endpoint — hit gateway directly, no store prefix or API key\n const url = `${this.gatewayUrl}/q/${encodeURIComponent(code)}/page`\n const res = await fetch(url)\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n throw new Error(body?.error?.message ?? `QR landing fetch failed: ${res.status}`)\n }\n return res.json()\n }\n\n /** Fetch landing page data by slug (public, no auth needed). */\n async fetchLandingPage(slug: string): Promise<import('./types.js').LandingPageRenderData> {\n const url = `${this.gatewayUrl}/l/${encodeURIComponent(slug)}`\n const res = await fetch(url)\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n throw new Error(body?.error?.message ?? `Landing page fetch failed: ${res.status}`)\n }\n return res.json()\n }\n\n // -- Analytics / Storefront Sessions --\n\n async createSession(params: {\n visitor_id?: string\n user_agent?: string\n referrer?: string\n page_url?: string\n device?: string\n utm_source?: string\n utm_medium?: string\n utm_campaign?: string\n utm_content?: string\n utm_term?: string\n gclid?: string\n fbclid?: string\n }): Promise<StorefrontSession> {\n return this.request<StorefrontSession>('/storefront/sessions', { method: 'POST', body: JSON.stringify(params) })\n }\n\n async updateSession(sessionId: string, params: {\n last_active_at?: string\n customer_id?: string\n customer_first_name?: string\n customer_last_name?: string\n cart_id?: string\n cart_item_count?: number\n cart_total?: number\n order_id?: string\n fingerprint_id?: string\n status?: string\n current_page?: string\n }): Promise<StorefrontSession> {\n return this.request<StorefrontSession>(`/storefront/sessions/${sessionId}`, { method: 'PATCH', body: JSON.stringify(params) })\n }\n\n async trackEvent(params: { session_id: string; event_type: EventType; event_data?: Record<string, unknown>; visitor_id?: string }): Promise<void> {\n const url = `${this.baseUrl}/v1/stores/${this.storeId}/storefront/events`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n }\n if (this._sessionToken) headers['Authorization'] = `Bearer ${this._sessionToken}`\n // Map SDK field names to gateway field names\n const payload: Record<string, unknown> = {\n event_name: params.event_type,\n session_id: params.session_id,\n event_properties: params.event_data,\n }\n if (params.visitor_id) payload.visitor_id = params.visitor_id\n await resilientSend(url, payload, headers)\n }\n\n // -- Checkout Sessions --\n\n async createCheckoutSession(params: {\n cart_id: string\n customer_email?: string\n shipping_address?: import('./types.js').Address\n billing_address?: import('./types.js').Address\n shipping_method_id?: string\n coupon_code?: string\n referral_code?: string\n }): Promise<CheckoutSession> {\n return this.request<CheckoutSession>('/storefront/checkout', {\n method: 'POST',\n body: JSON.stringify(params),\n })\n }\n\n async getCheckoutSession(sessionId: string): Promise<CheckoutSession> {\n return this.request<CheckoutSession>(`/storefront/checkout/${sessionId}`)\n }\n\n async updateCheckoutSession(sessionId: string, params: {\n customer_email?: string\n shipping_address?: import('./types.js').Address\n billing_address?: import('./types.js').Address\n shipping_method_id?: string\n coupon_code?: string\n }): Promise<CheckoutSession> {\n return this.request<CheckoutSession>(`/storefront/checkout/${sessionId}`, {\n method: 'PATCH',\n body: JSON.stringify(params),\n })\n }\n\n async completeCheckout(sessionId: string, payment?: PaymentData): Promise<Order> {\n return this.request<Order>(`/storefront/checkout/${sessionId}/complete`, {\n method: 'POST',\n body: JSON.stringify(payment ? {\n payment_method: payment.payment_method,\n ...(payment.opaque_data && { opaque_data: payment.opaque_data }),\n ...(payment.billTo && { bill_to: payment.billTo }),\n ...(payment.shipTo && { ship_to: payment.shipTo }),\n } : {}),\n })\n }\n\n // -- Search --\n\n async searchProducts(params: {\n query: string\n category_id?: string\n min_price?: number\n max_price?: number\n sort_by?: string\n sort_order?: 'asc' | 'desc'\n limit?: number\n starting_after?: string\n }): Promise<ListResponse<Product>> {\n const sp = new URLSearchParams({ q: params.query })\n if (params.category_id) sp.set('category_id', params.category_id)\n if (params.min_price !== undefined) sp.set('min_price', String(params.min_price))\n if (params.max_price !== undefined) sp.set('max_price', String(params.max_price))\n if (params.sort_by) sp.set('sort_by', params.sort_by)\n if (params.sort_order) sp.set('sort_order', params.sort_order)\n if (params.limit) sp.set('limit', String(params.limit))\n if (params.starting_after) sp.set('starting_after', params.starting_after)\n return this.request<ListResponse<Product>>(`/products/search?${sp}`)\n }\n\n // -- Categories --\n\n async listCategories(): Promise<ListResponse<Category>> {\n return this.request<ListResponse<Category>>('/categories')\n }\n\n async getCategory(id: string): Promise<Category> {\n return this.request<Category>(`/categories/${id}`)\n }\n\n // -- Loyalty --\n\n async getLoyaltyAccount(customerId: string): Promise<LoyaltyAccount> {\n return this.request<LoyaltyAccount>(`/storefront/loyalty/${customerId}`)\n }\n\n async listLoyaltyRewards(): Promise<ListResponse<LoyaltyReward>> {\n return this.request<ListResponse<LoyaltyReward>>('/storefront/loyalty/rewards')\n }\n\n async listLoyaltyTransactions(customerId: string, params?: {\n limit?: number\n starting_after?: string\n }): Promise<ListResponse<LoyaltyTransaction>> {\n const sp = new URLSearchParams()\n if (params?.limit) sp.set('limit', String(params.limit))\n if (params?.starting_after) sp.set('starting_after', params.starting_after)\n const qs = sp.toString()\n return this.request<ListResponse<LoyaltyTransaction>>(\n `/storefront/loyalty/${customerId}/transactions${qs ? `?${qs}` : ''}`\n )\n }\n\n async redeemLoyaltyReward(customerId: string, rewardId: string): Promise<{ success: boolean; points_remaining: number }> {\n return this.request<{ success: boolean; points_remaining: number }>(\n `/storefront/loyalty/${customerId}/redeem`,\n { method: 'POST', body: JSON.stringify({ reward_id: rewardId }) }\n )\n }\n\n // -- Reviews --\n\n async listProductReviews(productId: string, params?: {\n limit?: number\n starting_after?: string\n sort_by?: 'created_at' | 'rating'\n sort_order?: 'asc' | 'desc'\n }): Promise<ListResponse<Review> & { summary?: ReviewSummary }> {\n const sp = new URLSearchParams()\n if (params?.limit) sp.set('limit', String(params.limit))\n if (params?.starting_after) sp.set('starting_after', params.starting_after)\n if (params?.sort_by) sp.set('sort_by', params.sort_by)\n if (params?.sort_order) sp.set('sort_order', params.sort_order)\n const qs = sp.toString()\n return this.request<ListResponse<Review> & { summary?: ReviewSummary }>(\n `/products/${productId}/reviews${qs ? `?${qs}` : ''}`\n )\n }\n\n async submitReview(productId: string, data: {\n rating: number\n title?: string\n body?: string\n customer_name?: string\n }): Promise<Review> {\n return this.request<Review>(`/products/${productId}/reviews`, {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n\n // -- Wishlist --\n\n async listWishlistItems(customerId: string): Promise<ListResponse<WishlistItem>> {\n return this.request<ListResponse<WishlistItem>>(`/storefront/wishlist/${customerId}`)\n }\n\n async addWishlistItem(customerId: string, productId: string): Promise<WishlistItem> {\n return this.request<WishlistItem>(`/storefront/wishlist/${customerId}`, {\n method: 'POST',\n body: JSON.stringify({ product_id: productId }),\n })\n }\n\n async removeWishlistItem(customerId: string, productId: string): Promise<void> {\n return this.request<void>(`/storefront/wishlist/${customerId}/${productId}`, {\n method: 'DELETE',\n })\n }\n\n // -- Recommendations --\n\n async getRecommendations(params?: {\n product_id?: string\n customer_id?: string\n limit?: number\n type?: 'similar' | 'frequently_bought_together' | 'personalized'\n }): Promise<{ data: Recommendation[] }> {\n const sp = new URLSearchParams()\n if (params?.product_id) sp.set('product_id', params.product_id)\n if (params?.customer_id) sp.set('customer_id', params.customer_id)\n if (params?.limit) sp.set('limit', String(params.limit))\n if (params?.type) sp.set('type', params.type)\n const qs = sp.toString()\n return this.request<{ data: Recommendation[] }>(\n `/storefront/recommendations${qs ? `?${qs}` : ''}`\n )\n }\n\n // -- Locations (extended) --\n\n async getLocation(id: string): Promise<Location> {\n return this.request<Location>(`/locations/${id}`)\n }\n\n // -- Shipping --\n\n async listShippingMethods(): Promise<ListResponse<ShippingMethod>> {\n return this.request<ListResponse<ShippingMethod>>('/storefront/shipping/methods')\n }\n\n async calculateShippingRates(params: {\n cart_id: string\n shipping_address: import('./types.js').Address\n }): Promise<{ data: ShippingRate[] }> {\n return this.request<{ data: ShippingRate[] }>('/storefront/shipping/rates', {\n method: 'POST',\n body: JSON.stringify(params),\n })\n }\n\n // -- Deals (discount codes) --\n\n async validateDeal(code: string, params?: {\n cart_id?: string\n }): Promise<DealValidation> {\n const sp = new URLSearchParams({ code })\n if (params?.cart_id) sp.set('cart_id', params.cart_id)\n return this.request<DealValidation>(`/storefront/deals/validate?${sp}`)\n }\n\n async applyDeal(cartId: string, code: string): Promise<Cart> {\n return this.request<Cart>(`/cart/${cartId}/deal`, {\n method: 'POST',\n body: JSON.stringify({ code }),\n })\n }\n\n async removeDeal(cartId: string): Promise<Cart> {\n return this.request<Cart>(`/cart/${cartId}/deal`, {\n method: 'DELETE',\n })\n }\n\n /** @deprecated Use validateDeal instead */\n async validateCoupon(code: string, params?: { cart_id?: string }): Promise<DealValidation> {\n return this.validateDeal(code, params)\n }\n\n /** @deprecated Use applyDeal instead */\n async applyCoupon(cartId: string, code: string): Promise<Cart> {\n return this.applyDeal(cartId, code)\n }\n\n /** @deprecated Use removeDeal instead */\n async removeCoupon(cartId: string): Promise<Cart> {\n return this.removeDeal(cartId)\n }\n\n // -- Referrals --\n\n async enrollReferral(customerId: string): Promise<ReferralEnrollment> {\n return this.request<ReferralEnrollment>('/storefront/referrals/enroll', {\n method: 'POST',\n body: JSON.stringify({ customer_id: customerId }),\n })\n }\n\n async getReferralStatus(customerId: string): Promise<ReferralStatus> {\n return this.request<ReferralStatus>(`/storefront/referrals/status?customer_id=${customerId}`)\n }\n\n async attributeReferral(\n customerId: string,\n referralCode: string,\n ): Promise<{ success: boolean; affiliate_id?: string; error?: string }> {\n return this.request('/storefront/referrals/attribute', {\n method: 'POST',\n body: JSON.stringify({ customer_id: customerId, referral_code: referralCode }),\n })\n }\n\n // -- Static Media Utilities --\n\n static encodeBase64Url = encodeBase64Url\n static signMedia = signMedia\n}\n"]}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// src/pixels/meta-pixel.ts
|
|
2
|
+
var EVENT_MAP = {
|
|
3
|
+
page_view: "PageView",
|
|
4
|
+
product_view: "ViewContent",
|
|
5
|
+
add_to_cart: "AddToCart",
|
|
6
|
+
remove_from_cart: "RemoveFromCart",
|
|
7
|
+
begin_checkout: "InitiateCheckout",
|
|
8
|
+
purchase: "Purchase",
|
|
9
|
+
search: "Search",
|
|
10
|
+
category_view: "ViewContent"
|
|
11
|
+
};
|
|
12
|
+
var MetaPixelProvider = class {
|
|
13
|
+
constructor(pixelId) {
|
|
14
|
+
this.name = "meta";
|
|
15
|
+
this.loaded = false;
|
|
16
|
+
this.pixelId = pixelId;
|
|
17
|
+
}
|
|
18
|
+
async load() {
|
|
19
|
+
if (typeof window === "undefined") return;
|
|
20
|
+
if (this.loaded) return;
|
|
21
|
+
const w = window;
|
|
22
|
+
if (!w.fbq) {
|
|
23
|
+
const n = w.fbq = function(...args) {
|
|
24
|
+
n.callMethod ? n.callMethod.apply(n, args) : n.queue.push(args);
|
|
25
|
+
};
|
|
26
|
+
if (!w._fbq) w._fbq = n;
|
|
27
|
+
n.push = n;
|
|
28
|
+
n.loaded = true;
|
|
29
|
+
n.version = "2.0";
|
|
30
|
+
n.queue = [];
|
|
31
|
+
}
|
|
32
|
+
await new Promise((resolve) => {
|
|
33
|
+
const script = document.createElement("script");
|
|
34
|
+
script.async = true;
|
|
35
|
+
script.src = "https://connect.facebook.net/en_US/fbevents.js";
|
|
36
|
+
script.onload = () => resolve();
|
|
37
|
+
script.onerror = () => resolve();
|
|
38
|
+
const first = document.getElementsByTagName("script")[0];
|
|
39
|
+
first?.parentNode?.insertBefore(script, first);
|
|
40
|
+
});
|
|
41
|
+
w.fbq("init", this.pixelId);
|
|
42
|
+
w.fbq("track", "PageView");
|
|
43
|
+
this.loaded = true;
|
|
44
|
+
}
|
|
45
|
+
track(event, params) {
|
|
46
|
+
if (typeof window === "undefined") return;
|
|
47
|
+
const w = window;
|
|
48
|
+
if (typeof w.fbq !== "function") return;
|
|
49
|
+
const metaEvent = EVENT_MAP[event];
|
|
50
|
+
if (!metaEvent) return;
|
|
51
|
+
const { eventID, ...rest } = params ?? {};
|
|
52
|
+
const hasParams = Object.keys(rest).length > 0;
|
|
53
|
+
const options = eventID ? { eventID } : void 0;
|
|
54
|
+
if (hasParams) {
|
|
55
|
+
w.fbq("track", metaEvent, rest, options);
|
|
56
|
+
} else {
|
|
57
|
+
w.fbq("track", metaEvent, {}, options);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
isLoaded() {
|
|
61
|
+
return this.loaded;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// src/pixels/google-pixel.ts
|
|
66
|
+
var EVENT_MAP2 = {
|
|
67
|
+
page_view: "page_view",
|
|
68
|
+
product_view: "view_item",
|
|
69
|
+
add_to_cart: "add_to_cart",
|
|
70
|
+
remove_from_cart: "remove_from_cart",
|
|
71
|
+
begin_checkout: "begin_checkout",
|
|
72
|
+
purchase: "purchase",
|
|
73
|
+
search: "search",
|
|
74
|
+
category_view: "view_item_list"
|
|
75
|
+
};
|
|
76
|
+
var GooglePixelProvider = class {
|
|
77
|
+
constructor(measurementId) {
|
|
78
|
+
this.name = "google";
|
|
79
|
+
this.loaded = false;
|
|
80
|
+
this.measurementId = measurementId;
|
|
81
|
+
}
|
|
82
|
+
async load() {
|
|
83
|
+
if (typeof window === "undefined") return;
|
|
84
|
+
if (this.loaded) return;
|
|
85
|
+
const w = window;
|
|
86
|
+
w.dataLayer = w.dataLayer || [];
|
|
87
|
+
if (!w.gtag) {
|
|
88
|
+
w.gtag = function(...args) {
|
|
89
|
+
w.dataLayer.push(arguments);
|
|
90
|
+
};
|
|
91
|
+
w.gtag("js", /* @__PURE__ */ new Date());
|
|
92
|
+
w.gtag("config", this.measurementId);
|
|
93
|
+
}
|
|
94
|
+
await new Promise((resolve) => {
|
|
95
|
+
const script = document.createElement("script");
|
|
96
|
+
script.async = true;
|
|
97
|
+
script.src = `https://www.googletagmanager.com/gtag/js?id=${this.measurementId}`;
|
|
98
|
+
script.onload = () => resolve();
|
|
99
|
+
script.onerror = () => resolve();
|
|
100
|
+
document.head.appendChild(script);
|
|
101
|
+
});
|
|
102
|
+
this.loaded = true;
|
|
103
|
+
}
|
|
104
|
+
track(event, params) {
|
|
105
|
+
if (typeof window === "undefined") return;
|
|
106
|
+
const w = window;
|
|
107
|
+
if (typeof w.gtag !== "function") return;
|
|
108
|
+
const ga4Event = EVENT_MAP2[event];
|
|
109
|
+
if (!ga4Event) return;
|
|
110
|
+
const { eventID, product_id, product_name, quantity, price, tier, total, order_id, order_number, cart_id, item_count, query, result_count, ...rest } = params ?? {};
|
|
111
|
+
const ga4Params = { ...rest };
|
|
112
|
+
if (total !== void 0) ga4Params.value = total;
|
|
113
|
+
if (order_id) ga4Params.transaction_id = order_id;
|
|
114
|
+
if (query) ga4Params.search_term = query;
|
|
115
|
+
if (product_id) {
|
|
116
|
+
ga4Params.items = [{
|
|
117
|
+
item_id: product_id,
|
|
118
|
+
item_name: product_name,
|
|
119
|
+
quantity: quantity ?? 1,
|
|
120
|
+
price,
|
|
121
|
+
item_variant: tier
|
|
122
|
+
}];
|
|
123
|
+
}
|
|
124
|
+
ga4Params.currency = "USD";
|
|
125
|
+
w.gtag("event", ga4Event, ga4Params);
|
|
126
|
+
}
|
|
127
|
+
isLoaded() {
|
|
128
|
+
return this.loaded;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// src/pixels/pixel-manager.ts
|
|
133
|
+
var PixelManager = class {
|
|
134
|
+
constructor(configs) {
|
|
135
|
+
this.providers = [];
|
|
136
|
+
for (const config of configs) {
|
|
137
|
+
if (config.provider === "meta" && config.pixel_id) {
|
|
138
|
+
this.providers.push(new MetaPixelProvider(config.pixel_id));
|
|
139
|
+
} else if (config.provider === "google" && config.measurement_id) {
|
|
140
|
+
this.providers.push(new GooglePixelProvider(config.measurement_id));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async initialize() {
|
|
145
|
+
await Promise.all(this.providers.map((p) => p.load()));
|
|
146
|
+
}
|
|
147
|
+
track(event, params) {
|
|
148
|
+
for (const provider of this.providers) {
|
|
149
|
+
if (provider.isLoaded()) {
|
|
150
|
+
provider.track(event, params);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
export { PixelManager };
|
|
157
|
+
//# sourceMappingURL=chunk-PXS2DPVL.js.map
|
|
158
|
+
//# sourceMappingURL=chunk-PXS2DPVL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pixels/meta-pixel.ts","../src/pixels/google-pixel.ts","../src/pixels/pixel-manager.ts"],"names":["EVENT_MAP"],"mappings":"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","file":"chunk-PXS2DPVL.js","sourcesContent":["import type { PixelProvider } from './types.js'\n\n/** Map SDK event names → Meta standard event names */\nconst EVENT_MAP: Record<string, string> = {\n page_view: 'PageView',\n product_view: 'ViewContent',\n add_to_cart: 'AddToCart',\n remove_from_cart: 'RemoveFromCart',\n begin_checkout: 'InitiateCheckout',\n purchase: 'Purchase',\n search: 'Search',\n category_view: 'ViewContent',\n}\n\nexport class MetaPixelProvider implements PixelProvider {\n readonly name = 'meta'\n private pixelId: string\n private loaded = false\n\n constructor(pixelId: string) {\n this.pixelId = pixelId\n }\n\n async load(): Promise<void> {\n if (typeof window === 'undefined') return\n if (this.loaded) return\n\n // Initialize fbq queue\n const w = window as any\n if (!w.fbq) {\n const n: any = (w.fbq = function (...args: any[]) {\n n.callMethod ? n.callMethod.apply(n, args) : n.queue.push(args)\n })\n if (!w._fbq) w._fbq = n\n n.push = n\n n.loaded = true\n n.version = '2.0'\n n.queue = []\n }\n\n // Inject script\n await new Promise<void>((resolve) => {\n const script = document.createElement('script')\n script.async = true\n script.src = 'https://connect.facebook.net/en_US/fbevents.js'\n script.onload = () => resolve()\n script.onerror = () => resolve() // don't block on load failure\n const first = document.getElementsByTagName('script')[0]\n first?.parentNode?.insertBefore(script, first)\n })\n\n w.fbq('init', this.pixelId)\n w.fbq('track', 'PageView')\n this.loaded = true\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n if (typeof window === 'undefined') return\n const w = window as any\n if (typeof w.fbq !== 'function') return\n\n const metaEvent = EVENT_MAP[event]\n if (!metaEvent) return\n\n // Extract eventID for Meta dedup (fbq 4th arg), pass remaining as event params\n const { eventID, ...rest } = params ?? {}\n const hasParams = Object.keys(rest).length > 0\n const options = eventID ? { eventID } : undefined\n\n if (hasParams) {\n w.fbq('track', metaEvent, rest, options)\n } else {\n w.fbq('track', metaEvent, {}, options)\n }\n }\n\n isLoaded(): boolean {\n return this.loaded\n }\n}\n","import type { PixelProvider } from './types.js'\n\n/** Map SDK event names → GA4 recommended event names */\nconst EVENT_MAP: Record<string, string> = {\n page_view: 'page_view',\n product_view: 'view_item',\n add_to_cart: 'add_to_cart',\n remove_from_cart: 'remove_from_cart',\n begin_checkout: 'begin_checkout',\n purchase: 'purchase',\n search: 'search',\n category_view: 'view_item_list',\n}\n\nexport class GooglePixelProvider implements PixelProvider {\n readonly name = 'google'\n private measurementId: string\n private loaded = false\n\n constructor(measurementId: string) {\n this.measurementId = measurementId\n }\n\n async load(): Promise<void> {\n if (typeof window === 'undefined') return\n if (this.loaded) return\n\n const w = window as any\n\n // Initialize dataLayer\n w.dataLayer = w.dataLayer || []\n if (!w.gtag) {\n w.gtag = function (...args: any[]) {\n w.dataLayer.push(arguments)\n }\n w.gtag('js', new Date())\n w.gtag('config', this.measurementId)\n }\n\n // Inject gtag.js script\n await new Promise<void>((resolve) => {\n const script = document.createElement('script')\n script.async = true\n script.src = `https://www.googletagmanager.com/gtag/js?id=${this.measurementId}`\n script.onload = () => resolve()\n script.onerror = () => resolve()\n document.head.appendChild(script)\n })\n\n this.loaded = true\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n if (typeof window === 'undefined') return\n const w = window as any\n if (typeof w.gtag !== 'function') return\n\n const ga4Event = EVENT_MAP[event]\n if (!ga4Event) return\n\n // Strip eventID (Meta-specific), map to GA4 params\n const { eventID, product_id, product_name, quantity, price, tier, total, order_id, order_number, cart_id, item_count, query, result_count, ...rest } = params ?? {}\n\n const ga4Params: Record<string, unknown> = { ...rest }\n\n if (total !== undefined) ga4Params.value = total\n if (order_id) ga4Params.transaction_id = order_id\n if (query) ga4Params.search_term = query\n\n // Build items array for e-commerce events\n if (product_id) {\n ga4Params.items = [{\n item_id: product_id,\n item_name: product_name,\n quantity: quantity ?? 1,\n price,\n item_variant: tier,\n }]\n }\n\n ga4Params.currency = 'USD'\n\n w.gtag('event', ga4Event, ga4Params)\n }\n\n isLoaded(): boolean {\n return this.loaded\n }\n}\n","import type { PixelConfig, PixelProvider } from './types.js'\nimport { MetaPixelProvider } from './meta-pixel.js'\nimport { GooglePixelProvider } from './google-pixel.js'\n\nexport class PixelManager {\n private providers: PixelProvider[] = []\n\n constructor(configs: PixelConfig[]) {\n for (const config of configs) {\n if (config.provider === 'meta' && config.pixel_id) {\n this.providers.push(new MetaPixelProvider(config.pixel_id))\n } else if (config.provider === 'google' && config.measurement_id) {\n this.providers.push(new GooglePixelProvider(config.measurement_id))\n }\n }\n }\n\n async initialize(): Promise<void> {\n await Promise.all(this.providers.map((p) => p.load()))\n }\n\n track(event: string, params?: Record<string, unknown>): void {\n for (const provider of this.providers) {\n if (provider.isLoaded()) {\n provider.track(event, params)\n }\n }\n }\n}\n"]}
|