@tagadapay/headless-sdk 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/core/client.d.ts +2 -5
  2. package/dist/core/client.d.ts.map +1 -1
  3. package/dist/core/client.js +1 -3
  4. package/dist/core/client.js.map +1 -1
  5. package/dist/core/index.d.ts +1 -2
  6. package/dist/core/index.d.ts.map +1 -1
  7. package/dist/core/index.js +0 -1
  8. package/dist/core/index.js.map +1 -1
  9. package/dist/core/modules/offers.d.ts +64 -23
  10. package/dist/core/modules/offers.d.ts.map +1 -1
  11. package/dist/core/modules/offers.js +70 -33
  12. package/dist/core/modules/offers.js.map +1 -1
  13. package/dist/core/types.d.ts +26 -16
  14. package/dist/core/types.d.ts.map +1 -1
  15. package/dist/react/hooks/useOffers.d.ts +63 -22
  16. package/dist/react/hooks/useOffers.d.ts.map +1 -1
  17. package/dist/react/hooks/useOffers.js +36 -52
  18. package/dist/react/hooks/useOffers.js.map +1 -1
  19. package/dist/react/index.d.ts +1 -3
  20. package/dist/react/index.d.ts.map +1 -1
  21. package/dist/react/index.js +0 -1
  22. package/dist/react/index.js.map +1 -1
  23. package/dist/tagada-headless-react.min.js +2 -2
  24. package/dist/tagada-headless-react.min.js.map +4 -4
  25. package/dist/tagada-headless.js +67 -291
  26. package/dist/tagada-headless.min.js +2 -2
  27. package/dist/tagada-headless.min.js.map +4 -4
  28. package/package.json +3 -3
  29. package/dist/core/modules/analytics.d.ts +0 -79
  30. package/dist/core/modules/analytics.d.ts.map +0 -1
  31. package/dist/core/modules/analytics.js +0 -265
  32. package/dist/core/modules/analytics.js.map +0 -1
  33. package/dist/react/hooks/useAnalytics.d.ts +0 -59
  34. package/dist/react/hooks/useAnalytics.d.ts.map +0 -1
  35. package/dist/react/hooks/useAnalytics.js +0 -49
  36. package/dist/react/hooks/useAnalytics.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/core/index.ts", "../src/core/errors.ts", "../src/core/http.ts", "../src/core/modules/checkout.ts", "../src/core/modules/payment.ts", "../src/core/modules/analytics.ts", "../src/core/modules/offers.ts", "../src/core/modules/customer.ts", "../src/core/modules/catalog.ts", "../src/core/client.ts"],
