@neowhale/storefront 0.2.36 → 0.2.38
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-2XODSXJT.js → chunk-BZCZLS5M.js} +25 -16
- package/dist/chunk-BZCZLS5M.js.map +1 -0
- package/dist/{chunk-HSGM4XMK.cjs → chunk-ENC26DTB.cjs} +25 -16
- package/dist/chunk-ENC26DTB.cjs.map +1 -0
- package/dist/index.cjs +3 -3
- package/dist/index.js +1 -1
- package/dist/landing.global.js +33 -29
- package/dist/next/index.cjs +4 -4
- package/dist/next/index.js +1 -1
- package/dist/react/index.cjs +5 -5
- package/dist/react/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2XODSXJT.js.map +0 -1
- package/dist/chunk-HSGM4XMK.cjs.map +0 -1
|
@@ -115,22 +115,31 @@ var WhaleClient = class {
|
|
|
115
115
|
headers: { ...headers, ...options.headers ?? {} }
|
|
116
116
|
};
|
|
117
117
|
if (opts?.revalidate !== void 0) fetchOptions.next = { revalidate: opts.revalidate };
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
118
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
119
|
+
const res = await fetch(url, fetchOptions);
|
|
120
|
+
if (res.status === 429 && attempt === 0) {
|
|
121
|
+
const retryAfter = res.headers.get("Retry-After");
|
|
122
|
+
const waitMs = retryAfter ? Math.min(Number(retryAfter) * 1e3, 1e4) : 2e3;
|
|
123
|
+
await new Promise((r) => setTimeout(r, waitMs));
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (!res.ok) {
|
|
127
|
+
let message = `Gateway error ${res.status}: ${res.statusText}`;
|
|
128
|
+
try {
|
|
129
|
+
const body = await res.json();
|
|
130
|
+
if (body?.message) message = body.message;
|
|
131
|
+
else if (typeof body?.error === "string") message = body.error;
|
|
132
|
+
else if (body?.error?.message) message = body.error.message;
|
|
133
|
+
} catch {
|
|
134
|
+
}
|
|
135
|
+
const err = new Error(message);
|
|
136
|
+
err.status = res.status;
|
|
137
|
+
throw err;
|
|
127
138
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
throw err;
|
|
139
|
+
if (res.status === 204) return void 0;
|
|
140
|
+
return res.json();
|
|
131
141
|
}
|
|
132
|
-
|
|
133
|
-
return res.json();
|
|
142
|
+
throw new Error("Request failed after retry");
|
|
134
143
|
}
|
|
135
144
|
// -- Products --
|
|
136
145
|
async listProducts(params) {
|
|
@@ -500,5 +509,5 @@ WhaleClient.encodeBase64Url = encodeBase64Url;
|
|
|
500
509
|
WhaleClient.signMedia = signMedia;
|
|
501
510
|
|
|
502
511
|
export { WhaleClient, resilientSend };
|
|
503
|
-
//# sourceMappingURL=chunk-
|
|
504
|
-
//# sourceMappingURL=chunk-
|
|
512
|
+
//# sourceMappingURL=chunk-BZCZLS5M.js.map
|
|
513
|
+
//# sourceMappingURL=chunk-BZCZLS5M.js.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-BZCZLS5M.js","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 // Retry once on 429 (rate limited) — respect Retry-After header\n for (let attempt = 0; attempt < 2; attempt++) {\n const res = await fetch(url, fetchOptions)\n\n if (res.status === 429 && attempt === 0) {\n const retryAfter = res.headers.get('Retry-After')\n const waitMs = retryAfter ? Math.min(Number(retryAfter) * 1000, 10_000) : 2_000\n await new Promise(r => setTimeout(r, waitMs))\n continue\n }\n\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 // Should not reach here, but satisfy TypeScript\n throw new Error('Request failed after retry')\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 latitude?: number\n longitude?: number\n geolocation_source?: 'browser_gps' | 'ip' | 'zip' | 'address' | 'manual'\n geolocation_accuracy?: number\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 latitude?: number\n longitude?: number\n geolocation_source?: 'browser_gps' | 'ip' | 'zip' | 'address' | 'manual'\n geolocation_accuracy?: number\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 loyalty_reward_id?: string\n selected_product_id?: string\n visitor_id?: string\n session_id?: 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, opts?: {\n loyalty_reward_id?: string\n selected_product_id?: string\n }): Promise<Order> {\n return this.request<Order>(`/storefront/checkout/${sessionId}/complete`, {\n method: 'POST',\n body: JSON.stringify({\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 ...(opts?.loyalty_reward_id && { loyalty_reward_id: opts.loyalty_reward_id }),\n ...(opts?.selected_product_id && { selected_product_id: opts.selected_product_id }),\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 listLoyaltyProducts(params: {\n category: string\n location_id: string\n tier?: string\n }): Promise<ListResponse<Product>> {\n const sp = new URLSearchParams({ category: params.category, location_id: params.location_id })\n if (params.tier) sp.set('tier', params.tier)\n return this.request<ListResponse<Product>>(`/storefront/loyalty/products?${sp}`)\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"]}
|
|
@@ -117,22 +117,31 @@ var WhaleClient = class {
|
|
|
117
117
|
headers: { ...headers, ...options.headers ?? {} }
|
|
118
118
|
};
|
|
119
119
|
if (opts?.revalidate !== void 0) fetchOptions.next = { revalidate: opts.revalidate };
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
120
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
121
|
+
const res = await fetch(url, fetchOptions);
|
|
122
|
+
if (res.status === 429 && attempt === 0) {
|
|
123
|
+
const retryAfter = res.headers.get("Retry-After");
|
|
124
|
+
const waitMs = retryAfter ? Math.min(Number(retryAfter) * 1e3, 1e4) : 2e3;
|
|
125
|
+
await new Promise((r) => setTimeout(r, waitMs));
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (!res.ok) {
|
|
129
|
+
let message = `Gateway error ${res.status}: ${res.statusText}`;
|
|
130
|
+
try {
|
|
131
|
+
const body = await res.json();
|
|
132
|
+
if (body?.message) message = body.message;
|
|
133
|
+
else if (typeof body?.error === "string") message = body.error;
|
|
134
|
+
else if (body?.error?.message) message = body.error.message;
|
|
135
|
+
} catch {
|
|
136
|
+
}
|
|
137
|
+
const err = new Error(message);
|
|
138
|
+
err.status = res.status;
|
|
139
|
+
throw err;
|
|
129
140
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
throw err;
|
|
141
|
+
if (res.status === 204) return void 0;
|
|
142
|
+
return res.json();
|
|
133
143
|
}
|
|
134
|
-
|
|
135
|
-
return res.json();
|
|
144
|
+
throw new Error("Request failed after retry");
|
|
136
145
|
}
|
|
137
146
|
// -- Products --
|
|
138
147
|
async listProducts(params) {
|
|
@@ -503,5 +512,5 @@ WhaleClient.signMedia = signMedia;
|
|
|
503
512
|
|
|
504
513
|
exports.WhaleClient = WhaleClient;
|
|
505
514
|
exports.resilientSend = resilientSend;
|
|
506
|
-
//# sourceMappingURL=chunk-
|
|
507
|
-
//# sourceMappingURL=chunk-
|
|
515
|
+
//# sourceMappingURL=chunk-ENC26DTB.cjs.map
|
|
516
|
+
//# sourceMappingURL=chunk-ENC26DTB.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resilient-send.ts","../src/client-queries.ts","../src/client.ts"],"names":[],"mappings":";;;AAWA,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,cAAA,GAAiB,GAAA;AAEvB,eAAsB,aAAA,CACpB,GAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAEnC,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,WAAA,EAAa,OAAA,EAAA,EAAW;AACvD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC3B,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA,EAAW;AAAA,OACZ,CAAA;AAED,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,MAAA,GAAS,GAAA,EAAK;AAAA,IAClC,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI,UAAU,WAAA,EAAa;AACzB,MAAA,MAAM,IAAI,QAAc,CAAC,CAAA,KAAM,WAAW,CAAA,EAAG,cAAA,IAAkB,OAAA,GAAU,CAAA,CAAE,CAAC,CAAA;AAAA,IAC9E;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,UAAA,EAAY;AAC5D,IAAA,SAAA,CAAU,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,EAChC;AACF;;;ACxBA,eAAsB,sBAAA,CACpB,WACA,UAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAU,mBAAmB,UAAU,CAAA;AAC7C,EAAA,MAAM,MAAe,EAAC;AACtB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,OAAA,GAAU,IAAA;AAEd,EAAA,OAAO,OAAA,EAAS;AACd,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,EAAE,aAAa,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA;AACzE,IAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,gBAAA,EAAkB,MAAM,CAAA;AAE/C,IAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAA+B,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AACpE,IAAA,MAAM,KAAA,GAAQ,GAAA,EAAK,IAAA,IAAQ,EAAC;AAC5B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,IAAA,GAAA,CAAI,IAAA,CAAK,GAAG,KAAK,CAAA;AACjB,IAAA,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,EAAA;AACjC,IAAA,OAAA,GAAU,IAAI,QAAA,IAAY,KAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,GAAA;AACT;AAKA,eAAsB,qBAAA,CACpB,SAAA,EACA,UAAA,EACA,YAAA,EACmC;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAM,SAAA;AAAA,MAChB;AAAA,KACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,SAAA,EAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,gBAAgB,UAAU,CAAA;AACpE,IAAA,IAAI,MAAM,OAAO,IAAA;AACjB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,WAAA,EAAY,CAAE,IAAA,EAAK;AACnD,MAAA,OACE,IAAI,SAAA,EAAW,IAAA;AAAA,QACb,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,WAAA,EAAY,CAAE,MAAK,KAAM;AAAA,OACnD,IAAK,IAAA;AAAA,IAET;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,gBAAgB,GAAA,EAAqB;AACnD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,OAAO,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA,CAC5B,QAAA,CAAS,QAAQ,CAAA,CACjB,OAAA,CAAQ,KAAA,EAAO,GAAG,EAClB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,IAAA,CAAK,GAAG,CAAA,CACZ,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB;AAKO,SAAS,SAAA,CACd,aAAA,EACA,UAAA,EACA,CAAA,EACA,GACA,CAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,UAAU,IAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAC7D,EAAA,IAAI,KAAK,UAAA,EAAY,EAAA,GAAK,UAAA,EAAY,EAAA,GAAK,WAAY,EAAA,GAAK,UAAA;AAC5D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,UAAA,CAAW,CAAC,CAAA;AAC9B,IAAA,EAAA,IAAM,CAAA;AAAG,IAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,QAAU,CAAA;AACtC,IAAA,EAAA,IAAM,CAAA;AAAG,IAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,QAAU,CAAA;AACtC,IAAA,EAAA,IAAM,CAAA;AAAG,IAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,QAAU,CAAA;AACtC,IAAA,EAAA,IAAM,CAAA;AAAG,IAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,QAAU,CAAA;AAAA,EACxC;AACA,EAAA,OAAA,CAAA,CACG,OAAO,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAA,GAAA,CACtC,EAAA,KAAO,GAAG,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA,GAAA,CACtC,EAAA,KAAO,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,KACtC,EAAA,KAAO,CAAA,EAAG,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA,EACvC,KAAA,CAAM,GAAG,EAAE,CAAA;AACf;;;ACnEO,IAAM,cAAN,MAAkB;AAAA,EAQvB,YAAY,MAAA,EAA+B;AAF3C,IAAA,IAAA,CAAQ,aAAA,GAA+B,IAAA;AAGrC,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,+BAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,SAAA;AAAA,EACvC;AAAA;AAAA,EAIA,gBAAgB,KAAA,EAA4B;AAAE,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AAAA,EAAM;AAAA,EACzE,eAAA,GAAiC;AAAE,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAAc;AAAA;AAAA,EAI7D,IAAY,OAAA,GAAkB;AAC5B,IAAA,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,IAAA,CAAK,aAAa,IAAA,CAAK,SAAA;AAAA,EAChE;AAAA;AAAA,EAIA,MAAc,OAAA,CACZ,IAAA,EAAc,OAAA,GAAuB,IAAI,IAAA,EAC7B;AACZ,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,OAAO,cAAc,IAAA,CAAK,OAAO,GAAG,IAAI,CAAA,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,aAAa,IAAA,CAAK;AAAA,KACpB;AACA,IAAA,IAAI,KAAK,aAAA,EAAe,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,aAAa,CAAA,CAAA;AAE/E,IAAA,MAAM,YAAA,GAAiE;AAAA,MACrE,GAAG,OAAA;AAAA,MACH,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,GAAK,OAAA,CAAQ,OAAA,IAAsC,EAAC;AAAG,KAChF;AACA,IAAA,IAAI,IAAA,EAAM,eAAe,MAAA,EAAW,YAAA,CAAa,OAAO,EAAE,UAAA,EAAY,KAAK,UAAA,EAAW;AAGtF,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,CAAA,EAAG,OAAA,EAAA,EAAW;AAC5C,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,YAAY,CAAA;AAEzC,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,IAAO,OAAA,KAAY,CAAA,EAAG;AACvC,QAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAChD,QAAA,MAAM,MAAA,GAAS,aAAa,IAAA,CAAK,GAAA,CAAI,OAAO,UAAU,CAAA,GAAI,GAAA,EAAM,GAAM,CAAA,GAAI,GAAA;AAC1E,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,EAAG,MAAM,CAAC,CAAA;AAC5C,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,IAAI,UAAU,CAAA,cAAA,EAAiB,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK,IAAI,UAAU,CAAA,CAAA;AAC5D,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,UAAA,IAAI,IAAA,EAAM,OAAA,EAAS,OAAA,GAAU,IAAA,CAAK,OAAA;AAAA,eAAA,IACzB,OAAO,IAAA,EAAM,KAAA,KAAU,QAAA,YAAoB,IAAA,CAAK,KAAA;AAAA,eAAA,IAChD,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,OAAA,GAAU,KAAK,KAAA,CAAM,OAAA;AAAA,QACtD,CAAA,CAAA,MAAQ;AAAA,QAA4B;AACpC,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,OAAO,CAAA;AAC7B,QAAA,GAAA,CAAI,SAAS,GAAA,CAAI,MAAA;AACjB,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,MAAA;AAC/B,MAAA,OAAO,IAAI,IAAA,EAAK;AAAA,IAClB;AAGA,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AAAA;AAAA,EAIA,MAAM,aAAa,MAAA,EAAuG;AACxH,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,IAAA,IAAI,MAAA,EAAQ,OAAO,EAAA,CAAG,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACvD,IAAA,IAAI,QAAQ,cAAA,EAAgB,EAAA,CAAG,GAAA,CAAI,gBAAA,EAAkB,OAAO,cAAc,CAAA;AAC1E,IAAA,IAAI,QAAQ,MAAA,EAAQ,EAAA,CAAG,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAClD,IAAA,MAAM,EAAA,GAAK,GAAG,QAAA,EAAS;AACvB,IAAA,OAAO,IAAA,CAAK,QAA+B,CAAA,SAAA,EAAY,EAAA,GAAK,IAAI,EAAE,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAM,WAAW,EAAA,EAA8B;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAiB,CAAA,UAAA,EAAa,EAAE,CAAA,CAAE,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,eAAe,OAAA,EAEE;AACrB,IAAA,MAAM,MAAiB,EAAC;AACxB,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,EAAA;AAEtC,IAAA,OAAO,OAAA,IAAW,QAAQ,QAAA,EAAU;AAClC,MAAA,MAAM,SAAS,IAAI,eAAA,CAAgB,EAAE,KAAA,EAAO,OAAO,CAAA;AACnD,MAAA,IAAI,SAAS,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AAAA,WACnD,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,WAAW,CAAA;AACrC,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,gBAAA,EAAkB,MAAM,CAAA;AAE/C,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA;AAAA,QACtB,aAAa,MAAM,CAAA,CAAA;AAAA,QAAI,EAAC;AAAA,QACxB,SAAS,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,OAAA,CAAQ,YAAW,GAAI;AAAA,OAC3E;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AAC1C,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,IAAA,EAAM;AACzB,QAAA,IAAI,CAAC,SAAS,MAAA,IAAU,OAAA,CAAQ,OAAO,CAAC,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACrD,QAAA,MAAA,GAAS,CAAA,CAAE,EAAA;AAAA,MACb;AACA,MAAA,OAAA,GAAU,IAAA,CAAK,QAAA;AACf,MAAA,KAAA,EAAA;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,WAAW,aAAA,EAAuC;AACtD,IAAA,OAAO,IAAA,CAAK,QAAc,OAAA,EAAS;AAAA,MACjC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU,aAAA,GAAgB,EAAE,cAAA,EAAgB,aAAA,EAAc,GAAI,EAAE;AAAA,KAC5E,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ,MAAA,EAA+B;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAc,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,SAAA,CAAU,MAAA,EAAgB,SAAA,EAAmB,UAAkB,OAAA,EAAoE;AACvI,IAAA,OAAO,IAAA,CAAK,OAAA,CAAkB,CAAA,MAAA,EAAS,MAAM,CAAA,MAAA,CAAA,EAAU;AAAA,MACrD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,UAAA,EAAY,SAAA;AAAA,QAAW,QAAA;AAAA,QACvB,GAAI,OAAA,EAAS,IAAA,KAAS,UAAa,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,QACxD,GAAI,OAAA,EAAS,SAAA,KAAc,UAAa,EAAE,UAAA,EAAY,QAAQ,SAAA;AAAU,OACzE;AAAA,KACF,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,cAAA,CAAe,MAAA,EAAgB,MAAA,EAAgB,QAAA,EAAiC;AACpF,IAAA,OAAO,KAAK,OAAA,CAAc,CAAA,MAAA,EAAS,MAAM,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,GAAG,CAAA;AAAA,EACtH;AAAA,EAEA,MAAM,cAAA,CAAe,MAAA,EAAgB,MAAA,EAA+B;AAClE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAc,CAAA,MAAA,EAAS,MAAM,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AAAA,EACnF;AAAA;AAAA,EAIA,MAAM,QAAA,CAAS,MAAA,EAAgB,aAAA,EAAwB,SAAuB,YAAA,EAAuC;AACnH,IAAA,OAAO,IAAA,CAAK,QAAe,WAAA,EAAa;AAAA,MACtC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,OAAA,EAAS,MAAA;AAAA,QACT,GAAI,aAAA,IAAiB,EAAE,cAAA,EAAgB,aAAA,EAAc;AAAA,QACrD,GAAI,YAAA,IAAgB,EAAE,aAAA,EAAe,YAAA,EAAa;AAAA,QAClD,GAAI,OAAA,IAAW;AAAA,UACb,gBAAgB,OAAA,CAAQ,cAAA;AAAA,UACxB,GAAI,OAAA,CAAQ,WAAA,IAAe,EAAE,WAAA,EAAa,QAAQ,WAAA,EAAY;AAAA,UAC9D,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAE,OAAA,EAAS,QAAQ,MAAA,EAAO;AAAA,UAChD,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAE,OAAA,EAAS,QAAQ,MAAA;AAAO;AAClD,OACD;AAAA,KACF,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,aAAa,KAAA,EAAoC;AACrD,IAAA,MAAM,OAAA,GAAU,mBAAmB,KAAK,CAAA;AACxC,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAA,CAA2C,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAC/F,IAAA,OAAO,MAAM,OAAA,CAAQ,GAAG,IAAI,GAAA,GAAM,GAAA,EAAK,QAAQ,EAAC;AAAA,EAClD;AAAA,EAEA,MAAM,YAAY,EAAA,EAA+B;AAAE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAkB,CAAA,WAAA,EAAc,EAAE,CAAA,CAAE,CAAA;AAAA,EAAE;AAAA,EAErG,MAAM,eAAe,IAAA,EAAmG;AACtH,IAAA,OAAO,IAAA,CAAK,OAAA,CAAkB,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,CAAA;AAAA,EAC5F;AAAA,EAEA,MAAM,aAAA,CAAc,UAAA,EAAoB,IAAA,EAA4G;AAClJ,IAAA,OAAO,IAAA,CAAK,QAAkB,qBAAA,EAAuB;AAAA,MACnD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,aAAa,UAAA,EAAY,GAAG,MAAM;AAAA,KAC1D,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,WAAW,MAAA,EAA0G;AACzH,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,IAAA,IAAI,QAAQ,WAAA,EAAa,EAAA,CAAG,GAAA,CAAI,aAAA,EAAe,OAAO,WAAW,CAAA;AACjE,IAAA,IAAI,MAAA,EAAQ,OAAO,EAAA,CAAG,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACvD,IAAA,IAAI,QAAQ,cAAA,EAAgB,EAAA,CAAG,GAAA,CAAI,gBAAA,EAAkB,OAAO,cAAc,CAAA;AAC1E,IAAA,MAAM,EAAA,GAAK,GAAG,QAAA,EAAS;AACvB,IAAA,OAAO,IAAA,CAAK,QAA6B,CAAA,OAAA,EAAU,EAAA,GAAK,IAAI,EAAE,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,SAAS,EAAA,EAA4B;AAAE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAe,CAAA,QAAA,EAAW,EAAE,CAAA,CAAE,CAAA;AAAA,EAAE;AAAA,EAEzF,MAAM,kBAAkB,UAAA,EAAsC;AAC5D,IAAA,OAAO,sBAAA,CAAuB,CAAC,IAAA,EAAM,IAAA,KAAS,KAAK,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA,EAAG,UAAU,CAAA;AAAA,EACpF;AAAA;AAAA,EAIA,MAAM,SAAS,KAAA,EAA0C;AACvD,IAAA,OAAO,IAAA,CAAK,OAAA,CAA0B,4BAAA,EAA8B,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,EACzH;AAAA,EAEA,MAAM,UAAA,CAAW,KAAA,EAAe,IAAA,EAA2C;AACzE,IAAA,OAAO,IAAA,CAAK,OAAA,CAA4B,8BAAA,EAAgC,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,IAAA,EAAM,GAAG,CAAA;AAAA,EACnI;AAAA;AAAA,EAIA,MAAM,oBAAA,CAAqB,UAAA,EAAoB,YAAA,EAA0D;AACvG,IAAA,OAAO,qBAAA,CAAsB,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,IAAI,CAAA,EAAG,YAAY,YAAY,CAAA;AAAA,EACrF;AAAA;AAAA,EAIA,MAAM,aAAA,GAAiD;AAAE,IAAA,OAAO,IAAA,CAAK,QAAgC,YAAY,CAAA;AAAA,EAAE;AAAA;AAAA,EAInH,eAAe,SAAA,EAA2B;AACxC,IAAA,OAAO,GAAG,IAAA,CAAK,OAAO,cAAc,IAAA,CAAK,OAAO,QAAQ,SAAS,CAAA,MAAA,CAAA;AAAA,EACnE;AAAA;AAAA,EAIA,MAAM,qBAAA,GAAmD;AACvD,IAAA,OAAO,IAAA,CAAK,QAA0B,oBAAoB,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,IAAA,EAAsC;AAE7D,IAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,GAAA,EAAM,kBAAA,CAAmB,IAAI,CAAC,CAAA,KAAA,CAAA;AAC5D,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC9C,MAAA,MAAM,IAAI,MAAM,IAAA,EAAM,KAAA,EAAO,WAAW,CAAA,yBAAA,EAA4B,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAClF;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA;AAAA,EAGA,MAAM,iBAAiB,IAAA,EAAmE;AACxF,IAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,GAAA,EAAM,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AAC5D,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC9C,MAAA,MAAM,IAAI,MAAM,IAAA,EAAM,KAAA,EAAO,WAAW,CAAA,2BAAA,EAA8B,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IACpF;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA;AAAA,EAIA,MAAM,cAAc,MAAA,EAiBW;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA,CAA2B,sBAAA,EAAwB,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA;AAAA,EACjH;AAAA,EAEA,MAAM,aAAA,CAAc,SAAA,EAAmB,MAAA,EAgBR;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA,CAA2B,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,GAAG,CAAA;AAAA,EAC/H;AAAA,EAEA,MAAM,WAAW,MAAA,EAAiI;AAChJ,IAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,WAAA,EAAc,KAAK,OAAO,CAAA,kBAAA,CAAA;AACrD,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,aAAa,IAAA,CAAK;AAAA,KACpB;AACA,IAAA,IAAI,KAAK,aAAA,EAAe,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,aAAa,CAAA,CAAA;AAE/E,IAAA,MAAM,OAAA,GAAmC;AAAA,MACvC,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,kBAAkB,MAAA,CAAO;AAAA,KAC3B;AACA,IAAA,IAAI,MAAA,CAAO,UAAA,EAAY,OAAA,CAAQ,UAAA,GAAa,MAAA,CAAO,UAAA;AACnD,IAAA,MAAM,aAAA,CAAc,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA,EAIA,MAAM,sBAAsB,MAAA,EAYC;AAC3B,IAAA,OAAO,IAAA,CAAK,QAAyB,sBAAA,EAAwB;AAAA,MAC3D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB,SAAA,EAA6C;AACpE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAyB,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAE,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,qBAAA,CAAsB,SAAA,EAAmB,MAAA,EAMlB;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAyB,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAA,EAAI;AAAA,MACxE,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,gBAAA,CAAiB,SAAA,EAAmB,OAAA,EAAuB,IAAA,EAG9C;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAe,CAAA,qBAAA,EAAwB,SAAS,CAAA,SAAA,CAAA,EAAa;AAAA,MACvE,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,GAAI,OAAA,IAAW;AAAA,UACb,gBAAgB,OAAA,CAAQ,cAAA;AAAA,UACxB,GAAI,OAAA,CAAQ,WAAA,IAAe,EAAE,WAAA,EAAa,QAAQ,WAAA,EAAY;AAAA,UAC9D,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAE,OAAA,EAAS,QAAQ,MAAA,EAAO;AAAA,UAChD,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAE,OAAA,EAAS,QAAQ,MAAA;AAAO,SAClD;AAAA,QACA,GAAI,IAAA,EAAM,iBAAA,IAAqB,EAAE,iBAAA,EAAmB,KAAK,iBAAA,EAAkB;AAAA,QAC3E,GAAI,IAAA,EAAM,mBAAA,IAAuB,EAAE,mBAAA,EAAqB,KAAK,mBAAA;AAAoB,OAClF;AAAA,KACF,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,eAAe,MAAA,EASc;AACjC,IAAA,MAAM,KAAK,IAAI,eAAA,CAAgB,EAAE,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA;AAClD,IAAA,IAAI,OAAO,WAAA,EAAa,EAAA,CAAG,GAAA,CAAI,aAAA,EAAe,OAAO,WAAW,CAAA;AAChE,IAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAW,EAAA,CAAG,IAAI,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAChF,IAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAW,EAAA,CAAG,IAAI,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAChF,IAAA,IAAI,OAAO,OAAA,EAAS,EAAA,CAAG,GAAA,CAAI,SAAA,EAAW,OAAO,OAAO,CAAA;AACpD,IAAA,IAAI,OAAO,UAAA,EAAY,EAAA,CAAG,GAAA,CAAI,YAAA,EAAc,OAAO,UAAU,CAAA;AAC7D,IAAA,IAAI,MAAA,CAAO,OAAO,EAAA,CAAG,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACtD,IAAA,IAAI,OAAO,cAAA,EAAgB,EAAA,CAAG,GAAA,CAAI,gBAAA,EAAkB,OAAO,cAAc,CAAA;AACzE,IAAA,OAAO,IAAA,CAAK,OAAA,CAA+B,CAAA,iBAAA,EAAoB,EAAE,CAAA,CAAE,CAAA;AAAA,EACrE;AAAA;AAAA,EAIA,MAAM,cAAA,GAAkD;AACtD,IAAA,OAAO,IAAA,CAAK,QAAgC,aAAa,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,YAAY,EAAA,EAA+B;AAC/C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAkB,CAAA,YAAA,EAAe,EAAE,CAAA,CAAE,CAAA;AAAA,EACnD;AAAA;AAAA,EAIA,MAAM,kBAAkB,UAAA,EAA6C;AACnE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAwB,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAE,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,kBAAA,GAA2D;AAC/D,IAAA,OAAO,IAAA,CAAK,QAAqC,6BAA6B,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,uBAAA,CAAwB,UAAA,EAAoB,MAAA,EAGJ;AAC5C,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,IAAA,IAAI,MAAA,EAAQ,OAAO,EAAA,CAAG,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACvD,IAAA,IAAI,QAAQ,cAAA,EAAgB,EAAA,CAAG,GAAA,CAAI,gBAAA,EAAkB,OAAO,cAAc,CAAA;AAC1E,IAAA,MAAM,EAAA,GAAK,GAAG,QAAA,EAAS;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,uBAAuB,UAAU,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA,EAAI,EAAE,KAAK,EAAE,CAAA;AAAA,KACrE;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,MAAA,EAIS;AACjC,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,CAAgB,EAAE,QAAA,EAAU,OAAO,QAAA,EAAU,WAAA,EAAa,MAAA,CAAO,WAAA,EAAa,CAAA;AAC7F,IAAA,IAAI,OAAO,IAAA,EAAM,EAAA,CAAG,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAA+B,CAAA,6BAAA,EAAgC,EAAE,CAAA,CAAE,CAAA;AAAA,EACjF;AAAA,EAEA,MAAM,mBAAA,CAAoB,UAAA,EAAoB,QAAA,EAA2E;AACvH,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,uBAAuB,UAAU,CAAA,OAAA,CAAA;AAAA,MACjC,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,UAAU,EAAE,SAAA,EAAW,QAAA,EAAU,CAAA;AAAE,KAClE;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,kBAAA,CAAmB,SAAA,EAAmB,MAAA,EAKoB;AAC9D,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,IAAA,IAAI,MAAA,EAAQ,OAAO,EAAA,CAAG,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACvD,IAAA,IAAI,QAAQ,cAAA,EAAgB,EAAA,CAAG,GAAA,CAAI,gBAAA,EAAkB,OAAO,cAAc,CAAA;AAC1E,IAAA,IAAI,QAAQ,OAAA,EAAS,EAAA,CAAG,GAAA,CAAI,SAAA,EAAW,OAAO,OAAO,CAAA;AACrD,IAAA,IAAI,QAAQ,UAAA,EAAY,EAAA,CAAG,GAAA,CAAI,YAAA,EAAc,OAAO,UAAU,CAAA;AAC9D,IAAA,MAAM,EAAA,GAAK,GAAG,QAAA,EAAS;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,aAAa,SAAS,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,EAAI,EAAE,KAAK,EAAE,CAAA;AAAA,KACrD;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CAAa,SAAA,EAAmB,IAAA,EAKlB;AAClB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAgB,CAAA,UAAA,EAAa,SAAS,CAAA,QAAA,CAAA,EAAY;AAAA,MAC5D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,kBAAkB,UAAA,EAAyD;AAC/E,IAAA,OAAO,IAAA,CAAK,OAAA,CAAoC,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAE,CAAA;AAAA,EACtF;AAAA,EAEA,MAAM,eAAA,CAAgB,UAAA,EAAoB,SAAA,EAA0C;AAClF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAsB,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAA,EAAI;AAAA,MACtE,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,UAAA,EAAY,WAAW;AAAA,KAC/C,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,kBAAA,CAAmB,UAAA,EAAoB,SAAA,EAAkC;AAC7E,IAAA,OAAO,KAAK,OAAA,CAAc,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI;AAAA,MAC3E,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,mBAAmB,MAAA,EAKe;AACtC,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,IAAA,IAAI,QAAQ,UAAA,EAAY,EAAA,CAAG,GAAA,CAAI,YAAA,EAAc,OAAO,UAAU,CAAA;AAC9D,IAAA,IAAI,QAAQ,WAAA,EAAa,EAAA,CAAG,GAAA,CAAI,aAAA,EAAe,OAAO,WAAW,CAAA;AACjE,IAAA,IAAI,MAAA,EAAQ,OAAO,EAAA,CAAG,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACvD,IAAA,IAAI,QAAQ,IAAA,EAAM,EAAA,CAAG,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC5C,IAAA,MAAM,EAAA,GAAK,GAAG,QAAA,EAAS;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,CAAA,2BAAA,EAA8B,EAAA,GAAK,CAAA,CAAA,EAAI,EAAE,KAAK,EAAE,CAAA;AAAA,KAClD;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,YAAY,EAAA,EAA+B;AAC/C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAkB,CAAA,WAAA,EAAc,EAAE,CAAA,CAAE,CAAA;AAAA,EAClD;AAAA;AAAA,EAIA,MAAM,mBAAA,GAA6D;AACjE,IAAA,OAAO,IAAA,CAAK,QAAsC,8BAA8B,CAAA;AAAA,EAClF;AAAA,EAEA,MAAM,uBAAuB,MAAA,EAGS;AACpC,IAAA,OAAO,IAAA,CAAK,QAAkC,4BAAA,EAA8B;AAAA,MAC1E,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,YAAA,CAAa,IAAA,EAAc,MAAA,EAEL;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,CAAgB,EAAE,MAAM,CAAA;AACvC,IAAA,IAAI,QAAQ,OAAA,EAAS,EAAA,CAAG,GAAA,CAAI,SAAA,EAAW,OAAO,OAAO,CAAA;AACrD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAwB,CAAA,2BAAA,EAA8B,EAAE,CAAA,CAAE,CAAA;AAAA,EACxE;AAAA,EAEA,MAAM,SAAA,CAAU,MAAA,EAAgB,IAAA,EAA6B;AAC3D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAc,CAAA,MAAA,EAAS,MAAM,CAAA,KAAA,CAAA,EAAS;AAAA,MAChD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAM;AAAA,KAC9B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+B;AAC9C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAc,CAAA,MAAA,EAAS,MAAM,CAAA,KAAA,CAAA,EAAS;AAAA,MAChD,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cAAA,CAAe,IAAA,EAAc,MAAA,EAAwD;AACzF,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,MAAM,WAAA,CAAY,MAAA,EAAgB,IAAA,EAA6B;AAC7D,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAI,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,aAAa,MAAA,EAA+B;AAChD,IAAA,OAAO,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,EAC/B;AAAA;AAAA,EAIA,MAAM,eAAe,UAAA,EAAiD;AACpE,IAAA,OAAO,IAAA,CAAK,QAA4B,8BAAA,EAAgC;AAAA,MACtE,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAA,EAAa,YAAY;AAAA,KACjD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,UAAA,EAA6C;AACnE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAwB,CAAA,yCAAA,EAA4C,UAAU,CAAA,CAAE,CAAA;AAAA,EAC9F;AAAA,EAEA,MAAM,iBAAA,CACJ,UAAA,EACA,YAAA,EACsE;AACtE,IAAA,OAAO,IAAA,CAAK,QAAQ,iCAAA,EAAmC;AAAA,MACrD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,aAAa,UAAA,EAAY,aAAA,EAAe,cAAc;AAAA,KAC9E,CAAA;AAAA,EACH;AAMF;AAAA;AApmBa,WAAA,CAkmBJ,eAAA,GAAkB,eAAA;AAlmBd,WAAA,CAmmBJ,SAAA,GAAY,SAAA","file":"chunk-ENC26DTB.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 // Retry once on 429 (rate limited) — respect Retry-After header\n for (let attempt = 0; attempt < 2; attempt++) {\n const res = await fetch(url, fetchOptions)\n\n if (res.status === 429 && attempt === 0) {\n const retryAfter = res.headers.get('Retry-After')\n const waitMs = retryAfter ? Math.min(Number(retryAfter) * 1000, 10_000) : 2_000\n await new Promise(r => setTimeout(r, waitMs))\n continue\n }\n\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 // Should not reach here, but satisfy TypeScript\n throw new Error('Request failed after retry')\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 latitude?: number\n longitude?: number\n geolocation_source?: 'browser_gps' | 'ip' | 'zip' | 'address' | 'manual'\n geolocation_accuracy?: number\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 latitude?: number\n longitude?: number\n geolocation_source?: 'browser_gps' | 'ip' | 'zip' | 'address' | 'manual'\n geolocation_accuracy?: number\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 loyalty_reward_id?: string\n selected_product_id?: string\n visitor_id?: string\n session_id?: 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, opts?: {\n loyalty_reward_id?: string\n selected_product_id?: string\n }): Promise<Order> {\n return this.request<Order>(`/storefront/checkout/${sessionId}/complete`, {\n method: 'POST',\n body: JSON.stringify({\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 ...(opts?.loyalty_reward_id && { loyalty_reward_id: opts.loyalty_reward_id }),\n ...(opts?.selected_product_id && { selected_product_id: opts.selected_product_id }),\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 listLoyaltyProducts(params: {\n category: string\n location_id: string\n tier?: string\n }): Promise<ListResponse<Product>> {\n const sp = new URLSearchParams({ category: params.category, location_id: params.location_id })\n if (params.tier) sp.set('tier', params.tier)\n return this.request<ListResponse<Product>>(`/storefront/loyalty/products?${sp}`)\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"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkUW2U5BRY_cjs = require('./chunk-UW2U5BRY.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunkENC26DTB_cjs = require('./chunk-ENC26DTB.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
@@ -11,11 +11,11 @@ Object.defineProperty(exports, "PixelManager", {
|
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "WhaleClient", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkENC26DTB_cjs.WhaleClient; }
|
|
15
15
|
});
|
|
16
16
|
Object.defineProperty(exports, "resilientSend", {
|
|
17
17
|
enumerable: true,
|
|
18
|
-
get: function () { return
|
|
18
|
+
get: function () { return chunkENC26DTB_cjs.resilientSend; }
|
|
19
19
|
});
|
|
20
20
|
//# sourceMappingURL=index.cjs.map
|
|
21
21
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
package/dist/landing.global.js
CHANGED
|
@@ -379,9 +379,13 @@ var WhaleStorefront = (function (exports) {
|
|
|
379
379
|
|
|
380
380
|
// src/shims/jsx-runtime-global.ts
|
|
381
381
|
var R2 = globalThis.React;
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
382
|
+
function jsx(type, props, key) {
|
|
383
|
+
const { children, ...rest } = props;
|
|
384
|
+
if (key !== void 0) rest.key = key;
|
|
385
|
+
if (children === void 0) return R2.createElement(type, rest);
|
|
386
|
+
if (Array.isArray(children)) return R2.createElement(type, rest, ...children);
|
|
387
|
+
return R2.createElement(type, rest, children);
|
|
388
|
+
}
|
|
385
389
|
var Fragment2 = R2.Fragment;
|
|
386
390
|
|
|
387
391
|
// src/react/components/sections/shared.tsx
|
|
@@ -446,7 +450,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
446
450
|
visible
|
|
447
451
|
);
|
|
448
452
|
const display = decimals > 0 ? (count / Math.pow(10, decimals)).toFixed(decimals) : hasCommas ? count.toLocaleString() : String(count);
|
|
449
|
-
return /* @__PURE__ */
|
|
453
|
+
return /* @__PURE__ */ jsx("span", { ref, children: [
|
|
450
454
|
prefix,
|
|
451
455
|
display,
|
|
452
456
|
suffix
|
|
@@ -462,7 +466,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
462
466
|
// src/react/components/sections/content-sections.tsx
|
|
463
467
|
function HeroSection({ section, theme, tracking, onEvent }) {
|
|
464
468
|
const { title, subtitle, background_image, cta_text, cta_url } = section.content;
|
|
465
|
-
return /* @__PURE__ */
|
|
469
|
+
return /* @__PURE__ */ jsx("div", { style: {
|
|
466
470
|
position: "relative",
|
|
467
471
|
minHeight: "60vh",
|
|
468
472
|
display: "flex",
|
|
@@ -476,7 +480,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
476
480
|
backgroundPosition: "center"
|
|
477
481
|
}, children: [
|
|
478
482
|
background_image && /* @__PURE__ */ jsx("div", { style: { position: "absolute", inset: 0, background: "rgba(0,0,0,0.5)" } }),
|
|
479
|
-
/* @__PURE__ */
|
|
483
|
+
/* @__PURE__ */ jsx("div", { style: { position: "relative", zIndex: 1, maxWidth: 640 }, children: [
|
|
480
484
|
title && /* @__PURE__ */ jsx("h1", { style: {
|
|
481
485
|
fontSize: "clamp(2rem, 8vw, 3rem)",
|
|
482
486
|
fontWeight: 300,
|
|
@@ -522,7 +526,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
522
526
|
function TextSection({ section, theme }) {
|
|
523
527
|
const { heading, body } = section.content;
|
|
524
528
|
const align = section.config?.align || "left";
|
|
525
|
-
return /* @__PURE__ */
|
|
529
|
+
return /* @__PURE__ */ jsx("div", { style: { padding: "2rem 1.5rem", maxWidth: 640, margin: "0 auto", textAlign: align }, children: [
|
|
526
530
|
heading && /* @__PURE__ */ jsx("h2", { style: {
|
|
527
531
|
fontSize: 11,
|
|
528
532
|
fontWeight: 500,
|
|
@@ -538,7 +542,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
538
542
|
const { url, alt, caption } = section.content;
|
|
539
543
|
const contained = section.config?.contained !== false;
|
|
540
544
|
if (!url) return null;
|
|
541
|
-
return /* @__PURE__ */
|
|
545
|
+
return /* @__PURE__ */ jsx("div", { style: { padding: contained ? "1.5rem" : 0, maxWidth: contained ? 640 : void 0, margin: contained ? "0 auto" : void 0 }, children: [
|
|
542
546
|
/* @__PURE__ */ jsx("img", { src: url, alt: alt || "", style: { width: "100%", display: "block", objectFit: "cover" } }),
|
|
543
547
|
caption && /* @__PURE__ */ jsx("p", { style: { fontSize: "0.8rem", color: theme.muted, textAlign: "center", marginTop: "0.75rem" }, children: caption })
|
|
544
548
|
] });
|
|
@@ -585,7 +589,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
585
589
|
function CTASection({ section, theme, tracking, onEvent }) {
|
|
586
590
|
const { title, subtitle, buttons } = section.content;
|
|
587
591
|
if (!buttons || buttons.length === 0) return null;
|
|
588
|
-
return /* @__PURE__ */
|
|
592
|
+
return /* @__PURE__ */ jsx("div", { style: { padding: "2rem 1.5rem", maxWidth: 480, margin: "0 auto", display: "flex", flexDirection: "column", gap: "0.75rem" }, children: [
|
|
589
593
|
title && /* @__PURE__ */ jsx("h2", { style: {
|
|
590
594
|
fontSize: "clamp(1.25rem, 4vw, 1.5rem)",
|
|
591
595
|
fontWeight: 300,
|
|
@@ -642,8 +646,8 @@ var WhaleStorefront = (function (exports) {
|
|
|
642
646
|
const layout = section.config?.layout;
|
|
643
647
|
if (!stats || stats.length === 0) return null;
|
|
644
648
|
if (layout === "list") {
|
|
645
|
-
return /* @__PURE__ */ jsx("div", { style: { padding: "1.5rem", maxWidth: 640, margin: "0 auto" }, children: stats.map((stat, i) => /* @__PURE__ */
|
|
646
|
-
/* @__PURE__ */
|
|
649
|
+
return /* @__PURE__ */ jsx("div", { style: { padding: "1.5rem", maxWidth: 640, margin: "0 auto" }, children: stats.map((stat, i) => /* @__PURE__ */ jsx("div", { children: [
|
|
650
|
+
/* @__PURE__ */ jsx("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "baseline", padding: "0.625rem 0" }, children: [
|
|
647
651
|
/* @__PURE__ */ jsx("span", { style: { fontSize: 12, textTransform: "uppercase", letterSpacing: "0.15em", color: `${theme.fg}66` }, children: stat.label }),
|
|
648
652
|
/* @__PURE__ */ jsx("span", { style: { fontSize: 14, fontWeight: 300, color: `${theme.fg}CC` }, children: /* @__PURE__ */ jsx(AnimatedText, { text: stat.value }) })
|
|
649
653
|
] }),
|
|
@@ -651,7 +655,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
651
655
|
] }, i)) });
|
|
652
656
|
}
|
|
653
657
|
const columns = Math.min(stats.length, 4);
|
|
654
|
-
return /* @__PURE__ */ jsx("div", { style: { padding: "1.5rem", maxWidth: 640, margin: "0 auto" }, children: /* @__PURE__ */ jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${columns}, 1fr)`, border: `1px solid ${theme.fg}0F` }, children: stats.map((stat, i) => /* @__PURE__ */
|
|
658
|
+
return /* @__PURE__ */ jsx("div", { style: { padding: "1.5rem", maxWidth: 640, margin: "0 auto" }, children: /* @__PURE__ */ jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${columns}, 1fr)`, border: `1px solid ${theme.fg}0F` }, children: stats.map((stat, i) => /* @__PURE__ */ jsx("div", { style: {
|
|
655
659
|
padding: "1.25rem 0.5rem",
|
|
656
660
|
textAlign: "center",
|
|
657
661
|
borderRight: i < stats.length - 1 ? `1px solid ${theme.fg}0F` : void 0
|
|
@@ -680,9 +684,9 @@ var WhaleStorefront = (function (exports) {
|
|
|
680
684
|
const description = c.description || product?.description || "";
|
|
681
685
|
const imageUrl = c.image_url || product?.featured_image || null;
|
|
682
686
|
const url = c.url || null;
|
|
683
|
-
return /* @__PURE__ */ jsx("div", { style: { padding: "1.5rem", maxWidth: 480, margin: "0 auto" }, children: /* @__PURE__ */
|
|
687
|
+
return /* @__PURE__ */ jsx("div", { style: { padding: "1.5rem", maxWidth: 480, margin: "0 auto" }, children: /* @__PURE__ */ jsx("div", { style: { background: theme.surface, overflow: "hidden" }, children: [
|
|
684
688
|
imageUrl && /* @__PURE__ */ jsx("div", { style: { width: "100%", aspectRatio: "1", overflow: "hidden" }, children: /* @__PURE__ */ jsx("img", { src: imageUrl, alt: name, style: { width: "100%", height: "100%", objectFit: "cover", display: "block" } }) }),
|
|
685
|
-
/* @__PURE__ */
|
|
689
|
+
/* @__PURE__ */ jsx("div", { style: { padding: "1.25rem" }, children: [
|
|
686
690
|
/* @__PURE__ */ jsx("h3", { style: { fontSize: "1.25rem", fontWeight: 600, margin: "0 0 0.5rem", color: theme.fg }, children: name }),
|
|
687
691
|
description && /* @__PURE__ */ jsx("p", { style: { fontSize: "0.9rem", color: theme.muted, margin: "0 0 1rem", lineHeight: 1.5 }, children: description }),
|
|
688
692
|
url && /* @__PURE__ */ jsx(
|
|
@@ -750,8 +754,8 @@ var WhaleStorefront = (function (exports) {
|
|
|
750
754
|
}, style: buttonStyle, children: buttonLabel }) });
|
|
751
755
|
}
|
|
752
756
|
function COAModal({ coa, theme, onClose }) {
|
|
753
|
-
return /* @__PURE__ */
|
|
754
|
-
/* @__PURE__ */
|
|
757
|
+
return /* @__PURE__ */ jsx("div", { style: { position: "fixed", inset: 0, zIndex: 9999, background: "rgba(0,0,0,0.95)", display: "flex", flexDirection: "column" }, children: [
|
|
758
|
+
/* @__PURE__ */ jsx("div", { style: {
|
|
755
759
|
display: "flex",
|
|
756
760
|
justifyContent: "space-between",
|
|
757
761
|
alignItems: "center",
|
|
@@ -843,10 +847,10 @@ var WhaleStorefront = (function (exports) {
|
|
|
843
847
|
transition: "border-color 0.2s"
|
|
844
848
|
};
|
|
845
849
|
if (status === "success") return /* @__PURE__ */ jsx(SuccessState, { theme, heading: successHeading, message: successMessage, couponCode: c.coupon_code });
|
|
846
|
-
return /* @__PURE__ */
|
|
850
|
+
return /* @__PURE__ */ jsx("div", { style: { padding: "3.5rem 1.5rem", maxWidth: 560, margin: "0 auto" }, children: [
|
|
847
851
|
/* @__PURE__ */ jsx("style", { children: `@keyframes lc-spin { to { transform: rotate(360deg) } }` }),
|
|
848
|
-
/* @__PURE__ */
|
|
849
|
-
/* @__PURE__ */
|
|
852
|
+
/* @__PURE__ */ jsx("div", { style: { background: theme.surface, border: `1px solid ${theme.fg}12`, padding: "clamp(2rem, 6vw, 3rem)" }, children: [
|
|
853
|
+
/* @__PURE__ */ jsx("div", { style: { textAlign: "center", marginBottom: "clamp(1.5rem, 4vw, 2rem)" }, children: [
|
|
850
854
|
/* @__PURE__ */ jsx("h2", { style: {
|
|
851
855
|
fontSize: "clamp(1.5rem, 5vw, 2.25rem)",
|
|
852
856
|
fontWeight: 300,
|
|
@@ -865,12 +869,12 @@ var WhaleStorefront = (function (exports) {
|
|
|
865
869
|
letterSpacing: "0.15em"
|
|
866
870
|
}, children: subtitle })
|
|
867
871
|
] }),
|
|
868
|
-
/* @__PURE__ */
|
|
869
|
-
/* @__PURE__ */
|
|
872
|
+
/* @__PURE__ */ jsx("form", { onSubmit: handleSubmit, style: { display: "flex", flexDirection: "column", gap: "0.75rem" }, children: [
|
|
873
|
+
/* @__PURE__ */ jsx("div", { style: { display: "flex", gap: "0.75rem", flexWrap: "wrap" }, children: [
|
|
870
874
|
/* @__PURE__ */ jsx("input", { type: "text", placeholder: "First name", value: firstName, onChange: (e) => setFirstName(e.target.value), style: inputStyle }),
|
|
871
875
|
/* @__PURE__ */ jsx("input", { type: "email", placeholder: "Email address", value: email, onChange: (e) => setEmail(e.target.value), required: true, style: inputStyle })
|
|
872
876
|
] }),
|
|
873
|
-
c.show_newsletter_opt_in !== false && /* @__PURE__ */
|
|
877
|
+
c.show_newsletter_opt_in !== false && /* @__PURE__ */ jsx("label", { style: {
|
|
874
878
|
display: "flex",
|
|
875
879
|
alignItems: "center",
|
|
876
880
|
gap: "0.5rem",
|
|
@@ -892,7 +896,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
892
896
|
c.newsletter_label || "Also sign me up for the newsletter \u2014 new drops, deals, and company news."
|
|
893
897
|
] }),
|
|
894
898
|
status === "error" && errorMsg && /* @__PURE__ */ jsx("p", { style: { fontSize: "0.8rem", color: "#e55", margin: 0, fontWeight: 400 }, children: errorMsg }),
|
|
895
|
-
/* @__PURE__ */
|
|
899
|
+
/* @__PURE__ */ jsx("button", { type: "submit", disabled: status === "loading", style: {
|
|
896
900
|
width: "100%",
|
|
897
901
|
padding: "0.875rem",
|
|
898
902
|
background: theme.fg,
|
|
@@ -927,7 +931,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
927
931
|
] });
|
|
928
932
|
}
|
|
929
933
|
function SuccessState({ theme, heading, message, couponCode }) {
|
|
930
|
-
return /* @__PURE__ */ jsx("div", { style: { padding: "3.5rem 1.5rem", maxWidth: 560, margin: "0 auto" }, children: /* @__PURE__ */
|
|
934
|
+
return /* @__PURE__ */ jsx("div", { style: { padding: "3.5rem 1.5rem", maxWidth: 560, margin: "0 auto" }, children: /* @__PURE__ */ jsx("div", { style: { background: theme.surface, border: `1px solid ${theme.fg}12`, padding: "clamp(2rem, 6vw, 3rem)", textAlign: "center" }, children: [
|
|
931
935
|
/* @__PURE__ */ jsx("h2", { style: {
|
|
932
936
|
fontSize: "clamp(1.5rem, 5vw, 2rem)",
|
|
933
937
|
fontWeight: 300,
|
|
@@ -1007,7 +1011,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
1007
1011
|
obs.observe(el2);
|
|
1008
1012
|
return () => obs.disconnect();
|
|
1009
1013
|
}, [section.id, section.type, onEvent]);
|
|
1010
|
-
return /* @__PURE__ */
|
|
1014
|
+
return /* @__PURE__ */ jsx("div", { ref: sectionRef, "data-section-id": section.id, "data-section-type": section.type, children: [
|
|
1011
1015
|
el,
|
|
1012
1016
|
showCOA && data?.coa && /* @__PURE__ */ jsx(COAModal, { coa: data.coa, theme, onClose: () => setShowCOA(false) })
|
|
1013
1017
|
] });
|
|
@@ -1189,7 +1193,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
1189
1193
|
const urlParams = typeof window !== "undefined" ? new URLSearchParams(window.location.search) : new URLSearchParams();
|
|
1190
1194
|
const sorted = [...lp.sections].sort((a, b) => a.order - b.order).filter((s) => isSectionVisible(s, urlParams));
|
|
1191
1195
|
const sectionData = { ...data, gatewayUrl, landing_page: { slug: lp.slug }, analyticsContext };
|
|
1192
|
-
return /* @__PURE__ */
|
|
1196
|
+
return /* @__PURE__ */ jsx("div", { style: { minHeight: "100dvh", background: theme.bg, color: theme.fg, fontFamily }, children: [
|
|
1193
1197
|
lp.custom_css && /* @__PURE__ */ jsx("style", { children: lp.custom_css }),
|
|
1194
1198
|
logoUrl && /* @__PURE__ */ jsx("div", { style: { padding: "1.5rem", display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsx("img", { src: logoUrl, alt: store?.name || "Store", style: { height: 40, objectFit: "contain" } }) }),
|
|
1195
1199
|
sorted.map((section) => {
|
|
@@ -1197,7 +1201,7 @@ var WhaleStorefront = (function (exports) {
|
|
|
1197
1201
|
if (renderSection) return /* @__PURE__ */ jsx("div", { children: renderSection(section, defaultRenderer) }, section.id);
|
|
1198
1202
|
return /* @__PURE__ */ jsx(SectionRenderer, { section, data: sectionData, theme, onEvent: handleEvent }, section.id);
|
|
1199
1203
|
}),
|
|
1200
|
-
store?.name && /* @__PURE__ */ jsx("div", { style: { padding: "2rem 1.5rem", borderTop: `1px solid ${theme.surface}`, textAlign: "center" }, children: /* @__PURE__ */
|
|
1204
|
+
store?.name && /* @__PURE__ */ jsx("div", { style: { padding: "2rem 1.5rem", borderTop: `1px solid ${theme.surface}`, textAlign: "center" }, children: /* @__PURE__ */ jsx("p", { style: { fontSize: "0.75rem", color: theme.muted, margin: 0 }, children: [
|
|
1201
1205
|
"Powered by ",
|
|
1202
1206
|
store.name
|
|
1203
1207
|
] }) })
|
|
@@ -1225,8 +1229,8 @@ var WhaleStorefront = (function (exports) {
|
|
|
1225
1229
|
padding: "2rem"
|
|
1226
1230
|
};
|
|
1227
1231
|
function StateScreen({ title, subtitle, loading }) {
|
|
1228
|
-
return /* @__PURE__ */ jsx("div", { style: screenStyle, children: /* @__PURE__ */
|
|
1229
|
-
loading && /* @__PURE__ */
|
|
1232
|
+
return /* @__PURE__ */ jsx("div", { style: screenStyle, children: /* @__PURE__ */ jsx("div", { children: [
|
|
1233
|
+
loading && /* @__PURE__ */ jsx(Fragment2, { children: [
|
|
1230
1234
|
/* @__PURE__ */ jsx("div", { style: { width: 32, height: 32, border: "2px solid #333", borderTopColor: "#fafafa", borderRadius: "50%", animation: "spin 0.8s linear infinite", margin: "0 auto 1rem" } }),
|
|
1231
1235
|
/* @__PURE__ */ jsx("style", { children: `@keyframes spin { to { transform: rotate(360deg) } }` })
|
|
1232
1236
|
] }),
|
package/dist/next/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkENC26DTB_cjs = require('../chunk-ENC26DTB.cjs');
|
|
4
4
|
var server = require('next/server');
|
|
5
5
|
|
|
6
6
|
// src/next/headers.ts
|
|
@@ -54,7 +54,7 @@ function whaleGatewayRewrite(gatewayUrl = "https://whale-gateway.fly.dev", proxy
|
|
|
54
54
|
|
|
55
55
|
// src/next/server.ts
|
|
56
56
|
function createServerClient(config) {
|
|
57
|
-
return new
|
|
57
|
+
return new chunkENC26DTB_cjs.WhaleClient({
|
|
58
58
|
storeId: config?.storeId || process.env.NEXT_PUBLIC_STORE_ID || process.env.NEXT_PUBLIC_WHALE_STORE_ID || "",
|
|
59
59
|
apiKey: config?.apiKey || process.env.NEXT_PUBLIC_API_KEY || process.env.NEXT_PUBLIC_WHALE_API_KEY || "",
|
|
60
60
|
gatewayUrl: config?.gatewayUrl || process.env.NEXT_PUBLIC_API_URL || process.env.NEXT_PUBLIC_WHALE_GATEWAY_URL || "https://whale-gateway.fly.dev",
|
|
@@ -87,8 +87,8 @@ function createImageLoader(config) {
|
|
|
87
87
|
const w = String(snapWidth(width));
|
|
88
88
|
const q = String(quality || 80);
|
|
89
89
|
const f = "webp";
|
|
90
|
-
const encoded =
|
|
91
|
-
const s =
|
|
90
|
+
const encoded = chunkENC26DTB_cjs.WhaleClient.encodeBase64Url(cleanSrc);
|
|
91
|
+
const s = chunkENC26DTB_cjs.WhaleClient.signMedia(config.signingSecret, encoded, w, q, f);
|
|
92
92
|
return `${config.gatewayUrl}/v1/stores/${config.storeId}/media?url=${encoded}&w=${w}&q=${q}&f=${f}&s=${s}`;
|
|
93
93
|
};
|
|
94
94
|
}
|
package/dist/next/index.js
CHANGED
package/dist/react/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkUW2U5BRY_cjs = require('../chunk-UW2U5BRY.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunkENC26DTB_cjs = require('../chunk-ENC26DTB.cjs');
|
|
5
5
|
var chunkHOQKBNYB_cjs = require('../chunk-HOQKBNYB.cjs');
|
|
6
6
|
var react = require('react');
|
|
7
7
|
var navigation = require('next/navigation');
|
|
@@ -741,7 +741,7 @@ function BehavioralTrackerComponent({ pathname }) {
|
|
|
741
741
|
const baseUrl = config.proxyPath;
|
|
742
742
|
const endpoint = `${baseUrl}/v1/stores/${config.storeId}/storefront/behavioral`;
|
|
743
743
|
const sendBatch = async (batch) => {
|
|
744
|
-
await
|
|
744
|
+
await chunkENC26DTB_cjs.resilientSend(endpoint, batch, {
|
|
745
745
|
"Content-Type": "application/json",
|
|
746
746
|
"x-api-key": config.apiKey
|
|
747
747
|
});
|
|
@@ -927,7 +927,7 @@ function FingerprintCollector() {
|
|
|
927
927
|
collectFingerprint().then(async (fp) => {
|
|
928
928
|
const baseUrl = config.proxyPath;
|
|
929
929
|
const url = `${baseUrl}/v1/stores/${config.storeId}/storefront/fingerprints`;
|
|
930
|
-
await
|
|
930
|
+
await chunkENC26DTB_cjs.resilientSend(url, fp, {
|
|
931
931
|
"Content-Type": "application/json",
|
|
932
932
|
"x-api-key": config.apiKey
|
|
933
933
|
}).catch(() => {
|
|
@@ -1308,7 +1308,7 @@ function SessionRecorderComponent() {
|
|
|
1308
1308
|
const sid = sessionId;
|
|
1309
1309
|
const recorder = new SessionRecorder({
|
|
1310
1310
|
sendChunk: async (events, sequence) => {
|
|
1311
|
-
await
|
|
1311
|
+
await chunkENC26DTB_cjs.resilientSend(url, {
|
|
1312
1312
|
session_id: sid,
|
|
1313
1313
|
visitor_id: visitorId,
|
|
1314
1314
|
events,
|
|
@@ -1387,7 +1387,7 @@ function WhaleProvider({
|
|
|
1387
1387
|
trackingEnabled: trackingEnabled ?? envBool("NEXT_PUBLIC_TRACKING_ENABLED") ?? true,
|
|
1388
1388
|
recordingRate: recordingRate ?? envNumber("NEXT_PUBLIC_RECORDING_RATE") ?? 0.1
|
|
1389
1389
|
};
|
|
1390
|
-
const client = new
|
|
1390
|
+
const client = new chunkENC26DTB_cjs.WhaleClient({
|
|
1391
1391
|
storeId,
|
|
1392
1392
|
apiKey,
|
|
1393
1393
|
gatewayUrl: resolvedConfig.gatewayUrl,
|
package/dist/react/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PixelManager } from '../chunk-MZO7BCGU.js';
|
|
2
|
-
import { resilientSend, WhaleClient } from '../chunk-
|
|
2
|
+
import { resilientSend, WhaleClient } from '../chunk-BZCZLS5M.js';
|
|
3
3
|
import { BehavioralTracker } from '../chunk-AKWSW7DW.js';
|
|
4
4
|
import { createContext, useContext, useRef, useCallback, useEffect, useState, useMemo } from 'react';
|
|
5
5
|
import { usePathname } from 'next/navigation';
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resilient-send.ts","../src/client-queries.ts","../src/client.ts"],"names":[],"mappings":"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","file":"chunk-2XODSXJT.js","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 latitude?: number\n longitude?: number\n geolocation_source?: 'browser_gps' | 'ip' | 'zip' | 'address' | 'manual'\n geolocation_accuracy?: number\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 latitude?: number\n longitude?: number\n geolocation_source?: 'browser_gps' | 'ip' | 'zip' | 'address' | 'manual'\n geolocation_accuracy?: number\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 loyalty_reward_id?: string\n selected_product_id?: string\n visitor_id?: string\n session_id?: 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, opts?: {\n loyalty_reward_id?: string\n selected_product_id?: string\n }): Promise<Order> {\n return this.request<Order>(`/storefront/checkout/${sessionId}/complete`, {\n method: 'POST',\n body: JSON.stringify({\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 ...(opts?.loyalty_reward_id && { loyalty_reward_id: opts.loyalty_reward_id }),\n ...(opts?.selected_product_id && { selected_product_id: opts.selected_product_id }),\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 listLoyaltyProducts(params: {\n category: string\n location_id: string\n tier?: string\n }): Promise<ListResponse<Product>> {\n const sp = new URLSearchParams({ category: params.category, location_id: params.location_id })\n if (params.tier) sp.set('tier', params.tier)\n return this.request<ListResponse<Product>>(`/storefront/loyalty/products?${sp}`)\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resilient-send.ts","../src/client-queries.ts","../src/client.ts"],"names":[],"mappings":"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","file":"chunk-HSGM4XMK.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 latitude?: number\n longitude?: number\n geolocation_source?: 'browser_gps' | 'ip' | 'zip' | 'address' | 'manual'\n geolocation_accuracy?: number\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 latitude?: number\n longitude?: number\n geolocation_source?: 'browser_gps' | 'ip' | 'zip' | 'address' | 'manual'\n geolocation_accuracy?: number\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 loyalty_reward_id?: string\n selected_product_id?: string\n visitor_id?: string\n session_id?: 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, opts?: {\n loyalty_reward_id?: string\n selected_product_id?: string\n }): Promise<Order> {\n return this.request<Order>(`/storefront/checkout/${sessionId}/complete`, {\n method: 'POST',\n body: JSON.stringify({\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 ...(opts?.loyalty_reward_id && { loyalty_reward_id: opts.loyalty_reward_id }),\n ...(opts?.selected_product_id && { selected_product_id: opts.selected_product_id }),\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 listLoyaltyProducts(params: {\n category: string\n location_id: string\n tier?: string\n }): Promise<ListResponse<Product>> {\n const sp = new URLSearchParams({ category: params.category, location_id: params.location_id })\n if (params.tier) sp.set('tier', params.tier)\n return this.request<ListResponse<Product>>(`/storefront/loyalty/products?${sp}`)\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"]}
|