@neowhale/storefront 0.2.37 → 0.2.39

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.
@@ -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
- const res = await fetch(url, fetchOptions);
119
- if (!res.ok) {
120
- let message = `Gateway error ${res.status}: ${res.statusText}`;
121
- try {
122
- const body = await res.json();
123
- if (body?.message) message = body.message;
124
- else if (typeof body?.error === "string") message = body.error;
125
- else if (body?.error?.message) message = body.error.message;
126
- } catch {
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
- const err = new Error(message);
129
- err.status = res.status;
130
- throw err;
139
+ if (res.status === 204) return void 0;
140
+ return res.json();
131
141
  }
132
- if (res.status === 204) return void 0;
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-2XODSXJT.js.map
504
- //# sourceMappingURL=chunk-2XODSXJT.js.map
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
- const res = await fetch(url, fetchOptions);
121
- if (!res.ok) {
122
- let message = `Gateway error ${res.status}: ${res.statusText}`;
123
- try {
124
- const body = await res.json();
125
- if (body?.message) message = body.message;
126
- else if (typeof body?.error === "string") message = body.error;
127
- else if (body?.error?.message) message = body.error.message;
128
- } catch {
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
- const err = new Error(message);
131
- err.status = res.status;
132
- throw err;
141
+ if (res.status === 204) return void 0;
142
+ return res.json();
133
143
  }
134
- if (res.status === 204) return void 0;
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-HSGM4XMK.cjs.map
507
- //# sourceMappingURL=chunk-HSGM4XMK.cjs.map
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":"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","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 chunkHSGM4XMK_cjs = require('./chunk-HSGM4XMK.cjs');
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 chunkHSGM4XMK_cjs.WhaleClient; }
14
+ get: function () { return chunkENC26DTB_cjs.WhaleClient; }
15
15
  });
16
16
  Object.defineProperty(exports, "resilientSend", {
17
17
  enumerable: true,
18
- get: function () { return chunkHSGM4XMK_cjs.resilientSend; }
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
@@ -1,4 +1,4 @@
1
1
  export { PixelManager } from './chunk-MZO7BCGU.js';
2
- export { WhaleClient, resilientSend } from './chunk-2XODSXJT.js';
2
+ export { WhaleClient, resilientSend } from './chunk-BZCZLS5M.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -784,6 +784,7 @@ var WhaleStorefront = (function (exports) {
784
784
  const [newsletterOptIn, setNewsletterOptIn] = useState(false);
785
785
  const [status, setStatus] = useState("idle");
786
786
  const [errorMsg, setErrorMsg] = useState("");
787
+ const [serverMessage, setServerMessage] = useState(null);
787
788
  const gatewayUrl = c.gateway_url || data.gatewayUrl || "https://whale-gateway.fly.dev";
788
789
  const storeId = c.store_id || data.store?.id;
789
790
  const slug = c.landing_page_slug || data.landing_page?.slug;
@@ -822,8 +823,15 @@ var WhaleStorefront = (function (exports) {
822
823
  })
823
824
  });
824
825
  if (!res.ok) {
825
- const body = await res.json().catch(() => ({}));
826
- throw new Error(body?.error?.message || "Something went wrong. Please try again.");
826
+ const body2 = await res.json().catch(() => ({}));
827
+ throw new Error(body2?.error?.message || "Something went wrong. Please try again.");
828
+ }
829
+ const body = await res.json().catch(() => ({}));
830
+ if (body.is_new === false) {
831
+ setServerMessage({
832
+ heading: "welcome back!",
833
+ message: body.message || "your rewards are already loaded."
834
+ });
827
835
  }
828
836
  setStatus("success");
829
837
  onEvent?.("lead", { email, first_name: firstName || void 0, source: c.source || "landing_page", landing_page_slug: slug || void 0 });