4
- "sourcesContent": ["export { HeadlessClient, createHeadlessClient } from './client.js';\n\nexport { CheckoutModule } from './modules/checkout.js';\nexport { PaymentModule } from './modules/payment.js';\nexport { AnalyticsModule } from './modules/analytics.js';\nexport { OffersModule } from './modules/offers.js';\nexport { CustomerModule } from './modules/customer.js';\nexport { CatalogModule } from './modules/catalog.js';\n\nexport { HttpClient } from './http.js';\n\nexport {\n TagadaError,\n TagadaAuthError,\n TagadaValidationError,\n TagadaNotFoundError,\n TagadaRateLimitError,\n TagadaPaymentError,\n TagadaNetworkError,\n} from './errors.js';\n\nexport type {\n Environment,\n HeadlessConfig,\n HttpRequestOptions,\n LineItem,\n CheckoutSession,\n CheckoutLineItem,\n CheckoutTotals,\n CheckoutCustomer,\n Address,\n ShippingRate,\n PaymentMethodConfig,\n PaymentSetupConfig,\n ExpressMethod,\n ExpressMethods,\n StoreConfig,\n PayResult,\n PayOptions,\n PayDirectOptions,\n CreateInstrumentOptions,\n PaymentInstrument,\n ThreedsSession,\n PaymentStatus,\n AnalyticsEvent,\n PixelConfig,\n Offer,\n OfferLineItem,\n OfferResult,\n Customer,\n Order,\n OrderItem,\n Subscription,\n CatalogProduct,\n CatalogVariant,\n CatalogPrice,\n CurrencyOption,\n} from './types.js';\n", "/** Base error for all TagadaPay headless SDK errors. */\nexport class TagadaError extends Error {\n public readonly code: string;\n public readonly statusCode?: number;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n message: string,\n code: string,\n statusCode?: number,\n details?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'TagadaError';\n this.code = code;\n this.statusCode = statusCode;\n this.details = details;\n }\n}\n\n/** Thrown when the API returns 401/403. */\nexport class TagadaAuthError extends TagadaError {\n constructor(message = 'Authentication failed. Check your API key or checkout token.') {\n super(message, 'auth_error', 401);\n this.name = 'TagadaAuthError';\n }\n}\n\n/** Thrown when the API returns 422 with validation errors. */\nexport class TagadaValidationError extends TagadaError {\n public readonly errors: Array<{ field: string; message: string }>;\n\n constructor(\n message: string,\n errors: Array<{ field: string; message: string }> = [],\n ) {\n super(message, 'validation_error', 422, { errors });\n this.name = 'TagadaValidationError';\n this.errors = errors;\n }\n}\n\n/** Thrown when a resource is not found (404). */\nexport class TagadaNotFoundError extends TagadaError {\n constructor(resource: string, id: string) {\n super(`${resource} \"${id}\" not found.`, 'not_found', 404);\n this.name = 'TagadaNotFoundError';\n }\n}\n\n/** Thrown when the API returns 429. */\nexport class TagadaRateLimitError extends TagadaError {\n public readonly retryAfterMs: number;\n\n constructor(retryAfterMs = 1000) {\n super(`Rate limited. Retry after ${retryAfterMs}ms.`, 'rate_limit', 429);\n this.name = 'TagadaRateLimitError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/** Thrown when a payment fails or requires action. */\nexport class TagadaPaymentError extends TagadaError {\n public readonly paymentId?: string;\n public readonly requireAction?: string;\n\n constructor(\n message: string,\n opts?: { paymentId?: string; requireAction?: string; details?: Record<string, unknown> },\n ) {\n super(message, 'payment_error', undefined, opts?.details);\n this.name = 'TagadaPaymentError';\n this.paymentId = opts?.paymentId;\n this.requireAction = opts?.requireAction;\n }\n}\n\n/** Thrown on network / fetch failures. */\nexport class TagadaNetworkError extends TagadaError {\n constructor(message = 'Network request failed. Check your connection.') {\n super(message, 'network_error');\n this.name = 'TagadaNetworkError';\n }\n}\n", "import {\n TagadaError,\n TagadaAuthError,\n TagadaValidationError,\n TagadaNotFoundError,\n TagadaRateLimitError,\n TagadaNetworkError,\n} from './errors.js';\nimport type { Environment, HttpRequestOptions } from './types.js';\n\nconst BASE_URLS: Record<Environment, string> = {\n production: 'https://app.tagadapay.com',\n development: 'https://app.dev.tagadapay.com',\n local: 'http://localhost:3000',\n};\n\nexport interface HttpClientConfig {\n baseUrl: string;\n timeout: number;\n apiKey?: string;\n getToken?: () => string | undefined;\n}\n\n/**\n * Lightweight HTTP client built on native fetch.\n * Zero dependencies -- works in browser, edge runtimes, and Node 18+.\n */\nexport class HttpClient {\n readonly baseUrl: string;\n private timeout: number;\n private apiKey?: string;\n private getToken?: () => string | undefined;\n\n constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.timeout = config.timeout;\n this.apiKey = config.apiKey;\n this.getToken = config.getToken;\n }\n\n static resolveBaseUrl(environment: Environment, override?: string): string {\n return override ?? BASE_URLS[environment] ?? BASE_URLS.production;\n }\n\n async request<T = unknown>(path: string, options: HttpRequestOptions = {}): Promise<T> {\n const { method = 'GET', body, headers = {}, params, token, signal } = options;\n\n let url = `${this.baseUrl}${path}`;\n if (params) {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined) qs.set(k, String(v));\n }\n const str = qs.toString();\n if (str) url += `?${str}`;\n }\n\n const reqHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...headers,\n };\n\n const authToken = token ?? this.apiKey ?? this.getToken?.();\n if (authToken) {\n reqHeaders['x-cms-token'] = authToken;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const res = await fetch(url, {\n method,\n headers: reqHeaders,\n body: body != null ? JSON.stringify(body) : undefined,\n signal: signal ?? controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (res.ok) {\n const text = await res.text();\n return text ? (JSON.parse(text) as T) : ({} as T);\n }\n\n await this.handleErrorResponse(res, path);\n throw new TagadaError('Unexpected error', 'unknown', res.status);\n } catch (err) {\n clearTimeout(timeoutId);\n if (err instanceof TagadaError) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') {\n throw new TagadaNetworkError(`Request to ${path} timed out after ${this.timeout}ms.`);\n }\n throw new TagadaNetworkError(\n err instanceof Error ? err.message : 'Network request failed.',\n );\n }\n }\n\n get<T = unknown>(path: string, options?: HttpRequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'GET' });\n }\n\n post<T = unknown>(path: string, body?: unknown, options?: HttpRequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'POST', body });\n }\n\n patch<T = unknown>(path: string, body?: unknown, options?: HttpRequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PATCH', body });\n }\n\n put<T = unknown>(path: string, body?: unknown, options?: HttpRequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PUT', body });\n }\n\n delete<T = unknown>(path: string, options?: HttpRequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'DELETE' });\n }\n\n private async handleErrorResponse(res: Response, path: string): Promise<never> {\n let parsed: Record<string, unknown> = {};\n try {\n parsed = (await res.json()) as Record<string, unknown>;\n } catch {\n // response isn't JSON\n }\n\n const msg =\n (parsed.message as string) ??\n (parsed.error as string) ??\n `Request failed: ${res.status} ${res.statusText} on ${path}`;\n\n switch (res.status) {\n case 401:\n case 403:\n throw new TagadaAuthError(msg);\n case 404:\n throw new TagadaNotFoundError(path, '');\n case 422: {\n const fieldErrors = Array.isArray(parsed.errors)\n ? (parsed.errors as Array<{ field: string; message: string }>)\n : [];\n throw new TagadaValidationError(msg, fieldErrors);\n }\n case 429: {\n const retryAfter = Number(res.headers.get('Retry-After') ?? '1') * 1000;\n throw new TagadaRateLimitError(retryAfter);\n }\n default:\n throw new TagadaError(msg, 'api_error', res.status, parsed);\n }\n }\n}\n", "import type { HttpClient } from '../http.js';\nimport type {\n CheckoutSession,\n LineItem,\n ShippingRate,\n Address,\n CheckoutCustomer,\n} from '../types.js';\n\n/**\n * Manages checkout sessions -- load, update cart, apply promo codes, handle shipping.\n *\n * All methods talk to the TagadaPay REST API and return typed data.\n * No local state is kept; the server is the source of truth.\n */\nexport class CheckoutModule {\n private sessionToken: string | undefined;\n\n constructor(\n private readonly http: HttpClient,\n private readonly storeId: string,\n private readonly onTokenChange?: (token: string) => void,\n ) {}\n\n /**\n * Load an existing checkout session by its checkout token.\n *\n * @param checkoutToken The checkout token (from URL param `checkoutToken`).\n * @param sessionToken The JWT session token (from URL param `token`). Required for auth.\n *\n * Both values come from the redirect URL returned by `createSession()`.\n * Example URL: `/checkout?checkoutToken=abc123&token=eyJ...`\n */\n async loadSession(checkoutToken: string, sessionToken?: string): Promise<CheckoutSession> {\n if (sessionToken) {\n this.sessionToken = sessionToken;\n this.onTokenChange?.(sessionToken);\n }\n\n const raw = await this.http.get<{ checkoutSession: unknown; summary: unknown }>(\n `/api/v1/checkout-sessions/${checkoutToken}/v2`,\n {\n params: { skipAsyncWait: 'false' },\n token: this.sessionToken,\n },\n );\n\n return this.normalizeSession(raw);\n }\n\n /**\n * Create a new checkout session.\n *\n * Returns a `checkoutToken` and `sessionToken` (JWT) needed for all subsequent calls.\n * Also returns a `checkoutUrl` (the full Tagada-hosted checkout URL, for reference).\n */\n async createSession(opts: {\n items: LineItem[];\n currency?: string;\n returnUrl?: string;\n customerEmail?: string;\n customerFirstName?: string;\n customerLastName?: string;\n }): Promise<{ checkoutUrl: string; checkoutToken: string; sessionToken: string; customerId: string }> {\n const lineItems = opts.items.map((i) => ({\n variantId: i.variantId,\n priceId: i.priceId,\n quantity: i.quantity,\n }));\n\n const body: Record<string, unknown> = {\n storeId: this.storeId,\n lineItems,\n };\n if (opts.currency) body.currency = opts.currency;\n if (opts.returnUrl) body.returnUrl = opts.returnUrl;\n if (opts.customerEmail) {\n body.customer = {\n email: opts.customerEmail,\n firstName: opts.customerFirstName,\n lastName: opts.customerLastName,\n currency: opts.currency,\n };\n }\n\n const res = await this.http.post<{\n checkoutUrl: string;\n checkoutToken: string;\n customerId: string;\n }>('/api/v1/checkout/session/init', body);\n\n const url = new URL(res.checkoutUrl);\n const sessionToken = url.searchParams.get('token') ?? '';\n this.sessionToken = sessionToken;\n if (sessionToken) this.onTokenChange?.(sessionToken);\n\n return {\n checkoutUrl: res.checkoutUrl,\n checkoutToken: res.checkoutToken,\n sessionToken,\n customerId: res.customerId,\n };\n }\n\n /** Replace the cart items for an existing session. */\n async updateCart(sessionId: string, items: LineItem[]): Promise<CheckoutSession> {\n return this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/line-items`,\n { items },\n { token: this.sessionToken },\n );\n }\n\n /**\n * Update customer + address information on the session.\n * Uses the combined endpoint with `partial: true` so missing fields are tolerated.\n */\n async updateCustomer(\n sessionId: string,\n customer: Partial<CheckoutCustomer>,\n ): Promise<void> {\n await this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/customer-and-session-info`,\n {\n checkoutSessionId: sessionId,\n partial: true,\n customerData: {\n email: customer.email,\n },\n shippingAddress: {\n firstName: customer.firstName,\n lastName: customer.lastName,\n phone: customer.phone,\n },\n billingAddress: {},\n differentBillingAddress: false,\n },\n { token: this.sessionToken },\n );\n }\n\n /**\n * Update shipping and/or billing address on the session.\n *\n * Address fields use the API's naming: `address1`, `postal`, etc.\n */\n async updateAddress(\n sessionId: string,\n addresses: { shippingAddress?: Address; billingAddress?: Address },\n ): Promise<void> {\n const mapAddress = (a?: Address) => {\n if (!a) return undefined;\n return {\n address1: a.line1,\n address2: a.line2,\n city: a.city,\n state: a.state,\n postal: a.postalCode,\n country: a.country,\n };\n };\n\n await this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/address`,\n {\n checkoutSessionId: sessionId,\n data: {\n shippingAddress: mapAddress(addresses.shippingAddress) ?? {},\n billingAddress: mapAddress(addresses.billingAddress),\n },\n },\n { token: this.sessionToken },\n );\n }\n\n /** Apply a promotion code to the session. */\n async applyPromoCode(sessionId: string, code: string): Promise<void> {\n await this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/promotions/apply`,\n { checkoutSessionId: sessionId, code },\n { token: this.sessionToken },\n );\n }\n\n /** Remove a promotion from the session by promotion ID. */\n async removePromoCode(sessionId: string, promotionId?: string): Promise<void> {\n const promoId = promotionId ?? 'default';\n await this.http.delete(\n `/api/v1/checkout-sessions/${sessionId}/promotions/${promoId}`,\n { token: this.sessionToken },\n );\n }\n\n /** Fetch available shipping rates for the session's address. */\n async getShippingRates(sessionId: string): Promise<ShippingRate[]> {\n const res = await this.http.get<{ rates: ShippingRate[] }>(\n `/api/v1/checkout-sessions/${sessionId}/shipping-rates`,\n { token: this.sessionToken },\n );\n return res.rates ?? [];\n }\n\n /** Select a shipping rate for the session. */\n async selectShippingRate(sessionId: string, rateId: string): Promise<void> {\n await this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/shipping-rate`,\n { checkoutSessionId: sessionId, shippingRateId: rateId },\n { token: this.sessionToken },\n );\n }\n\n /**\n * Normalize the raw v2 API response into a cleaner CheckoutSession shape.\n * The raw response has nested `checkoutSession` + `summary` -- we flatten it.\n */\n private normalizeSession(raw: { checkoutSession: unknown; summary: unknown }): CheckoutSession {\n const cs = raw.checkoutSession as Record<string, unknown>;\n const orderSummaries = (cs.orderSummaries ?? []) as Array<Record<string, unknown>>;\n const summary = (raw.summary ?? cs.summary ?? orderSummaries[0] ?? {}) as Record<string, unknown>;\n const lineItems = (cs.sessionLineItems ?? []) as Array<Record<string, unknown>>;\n const customer = cs.customer as Record<string, unknown> | undefined;\n\n const items = lineItems.map((li) => {\n const price = li.price as Record<string, unknown> | undefined;\n const variant = (price?.variant ?? {}) as Record<string, unknown>;\n const product = (variant.product ?? {}) as Record<string, unknown>;\n const currencyOpts = (price?.currencyOptions ?? {}) as Record<string, { amount: number }>;\n const usd = currencyOpts.USD ?? currencyOpts[Object.keys(currencyOpts)[0]];\n return {\n id: li.id as string,\n variantId: li.variantId as string,\n priceId: li.priceId as string,\n productName: (product.name ?? '') as string,\n variantName: (variant.name ?? '') as string,\n quantity: (li.quantity ?? 1) as number,\n unitAmount: usd?.amount ?? 0,\n totalAmount: (usd?.amount ?? 0) * ((li.quantity ?? 1) as number),\n currency: (cs.selectedPresentmentCurrency ?? 'USD') as string,\n imageUrl: (variant.imageUrl ?? '') as string,\n };\n });\n\n const summaryItems = (summary.items ?? []) as Array<Record<string, unknown>>;\n\n return {\n id: cs.id as string,\n storeId: cs.storeId as string,\n checkoutToken: cs.checkoutToken as string,\n currency: (cs.selectedPresentmentCurrency ?? 'USD') as string,\n items,\n totals: {\n subtotal: (summary.subtotalAmount ?? 0) as number,\n discount: (summary.totalPromotionAmount ?? 0) as number,\n shipping: (summary.shippingCost ?? 0) as number,\n tax: (summary.totalTaxAmount ?? 0) as number,\n total: (summary.totalAmount ?? summaryItems.reduce((s: number, i: Record<string, unknown>) => s + ((i.amount ?? 0) as number), 0)) as number,\n currency: (summary.currency ?? cs.selectedPresentmentCurrency ?? 'USD') as string,\n },\n customer: customer\n ? {\n id: customer.id as string,\n email: customer.email as string | undefined,\n firstName: customer.firstName as string | undefined,\n lastName: customer.lastName as string | undefined,\n }\n : undefined,\n shippingAddress: cs.shippingAddress as CheckoutSession['shippingAddress'],\n billingAddress: cs.billingAddress as CheckoutSession['billingAddress'],\n metadata: cs.metadata as Record<string, unknown>,\n };\n }\n}\n", "import type { HttpClient } from '../http.js';\nimport type {\n Environment,\n PaymentSetupConfig,\n PaymentMethodConfig,\n ExpressMethods,\n StoreConfig,\n PayResult,\n PayOptions,\n PayDirectOptions,\n CreateInstrumentOptions,\n PaymentInstrument,\n ThreedsSession,\n PaymentStatus,\n} from '../types.js';\n\n/**\n * Full payment lifecycle -- discover APMs, tokenize, create instruments,\n * process payments, handle 3DS, and poll for status.\n *\n * Wraps the same REST endpoints that plugin-sdk uses internally.\n */\nexport class PaymentModule {\n constructor(\n private readonly http: HttpClient,\n private readonly storeId: string,\n private readonly environment: Environment,\n ) {}\n\n // ---------------------------------------------------------------------------\n // Discovery: what payment methods are available?\n // ---------------------------------------------------------------------------\n\n /**\n * Get the full payment setup config for a checkout session.\n * Returns a map of payment methods with their configuration\n * (card, apple_pay, google_pay, klarna, etc.).\n */\n async getPaymentSetup(checkoutSessionId: string): Promise<PaymentSetupConfig> {\n const methods = await this.http.get<{ methods: PaymentMethodConfig[] }>(\n '/api/v1/payment-methods',\n { params: { checkoutSessionId } },\n );\n\n const config: PaymentSetupConfig = {};\n for (const m of methods.methods ?? []) {\n const key = m.provider ? `${m.method}:${m.provider}` : m.method;\n config[key] = m;\n }\n return config;\n }\n\n /**\n * Get express payment methods (Apple Pay, Google Pay, PayPal, etc.)\n * filtered to only those available in the current browser.\n */\n async getExpressMethods(checkoutSessionId: string): Promise<ExpressMethods> {\n const setup = await this.getPaymentSetup(checkoutSessionId);\n const result: ExpressMethods = {};\n\n for (const [, config] of Object.entries(setup)) {\n if (!config.enabled || !config.express) continue;\n\n const method = config.method;\n const base = {\n type: method,\n available: true,\n processorId: config.processorId,\n publishableKey: config.publishableKey,\n metadata: config.metadata,\n };\n\n if (method === 'apple_pay' || config.type === 'apple_pay') {\n const hasApplePay =\n typeof window !== 'undefined' &&\n 'ApplePaySession' in window &&\n (window as unknown as Record<string, { canMakePayments?: () => boolean }>)\n .ApplePaySession?.canMakePayments?.();\n result.applePay = { ...base, available: !!hasApplePay };\n } else if (method === 'google_pay' || config.type === 'google_pay') {\n result.googlePay = base;\n } else if (method === 'paypal') {\n result.paypal = base;\n } else if (method === 'klarna' || method === 'klarna_express') {\n result.klarna = base;\n } else if (method === 'link') {\n result.link = base;\n }\n }\n\n return result;\n }\n\n /**\n * Get store-level payment config (3DS flags, default flow ID, etc.).\n */\n async getStoreConfig(): Promise<StoreConfig> {\n const res = await this.http.get<{ config: StoreConfig }>(\n '/api/v1/checkout/config',\n { params: { storeId: this.storeId } },\n );\n return res.config ?? (res as unknown as StoreConfig);\n }\n\n /**\n * Convenience: return only enabled payment method keys.\n */\n async getEnabledMethods(checkoutSessionId: string): Promise<string[]> {\n const setup = await this.getPaymentSetup(checkoutSessionId);\n return Object.entries(setup)\n .filter(([, c]) => c.enabled)\n .map(([key]) => key);\n }\n\n // ---------------------------------------------------------------------------\n // Tokenization (delegates to @tagadapay/core-js if available)\n // ---------------------------------------------------------------------------\n\n /**\n * Tokenize a card using @tagadapay/core-js.\n * Requires `@tagadapay/core-js` to be installed as a peer dependency.\n *\n * @returns tagadaToken (base64 string) and rawToken with SCA metadata.\n */\n async tokenizeCard(card: {\n cardNumber: string;\n expiryDate: string;\n cvc: string;\n cardholderName?: string;\n }): Promise<{ tagadaToken: string; rawToken: Record<string, unknown> }> {\n const coreJs = await this.loadCoreJs();\n\n const tokenizer = new coreJs.Tokenizer({ environment: this.environment });\n await tokenizer.initialize();\n\n const sanitized: Record<string, string> = {\n cardNumber: card.cardNumber,\n expiryDate: card.expiryDate,\n cvc: card.cvc,\n };\n if (card.cardholderName) sanitized.cardholderName = card.cardholderName;\n\n const [tagadaToken, rawToken] = await Promise.all([\n tokenizer.tokenizeCard(sanitized),\n tokenizer.tokenizeCardRaw(sanitized),\n ]);\n\n return { tagadaToken, rawToken };\n }\n\n // ---------------------------------------------------------------------------\n // Instrument creation\n // ---------------------------------------------------------------------------\n\n /**\n * Create a reusable payment instrument from a TagadaToken.\n * Session-authenticated (uses the checkout session JWT).\n */\n async createInstrument(\n opts: CreateInstrumentOptions,\n ): Promise<{ paymentInstrument: PaymentInstrument }> {\n return this.http.post('/api/v1/payment/create-instrument-from-token', {\n tagadaToken: opts.tagadaToken,\n });\n }\n\n // ---------------------------------------------------------------------------\n // 3DS\n // ---------------------------------------------------------------------------\n\n /**\n * Create a 3DS session on the TagadaPay backend.\n * This persists the session so the processor can use it during payment.\n */\n async create3dsSession(opts: {\n paymentInstrumentId: string;\n sessionData: { sessionId: string; metadata?: Record<string, unknown> };\n provider?: string;\n }): Promise<ThreedsSession> {\n return this.http.post('/api/public/v1/threeds/create-session', {\n provider: opts.provider ?? 'basis_theory',\n storeId: this.storeId,\n paymentInstrumentId: opts.paymentInstrumentId,\n sessionData: opts.sessionData,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Payment processing\n // ---------------------------------------------------------------------------\n\n /**\n * High-level pay: single API call that decodes tagadaToken server-side,\n * creates the payment instrument, and processes payment.\n *\n * Also accepts `paymentInstrumentId` directly for pre-created instruments.\n */\n async pay(opts: PayOptions): Promise<PayResult> {\n if (opts.tagadaToken && !opts.paymentInstrumentId) {\n return this.http.post<PayResult>('/api/v1/payment/pay-with-token', {\n tagadaToken: opts.tagadaToken,\n checkoutSessionId: opts.checkoutSessionId,\n paymentFlowId: opts.paymentFlowId,\n processorId: opts.processorId,\n paymentMethod: opts.paymentMethod,\n isExpress: opts.isExpress,\n metadata: opts.metadata,\n });\n }\n\n return this.http.post<PayResult>('/api/public/v1/checkout/pay-v2', {\n checkoutSessionId: opts.checkoutSessionId,\n paymentInstrumentId: opts.paymentInstrumentId,\n storeId: this.storeId,\n paymentFlowId: opts.paymentFlowId,\n threedsSessionId: opts.threedsSessionId,\n processorId: opts.processorId,\n paymentMethod: opts.paymentMethod,\n isExpress: opts.isExpress,\n metadata: opts.metadata,\n });\n }\n\n /**\n * Low-level pay: process payment with an existing instrument or for APM/express flows\n * where no instrument is needed (redirect-based methods).\n */\n async payDirect(opts: PayDirectOptions): Promise<PayResult> {\n return this.http.post<PayResult>('/api/public/v1/checkout/pay-v2', {\n checkoutSessionId: opts.checkoutSessionId,\n paymentInstrumentId: opts.paymentInstrumentId ?? '',\n storeId: this.storeId,\n paymentFlowId: opts.paymentFlowId,\n processorId: opts.processorId,\n paymentMethod: opts.paymentMethod,\n isExpress: opts.isExpress,\n threedsSessionId: opts.threedsSessionId,\n });\n }\n\n /**\n * Process an Apple Pay payment.\n * Tokenizes the Apple Pay token and processes payment in one call.\n */\n async processApplePay(opts: {\n checkoutSessionId: string;\n applePayToken: unknown;\n paymentFlowId?: string;\n processorId?: string;\n }): Promise<PayResult> {\n const coreJs = await this.loadCoreJs();\n const tokenizer = new coreJs.Tokenizer({ environment: this.environment });\n await tokenizer.initialize();\n const { tagadaToken } = await tokenizer.tokenizeApplePay(opts.applePayToken);\n\n return this.pay({\n checkoutSessionId: opts.checkoutSessionId,\n tagadaToken,\n paymentFlowId: opts.paymentFlowId,\n processorId: opts.processorId,\n paymentMethod: 'apple_pay',\n isExpress: true,\n });\n }\n\n /**\n * Process a Google Pay payment.\n * Tokenizes the Google Pay token and processes payment in one call.\n */\n async processGooglePay(opts: {\n checkoutSessionId: string;\n googlePayToken: string;\n paymentFlowId?: string;\n processorId?: string;\n }): Promise<PayResult> {\n const coreJs = await this.loadCoreJs();\n const tokenizer = new coreJs.Tokenizer({ environment: this.environment });\n await tokenizer.initialize();\n const { tagadaToken } = await tokenizer.tokenizeGooglePay(opts.googlePayToken);\n\n return this.pay({\n checkoutSessionId: opts.checkoutSessionId,\n tagadaToken,\n paymentFlowId: opts.paymentFlowId,\n processorId: opts.processorId,\n paymentMethod: 'google_pay',\n isExpress: true,\n });\n }\n\n /**\n * Process an APM payment (Klarna, iDEAL, etc.) via redirect.\n * These typically don't require a payment instrument -- the processor handles the redirect.\n */\n async processApm(opts: {\n checkoutSessionId: string;\n paymentMethod: string;\n processorId: string;\n paymentFlowId?: string;\n }): Promise<PayResult> {\n return this.payDirect({\n checkoutSessionId: opts.checkoutSessionId,\n paymentMethod: opts.paymentMethod,\n processorId: opts.processorId,\n paymentFlowId: opts.paymentFlowId,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Status polling\n // ---------------------------------------------------------------------------\n\n /** Get current status of a payment. */\n async getPaymentStatus(paymentId: string): Promise<PaymentStatus> {\n return this.http.get<PaymentStatus>(`/api/v1/payments/${paymentId}`);\n }\n\n /**\n * Poll a payment until it reaches a terminal status.\n * Returns the final status or throws on timeout.\n */\n async pollPaymentStatus(\n paymentId: string,\n opts?: { intervalMs?: number; timeoutMs?: number },\n ): Promise<PaymentStatus> {\n const interval = opts?.intervalMs ?? 1500;\n const timeout = opts?.timeoutMs ?? 60_000;\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n const status = await this.getPaymentStatus(paymentId);\n if (status.status === 'succeeded' || status.status === 'failed' || status.status === 'declined') {\n return status;\n }\n await new Promise((r) => setTimeout(r, interval));\n }\n\n throw new Error(`Payment ${paymentId} did not reach terminal status within ${timeout}ms.`);\n }\n\n /** Finalize a payment after a 3DS challenge completes. */\n async completeAfter3ds(paymentId: string): Promise<PaymentStatus> {\n return this.http.post<PaymentStatus>('/api/v1/payments/complete-after-3ds', {\n paymentId,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async loadCoreJs(): Promise<any> {\n try {\n return await import('@tagadapay/core-js');\n } catch {\n throw new Error(\n 'This method requires @tagadapay/core-js. Install it: npm install @tagadapay/core-js',\n );\n }\n }\n}\n", "import type { HttpClient } from '../http.js';\nimport type { PixelConfig } from '../types.js';\n\ninterface PixelState {\n loaded: boolean;\n config?: PixelConfig;\n}\n\n/**\n * Analytics and pixel tracking -- page views, checkout steps, conversions.\n *\n * Automatically loads pixel scripts (Meta, TikTok, Snapchat, GTM, GA)\n * from your store's configuration in the CRM, then fires events to all active pixels.\n */\nexport class AnalyticsModule {\n private pixels: PixelState = { loaded: false };\n private eventQueue: Array<{ event: string; data: Record<string, unknown> }> = [];\n private dedupeSet = new Set<string>();\n\n constructor(\n private readonly http: HttpClient,\n private readonly storeId: string,\n ) {}\n\n /**\n * Initialize analytics by loading pixel configuration from the store.\n * Call this once on page load. Events fired before init completes are queued.\n */\n async init(opts?: { pixelConfig?: PixelConfig }): Promise<void> {\n if (this.pixels.loaded) return;\n\n let config = opts?.pixelConfig;\n if (!config) {\n try {\n const res = await this.http.get<{ pixels?: PixelConfig }>(\n '/api/v1/checkout/config',\n { params: { storeId: this.storeId } },\n );\n config = res.pixels;\n } catch {\n // graceful degradation -- analytics just won't fire pixels\n }\n }\n\n this.pixels = { loaded: true, config };\n\n if (typeof window !== 'undefined' && config) {\n this.loadPixelScripts(config);\n }\n\n this.flushQueue();\n }\n\n // ---------------------------------------------------------------------------\n // Standard e-commerce events\n // ---------------------------------------------------------------------------\n\n trackPageView(page?: string): void {\n this.fireEvent('PageView', { page: page ?? this.getCurrentPath() });\n }\n\n trackViewContent(data: { productId?: string; variantId?: string; value?: number; currency?: string }): void {\n this.fireEvent('ViewContent', data);\n }\n\n trackAddToCart(data: { variantId: string; quantity?: number; amount?: number; currency?: string }): void {\n this.fireEvent('AddToCart', data);\n }\n\n trackInitiateCheckout(data?: { sessionId?: string; value?: number; currency?: string }): void {\n this.fireEvent('InitiateCheckout', data ?? {});\n }\n\n trackAddPaymentInfo(data?: { paymentMethod?: string }): void {\n this.fireEvent('AddPaymentInfo', data ?? {});\n }\n\n trackPurchase(data: { orderId: string; amount: number; currency: string; items?: unknown[] }): void {\n this.fireEvent('Purchase', data, true);\n }\n\n trackCustomEvent(event: string, data?: Record<string, unknown>): void {\n this.fireEvent(event, data ?? {});\n }\n\n /** Track a funnel step (maps to Tagada's funnel tracking endpoint). */\n trackStep(data: { stepName: string; stepIndex?: number; funnelId?: string; sessionId?: string }): void {\n this.fireEvent('FunnelStep', data);\n\n this.http\n .post('/api/v1/funnel-tracking/step', {\n storeId: this.storeId,\n ...data,\n })\n .catch(() => {\n // best-effort -- don't block the UI\n });\n }\n\n trackConversion(data: { orderId: string; amount: number; currency: string }): void {\n this.fireEvent('Conversion', data, true);\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n private fireEvent(event: string, data: Record<string, unknown>, dedupe = false): void {\n if (dedupe) {\n const key = `${event}:${JSON.stringify(data)}`;\n if (this.dedupeSet.has(key)) return;\n this.dedupeSet.add(key);\n }\n\n if (!this.pixels.loaded) {\n this.eventQueue.push({ event, data });\n return;\n }\n\n this.sendToMeta(event, data);\n this.sendToTikTok(event, data);\n this.sendToSnapchat(event, data);\n this.sendToGTM(event, data);\n this.sendToGA(event, data);\n }\n\n private flushQueue(): void {\n const queue = [...this.eventQueue];\n this.eventQueue = [];\n for (const { event, data } of queue) {\n this.fireEvent(event, data);\n }\n }\n\n private getCurrentPath(): string {\n return typeof window !== 'undefined' ? window.location.pathname : '/';\n }\n\n // ---------------------------------------------------------------------------\n // Pixel script loaders\n // ---------------------------------------------------------------------------\n\n private loadPixelScripts(config: PixelConfig): void {\n if (config.metaPixelId) this.loadMetaPixel(config.metaPixelId);\n if (config.tiktokPixelId) this.loadTikTokPixel(config.tiktokPixelId);\n if (config.snapchatPixelId) this.loadSnapchatPixel(config.snapchatPixelId);\n if (config.gtmId) this.loadGTM(config.gtmId);\n if (config.gaId) this.loadGA(config.gaId);\n }\n\n private loadMetaPixel(pixelId: string): void {\n if (typeof window === 'undefined') return;\n const w = window as unknown as Record<string, unknown>;\n if (w.fbq) return;\n\n const n = (w.fbq = function (...args: unknown[]) {\n (n as unknown as { callMethod?: (...a: unknown[]) => void; queue: unknown[] }).callMethod\n ? (n as unknown as { callMethod: (...a: unknown[]) => void }).callMethod(...args)\n : (n as unknown as { queue: unknown[] }).queue.push(args);\n }) as unknown as Record<string, unknown>;\n (n as unknown as { queue: unknown[] }).queue = [];\n n.loaded = true;\n n.version = '2.0';\n\n this.injectScript('https://connect.facebook.net/en_US/fbevents.js');\n (w.fbq as (...args: unknown[]) => void)('init', pixelId);\n }\n\n private loadTikTokPixel(pixelId: string): void {\n if (typeof window === 'undefined') return;\n const w = window as unknown as Record<string, unknown>;\n if (w.ttq) return;\n\n const ttq: Record<string, unknown> = {};\n ttq.methods = ['page', 'track', 'identify', 'instances', 'debug', 'on', 'off', 'once', 'ready', 'alias', 'group', 'enableCookie', 'disableCookie'];\n ttq.setAndDefer = function (t: Record<string, unknown>, e: string) {\n t[e] = function (...args: unknown[]) {\n (t as unknown as unknown[]).push([e, ...args]);\n };\n };\n w.ttq = ttq;\n\n this.injectScript('https://analytics.tiktok.com/i18n/pixel/events.js?sdkid=' + pixelId);\n }\n\n private loadSnapchatPixel(pixelId: string): void {\n if (typeof window === 'undefined') return;\n const w = window as unknown as Record<string, unknown>;\n if (w.snaptr) return;\n\n w.snaptr = function (...args: unknown[]) {\n (w.snaptr as unknown as { handleRequest?: (...a: unknown[]) => void; queue: unknown[] }).handleRequest\n ? (w.snaptr as unknown as { handleRequest: (...a: unknown[]) => void }).handleRequest(...args)\n : (w.snaptr as unknown as { queue: unknown[] }).queue.push(args);\n };\n (w.snaptr as unknown as { queue: unknown[] }).queue = [];\n\n this.injectScript('https://sc-static.net/scevent.min.js');\n (w.snaptr as (...args: unknown[]) => void)('init', pixelId);\n }\n\n private loadGTM(gtmId: string): void {\n if (typeof window === 'undefined') return;\n const w = window as unknown as Record<string, unknown>;\n (w.dataLayer as unknown[] | undefined) = (w.dataLayer as unknown[]) ?? [];\n (w.dataLayer as unknown[]).push({ 'gtm.start': Date.now(), event: 'gtm.js' });\n\n this.injectScript(`https://www.googletagmanager.com/gtm.js?id=${gtmId}`);\n }\n\n private loadGA(gaId: string): void {\n if (typeof window === 'undefined') return;\n this.injectScript(`https://www.googletagmanager.com/gtag/js?id=${gaId}`);\n\n const w = window as unknown as Record<string, unknown>;\n (w.dataLayer as unknown[]) = (w.dataLayer as unknown[]) ?? [];\n w.gtag = function (...args: unknown[]) {\n (w.dataLayer as unknown[]).push(args);\n };\n (w.gtag as (...args: unknown[]) => void)('js', new Date());\n (w.gtag as (...args: unknown[]) => void)('config', gaId);\n }\n\n private injectScript(src: string): void {\n if (typeof document === 'undefined') return;\n const s = document.createElement('script');\n s.async = true;\n s.src = src;\n document.head.appendChild(s);\n }\n\n // ---------------------------------------------------------------------------\n // Event dispatchers per pixel\n // ---------------------------------------------------------------------------\n\n private sendToMeta(event: string, data: Record<string, unknown>): void {\n const w = typeof window !== 'undefined' ? (window as unknown as Record<string, unknown>) : null;\n const fbq = w?.fbq as ((...args: unknown[]) => void) | undefined;\n if (!fbq) return;\n\n const metaEventMap: Record<string, string> = {\n PageView: 'PageView',\n ViewContent: 'ViewContent',\n AddToCart: 'AddToCart',\n InitiateCheckout: 'InitiateCheckout',\n AddPaymentInfo: 'AddPaymentInfo',\n Purchase: 'Purchase',\n };\n\n const mapped = metaEventMap[event];\n if (mapped) {\n fbq('track', mapped, data);\n } else {\n fbq('trackCustom', event, data);\n }\n }\n\n private sendToTikTok(event: string, data: Record<string, unknown>): void {\n const w = typeof window !== 'undefined' ? (window as unknown as Record<string, unknown>) : null;\n const ttq = w?.ttq as { track?: (e: string, d: Record<string, unknown>) => void; page?: () => void } | undefined;\n if (!ttq) return;\n\n if (event === 'PageView') {\n ttq.page?.();\n } else {\n ttq.track?.(event, data);\n }\n }\n\n private sendToSnapchat(event: string, data: Record<string, unknown>): void {\n const w = typeof window !== 'undefined' ? (window as unknown as Record<string, unknown>) : null;\n const snaptr = w?.snaptr as ((...args: unknown[]) => void) | undefined;\n if (!snaptr) return;\n\n const snapEventMap: Record<string, string> = {\n PageView: 'PAGE_VIEW',\n ViewContent: 'VIEW_CONTENT',\n AddToCart: 'ADD_CART',\n InitiateCheckout: 'START_CHECKOUT',\n Purchase: 'PURCHASE',\n };\n\n const mapped = snapEventMap[event];\n if (mapped) snaptr('track', mapped, data);\n }\n\n private sendToGTM(event: string, data: Record<string, unknown>): void {\n const w = typeof window !== 'undefined' ? (window as unknown as Record<string, unknown>) : null;\n const dataLayer = w?.dataLayer as unknown[] | undefined;\n if (!dataLayer) return;\n\n dataLayer.push({ event, ...data });\n }\n\n private sendToGA(event: string, data: Record<string, unknown>): void {\n const w = typeof window !== 'undefined' ? (window as unknown as Record<string, unknown>) : null;\n const gtag = w?.gtag as ((...args: unknown[]) => void) | undefined;\n if (!gtag) return;\n\n gtag('event', event, data);\n }\n}\n", "import type { HttpClient } from '../http.js';\nimport type { Offer, OfferResult } from '../types.js';\n\n/**\n * Post-purchase offers -- upsells, downsells, and order bumps.\n *\n * Offers are configured in the CRM and referenced by ID.\n * The headless SDK lets you load offer details, accept (one-click charge),\n * or decline from your own UI.\n */\nexport class OffersModule {\n constructor(\n private readonly http: HttpClient,\n private readonly storeId: string,\n ) {}\n\n /** Load offer details by ID. */\n async loadOffer(offerId: string): Promise<Offer> {\n const res = await this.http.get<{ offer: Offer }>(\n `/api/v1/checkout-offers/${offerId}`,\n { params: { storeId: this.storeId } },\n );\n return res.offer;\n }\n\n /** List all offers for the store. */\n async listOffers(opts?: { type?: 'upsell' | 'orderbump' }): Promise<Offer[]> {\n const res = await this.http.get<{ offers: Offer[] }>(\n '/api/v1/checkout-offers',\n { params: { storeId: this.storeId, type: opts?.type } },\n );\n return res.offers;\n }\n\n /**\n * Accept an offer (one-click upsell).\n * Charges the stored payment instrument from the main checkout order.\n */\n async acceptOffer(opts: {\n offerId: string;\n checkoutSessionId: string;\n paymentInstrumentId?: string;\n }): Promise<OfferResult> {\n return this.http.post<OfferResult>('/api/v1/checkout-offers/accept', {\n offerId: opts.offerId,\n checkoutSessionId: opts.checkoutSessionId,\n storeId: this.storeId,\n paymentInstrumentId: opts.paymentInstrumentId,\n });\n }\n\n /** Decline an offer. Advances the funnel to the next step. */\n async declineOffer(opts: {\n offerId: string;\n checkoutSessionId: string;\n }): Promise<OfferResult> {\n return this.http.post<OfferResult>('/api/v1/checkout-offers/decline', {\n offerId: opts.offerId,\n checkoutSessionId: opts.checkoutSessionId,\n storeId: this.storeId,\n });\n }\n\n /** List order bumps available for a checkout session (shown on the checkout page). */\n async listOrderBumps(checkoutSessionId: string): Promise<Offer[]> {\n const res = await this.http.get<{ offers: Offer[] }>(\n '/api/v1/checkout-offers',\n { params: { storeId: this.storeId, checkoutSessionId, type: 'orderbump' } },\n );\n return res.offers;\n }\n\n /** Toggle an order bump on/off for a checkout session. */\n async toggleOrderBump(opts: {\n checkoutSessionId: string;\n offerId: string;\n selected: boolean;\n }): Promise<void> {\n await this.http.post(`/api/v1/checkout-sessions/${opts.checkoutSessionId}/order-bumps`, {\n offerId: opts.offerId,\n selected: opts.selected,\n });\n }\n}\n", "import type { HttpClient } from '../http.js';\nimport type { Customer, Order, Subscription } from '../types.js';\n\n/**\n * Customer data -- profile, orders, subscriptions.\n *\n * Requires either an API key or a session token for authentication.\n */\nexport class CustomerModule {\n constructor(\n private readonly http: HttpClient,\n private readonly storeId: string,\n ) {}\n\n /** Get customer profile by ID. */\n async getProfile(customerId: string): Promise<Customer> {\n const res = await this.http.get<{ customer: Customer }>(\n `/api/v1/customers/${customerId}`,\n { params: { storeId: this.storeId } },\n );\n return res.customer;\n }\n\n /** Get customer profile by email. */\n async getByEmail(email: string): Promise<Customer | null> {\n try {\n const res = await this.http.get<{ customer: Customer }>(\n '/api/v1/customers/by-email',\n { params: { email, storeId: this.storeId } },\n );\n return res.customer;\n } catch {\n return null;\n }\n }\n\n /** Update customer profile fields. */\n async updateProfile(\n customerId: string,\n data: Partial<Pick<Customer, 'email' | 'firstName' | 'lastName' | 'phone' | 'metadata'>>,\n ): Promise<Customer> {\n const res = await this.http.patch<{ customer: Customer }>(\n `/api/v1/customers/${customerId}`,\n { storeId: this.storeId, ...data },\n );\n return res.customer;\n }\n\n /** List orders for a customer. */\n async getOrders(\n customerId: string,\n opts?: { limit?: number; offset?: number },\n ): Promise<{ orders: Order[]; total: number }> {\n return this.http.get<{ orders: Order[]; total: number }>(\n `/api/v1/customers/${customerId}/orders`,\n { params: { storeId: this.storeId, limit: opts?.limit, offset: opts?.offset } },\n );\n }\n\n /** Get a single order by ID. */\n async getOrder(orderId: string): Promise<Order> {\n const res = await this.http.get<{ order: Order }>(`/api/v1/orders/${orderId}`, {\n params: { storeId: this.storeId },\n });\n return res.order;\n }\n\n /** List subscriptions for a customer. */\n async getSubscriptions(customerId: string): Promise<Subscription[]> {\n const res = await this.http.get<{ subscriptions: Subscription[] }>(\n `/api/v1/customers/${customerId}/subscriptions`,\n { params: { storeId: this.storeId } },\n );\n return res.subscriptions;\n }\n\n /** Get a single subscription by ID. */\n async getSubscription(subscriptionId: string): Promise<Subscription> {\n const res = await this.http.get<{ subscription: Subscription }>(\n `/api/v1/subscriptions/${subscriptionId}`,\n { params: { storeId: this.storeId } },\n );\n return res.subscription;\n }\n}\n", "import type { HttpClient } from '../http.js';\nimport type { CatalogProduct } from '../types.js';\n\n/**\n * Fetches the product catalog for a store.\n *\n * Uses the public `/api/v1/products` endpoint (no auth required).\n */\nexport class CatalogModule {\n constructor(\n private readonly http: HttpClient,\n private readonly storeId: string,\n ) {}\n\n /**\n * List all active products for the store, including variants and prices.\n *\n * @param opts.productIds Optional filter to specific product IDs.\n * @param opts.variantIds Optional filter to products containing these variant IDs.\n */\n async getProducts(opts?: {\n productIds?: string[];\n variantIds?: string[];\n }): Promise<CatalogProduct[]> {\n const body: Record<string, unknown> = {\n storeId: this.storeId,\n includeVariants: true,\n includePrices: true,\n };\n if (opts?.productIds?.length) body.productIds = opts.productIds;\n if (opts?.variantIds?.length) body.variantIds = opts.variantIds;\n\n const res = await this.http.post<{ items: CatalogProduct[] }>(\n '/api/v1/products',\n body,\n );\n\n return res.items ?? [];\n }\n\n /**\n * Get a single product by ID.\n */\n async getProduct(productId: string): Promise<CatalogProduct | null> {\n const items = await this.getProducts({ productIds: [productId] });\n return items[0] ?? null;\n }\n}\n", "import { HttpClient } from './http.js';\nimport { CheckoutModule } from './modules/checkout.js';\nimport { PaymentModule } from './modules/payment.js';\nimport { AnalyticsModule } from './modules/analytics.js';\nimport { OffersModule } from './modules/offers.js';\nimport { CustomerModule } from './modules/customer.js';\nimport { CatalogModule } from './modules/catalog.js';\nimport type { HeadlessConfig, Environment } from './types.js';\n\n/**\n * Main entry point for the TagadaPay Headless SDK.\n *\n * Composes all domain modules (checkout, payment, analytics, offers, customer)\n * over a single lightweight HTTP client built on native fetch.\n */\nexport class HeadlessClient {\n readonly config: Required<Pick<HeadlessConfig, 'storeId' | 'environment'>> & HeadlessConfig;\n\n private readonly http: HttpClient;\n\n /** Shared session token used by all modules for authenticated API calls. */\n private _sessionToken: string | undefined;\n\n /** Checkout session management -- load, update cart, apply promos, shipping. */\n readonly checkout: CheckoutModule;\n\n /** Payment processing -- setup config, APMs, tokenize, pay, 3DS, poll. */\n readonly payment: PaymentModule;\n\n /** Analytics and pixel tracking -- page views, checkout steps, conversions. */\n readonly analytics: AnalyticsModule;\n\n /** Post-purchase offers -- load, accept, decline upsells and order bumps. */\n readonly offers: OffersModule;\n\n /** Customer data -- profile, orders, subscriptions. */\n readonly customer: CustomerModule;\n\n /** Product catalog -- list products, variants, and prices. */\n readonly catalog: CatalogModule;\n\n constructor(config: HeadlessConfig) {\n const environment: Environment = config.environment ?? 'production';\n const baseUrl = HttpClient.resolveBaseUrl(environment, config.baseUrl);\n\n this.config = {\n ...config,\n environment,\n baseUrl,\n timeout: config.timeout ?? 30_000,\n };\n\n this.http = new HttpClient({\n baseUrl,\n timeout: this.config.timeout!,\n apiKey: config.apiKey,\n getToken: () => this._sessionToken,\n });\n\n const setToken = (token: string) => {\n this._sessionToken = token;\n };\n\n this.checkout = new CheckoutModule(this.http, this.config.storeId, setToken);\n this.payment = new PaymentModule(this.http, this.config.storeId, environment);\n this.analytics = new AnalyticsModule(this.http, this.config.storeId);\n this.offers = new OffersModule(this.http, this.config.storeId);\n this.customer = new CustomerModule(this.http, this.config.storeId);\n this.catalog = new CatalogModule(this.http, this.config.storeId);\n }\n\n /** Manually set the session token (e.g. from URL params on page load). */\n setSessionToken(token: string) {\n this._sessionToken = token;\n }\n}\n\n/**\n * Create a new HeadlessClient instance.\n *\n * @example\n * ```ts\n * import { createHeadlessClient } from '@tagadapay/headless-sdk';\n *\n * const tagada = createHeadlessClient({\n * storeId: 'store_abc123',\n * environment: 'production',\n * });\n *\n * const session = await tagada.checkout.loadSession(checkoutToken);\n * ```\n */\nexport function createHeadlessClient(config: HeadlessConfig): HeadlessClient {\n return new HeadlessClient(config);\n}\n"],
5
- "mappings": "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",
6
- "names": ["core_exports", "__export", "AnalyticsModule", "CatalogModule", "CheckoutModule", "CustomerModule", "HeadlessClient", "HttpClient", "OffersModule", "PaymentModule", "TagadaAuthError", "TagadaError", "TagadaNetworkError", "TagadaNotFoundError", "TagadaPaymentError", "TagadaRateLimitError", "TagadaValidationError", "createHeadlessClient", "TagadaError", "message", "code", "statusCode", "details", "TagadaAuthError", "TagadaValidationError", "errors", "TagadaNotFoundError", "resource", "id", "TagadaRateLimitError", "retryAfterMs", "TagadaPaymentError", "opts", "TagadaNetworkError", "BASE_URLS", "HttpClient", "config", "environment", "override", "path", "options", "_a", "method", "body", "headers", "params", "token", "signal", "url", "qs", "k", "v", "str", "reqHeaders", "authToken", "controller", "timeoutId", "res", "text", "TagadaError", "err", "TagadaNetworkError", "parsed", "msg", "TagadaAuthError", "TagadaNotFoundError", "fieldErrors", "TagadaValidationError", "retryAfter", "TagadaRateLimitError", "CheckoutModule", "http", "storeId", "onTokenChange", "checkoutToken", "sessionToken", "_a", "raw", "opts", "lineItems", "i", "body", "res", "sessionId", "items", "customer", "addresses", "mapAddress", "a", "code", "promotionId", "promoId", "rateId", "cs", "orderSummaries", "summary", "li", "price", "variant", "product", "currencyOpts", "usd", "summaryItems", "s", "PaymentModule", "http", "storeId", "environment", "checkoutSessionId", "methods", "config", "m", "key", "_a", "_b", "setup", "result", "method", "base", "hasApplePay", "res", "c", "card", "coreJs", "tokenizer", "sanitized", "tagadaToken", "rawToken", "opts", "paymentId", "interval", "timeout", "start", "status", "r", "AnalyticsModule", "http", "storeId", "opts", "config", "page", "data", "event", "dedupe", "key", "queue", "pixelId", "w", "args", "ttq", "t", "e", "gtmId", "gaId", "src", "s", "fbq", "mapped", "_a", "_b", "snaptr", "dataLayer", "gtag", "OffersModule", "http", "storeId", "offerId", "opts", "checkoutSessionId", "CustomerModule", "http", "storeId", "customerId", "email", "data", "opts", "orderId", "subscriptionId", "CatalogModule", "http", "storeId", "opts", "_a", "_b", "body", "productId", "HeadlessClient", "config", "environment", "baseUrl", "HttpClient", "setToken", "token", "CheckoutModule", "PaymentModule", "AnalyticsModule", "OffersModule", "CustomerModule", "CatalogModule", "createHeadlessClient"]
3
+ "sources": ["../src/core/index.ts", "../src/core/errors.ts", "../src/core/http.ts", "../src/core/modules/checkout.ts", "../src/core/modules/payment.ts", "../src/core/modules/offers.ts", "../src/core/modules/customer.ts", "../src/core/modules/catalog.ts", "../src/core/client.ts"],
4
+ "sourcesContent": ["export { HeadlessClient, createHeadlessClient } from './client.js';\n\nexport { CheckoutModule } from './modules/checkout.js';\nexport { PaymentModule } from './modules/payment.js';\nexport { OffersModule } from './modules/offers.js';\nexport { CustomerModule } from './modules/customer.js';\nexport { CatalogModule } from './modules/catalog.js';\n\nexport { HttpClient } from './http.js';\n\nexport {\n TagadaError,\n TagadaAuthError,\n TagadaValidationError,\n TagadaNotFoundError,\n TagadaRateLimitError,\n TagadaPaymentError,\n TagadaNetworkError,\n} from './errors.js';\n\nexport type {\n Environment,\n HeadlessConfig,\n HttpRequestOptions,\n LineItem,\n CheckoutSession,\n CheckoutLineItem,\n CheckoutTotals,\n CheckoutCustomer,\n Address,\n ShippingRate,\n PaymentMethodConfig,\n PaymentSetupConfig,\n ExpressMethod,\n ExpressMethods,\n StoreConfig,\n PayResult,\n PayOptions,\n PayDirectOptions,\n CreateInstrumentOptions,\n PaymentInstrument,\n ThreedsSession,\n PaymentStatus,\n Offer,\n OfferLineItem,\n OfferPreview,\n OfferPreviewItem,\n OfferPayResult,\n Customer,\n Order,\n OrderItem,\n Subscription,\n CatalogProduct,\n CatalogVariant,\n CatalogPrice,\n CurrencyOption,\n} from './types.js';\n", "/** Base error for all TagadaPay headless SDK errors. */\nexport class TagadaError extends Error {\n public readonly code: string;\n public readonly statusCode?: number;\n public readonly details?: Record<string, unknown>;\n\n constructor(\n message: string,\n code: string,\n statusCode?: number,\n details?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'TagadaError';\n this.code = code;\n this.statusCode = statusCode;\n this.details = details;\n }\n}\n\n/** Thrown when the API returns 401/403. */\nexport class TagadaAuthError extends TagadaError {\n constructor(message = 'Authentication failed. Check your API key or checkout token.') {\n super(message, 'auth_error', 401);\n this.name = 'TagadaAuthError';\n }\n}\n\n/** Thrown when the API returns 422 with validation errors. */\nexport class TagadaValidationError extends TagadaError {\n public readonly errors: Array<{ field: string; message: string }>;\n\n constructor(\n message: string,\n errors: Array<{ field: string; message: string }> = [],\n ) {\n super(message, 'validation_error', 422, { errors });\n this.name = 'TagadaValidationError';\n this.errors = errors;\n }\n}\n\n/** Thrown when a resource is not found (404). */\nexport class TagadaNotFoundError extends TagadaError {\n constructor(resource: string, id: string) {\n super(`${resource} \"${id}\" not found.`, 'not_found', 404);\n this.name = 'TagadaNotFoundError';\n }\n}\n\n/** Thrown when the API returns 429. */\nexport class TagadaRateLimitError extends TagadaError {\n public readonly retryAfterMs: number;\n\n constructor(retryAfterMs = 1000) {\n super(`Rate limited. Retry after ${retryAfterMs}ms.`, 'rate_limit', 429);\n this.name = 'TagadaRateLimitError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/** Thrown when a payment fails or requires action. */\nexport class TagadaPaymentError extends TagadaError {\n public readonly paymentId?: string;\n public readonly requireAction?: string;\n\n constructor(\n message: string,\n opts?: { paymentId?: string; requireAction?: string; details?: Record<string, unknown> },\n ) {\n super(message, 'payment_error', undefined, opts?.details);\n this.name = 'TagadaPaymentError';\n this.paymentId = opts?.paymentId;\n this.requireAction = opts?.requireAction;\n }\n}\n\n/** Thrown on network / fetch failures. */\nexport class TagadaNetworkError extends TagadaError {\n constructor(message = 'Network request failed. Check your connection.') {\n super(message, 'network_error');\n this.name = 'TagadaNetworkError';\n }\n}\n", "import {\n TagadaError,\n TagadaAuthError,\n TagadaValidationError,\n TagadaNotFoundError,\n TagadaRateLimitError,\n TagadaNetworkError,\n} from './errors.js';\nimport type { Environment, HttpRequestOptions } from './types.js';\n\nconst BASE_URLS: Record<Environment, string> = {\n production: 'https://app.tagadapay.com',\n development: 'https://app.dev.tagadapay.com',\n local: 'http://localhost:3000',\n};\n\nexport interface HttpClientConfig {\n baseUrl: string;\n timeout: number;\n apiKey?: string;\n getToken?: () => string | undefined;\n}\n\n/**\n * Lightweight HTTP client built on native fetch.\n * Zero dependencies -- works in browser, edge runtimes, and Node 18+.\n */\nexport class HttpClient {\n readonly baseUrl: string;\n private timeout: number;\n private apiKey?: string;\n private getToken?: () => string | undefined;\n\n constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.timeout = config.timeout;\n this.apiKey = config.apiKey;\n this.getToken = config.getToken;\n }\n\n static resolveBaseUrl(environment: Environment, override?: string): string {\n return override ?? BASE_URLS[environment] ?? BASE_URLS.production;\n }\n\n async request<T = unknown>(path: string, options: HttpRequestOptions = {}): Promise<T> {\n const { method = 'GET', body, headers = {}, params, token, signal } = options;\n\n let url = `${this.baseUrl}${path}`;\n if (params) {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined) qs.set(k, String(v));\n }\n const str = qs.toString();\n if (str) url += `?${str}`;\n }\n\n const reqHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...headers,\n };\n\n const authToken = token ?? this.apiKey ?? this.getToken?.();\n if (authToken) {\n reqHeaders['x-cms-token'] = authToken;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const res = await fetch(url, {\n method,\n headers: reqHeaders,\n body: body != null ? JSON.stringify(body) : undefined,\n signal: signal ?? controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (res.ok) {\n const text = await res.text();\n return text ? (JSON.parse(text) as T) : ({} as T);\n }\n\n await this.handleErrorResponse(res, path);\n throw new TagadaError('Unexpected error', 'unknown', res.status);\n } catch (err) {\n clearTimeout(timeoutId);\n if (err instanceof TagadaError) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') {\n throw new TagadaNetworkError(`Request to ${path} timed out after ${this.timeout}ms.`);\n }\n throw new TagadaNetworkError(\n err instanceof Error ? err.message : 'Network request failed.',\n );\n }\n }\n\n get<T = unknown>(path: string, options?: HttpRequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'GET' });\n }\n\n post<T = unknown>(path: string, body?: unknown, options?: HttpRequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'POST', body });\n }\n\n patch<T = unknown>(path: string, body?: unknown, options?: HttpRequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PATCH', body });\n }\n\n put<T = unknown>(path: string, body?: unknown, options?: HttpRequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PUT', body });\n }\n\n delete<T = unknown>(path: string, options?: HttpRequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'DELETE' });\n }\n\n private async handleErrorResponse(res: Response, path: string): Promise<never> {\n let parsed: Record<string, unknown> = {};\n try {\n parsed = (await res.json()) as Record<string, unknown>;\n } catch {\n // response isn't JSON\n }\n\n const msg =\n (parsed.message as string) ??\n (parsed.error as string) ??\n `Request failed: ${res.status} ${res.statusText} on ${path}`;\n\n switch (res.status) {\n case 401:\n case 403:\n throw new TagadaAuthError(msg);\n case 404:\n throw new TagadaNotFoundError(path, '');\n case 422: {\n const fieldErrors = Array.isArray(parsed.errors)\n ? (parsed.errors as Array<{ field: string; message: string }>)\n : [];\n throw new TagadaValidationError(msg, fieldErrors);\n }\n case 429: {\n const retryAfter = Number(res.headers.get('Retry-After') ?? '1') * 1000;\n throw new TagadaRateLimitError(retryAfter);\n }\n default:\n throw new TagadaError(msg, 'api_error', res.status, parsed);\n }\n }\n}\n", "import type { HttpClient } from '../http.js';\nimport type {\n CheckoutSession,\n LineItem,\n ShippingRate,\n Address,\n CheckoutCustomer,\n} from '../types.js';\n\n/**\n * Manages checkout sessions -- load, update cart, apply promo codes, handle shipping.\n *\n * All methods talk to the TagadaPay REST API and return typed data.\n * No local state is kept; the server is the source of truth.\n */\nexport class CheckoutModule {\n private sessionToken: string | undefined;\n\n constructor(\n private readonly http: HttpClient,\n private readonly storeId: string,\n private readonly onTokenChange?: (token: string) => void,\n ) {}\n\n /**\n * Load an existing checkout session by its checkout token.\n *\n * @param checkoutToken The checkout token (from URL param `checkoutToken`).\n * @param sessionToken The JWT session token (from URL param `token`). Required for auth.\n *\n * Both values come from the redirect URL returned by `createSession()`.\n * Example URL: `/checkout?checkoutToken=abc123&token=eyJ...`\n */\n async loadSession(checkoutToken: string, sessionToken?: string): Promise<CheckoutSession> {\n if (sessionToken) {\n this.sessionToken = sessionToken;\n this.onTokenChange?.(sessionToken);\n }\n\n const raw = await this.http.get<{ checkoutSession: unknown; summary: unknown }>(\n `/api/v1/checkout-sessions/${checkoutToken}/v2`,\n {\n params: { skipAsyncWait: 'false' },\n token: this.sessionToken,\n },\n );\n\n return this.normalizeSession(raw);\n }\n\n /**\n * Create a new checkout session.\n *\n * Returns a `checkoutToken` and `sessionToken` (JWT) needed for all subsequent calls.\n * Also returns a `checkoutUrl` (the full Tagada-hosted checkout URL, for reference).\n */\n async createSession(opts: {\n items: LineItem[];\n currency?: string;\n returnUrl?: string;\n customerEmail?: string;\n customerFirstName?: string;\n customerLastName?: string;\n }): Promise<{ checkoutUrl: string; checkoutToken: string; sessionToken: string; customerId: string }> {\n const lineItems = opts.items.map((i) => ({\n variantId: i.variantId,\n priceId: i.priceId,\n quantity: i.quantity,\n }));\n\n const body: Record<string, unknown> = {\n storeId: this.storeId,\n lineItems,\n };\n if (opts.currency) body.currency = opts.currency;\n if (opts.returnUrl) body.returnUrl = opts.returnUrl;\n if (opts.customerEmail) {\n body.customer = {\n email: opts.customerEmail,\n firstName: opts.customerFirstName,\n lastName: opts.customerLastName,\n currency: opts.currency,\n };\n }\n\n const res = await this.http.post<{\n checkoutUrl: string;\n checkoutToken: string;\n customerId: string;\n }>('/api/v1/checkout/session/init', body);\n\n const url = new URL(res.checkoutUrl);\n const sessionToken = url.searchParams.get('token') ?? '';\n this.sessionToken = sessionToken;\n if (sessionToken) this.onTokenChange?.(sessionToken);\n\n return {\n checkoutUrl: res.checkoutUrl,\n checkoutToken: res.checkoutToken,\n sessionToken,\n customerId: res.customerId,\n };\n }\n\n /** Replace the cart items for an existing session. */\n async updateCart(sessionId: string, items: LineItem[]): Promise<CheckoutSession> {\n return this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/line-items`,\n { items },\n { token: this.sessionToken },\n );\n }\n\n /**\n * Update customer + address information on the session.\n * Uses the combined endpoint with `partial: true` so missing fields are tolerated.\n */\n async updateCustomer(\n sessionId: string,\n customer: Partial<CheckoutCustomer>,\n ): Promise<void> {\n await this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/customer-and-session-info`,\n {\n checkoutSessionId: sessionId,\n partial: true,\n customerData: {\n email: customer.email,\n },\n shippingAddress: {\n firstName: customer.firstName,\n lastName: customer.lastName,\n phone: customer.phone,\n },\n billingAddress: {},\n differentBillingAddress: false,\n },\n { token: this.sessionToken },\n );\n }\n\n /**\n * Update shipping and/or billing address on the session.\n *\n * Address fields use the API's naming: `address1`, `postal`, etc.\n */\n async updateAddress(\n sessionId: string,\n addresses: { shippingAddress?: Address; billingAddress?: Address },\n ): Promise<void> {\n const mapAddress = (a?: Address) => {\n if (!a) return undefined;\n return {\n address1: a.line1,\n address2: a.line2,\n city: a.city,\n state: a.state,\n postal: a.postalCode,\n country: a.country,\n };\n };\n\n await this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/address`,\n {\n checkoutSessionId: sessionId,\n data: {\n shippingAddress: mapAddress(addresses.shippingAddress) ?? {},\n billingAddress: mapAddress(addresses.billingAddress),\n },\n },\n { token: this.sessionToken },\n );\n }\n\n /** Apply a promotion code to the session. */\n async applyPromoCode(sessionId: string, code: string): Promise<void> {\n await this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/promotions/apply`,\n { checkoutSessionId: sessionId, code },\n { token: this.sessionToken },\n );\n }\n\n /** Remove a promotion from the session by promotion ID. */\n async removePromoCode(sessionId: string, promotionId?: string): Promise<void> {\n const promoId = promotionId ?? 'default';\n await this.http.delete(\n `/api/v1/checkout-sessions/${sessionId}/promotions/${promoId}`,\n { token: this.sessionToken },\n );\n }\n\n /** Fetch available shipping rates for the session's address. */\n async getShippingRates(sessionId: string): Promise<ShippingRate[]> {\n const res = await this.http.get<{ rates: ShippingRate[] }>(\n `/api/v1/checkout-sessions/${sessionId}/shipping-rates`,\n { token: this.sessionToken },\n );\n return res.rates ?? [];\n }\n\n /** Select a shipping rate for the session. */\n async selectShippingRate(sessionId: string, rateId: string): Promise<void> {\n await this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/shipping-rate`,\n { checkoutSessionId: sessionId, shippingRateId: rateId },\n { token: this.sessionToken },\n );\n }\n\n /**\n * Normalize the raw v2 API response into a cleaner CheckoutSession shape.\n * The raw response has nested `checkoutSession` + `summary` -- we flatten it.\n */\n private normalizeSession(raw: { checkoutSession: unknown; summary: unknown }): CheckoutSession {\n const cs = raw.checkoutSession as Record<string, unknown>;\n const orderSummaries = (cs.orderSummaries ?? []) as Array<Record<string, unknown>>;\n const summary = (raw.summary ?? cs.summary ?? orderSummaries[0] ?? {}) as Record<string, unknown>;\n const lineItems = (cs.sessionLineItems ?? []) as Array<Record<string, unknown>>;\n const customer = cs.customer as Record<string, unknown> | undefined;\n\n const items = lineItems.map((li) => {\n const price = li.price as Record<string, unknown> | undefined;\n const variant = (price?.variant ?? {}) as Record<string, unknown>;\n const product = (variant.product ?? {}) as Record<string, unknown>;\n const currencyOpts = (price?.currencyOptions ?? {}) as Record<string, { amount: number }>;\n const usd = currencyOpts.USD ?? currencyOpts[Object.keys(currencyOpts)[0]];\n return {\n id: li.id as string,\n variantId: li.variantId as string,\n priceId: li.priceId as string,\n productName: (product.name ?? '') as string,\n variantName: (variant.name ?? '') as string,\n quantity: (li.quantity ?? 1) as number,\n unitAmount: usd?.amount ?? 0,\n totalAmount: (usd?.amount ?? 0) * ((li.quantity ?? 1) as number),\n currency: (cs.selectedPresentmentCurrency ?? 'USD') as string,\n imageUrl: (variant.imageUrl ?? '') as string,\n };\n });\n\n const summaryItems = (summary.items ?? []) as Array<Record<string, unknown>>;\n\n return {\n id: cs.id as string,\n storeId: cs.storeId as string,\n checkoutToken: cs.checkoutToken as string,\n currency: (cs.selectedPresentmentCurrency ?? 'USD') as string,\n items,\n totals: {\n subtotal: (summary.subtotalAmount ?? 0) as number,\n discount: (summary.totalPromotionAmount ?? 0) as number,\n shipping: (summary.shippingCost ?? 0) as number,\n tax: (summary.totalTaxAmount ?? 0) as number,\n total: (summary.totalAmount ?? summaryItems.reduce((s: number, i: Record<string, unknown>) => s + ((i.amount ?? 0) as number), 0)) as number,\n currency: (summary.currency ?? cs.selectedPresentmentCurrency ?? 'USD') as string,\n },\n customer: customer\n ? {\n id: customer.id as string,\n email: customer.email as string | undefined,\n firstName: customer.firstName as string | undefined,\n lastName: customer.lastName as string | undefined,\n }\n : undefined,\n shippingAddress: cs.shippingAddress as CheckoutSession['shippingAddress'],\n billingAddress: cs.billingAddress as CheckoutSession['billingAddress'],\n metadata: cs.metadata as Record<string, unknown>,\n };\n }\n}\n", "import type { HttpClient } from '../http.js';\nimport type {\n Environment,\n PaymentSetupConfig,\n PaymentMethodConfig,\n ExpressMethods,\n StoreConfig,\n PayResult,\n PayOptions,\n PayDirectOptions,\n CreateInstrumentOptions,\n PaymentInstrument,\n ThreedsSession,\n PaymentStatus,\n} from '../types.js';\n\n/**\n * Full payment lifecycle -- discover APMs, tokenize, create instruments,\n * process payments, handle 3DS, and poll for status.\n *\n * Wraps the same REST endpoints that plugin-sdk uses internally.\n */\nexport class PaymentModule {\n constructor(\n private readonly http: HttpClient,\n private readonly storeId: string,\n private readonly environment: Environment,\n ) {}\n\n // ---------------------------------------------------------------------------\n // Discovery: what payment methods are available?\n // ---------------------------------------------------------------------------\n\n /**\n * Get the full payment setup config for a checkout session.\n * Returns a map of payment methods with their configuration\n * (card, apple_pay, google_pay, klarna, etc.).\n */\n async getPaymentSetup(checkoutSessionId: string): Promise<PaymentSetupConfig> {\n const methods = await this.http.get<{ methods: PaymentMethodConfig[] }>(\n '/api/v1/payment-methods',\n { params: { checkoutSessionId } },\n );\n\n const config: PaymentSetupConfig = {};\n for (const m of methods.methods ?? []) {\n const key = m.provider ? `${m.method}:${m.provider}` : m.method;\n config[key] = m;\n }\n return config;\n }\n\n /**\n * Get express payment methods (Apple Pay, Google Pay, PayPal, etc.)\n * filtered to only those available in the current browser.\n */\n async getExpressMethods(checkoutSessionId: string): Promise<ExpressMethods> {\n const setup = await this.getPaymentSetup(checkoutSessionId);\n const result: ExpressMethods = {};\n\n for (const [, config] of Object.entries(setup)) {\n if (!config.enabled || !config.express) continue;\n\n const method = config.method;\n const base = {\n type: method,\n available: true,\n processorId: config.processorId,\n publishableKey: config.publishableKey,\n metadata: config.metadata,\n };\n\n if (method === 'apple_pay' || config.type === 'apple_pay') {\n const hasApplePay =\n typeof window !== 'undefined' &&\n 'ApplePaySession' in window &&\n (window as unknown as Record<string, { canMakePayments?: () => boolean }>)\n .ApplePaySession?.canMakePayments?.();\n result.applePay = { ...base, available: !!hasApplePay };\n } else if (method === 'google_pay' || config.type === 'google_pay') {\n result.googlePay = base;\n } else if (method === 'paypal') {\n result.paypal = base;\n } else if (method === 'klarna' || method === 'klarna_express') {\n result.klarna = base;\n } else if (method === 'link') {\n result.link = base;\n }\n }\n\n return result;\n }\n\n /**\n * Get store-level payment config (3DS flags, default flow ID, etc.).\n */\n async getStoreConfig(): Promise<StoreConfig> {\n const res = await this.http.get<{ config: StoreConfig }>(\n '/api/v1/checkout/config',\n { params: { storeId: this.storeId } },\n );\n return res.config ?? (res as unknown as StoreConfig);\n }\n\n /**\n * Convenience: return only enabled payment method keys.\n */\n async getEnabledMethods(checkoutSessionId: string): Promise<string[]> {\n const setup = await this.getPaymentSetup(checkoutSessionId);\n return Object.entries(setup)\n .filter(([, c]) => c.enabled)\n .map(([key]) => key);\n }\n\n // ---------------------------------------------------------------------------\n // Tokenization (delegates to @tagadapay/core-js if available)\n // ---------------------------------------------------------------------------\n\n /**\n * Tokenize a card using @tagadapay/core-js.\n * Requires `@tagadapay/core-js` to be installed as a peer dependency.\n *\n * @returns tagadaToken (base64 string) and rawToken with SCA metadata.\n */\n async tokenizeCard(card: {\n cardNumber: string;\n expiryDate: string;\n cvc: string;\n cardholderName?: string;\n }): Promise<{ tagadaToken: string; rawToken: Record<string, unknown> }> {\n const coreJs = await this.loadCoreJs();\n\n const tokenizer = new coreJs.Tokenizer({ environment: this.environment });\n await tokenizer.initialize();\n\n const sanitized: Record<string, string> = {\n cardNumber: card.cardNumber,\n expiryDate: card.expiryDate,\n cvc: card.cvc,\n };\n if (card.cardholderName) sanitized.cardholderName = card.cardholderName;\n\n const [tagadaToken, rawToken] = await Promise.all([\n tokenizer.tokenizeCard(sanitized),\n tokenizer.tokenizeCardRaw(sanitized),\n ]);\n\n return { tagadaToken, rawToken };\n }\n\n // ---------------------------------------------------------------------------\n // Instrument creation\n // ---------------------------------------------------------------------------\n\n /**\n * Create a reusable payment instrument from a TagadaToken.\n * Session-authenticated (uses the checkout session JWT).\n */\n async createInstrument(\n opts: CreateInstrumentOptions,\n ): Promise<{ paymentInstrument: PaymentInstrument }> {\n return this.http.post('/api/v1/payment/create-instrument-from-token', {\n tagadaToken: opts.tagadaToken,\n });\n }\n\n // ---------------------------------------------------------------------------\n // 3DS\n // ---------------------------------------------------------------------------\n\n /**\n * Create a 3DS session on the TagadaPay backend.\n * This persists the session so the processor can use it during payment.\n */\n async create3dsSession(opts: {\n paymentInstrumentId: string;\n sessionData: { sessionId: string; metadata?: Record<string, unknown> };\n provider?: string;\n }): Promise<ThreedsSession> {\n return this.http.post('/api/public/v1/threeds/create-session', {\n provider: opts.provider ?? 'basis_theory',\n storeId: this.storeId,\n paymentInstrumentId: opts.paymentInstrumentId,\n sessionData: opts.sessionData,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Payment processing\n // ---------------------------------------------------------------------------\n\n /**\n * High-level pay: single API call that decodes tagadaToken server-side,\n * creates the payment instrument, and processes payment.\n *\n * Also accepts `paymentInstrumentId` directly for pre-created instruments.\n */\n async pay(opts: PayOptions): Promise<PayResult> {\n if (opts.tagadaToken && !opts.paymentInstrumentId) {\n return this.http.post<PayResult>('/api/v1/payment/pay-with-token', {\n tagadaToken: opts.tagadaToken,\n checkoutSessionId: opts.checkoutSessionId,\n paymentFlowId: opts.paymentFlowId,\n processorId: opts.processorId,\n paymentMethod: opts.paymentMethod,\n isExpress: opts.isExpress,\n metadata: opts.metadata,\n });\n }\n\n return this.http.post<PayResult>('/api/public/v1/checkout/pay-v2', {\n checkoutSessionId: opts.checkoutSessionId,\n paymentInstrumentId: opts.paymentInstrumentId,\n storeId: this.storeId,\n paymentFlowId: opts.paymentFlowId,\n threedsSessionId: opts.threedsSessionId,\n processorId: opts.processorId,\n paymentMethod: opts.paymentMethod,\n isExpress: opts.isExpress,\n metadata: opts.metadata,\n });\n }\n\n /**\n * Low-level pay: process payment with an existing instrument or for APM/express flows\n * where no instrument is needed (redirect-based methods).\n */\n async payDirect(opts: PayDirectOptions): Promise<PayResult> {\n return this.http.post<PayResult>('/api/public/v1/checkout/pay-v2', {\n checkoutSessionId: opts.checkoutSessionId,\n paymentInstrumentId: opts.paymentInstrumentId ?? '',\n storeId: this.storeId,\n paymentFlowId: opts.paymentFlowId,\n processorId: opts.processorId,\n paymentMethod: opts.paymentMethod,\n isExpress: opts.isExpress,\n threedsSessionId: opts.threedsSessionId,\n });\n }\n\n /**\n * Process an Apple Pay payment.\n * Tokenizes the Apple Pay token and processes payment in one call.\n */\n async processApplePay(opts: {\n checkoutSessionId: string;\n applePayToken: unknown;\n paymentFlowId?: string;\n processorId?: string;\n }): Promise<PayResult> {\n const coreJs = await this.loadCoreJs();\n const tokenizer = new coreJs.Tokenizer({ environment: this.environment });\n await tokenizer.initialize();\n const { tagadaToken } = await tokenizer.tokenizeApplePay(opts.applePayToken);\n\n return this.pay({\n checkoutSessionId: opts.checkoutSessionId,\n tagadaToken,\n paymentFlowId: opts.paymentFlowId,\n processorId: opts.processorId,\n paymentMethod: 'apple_pay',\n isExpress: true,\n });\n }\n\n /**\n * Process a Google Pay payment.\n * Tokenizes the Google Pay token and processes payment in one call.\n */\n async processGooglePay(opts: {\n checkoutSessionId: string;\n googlePayToken: string;\n paymentFlowId?: string;\n processorId?: string;\n }): Promise<PayResult> {\n const coreJs = await this.loadCoreJs();\n const tokenizer = new coreJs.Tokenizer({ environment: this.environment });\n await tokenizer.initialize();\n const { tagadaToken } = await tokenizer.tokenizeGooglePay(opts.googlePayToken);\n\n return this.pay({\n checkoutSessionId: opts.checkoutSessionId,\n tagadaToken,\n paymentFlowId: opts.paymentFlowId,\n processorId: opts.processorId,\n paymentMethod: 'google_pay',\n isExpress: true,\n });\n }\n\n /**\n * Process an APM payment (Klarna, iDEAL, etc.) via redirect.\n * These typically don't require a payment instrument -- the processor handles the redirect.\n */\n async processApm(opts: {\n checkoutSessionId: string;\n paymentMethod: string;\n processorId: string;\n paymentFlowId?: string;\n }): Promise<PayResult> {\n return this.payDirect({\n checkoutSessionId: opts.checkoutSessionId,\n paymentMethod: opts.paymentMethod,\n processorId: opts.processorId,\n paymentFlowId: opts.paymentFlowId,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Status polling\n // ---------------------------------------------------------------------------\n\n /** Get current status of a payment. */\n async getPaymentStatus(paymentId: string): Promise<PaymentStatus> {\n return this.http.get<PaymentStatus>(`/api/v1/payments/${paymentId}`);\n }\n\n /**\n * Poll a payment until it reaches a terminal status.\n * Returns the final status or throws on timeout.\n */\n async pollPaymentStatus(\n paymentId: string,\n opts?: { intervalMs?: number; timeoutMs?: number },\n ): Promise<PaymentStatus> {\n const interval = opts?.intervalMs ?? 1500;\n const timeout = opts?.timeoutMs ?? 60_000;\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n const status = await this.getPaymentStatus(paymentId);\n if (status.status === 'succeeded' || status.status === 'failed' || status.status === 'declined') {\n return status;\n }\n await new Promise((r) => setTimeout(r, interval));\n }\n\n throw new Error(`Payment ${paymentId} did not reach terminal status within ${timeout}ms.`);\n }\n\n /** Finalize a payment after a 3DS challenge completes. */\n async completeAfter3ds(paymentId: string): Promise<PaymentStatus> {\n return this.http.post<PaymentStatus>('/api/v1/payments/complete-after-3ds', {\n paymentId,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async loadCoreJs(): Promise<any> {\n try {\n return await import('@tagadapay/core-js');\n } catch {\n throw new Error(\n 'This method requires @tagadapay/core-js. Install it: npm install @tagadapay/core-js',\n );\n }\n }\n}\n", "import type { HttpClient } from '../http.js';\nimport type { Offer, OfferPreview, OfferPayResult } from '../types.js';\n\n/**\n * Offers \u2014 upsells, downsells, order bumps, and post-purchase offers.\n *\n * Endpoints align with the plugin-sdk patterns:\n * GET /api/v1/offers/:id \u2014 single offer\n * GET /api/v1/stores/:storeId/offers \u2014 list store offers\n * POST /api/v1/offers/:offerId/preview \u2014 preview pricing\n * POST /api/v1/offers/:offerId/pay-preview \u2014 pay a previewed offer (one-click)\n * POST /api/v1/checkout-sessions/:id/toggle-order-bump \u2014 toggle order bump\n * GET /api/v1/post-purchase/:orderId/offers \u2014 post-purchase offers for an order\n * POST /api/v1/orders/:orderId/post-purchase-offers/:offerId/accept \u2014 accept\n * POST /api/v1/orders/:orderId/post-purchase-offers/:offerId/decline \u2014 decline\n */\nexport class OffersModule {\n constructor(\n private readonly http: HttpClient,\n private readonly storeId: string,\n ) {}\n\n // ---------------------------------------------------------------------------\n // Offer loading\n // ---------------------------------------------------------------------------\n\n /** Get a single offer by ID. */\n async getOffer(offerId: string): Promise<Offer> {\n return this.http.get<Offer>(`/api/v1/offers/${offerId}`);\n }\n\n /** List offers for the current store. Optionally filter by type or a set of IDs. */\n async listOffers(opts?: {\n type?: 'upsell' | 'orderbump';\n ids?: string[];\n }): Promise<Offer[]> {\n let url = `/api/v1/stores/${this.storeId}/offers`;\n\n const queryParts: string[] = [];\n if (opts?.type) queryParts.push(`type=${encodeURIComponent(opts.type)}`);\n if (opts?.ids?.length) {\n for (const id of opts.ids) queryParts.push(`ids=${encodeURIComponent(id)}`);\n }\n if (queryParts.length) url += `?${queryParts.join('&')}`;\n\n const res = await this.http.get<{ offers: Offer[] }>(url);\n return res.offers ?? [];\n }\n\n // ---------------------------------------------------------------------------\n // Preview & pay (one-click upsell flow from plugin-sdk)\n // ---------------------------------------------------------------------------\n\n /** Preview offer pricing. Returns line items with amounts and totals. */\n async previewOffer(opts: {\n offerId: string;\n currency?: string;\n lineItems?: Array<{ lineItemId?: string; productId?: string; variantId: string; quantity: number }>;\n }): Promise<OfferPreview> {\n return this.http.post<OfferPreview>(`/api/v1/offers/${opts.offerId}/preview`, {\n offerId: opts.offerId,\n currency: opts.currency ?? '',\n lineItems: opts.lineItems,\n });\n }\n\n /**\n * Pay a previously previewed offer (one-click charge).\n * Used after a main order so the stored payment instrument is reused.\n */\n async payPreviewedOffer(opts: {\n offerId: string;\n mainOrderId: string;\n currency?: string;\n lineItems?: Array<{ lineItemId?: string; productId?: string; variantId: string; quantity: number }>;\n returnUrl?: string;\n paymentInstrumentId?: string;\n }): Promise<OfferPayResult> {\n return this.http.post<OfferPayResult>(`/api/v1/offers/${opts.offerId}/pay-preview`, {\n offerId: opts.offerId,\n currency: opts.currency ?? '',\n lineItems: opts.lineItems,\n returnUrl: opts.returnUrl ?? (typeof window !== 'undefined' ? window.location.href : ''),\n mainOrderId: opts.mainOrderId,\n paymentInstrumentId: opts.paymentInstrumentId,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Order bumps (checkout-session scoped)\n // ---------------------------------------------------------------------------\n\n /** Toggle an order bump on/off within a checkout session. */\n async toggleOrderBump(opts: {\n checkoutSessionId: string;\n orderBumpOfferId: string;\n selected: boolean;\n }): Promise<unknown> {\n return this.http.post(\n `/api/v1/checkout-sessions/${opts.checkoutSessionId}/toggle-order-bump`,\n {\n orderBumpOfferId: opts.orderBumpOfferId,\n selected: opts.selected,\n },\n );\n }\n\n // ---------------------------------------------------------------------------\n // Post-purchase offers (order-scoped)\n // ---------------------------------------------------------------------------\n\n /** List post-purchase offers for an order. */\n async listPostPurchaseOffers(orderId: string): Promise<Offer[]> {\n const res = await this.http.get<Offer[]>(`/api/v1/post-purchase/${orderId}/offers`);\n return Array.isArray(res) ? res : [];\n }\n\n /** Accept a post-purchase offer. */\n async acceptPostPurchaseOffer(opts: {\n orderId: string;\n offerId: string;\n items?: Array<{ variantId: string; quantity: number }>;\n }): Promise<{ success: boolean; error?: string }> {\n return this.http.post(\n `/api/v1/orders/${opts.orderId}/post-purchase-offers/${opts.offerId}/accept`,\n { items: opts.items ?? [] },\n );\n }\n\n /** Decline a post-purchase offer. */\n async declinePostPurchaseOffer(opts: {\n orderId: string;\n offerId: string;\n }): Promise<{ success: boolean; error?: string }> {\n return this.http.post(\n `/api/v1/orders/${opts.orderId}/post-purchase-offers/${opts.offerId}/decline`,\n );\n }\n}\n", "import type { HttpClient } from '../http.js';\nimport type { Customer, Order, Subscription } from '../types.js';\n\n/**\n * Customer data -- profile, orders, subscriptions.\n *\n * Requires either an API key or a session token for authentication.\n */\nexport class CustomerModule {\n constructor(\n private readonly http: HttpClient,\n private readonly storeId: string,\n ) {}\n\n /** Get customer profile by ID. */\n async getProfile(customerId: string): Promise<Customer> {\n const res = await this.http.get<{ customer: Customer }>(\n `/api/v1/customers/${customerId}`,\n { params: { storeId: this.storeId } },\n );\n return res.customer;\n }\n\n /** Get customer profile by email. */\n async getByEmail(email: string): Promise<Customer | null> {\n try {\n const res = await this.http.get<{ customer: Customer }>(\n '/api/v1/customers/by-email',\n { params: { email, storeId: this.storeId } },\n );\n return res.customer;\n } catch {\n return null;\n }\n }\n\n /** Update customer profile fields. */\n async updateProfile(\n customerId: string,\n data: Partial<Pick<Customer, 'email' | 'firstName' | 'lastName' | 'phone' | 'metadata'>>,\n ): Promise<Customer> {\n const res = await this.http.patch<{ customer: Customer }>(\n `/api/v1/customers/${customerId}`,\n { storeId: this.storeId, ...data },\n );\n return res.customer;\n }\n\n /** List orders for a customer. */\n async getOrders(\n customerId: string,\n opts?: { limit?: number; offset?: number },\n ): Promise<{ orders: Order[]; total: number }> {\n return this.http.get<{ orders: Order[]; total: number }>(\n `/api/v1/customers/${customerId}/orders`,\n { params: { storeId: this.storeId, limit: opts?.limit, offset: opts?.offset } },\n );\n }\n\n /** Get a single order by ID. */\n async getOrder(orderId: string): Promise<Order> {\n const res = await this.http.get<{ order: Order }>(`/api/v1/orders/${orderId}`, {\n params: { storeId: this.storeId },\n });\n return res.order;\n }\n\n /** List subscriptions for a customer. */\n async getSubscriptions(customerId: string): Promise<Subscription[]> {\n const res = await this.http.get<{ subscriptions: Subscription[] }>(\n `/api/v1/customers/${customerId}/subscriptions`,\n { params: { storeId: this.storeId } },\n );\n return res.subscriptions;\n }\n\n /** Get a single subscription by ID. */\n async getSubscription(subscriptionId: string): Promise<Subscription> {\n const res = await this.http.get<{ subscription: Subscription }>(\n `/api/v1/subscriptions/${subscriptionId}`,\n { params: { storeId: this.storeId } },\n );\n return res.subscription;\n }\n}\n", "import type { HttpClient } from '../http.js';\nimport type { CatalogProduct } from '../types.js';\n\n/**\n * Fetches the product catalog for a store.\n *\n * Uses the public `/api/v1/products` endpoint (no auth required).\n */\nexport class CatalogModule {\n constructor(\n private readonly http: HttpClient,\n private readonly storeId: string,\n ) {}\n\n /**\n * List all active products for the store, including variants and prices.\n *\n * @param opts.productIds Optional filter to specific product IDs.\n * @param opts.variantIds Optional filter to products containing these variant IDs.\n */\n async getProducts(opts?: {\n productIds?: string[];\n variantIds?: string[];\n }): Promise<CatalogProduct[]> {\n const body: Record<string, unknown> = {\n storeId: this.storeId,\n includeVariants: true,\n includePrices: true,\n };\n if (opts?.productIds?.length) body.productIds = opts.productIds;\n if (opts?.variantIds?.length) body.variantIds = opts.variantIds;\n\n const res = await this.http.post<{ items: CatalogProduct[] }>(\n '/api/v1/products',\n body,\n );\n\n return res.items ?? [];\n }\n\n /**\n * Get a single product by ID.\n */\n async getProduct(productId: string): Promise<CatalogProduct | null> {\n const items = await this.getProducts({ productIds: [productId] });\n return items[0] ?? null;\n }\n}\n", "import { HttpClient } from './http.js';\nimport { CheckoutModule } from './modules/checkout.js';\nimport { PaymentModule } from './modules/payment.js';\nimport { OffersModule } from './modules/offers.js';\nimport { CustomerModule } from './modules/customer.js';\nimport { CatalogModule } from './modules/catalog.js';\nimport type { HeadlessConfig, Environment } from './types.js';\n\n/**\n * Main entry point for the TagadaPay Headless SDK.\n *\n * Composes all domain modules (checkout, payment, offers, customer, catalog)\n * over a single lightweight HTTP client built on native fetch.\n */\nexport class HeadlessClient {\n readonly config: Required<Pick<HeadlessConfig, 'storeId' | 'environment'>> & HeadlessConfig;\n\n private readonly http: HttpClient;\n\n /** Shared session token used by all modules for authenticated API calls. */\n private _sessionToken: string | undefined;\n\n /** Checkout session management -- load, update cart, apply promos, shipping. */\n readonly checkout: CheckoutModule;\n\n /** Payment processing -- setup config, APMs, tokenize, pay, 3DS, poll. */\n readonly payment: PaymentModule;\n\n /** Offers -- preview, pay, accept/decline upsells and order bumps. */\n readonly offers: OffersModule;\n\n /** Customer data -- profile, orders, subscriptions. */\n readonly customer: CustomerModule;\n\n /** Product catalog -- list products, variants, and prices. */\n readonly catalog: CatalogModule;\n\n constructor(config: HeadlessConfig) {\n const environment: Environment = config.environment ?? 'production';\n const baseUrl = HttpClient.resolveBaseUrl(environment, config.baseUrl);\n\n this.config = {\n ...config,\n environment,\n baseUrl,\n timeout: config.timeout ?? 30_000,\n };\n\n this.http = new HttpClient({\n baseUrl,\n timeout: this.config.timeout!,\n apiKey: config.apiKey,\n getToken: () => this._sessionToken,\n });\n\n const setToken = (token: string) => {\n this._sessionToken = token;\n };\n\n this.checkout = new CheckoutModule(this.http, this.config.storeId, setToken);\n this.payment = new PaymentModule(this.http, this.config.storeId, environment);\n this.offers = new OffersModule(this.http, this.config.storeId);\n this.customer = new CustomerModule(this.http, this.config.storeId);\n this.catalog = new CatalogModule(this.http, this.config.storeId);\n }\n\n /** Manually set the session token (e.g. from URL params on page load). */\n setSessionToken(token: string) {\n this._sessionToken = token;\n }\n}\n\n/**\n * Create a new HeadlessClient instance.\n *\n * @example\n * ```ts\n * import { createHeadlessClient } from '@tagadapay/headless-sdk';\n *\n * const tagada = createHeadlessClient({\n * storeId: 'store_abc123',\n * environment: 'production',\n * });\n *\n * const session = await tagada.checkout.loadSession(checkoutToken);\n * ```\n */\nexport function createHeadlessClient(config: HeadlessConfig): HeadlessClient {\n return new HeadlessClient(config);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["core_exports", "__export", "CatalogModule", "CheckoutModule", "CustomerModule", "HeadlessClient", "HttpClient", "OffersModule", "PaymentModule", "TagadaAuthError", "TagadaError", "TagadaNetworkError", "TagadaNotFoundError", "TagadaPaymentError", "TagadaRateLimitError", "TagadaValidationError", "createHeadlessClient", "TagadaError", "message", "code", "statusCode", "details", "TagadaAuthError", "TagadaValidationError", "errors", "TagadaNotFoundError", "resource", "id", "TagadaRateLimitError", "retryAfterMs", "TagadaPaymentError", "opts", "TagadaNetworkError", "BASE_URLS", "HttpClient", "config", "environment", "override", "path", "options", "_a", "method", "body", "headers", "params", "token", "signal", "url", "qs", "k", "v", "str", "reqHeaders", "authToken", "controller", "timeoutId", "res", "text", "TagadaError", "err", "TagadaNetworkError", "parsed", "msg", "TagadaAuthError", "TagadaNotFoundError", "fieldErrors", "TagadaValidationError", "retryAfter", "TagadaRateLimitError", "CheckoutModule", "http", "storeId", "onTokenChange", "checkoutToken", "sessionToken", "_a", "raw", "opts", "lineItems", "i", "body", "res", "sessionId", "items", "customer", "addresses", "mapAddress", "a", "code", "promotionId", "promoId", "rateId", "cs", "orderSummaries", "summary", "li", "price", "variant", "product", "currencyOpts", "usd", "summaryItems", "s", "PaymentModule", "http", "storeId", "environment", "checkoutSessionId", "methods", "config", "m", "key", "_a", "_b", "setup", "result", "method", "base", "hasApplePay", "res", "c", "card", "coreJs", "tokenizer", "sanitized", "tagadaToken", "rawToken", "opts", "paymentId", "interval", "timeout", "start", "status", "r", "OffersModule", "http", "storeId", "offerId", "opts", "_a", "url", "queryParts", "id", "orderId", "res", "CustomerModule", "http", "storeId", "customerId", "email", "data", "opts", "orderId", "subscriptionId", "CatalogModule", "http", "storeId", "opts", "_a", "_b", "body", "productId", "HeadlessClient", "config", "environment", "baseUrl", "HttpClient", "setToken", "token", "CheckoutModule", "PaymentModule", "OffersModule", "CustomerModule", "CatalogModule", "createHeadlessClient"]
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tagadapay/headless-sdk",
3
- "version": "1.1.1",
4
- "description": "Headless SDK for using TagadaPay as a checkout, analytics, and CRM backend from any external website",
3
+ "version": "1.2.0",
4
+ "description": "Headless SDK for using TagadaPay as a checkout, offers, and CRM backend from any external website",
5
5
  "type": "module",
6
6
  "main": "dist/core/index.js",
7
7
  "types": "dist/core/index.d.ts",
@@ -33,7 +33,7 @@
33
33
  "checkout",
34
34
  "payment",
35
35
  "sdk",
36
- "analytics",
36
+ "offers",
37
37
  "ecommerce"
38
38
  ],
