@tagadapay/headless-sdk 1.3.2 → 1.4.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.
- package/README.md +84 -7
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/modules/checkout.d.ts +71 -8
- package/dist/core/modules/checkout.d.ts.map +1 -1
- package/dist/core/modules/checkout.js +129 -35
- package/dist/core/modules/checkout.js.map +1 -1
- package/dist/core/modules/payment.d.ts +62 -1
- package/dist/core/modules/payment.d.ts.map +1 -1
- package/dist/core/modules/payment.js +225 -0
- package/dist/core/modules/payment.js.map +1 -1
- package/dist/core/types.d.ts +80 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/react/hooks/useCheckout.d.ts.map +1 -1
- package/dist/react/hooks/useCheckout.js +2 -12
- package/dist/react/hooks/useCheckout.js.map +1 -1
- package/dist/react/hooks/usePayment.d.ts +39 -10
- package/dist/react/hooks/usePayment.d.ts.map +1 -1
- package/dist/react/hooks/usePayment.js +116 -8
- package/dist/react/hooks/usePayment.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/tagada-headless-react.min.js +2 -2
- package/dist/tagada-headless-react.min.js.map +3 -3
- package/dist/tagada-headless.js +321 -34
- package/dist/tagada-headless.min.js +2 -2
- package/dist/tagada-headless.min.js.map +3 -3
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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/offers.ts", "../src/core/modules/customer.ts", "../src/core/modules/catalog.ts", "../src/core/client.ts", "../src/core/helpers/autocomplete.ts", "../src/core/helpers/iso3166.ts", "../src/core/helpers/countries.ts", "../src/core/helpers/currency.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\n// Helpers: Google Autocomplete, ISO countries/regions, currency formatting\nexport {\n GoogleAutocompleteCore,\n loadGoogleMapsScript,\n ISODataCore,\n AVAILABLE_LANGUAGES,\n CurrencyUtils,\n formatMoney,\n ensureGeoDataLoaded,\n getCountries,\n getStatesForCountry,\n isLanguageLoaded,\n} from './helpers/index.js';\n\nexport type {\n GooglePrediction,\n GooglePlaceDetails,\n ExtractedAddress,\n FormattedAddress,\n SupportedLanguage,\n ISOCountry,\n ISORegion,\n Country,\n State,\n Currency,\n} from './helpers/index.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", "/**\n * Google Places Autocomplete \u2014 script injection + address extraction.\n * Works standalone (no external dependencies beyond the Google Maps JS API).\n */\n\ndeclare global {\n interface Window {\n google?: {\n maps?: {\n places?: {\n AutocompleteService: new () => any;\n PlacesService: new (el: any) => any;\n PlacesServiceStatus: { OK: string; ZERO_RESULTS: string };\n };\n Map: new (el: HTMLElement) => any;\n };\n };\n }\n}\n\nexport interface GooglePrediction {\n place_id: string;\n description: string;\n structured_formatting?: { main_text: string; secondary_text: string };\n}\n\nexport interface GooglePlaceDetails {\n place_id: string;\n formatted_address: string;\n address_components: Array<{ long_name: string; short_name: string; types: string[] }>;\n geometry?: { location: { lat: number; lng: number } };\n}\n\nexport interface ExtractedAddress {\n subpremise: string;\n streetNumber: string;\n route: string;\n locality: string;\n administrativeAreaLevel1: string;\n administrativeAreaLevel1Long: string;\n administrativeAreaLevel2: string;\n administrativeAreaLevel2Long: string;\n country: string;\n postalCode: string;\n fullStreetAddress: string;\n}\n\nexport interface FormattedAddress {\n address1: string;\n city: string;\n country: string;\n state: string;\n postal: string;\n}\n\n// ---------------------------------------------------------------------------\n// Script injection\n// ---------------------------------------------------------------------------\n\nlet scriptInjected = false;\nlet scriptReady = false;\nconst readyCallbacks: Array<() => void> = [];\n\nfunction onScriptReady() {\n scriptReady = true;\n for (const cb of readyCallbacks) cb();\n readyCallbacks.length = 0;\n}\n\n/**\n * Inject the Google Maps JS SDK into the page (idempotent).\n * Resolves once `window.google.maps.places` is available.\n */\nexport function loadGoogleMapsScript(\n apiKey: string,\n opts: { language?: string; region?: string; version?: string } = {},\n): Promise<void> {\n if (scriptReady || window.google?.maps?.places) {\n onScriptReady();\n return Promise.resolve();\n }\n\n if (scriptInjected) {\n return new Promise<void>((resolve) => readyCallbacks.push(resolve));\n }\n\n scriptInjected = true;\n\n return new Promise<void>((resolve, reject) => {\n readyCallbacks.push(resolve);\n\n const existing = document.querySelector('script[src*=\"maps.googleapis.com\"]');\n if (existing) {\n const poll = () => {\n if (window.google?.maps?.places) { onScriptReady(); }\n else { setTimeout(poll, 100); }\n };\n poll();\n return;\n }\n\n const params = new URLSearchParams({\n key: apiKey,\n libraries: 'places',\n v: opts.version ?? 'weekly',\n });\n if (opts.language) params.set('language', opts.language);\n if (opts.region) params.set('region', opts.region);\n\n const script = document.createElement('script');\n script.src = `https://maps.googleapis.com/maps/api/js?${params}`;\n script.async = true;\n script.defer = true;\n script.onload = () => onScriptReady();\n script.onerror = () => reject(new Error('Failed to load Google Maps script'));\n document.head.appendChild(script);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Core class\n// ---------------------------------------------------------------------------\n\nexport class GoogleAutocompleteCore {\n /** Search for address predictions. */\n static async searchPlaces(\n input: string,\n options: { types?: string[]; componentRestrictions?: { country: string } } = {},\n ): Promise<GooglePrediction[]> {\n if (!window.google?.maps?.places || !input.trim()) return [];\n\n const service = new window.google.maps.places.AutocompleteService();\n return new Promise((resolve) => {\n service.getPlacePredictions(\n { input, types: options.types ?? ['address'], componentRestrictions: options.componentRestrictions },\n (predictions: GooglePrediction[] | null, status: string) => {\n resolve(status === window.google?.maps?.places?.PlacesServiceStatus.OK && predictions ? predictions : []);\n },\n );\n });\n }\n\n /** Get full place details by place_id. */\n static async getPlaceDetails(placeId: string): Promise<GooglePlaceDetails | null> {\n if (!window.google?.maps?.places) return null;\n\n const svc = new window.google.maps.places.PlacesService(document.createElement('div'));\n return new Promise((resolve) => {\n svc.getDetails(\n { placeId, fields: ['place_id', 'formatted_address', 'address_components', 'geometry'] },\n (place: GooglePlaceDetails | null, status: string) => {\n resolve(status === window.google?.maps?.places?.PlacesServiceStatus.OK && place ? place : null);\n },\n );\n });\n }\n\n /** Extract structured address fields from a Google PlaceDetails result. */\n static extractAddressComponents(place: GooglePlaceDetails): ExtractedAddress {\n const out: ExtractedAddress = {\n subpremise: '', streetNumber: '', route: '', locality: '',\n administrativeAreaLevel1: '', administrativeAreaLevel1Long: '',\n administrativeAreaLevel2: '', administrativeAreaLevel2Long: '',\n country: '', postalCode: '', fullStreetAddress: '',\n };\n\n let premise = '';\n let neighborhood = '';\n let sublocality5 = '', sublocality4 = '', sublocality3 = '', sublocality2 = '', sublocality1 = '';\n let postalTown = '';\n\n for (const c of place.address_components ?? []) {\n const t = c.types;\n if (t.includes('subpremise')) out.subpremise = c.long_name;\n if (t.includes('street_number')) out.streetNumber = c.long_name;\n if (t.includes('premise')) premise = c.long_name;\n if (t.includes('route')) out.route = c.long_name;\n if (t.includes('neighborhood')) neighborhood = c.long_name;\n if (t.includes('sublocality_level_5')) sublocality5 = c.long_name;\n if (t.includes('sublocality_level_4')) sublocality4 = c.long_name;\n if (t.includes('sublocality_level_3')) sublocality3 = c.long_name;\n if (t.includes('sublocality_level_2')) sublocality2 = c.long_name;\n if (t.includes('sublocality_level_1')) sublocality1 = c.long_name;\n if (t.includes('locality')) out.locality = c.long_name;\n if (t.includes('postal_town')) postalTown = c.long_name;\n if (t.includes('administrative_area_level_2')) {\n out.administrativeAreaLevel2 = c.short_name;\n out.administrativeAreaLevel2Long = c.long_name;\n }\n if (t.includes('administrative_area_level_1')) {\n out.administrativeAreaLevel1 = c.short_name;\n out.administrativeAreaLevel1Long = c.long_name;\n }\n if (t.includes('country')) out.country = c.short_name;\n if (t.includes('postal_code')) out.postalCode = c.long_name;\n }\n\n // Locality fallbacks (UK postal_town, Asian sublocalities)\n if (!out.locality) out.locality = postalTown || sublocality2 || sublocality1 || '';\n\n // French-style fallback: use d\u00E9partement when r\u00E9gion is missing\n if (!out.administrativeAreaLevel1 && out.administrativeAreaLevel2) {\n out.administrativeAreaLevel1 = out.administrativeAreaLevel2Long || out.administrativeAreaLevel2;\n out.administrativeAreaLevel1Long = out.administrativeAreaLevel2Long;\n }\n\n // Build full street address\n const buildingNumber = out.streetNumber || premise;\n const streetName = out.route || sublocality5 || sublocality4 || sublocality3 || neighborhood;\n\n if (out.subpremise && buildingNumber && streetName) {\n out.fullStreetAddress = `${out.subpremise}/${buildingNumber} ${streetName}`;\n } else if (buildingNumber && streetName) {\n if (premise && sublocality4 && sublocality3) {\n let addr = `${sublocality3}-${sublocality4}-${premise}`;\n if (sublocality2) addr = `${addr} ${sublocality2}`;\n out.fullStreetAddress = addr;\n } else {\n out.fullStreetAddress = `${buildingNumber} ${streetName}`;\n }\n } else if (streetName) {\n out.fullStreetAddress = streetName;\n } else if (buildingNumber) {\n out.fullStreetAddress = buildingNumber;\n }\n\n out.fullStreetAddress = out.fullStreetAddress.trim();\n return out;\n }\n\n /** Shorthand: extract into the flat shape used by address forms. */\n static extractFormattedAddress(place: GooglePlaceDetails): FormattedAddress {\n const a = GoogleAutocompleteCore.extractAddressComponents(place);\n return {\n address1: a.fullStreetAddress,\n city: a.locality,\n country: a.country,\n state: a.administrativeAreaLevel1,\n postal: a.postalCode,\n };\n }\n}\n", "/**\n * Geodata \u2014 CDN-backed country/region data.\n *\n * Fetches slim JSON from Vercel Blob CDN on demand:\n * - countries.json (~10KB) \u2014 fetched once on first getCountries() call\n * - regions.json (~95KB) \u2014 fetched lazily on first getStatesForCountry() call\n *\n * Both are cached in memory after first fetch.\n */\n\nconst GEODATA_CDN_BASE = 'https://cvwnizdbugpz6jwk.public.blob.vercel-storage.com/geodata/v1';\n\nexport const AVAILABLE_LANGUAGES = ['en', 'ru', 'de', 'da', 'fr', 'es', 'zh', 'hi', 'pt', 'ja', 'ar', 'it', 'he'] as const;\nexport type SupportedLanguage = (typeof AVAILABLE_LANGUAGES)[number];\n\nexport interface Country {\n code: string;\n name: string;\n iso3?: string;\n numeric?: number;\n}\n\nexport interface State {\n code: string;\n name: string;\n countryCode: string;\n}\n\ninterface CdnCountries { [iso2: string]: { n: string; i3?: string; nu?: number } }\ninterface CdnRegions { [iso2: string]: [string, string][] }\n\nconst countriesCache = new Map<SupportedLanguage, CdnCountries>();\nconst regionsCache = new Map<SupportedLanguage, CdnRegions>();\nconst inflightCountries = new Map<SupportedLanguage, Promise<CdnCountries>>();\nconst inflightRegions = new Map<SupportedLanguage, Promise<CdnRegions>>();\n\nasync function fetchCountriesRaw(language: SupportedLanguage): Promise<CdnCountries> {\n const cached = countriesCache.get(language);\n if (cached) return cached;\n\n let inflight = inflightCountries.get(language);\n if (inflight) return inflight;\n\n inflight = (async () => {\n const url = `${GEODATA_CDN_BASE}/${language}/countries.json`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Geodata fetch failed: ${url} (${res.status})`);\n const data: CdnCountries = await res.json();\n countriesCache.set(language, data);\n inflightCountries.delete(language);\n return data;\n })();\n\n inflightCountries.set(language, inflight);\n return inflight;\n}\n\nasync function fetchRegionsRaw(language: SupportedLanguage): Promise<CdnRegions> {\n const cached = regionsCache.get(language);\n if (cached) return cached;\n\n let inflight = inflightRegions.get(language);\n if (inflight) return inflight;\n\n inflight = (async () => {\n const url = `${GEODATA_CDN_BASE}/${language}/regions.json`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Geodata fetch failed: ${url} (${res.status})`);\n const data: CdnRegions = await res.json();\n regionsCache.set(language, data);\n inflightRegions.delete(language);\n return data;\n })();\n\n inflightRegions.set(language, inflight);\n return inflight;\n}\n\nfunction getCountriesCached(language: SupportedLanguage): CdnCountries {\n return countriesCache.get(language) || countriesCache.get('en') || {};\n}\n\nfunction getRegionsCached(language: SupportedLanguage): CdnRegions {\n return regionsCache.get(language) || regionsCache.get('en') || {};\n}\n\n/** Fetch countries + regions from CDN for a language. Call before sync getters. */\nexport async function ensureGeoDataLoaded(language: SupportedLanguage = 'en'): Promise<void> {\n await Promise.all([fetchCountriesRaw(language), fetchRegionsRaw(language)]);\n}\n\nexport const getCountries = (language: SupportedLanguage = 'en'): Country[] => {\n const raw = getCountriesCached(language);\n return Object.entries(raw)\n .map(([code, c]) => ({ code, name: c.n, iso3: c.i3, numeric: c.nu }))\n .sort((a, b) => a.name.localeCompare(b.name));\n};\n\nexport const getStatesForCountry = (countryCode: string, language: SupportedLanguage = 'en'): State[] => {\n const raw = getRegionsCached(language);\n const tuples = raw[countryCode];\n if (!tuples) return [];\n return tuples\n .map(([iso, name]) => ({ code: iso, name, countryCode }))\n .sort((a, b) => a.name.localeCompare(b.name));\n};\n\nexport function isLanguageLoaded(language: SupportedLanguage): boolean {\n return countriesCache.has(language);\n}\n", "/**\n * ISO country/region helpers \u2014 countries list, regions by country,\n * and Google Places state \u2192 ISO region mapping.\n */\n\nimport {\n getCountries,\n getStatesForCountry,\n ensureGeoDataLoaded,\n isLanguageLoaded,\n AVAILABLE_LANGUAGES,\n type SupportedLanguage,\n type Country,\n type State,\n} from './iso3166.js';\n\nexport type { SupportedLanguage, Country, State };\nexport { AVAILABLE_LANGUAGES };\n\nexport interface ISOCountry {\n iso: string;\n iso3: string;\n numeric: number;\n name: string;\n}\n\nexport interface ISORegion {\n iso: string;\n name: string;\n}\n\nexport class ISODataCore {\n /** Fetch countries + regions from CDN for a language. Call before sync getters. */\n static ensureLoaded(language: SupportedLanguage = 'en'): Promise<void> {\n return ensureGeoDataLoaded(language);\n }\n\n /** Get all countries as a Record keyed by ISO code. */\n static getCountries(language: SupportedLanguage = 'en'): Record<string, ISOCountry> {\n const arr = getCountries(language);\n const result: Record<string, ISOCountry> = {};\n for (const c of arr) {\n result[c.code] = { iso: c.code, iso3: c.iso3 ?? '', numeric: c.numeric ?? 0, name: c.name };\n }\n return result;\n }\n\n /** Get all countries as a sorted array of { value, label } for select inputs. */\n static getCountryOptions(language: SupportedLanguage = 'en'): Array<{ value: string; label: string }> {\n return getCountries(language).map((c) => ({ value: c.code, label: c.name }));\n }\n\n /** Get regions/states for a country. */\n static getRegions(countryCode: string, language: SupportedLanguage = 'en'): ISORegion[] {\n return getStatesForCountry(countryCode, language).map((s) => ({ iso: s.code, name: s.name }));\n }\n\n /** Get regions as a sorted array of { value, label } for select inputs. */\n static getRegionOptions(countryCode: string, language: SupportedLanguage = 'en'): Array<{ value: string; label: string }> {\n return ISODataCore.getRegions(countryCode, language).map((r) => ({ value: r.iso, label: r.name }));\n }\n\n /** Find a specific region by ISO code. */\n static findRegion(countryCode: string, regionCode: string, language: SupportedLanguage = 'en'): ISORegion | null {\n return ISODataCore.getRegions(countryCode, language).find((r) => r.iso === regionCode) ?? null;\n }\n\n /**\n * Map a Google Places administrative_area to an ISO region.\n * Tries exact ISO match, then name match, then partial match.\n */\n static mapGoogleToISO(\n googleState: string,\n googleStateLong: string,\n countryCode: string,\n language: SupportedLanguage = 'en',\n ): ISORegion | null {\n const regions = ISODataCore.getRegions(countryCode, language);\n if (regions.length === 0) return null;\n\n let match = regions.find((r) => r.iso === googleState);\n if (match) return match;\n\n match = regions.find((r) => r.name.toLowerCase() === googleState.toLowerCase());\n if (match) return match;\n\n match = regions.find((r) => r.name.toLowerCase() === googleStateLong.toLowerCase());\n if (match) return match;\n\n match = regions.find(\n (r) =>\n r.name.toLowerCase().includes(googleStateLong.toLowerCase()) ||\n googleStateLong.toLowerCase().includes(r.name.toLowerCase()),\n );\n\n return match ?? null;\n }\n\n static isLanguageLoaded(language: SupportedLanguage): boolean {\n return isLanguageLoaded(language);\n }\n\n static getAvailableLanguages(): readonly SupportedLanguage[] {\n return AVAILABLE_LANGUAGES;\n }\n}\n", "/**\n * Currency formatting utilities \u2014 symbol lookup, decimal handling,\n * and Intl.NumberFormat-based money formatting from minor units (cents).\n */\n\nexport interface Currency {\n code: string;\n symbol: string;\n name: string;\n decimalPlaces: number;\n}\n\nconst SYMBOLS: Record<string, string> = {\n USD: '$', EUR: '\u20AC', GBP: '\u00A3', JPY: '\u00A5', CAD: 'C$', AUD: 'A$', CHF: 'CHF',\n CNY: '\u00A5', SEK: 'kr', NOK: 'kr', DKK: 'kr', PLN: 'z\u0142', CZK: 'K\u010D', HUF: 'Ft',\n RON: 'lei', BGN: '\u043B\u0432', HRK: 'kn', RUB: '\u20BD', UAH: '\u20B4', TRY: '\u20BA', BRL: 'R$',\n MXN: '$', ZAR: 'R', INR: '\u20B9', KRW: '\u20A9', THB: '\u0E3F', VND: '\u20AB', IDR: 'Rp',\n MYR: 'RM', SGD: 'S$', PHP: '\u20B1', TWD: 'NT$', HKD: 'HK$', ILS: '\u20AA', AED: '\u062F.\u0625',\n SAR: '\u0631.\u0633', QAR: '\u0631.\u0642', KWD: '\u062F.\u0643', BHD: '\u062F.\u0628', OMR: '\u0631.\u0639.', EGP: '\u00A3',\n NGN: '\u20A6', KES: 'KSh', GHS: '\u20B5', COP: '$', ARS: '$', CLP: '$', PEN: 'S/',\n CRC: '\u20A1', DOP: 'RD$', JMD: 'J$', BOB: 'Bs', PYG: '\u20B2', GTQ: 'Q',\n NIO: 'C$', PAB: 'B/.', PKR: '\u20A8', BDT: '\u09F3', LKR: '\u20A8', NPR: '\u20A8',\n GEL: '\u20BE', AMD: '\u058F', AZN: '\u20BC', KZT: '\u20B8',\n};\n\nconst NAMES: Record<string, string> = {\n USD: 'US Dollar', EUR: 'Euro', GBP: 'British Pound', JPY: 'Japanese Yen',\n CAD: 'Canadian Dollar', AUD: 'Australian Dollar', CHF: 'Swiss Franc',\n CNY: 'Chinese Yuan', SEK: 'Swedish Krona', NOK: 'Norwegian Krone',\n DKK: 'Danish Krone', PLN: 'Polish Zloty', CZK: 'Czech Koruna', HUF: 'Hungarian Forint',\n BRL: 'Brazilian Real', MXN: 'Mexican Peso', INR: 'Indian Rupee', KRW: 'South Korean Won',\n THB: 'Thai Baht', SGD: 'Singapore Dollar', HKD: 'Hong Kong Dollar', TWD: 'Taiwan Dollar',\n ILS: 'Israeli Shekel', AED: 'UAE Dirham', SAR: 'Saudi Riyal', ZAR: 'South African Rand',\n TRY: 'Turkish Lira', RUB: 'Russian Ruble', NGN: 'Nigerian Naira',\n};\n\nconst ZERO_DECIMAL: Set<string> = new Set([\n 'JPY', 'KRW', 'VND', 'IDR', 'LAK', 'KHR', 'MMK', 'PYG',\n]);\n\nexport class CurrencyUtils {\n static getSymbol(code: string): string {\n return SYMBOLS[code] ?? code;\n }\n\n static getName(code: string): string {\n return NAMES[code] ?? code;\n }\n\n static getDecimalPlaces(code: string): number {\n return ZERO_DECIMAL.has(code) ? 0 : 2;\n }\n\n static getCurrency(code: string): Currency {\n return {\n code,\n symbol: CurrencyUtils.getSymbol(code),\n name: CurrencyUtils.getName(code),\n decimalPlaces: CurrencyUtils.getDecimalPlaces(code),\n };\n }\n}\n\n/**\n * Format an amount expressed in minor units (cents) into a locale-aware string.\n *\n * @example\n * formatMoney(12345, 'USD') // \"$123.45\"\n * formatMoney(10000, 'EUR', 'de-DE') // \"100,00 \u20AC\"\n * formatMoney(1000, 'JPY') // \"\u00A51,000\"\n */\nexport function formatMoney(amountMinorUnits: number, currencyCode = 'USD', locale = 'en-US'): string {\n const decimals = CurrencyUtils.getDecimalPlaces(currencyCode);\n const value = amountMinorUnits / (decimals === 0 ? 100 : Math.pow(10, decimals));\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value);\n } catch {\n return `${CurrencyUtils.getSymbol(currencyCode)}${value.toFixed(decimals)}`;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["core_exports", "__export", "AVAILABLE_LANGUAGES", "CatalogModule", "CheckoutModule", "CurrencyUtils", "CustomerModule", "GoogleAutocompleteCore", "HeadlessClient", "HttpClient", "ISODataCore", "OffersModule", "PaymentModule", "TagadaAuthError", "TagadaError", "TagadaNetworkError", "TagadaNotFoundError", "TagadaPaymentError", "TagadaRateLimitError", "TagadaValidationError", "createHeadlessClient", "ensureGeoDataLoaded", "formatMoney", "getCountries", "getStatesForCountry", "isLanguageLoaded", "loadGoogleMapsScript", "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", "
|
|
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\n// Helpers: Google Autocomplete, ISO countries/regions, currency formatting\nexport {\n GoogleAutocompleteCore,\n loadGoogleMapsScript,\n ISODataCore,\n AVAILABLE_LANGUAGES,\n CurrencyUtils,\n formatMoney,\n ensureGeoDataLoaded,\n getCountries,\n getStatesForCountry,\n isLanguageLoaded,\n} from './helpers/index.js';\n\nexport type {\n GooglePrediction,\n GooglePlaceDetails,\n ExtractedAddress,\n FormattedAddress,\n SupportedLanguage,\n ISOCountry,\n ISORegion,\n Country,\n State,\n Currency,\n} from './helpers/index.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 ProcessPaymentOptions,\n ProcessPaymentResult,\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 \u2014 load, update cart, apply promo codes, handle shipping.\n *\n * Works for both **shipped** and **digital** products:\n *\n * **Shipped products** (physical goods):\n * ```\n * updateCustomer(id, { email, firstName, lastName })\n * updateAddress(id, { shippingAddress: { line1, city, ... } })\n * getShippingRates(id)\n * selectShippingRate(id, rateId)\n * ```\n *\n * **Digital products** (no shipping needed):\n * ```\n * updateCustomer(id, { email, firstName, lastName })\n * updateAddress(id, { billingAddress: { line1, city, country } })\n * // Skip shipping rates \u2014 go straight to payment\n * ```\n */\nexport class CheckoutModule {\n private sessionToken: string | undefined;\n private customerEmail: string | undefined;\n private customerFirstName: string | undefined;\n private customerLastName: string | undefined;\n private customerPhone: 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 identity (email, name, phone).\n *\n * Call this before `updateAddress()` \u2014 the SDK remembers the values and\n * includes them automatically when addresses are submitted.\n *\n * If you prefer a single call, use `updateCustomerAndAddress()` instead.\n */\n async updateCustomer(\n sessionId: string,\n customer: Partial<CheckoutCustomer>,\n ): Promise<void> {\n if (customer.email) this.customerEmail = customer.email;\n if (customer.firstName) this.customerFirstName = customer.firstName;\n if (customer.lastName) this.customerLastName = customer.lastName;\n if (customer.phone) this.customerPhone = customer.phone;\n }\n\n /**\n * Update shipping and/or billing address on the session.\n *\n * Automatically includes customer name/phone stored from `updateCustomer()`.\n * Uses the same atomic API call as the production checkout, so email,\n * customer name, and addresses are all persisted together.\n *\n * **Shipped products**: pass `shippingAddress`. If `billingAddress` is omitted,\n * the shipping address is automatically used as billing.\n *\n * **Digital products**: pass only `billingAddress` (no shipping needed).\n *\n * @example\n * // Shipped product \u2014 billing = shipping automatically\n * await checkout.updateAddress(sessionId, {\n * shippingAddress: { line1: '10 Rue de la Paix', city: 'Paris', postalCode: '75002', country: 'FR' },\n * });\n *\n * @example\n * // Digital product \u2014 billing only\n * await checkout.updateAddress(sessionId, {\n * billingAddress: { country: 'FR' },\n * });\n */\n async updateAddress(\n sessionId: string,\n addresses: { shippingAddress?: Address; billingAddress?: Address },\n ): Promise<void> {\n const shipping = this.mapAddress(addresses.shippingAddress);\n const billing = this.mapAddress(addresses.billingAddress);\n\n const effectiveShipping = shipping ?? billing ?? {};\n const effectiveBilling = billing ?? shipping;\n const differentBilling = !!(addresses.billingAddress && addresses.shippingAddress);\n\n await this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/customer-and-session-info`,\n {\n checkoutSessionId: sessionId,\n customerData: {\n email: this.customerEmail,\n },\n shippingAddress: effectiveShipping,\n billingAddress: effectiveBilling ?? {},\n differentBillingAddress: differentBilling,\n },\n { token: this.sessionToken },\n );\n }\n\n /**\n * Set customer info + addresses in one call (mirrors production checkout).\n *\n * Equivalent to calling `updateCustomer()` then `updateAddress()`, but\n * in a single network request.\n */\n async updateCustomerAndAddress(\n sessionId: string,\n data: {\n customer: Partial<CheckoutCustomer>;\n shippingAddress?: Address;\n billingAddress?: Address;\n },\n ): Promise<void> {\n if (data.customer.email) this.customerEmail = data.customer.email;\n if (data.customer.firstName) this.customerFirstName = data.customer.firstName;\n if (data.customer.lastName) this.customerLastName = data.customer.lastName;\n if (data.customer.phone) this.customerPhone = data.customer.phone;\n\n const shipping = this.mapAddress(data.shippingAddress);\n const billing = this.mapAddress(data.billingAddress);\n\n const effectiveShipping = shipping ?? billing ?? {};\n const effectiveBilling = billing ?? shipping;\n const differentBilling = !!(data.billingAddress && data.shippingAddress);\n\n await this.http.post(\n `/api/v1/checkout-sessions/${sessionId}/customer-and-session-info`,\n {\n checkoutSessionId: sessionId,\n customerData: {\n email: this.customerEmail,\n },\n shippingAddress: effectiveShipping,\n billingAddress: effectiveBilling ?? {},\n differentBillingAddress: differentBilling,\n },\n { token: this.sessionToken },\n );\n }\n\n /** Map an SDK Address to the API shape, injecting stored customer fields. */\n private mapAddress(a?: Address): Record<string, unknown> | undefined {\n if (!a) return undefined;\n return stripEmpty({\n firstName: a.firstName ?? this.customerFirstName,\n lastName: a.lastName ?? this.customerLastName,\n phone: a.phone ?? this.customerPhone,\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 /** 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 /**\n * Fetch available shipping rates for the session's address.\n * Only relevant for **shipped products** \u2014 digital products can skip this step.\n *\n * Requires a shipping address to be set first via `updateAddress()`.\n * Returns an empty array if no rates are configured or address is missing.\n */\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 /**\n * Select a shipping rate for the session.\n * Only relevant for **shipped products** \u2014 digital products can skip this step.\n */\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\n/**\n * Remove keys with empty-string / null / undefined values from an object.\n * Prevents sending `\"\"` to APIs that reject empty values (e.g. Stripe `country`).\n */\nfunction stripEmpty<T extends Record<string, unknown>>(obj: T): T {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined && v !== null && v !== '') {\n result[k] = v;\n }\n }\n return (Object.keys(result).length > 0 ? result : undefined) as T;\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 ProcessPaymentOptions,\n ProcessPaymentResult,\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 returnUrl: opts.returnUrl,\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 // High-level orchestrator \u2014 the ONE function beginners should call\n // ---------------------------------------------------------------------------\n\n /**\n * Process a payment end-to-end: pay, handle 3DS / redirects, poll until done.\n *\n * This is the **recommended** way to process payments. It wraps `pay()`, detects\n * `requireAction`, runs 3DS challenges (if `@tagadapay/core-js` is installed),\n * and polls until a terminal status.\n *\n * Returns a discriminated union so you can pattern-match on `result.status`:\n *\n * @example\n * ```ts\n * const result = await payment.processPayment({\n * checkoutSessionId: session.id,\n * tagadaToken,\n * });\n *\n * switch (result.status) {\n * case 'succeeded':\n * console.log('Paid!', result.payment.id);\n * break;\n * case 'requires_redirect':\n * // In browser: window.location.href = result.redirectUrl\n * // The React hook handles this automatically.\n * break;\n * case 'failed':\n * console.error(result.error);\n * break;\n * }\n * ```\n */\n async processPayment(opts: ProcessPaymentOptions): Promise<ProcessPaymentResult> {\n if (!opts.returnUrl && typeof window !== 'undefined') {\n opts = { ...opts, returnUrl: window.location.href };\n }\n const payResult = await this.pay(opts);\n const payment = payResult.payment;\n\n if (payment.status === 'succeeded') {\n return { status: 'succeeded', payment, order: payResult.order };\n }\n\n if (payment.status === 'failed' || payment.status === 'declined') {\n const msg = payment.requireActionData?.message\n || payment.requireActionData?.errorCode\n || `Payment ${payment.status}`;\n return { status: 'failed', error: msg, payment };\n }\n\n if (payment.requireAction && payment.requireAction !== 'none' && payment.requireActionData) {\n return this.handlePaymentAction(payment, opts);\n }\n\n // status is 'pending' or 'requires_action' without explicit actionData \u2014 poll\n return this.pollUntilDone(payment.id);\n }\n\n /**\n * Resume a payment after the user returns from a redirect (3DS, processor auth, APM).\n *\n * Called automatically by `usePayment()` in React when it detects return-URL params.\n * You can also call it manually in non-React apps.\n */\n async resumeAfterRedirect(paymentId: string): Promise<ProcessPaymentResult> {\n return this.pollUntilDone(paymentId);\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 /** Tell the server this action has been seen / is being processed. */\n async markActionProcessed(paymentId: string): Promise<void> {\n try {\n await this.http.post('/api/v1/payments/require-action/processed', {\n paymentId,\n });\n } catch {\n // Best-effort \u2014 don't block the payment flow if this fails\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal: action routing\n // ---------------------------------------------------------------------------\n\n /**\n * Route a payment action to the appropriate handler.\n * Returns `requires_redirect` for browser-level redirects,\n * or attempts 3DS inline and polls to completion.\n */\n private async handlePaymentAction(\n payment: PayResult['payment'],\n opts: ProcessPaymentOptions,\n ): Promise<ProcessPaymentResult> {\n const actionData = payment.requireActionData!;\n\n await this.markActionProcessed(payment.id);\n\n const actionType = actionData.type;\n\n switch (actionType) {\n case 'threeds_auth':\n return this.handleThreedsAuth(payment, opts);\n\n case 'processor_auth':\n case 'redirect_to_payment':\n return this.extractRedirect(payment, actionData);\n\n case 'redirect':\n return this.extractRedirect(payment, actionData);\n\n case 'error':\n return {\n status: 'failed',\n error: actionData.message || actionData.errorCode || 'Payment failed',\n payment,\n };\n\n default:\n // Unknown action type \u2014 try to extract a redirect URL (forward-compatible)\n return this.extractRedirect(payment, actionData);\n }\n }\n\n /**\n * Extract redirect info from actionData.\n * Works for processor_auth (GET or POST), redirect, and any unknown type with a URL.\n */\n private extractRedirect(\n payment: PayResult['payment'],\n actionData: NonNullable<PayResult['payment']['requireActionData']>,\n ): ProcessPaymentResult {\n const redirect = actionData.metadata?.redirect;\n const url = redirect?.redirectUrl || actionData.redirectUrl;\n\n if (!url) {\n return {\n status: 'failed',\n error: `Payment requires action (${actionData.type}) but no redirect URL was provided`,\n payment,\n };\n }\n\n return {\n status: 'requires_redirect',\n redirectUrl: url,\n method: (redirect?.method?.toUpperCase() as 'GET' | 'POST') || 'GET',\n postData: redirect?.data,\n paymentId: payment.id,\n };\n }\n\n /**\n * Run a 3DS challenge using @tagadapay/core-js.\n * If core-js is not installed, falls back to redirect.\n */\n private async handleThreedsAuth(\n payment: PayResult['payment'],\n opts: ProcessPaymentOptions,\n ): Promise<ProcessPaymentResult> {\n const session = payment.requireActionData?.metadata?.threedsSession;\n\n // If no 3DS session data, fall back to redirect (acsChallengeUrl)\n if (!session?.externalSessionId) {\n return this.extractRedirect(payment, payment.requireActionData!);\n }\n\n // Try to run the challenge inline via core-js\n let coreJs: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n try {\n coreJs = await import('@tagadapay/core-js');\n } catch {\n // core-js not installed \u2014 fall back to redirect if possible\n if (session.acsChallengeUrl) {\n return {\n status: 'requires_redirect',\n redirectUrl: session.acsChallengeUrl,\n paymentId: payment.id,\n };\n }\n return this.extractRedirect(payment, payment.requireActionData!);\n }\n\n // Run BasisTheory 3DS challenge in a modal iframe\n try {\n const manager = new coreJs.ThreedsManager({ provider: 'basis_theory' });\n await manager.initialize({ apiKey: undefined });\n\n await manager.startChallenge({\n sessionId: session.externalSessionId,\n acsChallengeUrl: session.acsChallengeUrl,\n acsTransactionId: session.acsTransID,\n threeDSVersion: session.messageVersion,\n });\n\n // Challenge done \u2014 tell backend and poll\n await this.completeAfter3ds(payment.id);\n return this.pollUntilDone(payment.id);\n } catch {\n // 3DS challenge failed \u2014 fall back to redirect\n if (session.acsChallengeUrl) {\n return {\n status: 'requires_redirect',\n redirectUrl: session.acsChallengeUrl,\n paymentId: payment.id,\n };\n }\n return {\n status: 'failed',\n error: '3D Secure authentication failed',\n payment,\n };\n }\n }\n\n /**\n * Poll until the payment reaches a terminal status, then return a ProcessPaymentResult.\n * Also handles new requireAction that may appear during polling.\n */\n private async pollUntilDone(\n paymentId: string,\n opts?: { intervalMs?: number; timeoutMs?: number },\n ): Promise<ProcessPaymentResult> {\n const interval = opts?.intervalMs ?? 1500;\n const timeout = opts?.timeoutMs ?? 60_000;\n const start = Date.now();\n let consecutiveErrors = 0;\n\n while (Date.now() - start < timeout) {\n let status: PaymentStatus;\n try {\n status = await this.getPaymentStatus(paymentId);\n consecutiveErrors = 0;\n } catch {\n consecutiveErrors++;\n if (consecutiveErrors >= 3) {\n return { status: 'failed', error: 'Payment verification failed due to network errors' };\n }\n await new Promise((r) => setTimeout(r, interval));\n continue;\n }\n\n if (\n status.status === 'succeeded' ||\n (status.status === 'pending' && status.subStatus === 'authorized')\n ) {\n return { status: 'succeeded', payment: status as unknown as PayResult['payment'], order: status.order };\n }\n\n if (status.status === 'failed' || status.status === 'declined') {\n return { status: 'failed', error: status.status, payment: status as unknown as PayResult['payment'] };\n }\n\n // New unprocessed action appeared during polling\n if (\n status.requireAction &&\n status.requireAction !== 'none' &&\n status.requireActionData &&\n !status.requireActionData.processed\n ) {\n return this.handlePaymentAction(\n status as unknown as PayResult['payment'],\n {} as ProcessPaymentOptions,\n );\n }\n\n await new Promise((r) => setTimeout(r, interval));\n }\n\n return { status: 'pending', paymentId };\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", "/**\n * Google Places Autocomplete \u2014 script injection + address extraction.\n * Works standalone (no external dependencies beyond the Google Maps JS API).\n */\n\ndeclare global {\n interface Window {\n google?: {\n maps?: {\n places?: {\n AutocompleteService: new () => any;\n PlacesService: new (el: any) => any;\n PlacesServiceStatus: { OK: string; ZERO_RESULTS: string };\n };\n Map: new (el: HTMLElement) => any;\n };\n };\n }\n}\n\nexport interface GooglePrediction {\n place_id: string;\n description: string;\n structured_formatting?: { main_text: string; secondary_text: string };\n}\n\nexport interface GooglePlaceDetails {\n place_id: string;\n formatted_address: string;\n address_components: Array<{ long_name: string; short_name: string; types: string[] }>;\n geometry?: { location: { lat: number; lng: number } };\n}\n\nexport interface ExtractedAddress {\n subpremise: string;\n streetNumber: string;\n route: string;\n locality: string;\n administrativeAreaLevel1: string;\n administrativeAreaLevel1Long: string;\n administrativeAreaLevel2: string;\n administrativeAreaLevel2Long: string;\n country: string;\n postalCode: string;\n fullStreetAddress: string;\n}\n\nexport interface FormattedAddress {\n address1: string;\n city: string;\n country: string;\n state: string;\n postal: string;\n}\n\n// ---------------------------------------------------------------------------\n// Script injection\n// ---------------------------------------------------------------------------\n\nlet scriptInjected = false;\nlet scriptReady = false;\nconst readyCallbacks: Array<() => void> = [];\n\nfunction onScriptReady() {\n scriptReady = true;\n for (const cb of readyCallbacks) cb();\n readyCallbacks.length = 0;\n}\n\n/**\n * Inject the Google Maps JS SDK into the page (idempotent).\n * Resolves once `window.google.maps.places` is available.\n */\nexport function loadGoogleMapsScript(\n apiKey: string,\n opts: { language?: string; region?: string; version?: string } = {},\n): Promise<void> {\n if (scriptReady || window.google?.maps?.places) {\n onScriptReady();\n return Promise.resolve();\n }\n\n if (scriptInjected) {\n return new Promise<void>((resolve) => readyCallbacks.push(resolve));\n }\n\n scriptInjected = true;\n\n return new Promise<void>((resolve, reject) => {\n readyCallbacks.push(resolve);\n\n const existing = document.querySelector('script[src*=\"maps.googleapis.com\"]');\n if (existing) {\n const poll = () => {\n if (window.google?.maps?.places) { onScriptReady(); }\n else { setTimeout(poll, 100); }\n };\n poll();\n return;\n }\n\n const params = new URLSearchParams({\n key: apiKey,\n libraries: 'places',\n v: opts.version ?? 'weekly',\n });\n if (opts.language) params.set('language', opts.language);\n if (opts.region) params.set('region', opts.region);\n\n const script = document.createElement('script');\n script.src = `https://maps.googleapis.com/maps/api/js?${params}`;\n script.async = true;\n script.defer = true;\n script.onload = () => onScriptReady();\n script.onerror = () => reject(new Error('Failed to load Google Maps script'));\n document.head.appendChild(script);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Core class\n// ---------------------------------------------------------------------------\n\nexport class GoogleAutocompleteCore {\n /** Search for address predictions. */\n static async searchPlaces(\n input: string,\n options: { types?: string[]; componentRestrictions?: { country: string } } = {},\n ): Promise<GooglePrediction[]> {\n if (!window.google?.maps?.places || !input.trim()) return [];\n\n const service = new window.google.maps.places.AutocompleteService();\n return new Promise((resolve) => {\n service.getPlacePredictions(\n { input, types: options.types ?? ['address'], componentRestrictions: options.componentRestrictions },\n (predictions: GooglePrediction[] | null, status: string) => {\n resolve(status === window.google?.maps?.places?.PlacesServiceStatus.OK && predictions ? predictions : []);\n },\n );\n });\n }\n\n /** Get full place details by place_id. */\n static async getPlaceDetails(placeId: string): Promise<GooglePlaceDetails | null> {\n if (!window.google?.maps?.places) return null;\n\n const svc = new window.google.maps.places.PlacesService(document.createElement('div'));\n return new Promise((resolve) => {\n svc.getDetails(\n { placeId, fields: ['place_id', 'formatted_address', 'address_components', 'geometry'] },\n (place: GooglePlaceDetails | null, status: string) => {\n resolve(status === window.google?.maps?.places?.PlacesServiceStatus.OK && place ? place : null);\n },\n );\n });\n }\n\n /** Extract structured address fields from a Google PlaceDetails result. */\n static extractAddressComponents(place: GooglePlaceDetails): ExtractedAddress {\n const out: ExtractedAddress = {\n subpremise: '', streetNumber: '', route: '', locality: '',\n administrativeAreaLevel1: '', administrativeAreaLevel1Long: '',\n administrativeAreaLevel2: '', administrativeAreaLevel2Long: '',\n country: '', postalCode: '', fullStreetAddress: '',\n };\n\n let premise = '';\n let neighborhood = '';\n let sublocality5 = '', sublocality4 = '', sublocality3 = '', sublocality2 = '', sublocality1 = '';\n let postalTown = '';\n\n for (const c of place.address_components ?? []) {\n const t = c.types;\n if (t.includes('subpremise')) out.subpremise = c.long_name;\n if (t.includes('street_number')) out.streetNumber = c.long_name;\n if (t.includes('premise')) premise = c.long_name;\n if (t.includes('route')) out.route = c.long_name;\n if (t.includes('neighborhood')) neighborhood = c.long_name;\n if (t.includes('sublocality_level_5')) sublocality5 = c.long_name;\n if (t.includes('sublocality_level_4')) sublocality4 = c.long_name;\n if (t.includes('sublocality_level_3')) sublocality3 = c.long_name;\n if (t.includes('sublocality_level_2')) sublocality2 = c.long_name;\n if (t.includes('sublocality_level_1')) sublocality1 = c.long_name;\n if (t.includes('locality')) out.locality = c.long_name;\n if (t.includes('postal_town')) postalTown = c.long_name;\n if (t.includes('administrative_area_level_2')) {\n out.administrativeAreaLevel2 = c.short_name;\n out.administrativeAreaLevel2Long = c.long_name;\n }\n if (t.includes('administrative_area_level_1')) {\n out.administrativeAreaLevel1 = c.short_name;\n out.administrativeAreaLevel1Long = c.long_name;\n }\n if (t.includes('country')) out.country = c.short_name;\n if (t.includes('postal_code')) out.postalCode = c.long_name;\n }\n\n // Locality fallbacks (UK postal_town, Asian sublocalities)\n if (!out.locality) out.locality = postalTown || sublocality2 || sublocality1 || '';\n\n // French-style fallback: use d\u00E9partement when r\u00E9gion is missing\n if (!out.administrativeAreaLevel1 && out.administrativeAreaLevel2) {\n out.administrativeAreaLevel1 = out.administrativeAreaLevel2Long || out.administrativeAreaLevel2;\n out.administrativeAreaLevel1Long = out.administrativeAreaLevel2Long;\n }\n\n // Build full street address\n const buildingNumber = out.streetNumber || premise;\n const streetName = out.route || sublocality5 || sublocality4 || sublocality3 || neighborhood;\n\n if (out.subpremise && buildingNumber && streetName) {\n out.fullStreetAddress = `${out.subpremise}/${buildingNumber} ${streetName}`;\n } else if (buildingNumber && streetName) {\n if (premise && sublocality4 && sublocality3) {\n let addr = `${sublocality3}-${sublocality4}-${premise}`;\n if (sublocality2) addr = `${addr} ${sublocality2}`;\n out.fullStreetAddress = addr;\n } else {\n out.fullStreetAddress = `${buildingNumber} ${streetName}`;\n }\n } else if (streetName) {\n out.fullStreetAddress = streetName;\n } else if (buildingNumber) {\n out.fullStreetAddress = buildingNumber;\n }\n\n out.fullStreetAddress = out.fullStreetAddress.trim();\n return out;\n }\n\n /** Shorthand: extract into the flat shape used by address forms. */\n static extractFormattedAddress(place: GooglePlaceDetails): FormattedAddress {\n const a = GoogleAutocompleteCore.extractAddressComponents(place);\n return {\n address1: a.fullStreetAddress,\n city: a.locality,\n country: a.country,\n state: a.administrativeAreaLevel1,\n postal: a.postalCode,\n };\n }\n}\n", "/**\n * Geodata \u2014 CDN-backed country/region data.\n *\n * Fetches slim JSON from Vercel Blob CDN on demand:\n * - countries.json (~10KB) \u2014 fetched once on first getCountries() call\n * - regions.json (~95KB) \u2014 fetched lazily on first getStatesForCountry() call\n *\n * Both are cached in memory after first fetch.\n */\n\nconst GEODATA_CDN_BASE = 'https://cvwnizdbugpz6jwk.public.blob.vercel-storage.com/geodata/v1';\n\nexport const AVAILABLE_LANGUAGES = ['en', 'ru', 'de', 'da', 'fr', 'es', 'zh', 'hi', 'pt', 'ja', 'ar', 'it', 'he'] as const;\nexport type SupportedLanguage = (typeof AVAILABLE_LANGUAGES)[number];\n\nexport interface Country {\n code: string;\n name: string;\n iso3?: string;\n numeric?: number;\n}\n\nexport interface State {\n code: string;\n name: string;\n countryCode: string;\n}\n\ninterface CdnCountries { [iso2: string]: { n: string; i3?: string; nu?: number } }\ninterface CdnRegions { [iso2: string]: [string, string][] }\n\nconst countriesCache = new Map<SupportedLanguage, CdnCountries>();\nconst regionsCache = new Map<SupportedLanguage, CdnRegions>();\nconst inflightCountries = new Map<SupportedLanguage, Promise<CdnCountries>>();\nconst inflightRegions = new Map<SupportedLanguage, Promise<CdnRegions>>();\n\nasync function fetchCountriesRaw(language: SupportedLanguage): Promise<CdnCountries> {\n const cached = countriesCache.get(language);\n if (cached) return cached;\n\n let inflight = inflightCountries.get(language);\n if (inflight) return inflight;\n\n inflight = (async () => {\n const url = `${GEODATA_CDN_BASE}/${language}/countries.json`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Geodata fetch failed: ${url} (${res.status})`);\n const data: CdnCountries = await res.json();\n countriesCache.set(language, data);\n inflightCountries.delete(language);\n return data;\n })();\n\n inflightCountries.set(language, inflight);\n return inflight;\n}\n\nasync function fetchRegionsRaw(language: SupportedLanguage): Promise<CdnRegions> {\n const cached = regionsCache.get(language);\n if (cached) return cached;\n\n let inflight = inflightRegions.get(language);\n if (inflight) return inflight;\n\n inflight = (async () => {\n const url = `${GEODATA_CDN_BASE}/${language}/regions.json`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Geodata fetch failed: ${url} (${res.status})`);\n const data: CdnRegions = await res.json();\n regionsCache.set(language, data);\n inflightRegions.delete(language);\n return data;\n })();\n\n inflightRegions.set(language, inflight);\n return inflight;\n}\n\nfunction getCountriesCached(language: SupportedLanguage): CdnCountries {\n return countriesCache.get(language) || countriesCache.get('en') || {};\n}\n\nfunction getRegionsCached(language: SupportedLanguage): CdnRegions {\n return regionsCache.get(language) || regionsCache.get('en') || {};\n}\n\n/** Fetch countries + regions from CDN for a language. Call before sync getters. */\nexport async function ensureGeoDataLoaded(language: SupportedLanguage = 'en'): Promise<void> {\n await Promise.all([fetchCountriesRaw(language), fetchRegionsRaw(language)]);\n}\n\nexport const getCountries = (language: SupportedLanguage = 'en'): Country[] => {\n const raw = getCountriesCached(language);\n return Object.entries(raw)\n .map(([code, c]) => ({ code, name: c.n, iso3: c.i3, numeric: c.nu }))\n .sort((a, b) => a.name.localeCompare(b.name));\n};\n\nexport const getStatesForCountry = (countryCode: string, language: SupportedLanguage = 'en'): State[] => {\n const raw = getRegionsCached(language);\n const tuples = raw[countryCode];\n if (!tuples) return [];\n return tuples\n .map(([iso, name]) => ({ code: iso, name, countryCode }))\n .sort((a, b) => a.name.localeCompare(b.name));\n};\n\nexport function isLanguageLoaded(language: SupportedLanguage): boolean {\n return countriesCache.has(language);\n}\n", "/**\n * ISO country/region helpers \u2014 countries list, regions by country,\n * and Google Places state \u2192 ISO region mapping.\n */\n\nimport {\n getCountries,\n getStatesForCountry,\n ensureGeoDataLoaded,\n isLanguageLoaded,\n AVAILABLE_LANGUAGES,\n type SupportedLanguage,\n type Country,\n type State,\n} from './iso3166.js';\n\nexport type { SupportedLanguage, Country, State };\nexport { AVAILABLE_LANGUAGES };\n\nexport interface ISOCountry {\n iso: string;\n iso3: string;\n numeric: number;\n name: string;\n}\n\nexport interface ISORegion {\n iso: string;\n name: string;\n}\n\nexport class ISODataCore {\n /** Fetch countries + regions from CDN for a language. Call before sync getters. */\n static ensureLoaded(language: SupportedLanguage = 'en'): Promise<void> {\n return ensureGeoDataLoaded(language);\n }\n\n /** Get all countries as a Record keyed by ISO code. */\n static getCountries(language: SupportedLanguage = 'en'): Record<string, ISOCountry> {\n const arr = getCountries(language);\n const result: Record<string, ISOCountry> = {};\n for (const c of arr) {\n result[c.code] = { iso: c.code, iso3: c.iso3 ?? '', numeric: c.numeric ?? 0, name: c.name };\n }\n return result;\n }\n\n /** Get all countries as a sorted array of { value, label } for select inputs. */\n static getCountryOptions(language: SupportedLanguage = 'en'): Array<{ value: string; label: string }> {\n return getCountries(language).map((c) => ({ value: c.code, label: c.name }));\n }\n\n /** Get regions/states for a country. */\n static getRegions(countryCode: string, language: SupportedLanguage = 'en'): ISORegion[] {\n return getStatesForCountry(countryCode, language).map((s) => ({ iso: s.code, name: s.name }));\n }\n\n /** Get regions as a sorted array of { value, label } for select inputs. */\n static getRegionOptions(countryCode: string, language: SupportedLanguage = 'en'): Array<{ value: string; label: string }> {\n return ISODataCore.getRegions(countryCode, language).map((r) => ({ value: r.iso, label: r.name }));\n }\n\n /** Find a specific region by ISO code. */\n static findRegion(countryCode: string, regionCode: string, language: SupportedLanguage = 'en'): ISORegion | null {\n return ISODataCore.getRegions(countryCode, language).find((r) => r.iso === regionCode) ?? null;\n }\n\n /**\n * Map a Google Places administrative_area to an ISO region.\n * Tries exact ISO match, then name match, then partial match.\n */\n static mapGoogleToISO(\n googleState: string,\n googleStateLong: string,\n countryCode: string,\n language: SupportedLanguage = 'en',\n ): ISORegion | null {\n const regions = ISODataCore.getRegions(countryCode, language);\n if (regions.length === 0) return null;\n\n let match = regions.find((r) => r.iso === googleState);\n if (match) return match;\n\n match = regions.find((r) => r.name.toLowerCase() === googleState.toLowerCase());\n if (match) return match;\n\n match = regions.find((r) => r.name.toLowerCase() === googleStateLong.toLowerCase());\n if (match) return match;\n\n match = regions.find(\n (r) =>\n r.name.toLowerCase().includes(googleStateLong.toLowerCase()) ||\n googleStateLong.toLowerCase().includes(r.name.toLowerCase()),\n );\n\n return match ?? null;\n }\n\n static isLanguageLoaded(language: SupportedLanguage): boolean {\n return isLanguageLoaded(language);\n }\n\n static getAvailableLanguages(): readonly SupportedLanguage[] {\n return AVAILABLE_LANGUAGES;\n }\n}\n", "/**\n * Currency formatting utilities \u2014 symbol lookup, decimal handling,\n * and Intl.NumberFormat-based money formatting from minor units (cents).\n */\n\nexport interface Currency {\n code: string;\n symbol: string;\n name: string;\n decimalPlaces: number;\n}\n\nconst SYMBOLS: Record<string, string> = {\n USD: '$', EUR: '\u20AC', GBP: '\u00A3', JPY: '\u00A5', CAD: 'C$', AUD: 'A$', CHF: 'CHF',\n CNY: '\u00A5', SEK: 'kr', NOK: 'kr', DKK: 'kr', PLN: 'z\u0142', CZK: 'K\u010D', HUF: 'Ft',\n RON: 'lei', BGN: '\u043B\u0432', HRK: 'kn', RUB: '\u20BD', UAH: '\u20B4', TRY: '\u20BA', BRL: 'R$',\n MXN: '$', ZAR: 'R', INR: '\u20B9', KRW: '\u20A9', THB: '\u0E3F', VND: '\u20AB', IDR: 'Rp',\n MYR: 'RM', SGD: 'S$', PHP: '\u20B1', TWD: 'NT$', HKD: 'HK$', ILS: '\u20AA', AED: '\u062F.\u0625',\n SAR: '\u0631.\u0633', QAR: '\u0631.\u0642', KWD: '\u062F.\u0643', BHD: '\u062F.\u0628', OMR: '\u0631.\u0639.', EGP: '\u00A3',\n NGN: '\u20A6', KES: 'KSh', GHS: '\u20B5', COP: '$', ARS: '$', CLP: '$', PEN: 'S/',\n CRC: '\u20A1', DOP: 'RD$', JMD: 'J$', BOB: 'Bs', PYG: '\u20B2', GTQ: 'Q',\n NIO: 'C$', PAB: 'B/.', PKR: '\u20A8', BDT: '\u09F3', LKR: '\u20A8', NPR: '\u20A8',\n GEL: '\u20BE', AMD: '\u058F', AZN: '\u20BC', KZT: '\u20B8',\n};\n\nconst NAMES: Record<string, string> = {\n USD: 'US Dollar', EUR: 'Euro', GBP: 'British Pound', JPY: 'Japanese Yen',\n CAD: 'Canadian Dollar', AUD: 'Australian Dollar', CHF: 'Swiss Franc',\n CNY: 'Chinese Yuan', SEK: 'Swedish Krona', NOK: 'Norwegian Krone',\n DKK: 'Danish Krone', PLN: 'Polish Zloty', CZK: 'Czech Koruna', HUF: 'Hungarian Forint',\n BRL: 'Brazilian Real', MXN: 'Mexican Peso', INR: 'Indian Rupee', KRW: 'South Korean Won',\n THB: 'Thai Baht', SGD: 'Singapore Dollar', HKD: 'Hong Kong Dollar', TWD: 'Taiwan Dollar',\n ILS: 'Israeli Shekel', AED: 'UAE Dirham', SAR: 'Saudi Riyal', ZAR: 'South African Rand',\n TRY: 'Turkish Lira', RUB: 'Russian Ruble', NGN: 'Nigerian Naira',\n};\n\nconst ZERO_DECIMAL: Set<string> = new Set([\n 'JPY', 'KRW', 'VND', 'IDR', 'LAK', 'KHR', 'MMK', 'PYG',\n]);\n\nexport class CurrencyUtils {\n static getSymbol(code: string): string {\n return SYMBOLS[code] ?? code;\n }\n\n static getName(code: string): string {\n return NAMES[code] ?? code;\n }\n\n static getDecimalPlaces(code: string): number {\n return ZERO_DECIMAL.has(code) ? 0 : 2;\n }\n\n static getCurrency(code: string): Currency {\n return {\n code,\n symbol: CurrencyUtils.getSymbol(code),\n name: CurrencyUtils.getName(code),\n decimalPlaces: CurrencyUtils.getDecimalPlaces(code),\n };\n }\n}\n\n/**\n * Format an amount expressed in minor units (cents) into a locale-aware string.\n *\n * @example\n * formatMoney(12345, 'USD') // \"$123.45\"\n * formatMoney(10000, 'EUR', 'de-DE') // \"100,00 \u20AC\"\n * formatMoney(1000, 'JPY') // \"\u00A51,000\"\n */\nexport function formatMoney(amountMinorUnits: number, currencyCode = 'USD', locale = 'en-US'): string {\n const decimals = CurrencyUtils.getDecimalPlaces(currencyCode);\n const value = amountMinorUnits / (decimals === 0 ? 100 : Math.pow(10, decimals));\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value);\n } catch {\n return `${CurrencyUtils.getSymbol(currencyCode)}${value.toFixed(decimals)}`;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["core_exports", "__export", "AVAILABLE_LANGUAGES", "CatalogModule", "CheckoutModule", "CurrencyUtils", "CustomerModule", "GoogleAutocompleteCore", "HeadlessClient", "HttpClient", "ISODataCore", "OffersModule", "PaymentModule", "TagadaAuthError", "TagadaError", "TagadaNetworkError", "TagadaNotFoundError", "TagadaPaymentError", "TagadaRateLimitError", "TagadaValidationError", "createHeadlessClient", "ensureGeoDataLoaded", "formatMoney", "getCountries", "getStatesForCountry", "isLanguageLoaded", "loadGoogleMapsScript", "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", "shipping", "billing", "effectiveShipping", "effectiveBilling", "differentBilling", "data", "a", "stripEmpty", "code", "promotionId", "promoId", "rateId", "cs", "orderSummaries", "summary", "li", "price", "variant", "product", "currencyOpts", "usd", "summaryItems", "s", "obj", "result", "k", "v", "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", "payResult", "payment", "paymentId", "interval", "timeout", "start", "status", "r", "actionData", "redirect", "url", "session", "manager", "consecutiveErrors", "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", "scriptInjected", "scriptReady", "readyCallbacks", "onScriptReady", "cb", "loadGoogleMapsScript", "apiKey", "opts", "_a", "_b", "resolve", "reject", "poll", "params", "script", "GoogleAutocompleteCore", "_GoogleAutocompleteCore", "input", "options", "service", "predictions", "status", "_c", "placeId", "svc", "place", "out", "premise", "neighborhood", "sublocality5", "sublocality4", "sublocality3", "sublocality2", "sublocality1", "postalTown", "c", "t", "buildingNumber", "streetName", "addr", "a", "GEODATA_CDN_BASE", "AVAILABLE_LANGUAGES", "countriesCache", "regionsCache", "inflightCountries", "inflightRegions", "fetchCountriesRaw", "language", "cached", "inflight", "url", "res", "data", "fetchRegionsRaw", "getCountriesCached", "getRegionsCached", "ensureGeoDataLoaded", "getCountries", "raw", "code", "c", "a", "b", "getStatesForCountry", "countryCode", "tuples", "iso", "name", "isLanguageLoaded", "ISODataCore", "_ISODataCore", "language", "ensureGeoDataLoaded", "arr", "getCountries", "result", "c", "countryCode", "getStatesForCountry", "s", "regionCode", "r", "googleState", "googleStateLong", "regions", "match", "isLanguageLoaded", "AVAILABLE_LANGUAGES", "SYMBOLS", "NAMES", "ZERO_DECIMAL", "CurrencyUtils", "_CurrencyUtils", "code", "formatMoney", "amountMinorUnits", "currencyCode", "locale", "decimals", "value"]
|
|
7
7
|
}
|
package/package.json
CHANGED