@@ -846,7 +854,7 @@ var WhaleStorefront = (function (exports) {
846
854
  fontFamily: "inherit",
847
855
  transition: "border-color 0.2s"
848
856
  };
849
- if (status === "success") return /* @__PURE__ */ jsx(SuccessState, { theme, heading: successHeading, message: successMessage, couponCode: c.coupon_code });
857
+ if (status === "success") return /* @__PURE__ */ jsx(SuccessState, { theme, heading: serverMessage?.heading || successHeading, message: serverMessage?.message || successMessage, couponCode: c.coupon_code });
850
858
  return /* @__PURE__ */ jsx("div", { style: { padding: "3.5rem 1.5rem", maxWidth: 560, margin: "0 auto" }, children: [
851
859
  /* @__PURE__ */ jsx("style", { children: `@keyframes lc-spin { to { transform: rotate(360deg) } }` }),
852
860
  /* @__PURE__ */ jsx("div", { style: { background: theme.surface, border: `1px solid ${theme.fg}12`, padding: "clamp(2rem, 6vw, 3rem)" }, children: [
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkHSGM4XMK_cjs = require('../chunk-HSGM4XMK.cjs');
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 chunkHSGM4XMK_cjs.WhaleClient({
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 = chunkHSGM4XMK_cjs.WhaleClient.encodeBase64Url(cleanSrc);
91
- const s = chunkHSGM4XMK_cjs.WhaleClient.signMedia(config.signingSecret, encoded, w, q, f);
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
  }
@@ -1,4 +1,4 @@
1
- import { WhaleClient } from '../chunk-2XODSXJT.js';
1
+ import { WhaleClient } from '../chunk-BZCZLS5M.js';
2
2
  import { NextResponse } from 'next/server';
3
3
 
4
4
  // src/next/headers.ts
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkUW2U5BRY_cjs = require('../chunk-UW2U5BRY.cjs');
4
- var chunkHSGM4XMK_cjs = require('../chunk-HSGM4XMK.cjs');
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 chunkHSGM4XMK_cjs.resilientSend(endpoint, batch, {
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 chunkHSGM4XMK_cjs.resilientSend(url, fp, {
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 chunkHSGM4XMK_cjs.resilientSend(url, {
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 chunkHSGM4XMK_cjs.WhaleClient({
1390
+ const client = new chunkENC26DTB_cjs.WhaleClient({
1391
1391
  storeId,
1392
1392
  apiKey,
1393
1393
  gatewayUrl: resolvedConfig.gatewayUrl,
@@ -2524,6 +2524,7 @@ function LeadCaptureSection({ section, data, theme, onEvent }) {
2524
2524
  const [newsletterOptIn, setNewsletterOptIn] = react.useState(false);
2525
2525
  const [status, setStatus] = react.useState("idle");
2526
2526
  const [errorMsg, setErrorMsg] = react.useState("");
2527
+ const [serverMessage, setServerMessage] = react.useState(null);
2527
2528
  const gatewayUrl = c.gateway_url || data.gatewayUrl || "https://whale-gateway.fly.dev";
2528
2529
  const storeId = c.store_id || data.store?.id;
2529
2530
  const slug = c.landing_page_slug || data.landing_page?.slug;
@@ -2562,8 +2563,15 @@ function LeadCaptureSection({ section, data, theme, onEvent }) {
2562
2563
  })
2563
2564
  });
2564
2565
  if (!res.ok) {
2565
- const body = await res.json().catch(() => ({}));
2566
- throw new Error(body?.error?.message || "Something went wrong. Please try again.");
2566
+ const body2 = await res.json().catch(() => ({}));
2567
+ throw new Error(body2?.error?.message || "Something went wrong. Please try again.");
2568
+ }
2569
+ const body = await res.json().catch(() => ({}));
2570
+ if (body.is_new === false) {
2571
+ setServerMessage({
2572
+ heading: "welcome back!",
2573
+ message: body.message || "your rewards are already loaded."
2574
+ });
2567
2575
  }
2568
2576
  setStatus("success");
2569
2577
  onEvent?.("lead", { email, first_name: firstName || void 0, source: c.source || "landing_page", landing_page_slug: slug || void 0 });
@@ -2586,7 +2594,7 @@ function LeadCaptureSection({ section, data, theme, onEvent }) {
2586
2594
  fontFamily: "inherit",
2587
2595
  transition: "border-color 0.2s"
2588
2596
  };
2589
- if (status === "success") return /* @__PURE__ */ jsxRuntime.jsx(SuccessState, { theme, heading: successHeading, message: successMessage, couponCode: c.coupon_code });
2597
+ if (status === "success") return /* @__PURE__ */ jsxRuntime.jsx(SuccessState, { theme, heading: serverMessage?.heading || successHeading, message: serverMessage?.message || successMessage, couponCode: c.coupon_code });
2590
2598
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { padding: "3.5rem 1.5rem", maxWidth: 560, margin: "0 auto" }, children: [
2591
2599
  /* @__PURE__ */ jsxRuntime.jsx("style", { children: `@keyframes lc-spin { to { transform: rotate(360deg) } }` }),
2592
2600
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { background: theme.surface, border: `1px solid ${theme.fg}12`, padding: "clamp(2rem, 6vw, 3rem)" }, children: [