39
39
  "author": "Tagada Pay",
@@ -1,79 +0,0 @@
1
- import type { HttpClient } from '../http.js';
2
- import type { PixelConfig } from '../types.js';
3
- /**
4
- * Analytics and pixel tracking -- page views, checkout steps, conversions.
5
- *
6
- * Automatically loads pixel scripts (Meta, TikTok, Snapchat, GTM, GA)
7
- * from your store's configuration in the CRM, then fires events to all active pixels.
8
- */
9
- export declare class AnalyticsModule {
10
- private readonly http;
11
- private readonly storeId;
12
- private pixels;
13
- private eventQueue;
14
- private dedupeSet;
15
- constructor(http: HttpClient, storeId: string);
16
- /**
17
- * Initialize analytics by loading pixel configuration from the store.
18
- * Call this once on page load. Events fired before init completes are queued.
19
- */
20
- init(opts?: {
21
- pixelConfig?: PixelConfig;
22
- }): Promise<void>;
23
- trackPageView(page?: string): void;
24
- trackViewContent(data: {
25
- productId?: string;
26
- variantId?: string;
27
- value?: number;
28
- currency?: string;
29
- }): void;
30
- trackAddToCart(data: {
31
- variantId: string;
32
- quantity?: number;
33
- amount?: number;
34
- currency?: string;
35
- }): void;
36
- trackInitiateCheckout(data?: {
37
- sessionId?: string;
38
- value?: number;
39
- currency?: string;
40
- }): void;
41
- trackAddPaymentInfo(data?: {
42
- paymentMethod?: string;
43
- }): void;
44
- trackPurchase(data: {
45
- orderId: string;
46
- amount: number;
47
- currency: string;
48
- items?: unknown[];
49
- }): void;
50
- trackCustomEvent(event: string, data?: Record<string, unknown>): void;
51
- /** Track a funnel step (maps to Tagada's funnel tracking endpoint). */
52
- trackStep(data: {
53
- stepName: string;
54
- stepIndex?: number;
55
- funnelId?: string;
56
- sessionId?: string;
57
- }): void;
58
- trackConversion(data: {
59
- orderId: string;
60
- amount: number;
61
- currency: string;
62
- }): void;
63
- private fireEvent;
64
- private flushQueue;
65
- private getCurrentPath;
66
- private loadPixelScripts;
67
- private loadMetaPixel;
68
- private loadTikTokPixel;
69
- private loadSnapchatPixel;
70
- private loadGTM;
71
- private loadGA;
72
- private injectScript;
73
- private sendToMeta;
74
- private sendToTikTok;
75
- private sendToSnapchat;
76
- private sendToGTM;
77
- private sendToGA;
78
- }
79
- //# sourceMappingURL=analytics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../../src/core/modules/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO/C;;;;;GAKG;AACH,qBAAa,eAAe;IAMxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,UAAU,CAA+D;IACjF,OAAO,CAAC,SAAS,CAAqB;gBAGnB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM;IAGlC;;;OAGG;IACG,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B/D,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlC,gBAAgB,CAAC,IAAI,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAI3G,cAAc,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIxG,qBAAqB,CAAC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAI7F,mBAAmB,CAAC,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAI5D,aAAa,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,GAAG,IAAI;IAInG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIrE,uEAAuE;IACvE,SAAS,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAatG,eAAe,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQlF,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,QAAQ;CAOjB"}