@vio-live/web-sdk 0.4.0 → 0.4.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/configuration.ts","../src/core/api/vio.ts","../src/core/types.ts","../src/core/api/commerce.ts","../src/core/api/cart-queries.ts","../src/core/checkout/payments/vipps.ts","../src/core/cart/cart-manager.ts","../src/core/checkout/payments/apple-pay.ts","../src/core/checkout/payments/klarna.ts","../src/core/checkout/payments/klarna-payments.ts","../src/core/checkout/checkout-manager.ts","../src/core/client.ts"],"names":[],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsEzC,IAAM,qCAAA,GAAwC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyE9C,IAAM,wBAAA,GAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqIjC,IAAM,wBAAA,GAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqIjC,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","file":"chunk-KMIARP6X.js","sourcesContent":["/**\n * Vio Configuration — singleton holding apiKey, environment, base URLs,\n * and optional payment-vendor publishable keys.\n *\n * Mirrors `VioConfiguration.shared` in the iOS SDK. Initialised once via\n * `Vio.init({ apiKey, ... })`; consumed via `Configuration.get()`.\n *\n * Secrets (apiKey) never come from inside the SDK — the consumer reads\n * them from env vars / their config and passes them to `Vio.init`.\n */\n\nexport type Environment = 'development' | 'testing' | 'production'\n\nexport interface VioConfig {\n /** Vio API key for this client app (from the Vio dashboard). */\n apiKey: string\n /** Target environment. Defaults to 'development'. */\n environment?: Environment\n /** Override REST API base. Defaults are env-aware. */\n apiBase?: string\n /** Override GraphQL base. Defaults are env-aware. */\n graphQLBase?: string\n /**\n * Stripe **publishable** key (`pk_test_xxx` or `pk_live_xxx`). Used for\n * Apple Pay (via Payment Request) and Card flows. Public-safe — fine\n * to expose in client bundles.\n */\n stripePublishableKey?: string\n /**\n * Klarna **Client Identifier** for Express Checkout (KEC). Public-safe.\n * From Merchant Portal → Payment settings → Client Identifiers. When set,\n * the checkout shows the Klarna Express button; when absent it degrades\n * to the plain method selector. Must match `klarnaEnvironment`.\n */\n klarnaClientId?: string\n /**\n * Klarna environment for the Express button. `playground` = sandbox\n * (test orders, no real money), `production` = live. Defaults to\n * `playground` so dev/test never hits live Klarna by accident.\n */\n klarnaEnvironment?: 'playground' | 'production'\n}\n\nexport interface ResolvedConfig {\n apiKey: string\n environment: Environment\n apiBase: string\n graphQLBase: string\n stripePublishableKey?: string\n klarnaClientId?: string\n klarnaEnvironment: 'playground' | 'production'\n}\n\nconst DEFAULT_URLS: Record<Environment, { apiBase: string; graphQLBase: string }> = {\n development: {\n apiBase: 'https://api-dev.vio.live',\n graphQLBase: 'https://graph-ql-dev.vio.live',\n },\n // No separate staging GraphQL deployment yet — shares dev's.\n testing: {\n apiBase: 'https://api-staging.vio.live',\n graphQLBase: 'https://graph-ql-dev.vio.live',\n },\n production: {\n apiBase: 'https://api.vio.live',\n graphQLBase: 'https://graph-ql.vio.live',\n },\n}\n\nclass ConfigurationSingleton {\n private resolved: ResolvedConfig | null = null\n private readyWaiters: Array<() => void> = []\n\n init(input: VioConfig): void {\n if (!input.apiKey || typeof input.apiKey !== 'string') {\n throw new Error('[Vio] apiKey is required in Vio.init({ apiKey })')\n }\n const env: Environment = input.environment ?? 'development'\n const defaults = DEFAULT_URLS[env]\n this.resolved = {\n apiKey: input.apiKey,\n environment: env,\n apiBase: input.apiBase ?? defaults.apiBase,\n graphQLBase: input.graphQLBase ?? defaults.graphQLBase,\n stripePublishableKey: input.stripePublishableKey,\n klarnaClientId: input.klarnaClientId,\n // Sandbox by default — live Klarna must be opted into explicitly.\n klarnaEnvironment: input.klarnaEnvironment ?? 'playground',\n }\n if (typeof console !== 'undefined') {\n const masked =\n input.apiKey.length > 4\n ? '*'.repeat(Math.max(0, input.apiKey.length - 4)) + input.apiKey.slice(-4)\n : '****'\n console.info('[Vio] Initialized', {\n environment: env,\n apiBase: this.resolved.apiBase,\n apiKey: masked,\n stripeConfigured: !!input.stripePublishableKey,\n klarnaConfigured: !!input.klarnaClientId,\n klarnaEnvironment: this.resolved.klarnaEnvironment,\n })\n }\n const waiters = this.readyWaiters\n this.readyWaiters = []\n for (const waiter of waiters) waiter()\n }\n\n get(): ResolvedConfig {\n if (!this.resolved) {\n throw new Error(\n '[Vio] Not initialized. Call Vio.init({ apiKey }) before using the SDK.',\n )\n }\n return this.resolved\n }\n\n get isInitialized(): boolean {\n return this.resolved !== null\n }\n\n /**\n * Resolves once `Vio.init()` has run, or after `timeoutMs` — whichever\n * comes first. Hosts that mount several independent components (e.g. Vev\n * blocks, which mount in no guaranteed order) may have one fire a GraphQL\n * call before another has called `Vio.init()`. Awaiting this briefly lets\n * that race resolve instead of silently sending an unauthenticated\n * request. Resolves `true` if init happened in time, `false` on timeout —\n * callers should still degrade gracefully either way.\n */\n whenReady(timeoutMs = 2000): Promise<boolean> {\n if (this.resolved) return Promise.resolve(true)\n return new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => resolve(false), timeoutMs)\n this.readyWaiters.push(() => {\n clearTimeout(timer)\n resolve(true)\n })\n })\n }\n\n /** For tests only. */\n reset(): void {\n this.resolved = null\n this.readyWaiters = []\n }\n}\n\nexport const Configuration = /* @__PURE__ */ new ConfigurationSingleton()\n","/**\n * Vio REST API client — talks to `api-dev.vio.live` (or override).\n *\n * Endpoints (mirrors the iOS SDK's surface):\n * GET /v2/mobile/config bootstrap (sponsors + market)\n * GET /v2/mobile/campaigns/:id/components placement components (TBD)\n * POST /v2/mobile/campaigns/:id/cart-intent cross-device cart-intent (TBD)\n *\n * Auth: `X-API-Key: <apiKey>` header (the top-level Vio apiKey).\n *\n * Note: until the backend exposes a dedicated `/v2/web/*` surface we\n * reuse the `/v2/mobile/*` paths — the apiKey identifies the client_app\n * and the response shape is platform-agnostic enough.\n */\n\nimport type { BootstrapResponse, PlacementComponent } from '../types.js'\n\nexport interface VioApiOptions {\n /** REST API base URL, e.g. `https://api-dev.vio.live`. */\n apiBase: string\n /** Top-level Vio apiKey for this client app. */\n apiKey: string\n}\n\nexport class VioApi {\n private readonly apiBase: string\n private readonly apiKey: string\n\n constructor(options: VioApiOptions) {\n if (!options.apiBase) throw new Error('[VioApi] apiBase is required')\n if (!options.apiKey) throw new Error('[VioApi] apiKey is required')\n this.apiBase = options.apiBase.replace(/\\/+$/, '')\n this.apiKey = options.apiKey\n }\n\n /**\n * Bootstrap — fetches client app config (sponsors with commerce keys,\n * default market, campaign id). Called once at SDK init.\n */\n async bootstrap(): Promise<BootstrapResponse> {\n return this.get<BootstrapResponse>('/v2/mobile/config')\n }\n\n /**\n * Get placement components for a campaign. Used by the carousel auto-fetch\n * mode (`<vio-product-carousel campaign-id=\"36\" location=\"news-favorites\">`).\n */\n async getComponents(campaignId: number | string): Promise<PlacementComponent[]> {\n const path = `/v2/mobile/campaigns/${encodeURIComponent(String(campaignId))}/components`\n const res = await this.get<{ components: PlacementComponent[] } | PlacementComponent[]>(path)\n return Array.isArray(res) ? res : (res?.components ?? [])\n }\n\n // MARK: - HTTP plumbing\n\n private async get<T>(path: string): Promise<T> {\n const url = `${this.apiBase}${path}`\n const res = await fetch(url, {\n method: 'GET',\n headers: {\n 'X-API-Key': this.apiKey,\n Accept: 'application/json',\n },\n })\n if (!res.ok) {\n throw new VioApiError(res.status, await safeText(res), `GET ${path}`)\n }\n return (await res.json()) as T\n }\n}\n\nexport class VioApiError extends Error {\n constructor(\n public readonly status: number,\n public readonly body: string,\n public readonly endpoint: string,\n ) {\n super(`[VioApi] ${endpoint} → HTTP ${status}: ${body.slice(0, 200)}`)\n this.name = 'VioApiError'\n }\n}\n\nasync function safeText(res: Response): Promise<string> {\n try {\n return await res.text()\n } catch {\n return ''\n }\n}\n\nexport function createVioApi(options: VioApiOptions): VioApi {\n return new VioApi(options)\n}\n","/**\n * Vio types — Product / Sponsor / Bootstrap shapes.\n *\n * Product types mirror the Vio Commerce GraphQL schema.\n * Sponsor / Bootstrap shapes mirror the iOS SDK's bootstrap response so\n * we stay aligned cross-platform.\n */\n\nexport type ImageSize = 'thumbnail' | 'small' | 'medium' | 'large' | 'full'\n\nexport interface ProductPrice {\n amount: number\n currency_code: string\n compare_at?: number | null\n amount_incl_taxes?: number | null\n compare_at_incl_taxes?: number | null\n tax_amount?: number | null\n tax_rate?: number | null\n}\n\nexport interface ProductImage {\n id: string\n url: string\n width?: number | null\n height?: number | null\n order?: number | null\n}\n\nexport interface ProductOption {\n id: number\n name: string\n order: number\n values: string[]\n}\n\nexport interface ProductCategory {\n id: number\n name: string\n}\n\nexport interface ProductVariant {\n id: number\n barcode?: string | null\n quantity?: number | null\n sku?: string | null\n title?: string | null\n price: ProductPrice\n images: ProductImage[]\n}\n\nexport interface Product {\n id: number\n brand?: string | null\n title: string\n description?: string | null\n tags?: string | null\n sku: string\n quantity?: number | null\n price: ProductPrice\n variants: ProductVariant[]\n barcode?: string | null\n options: ProductOption[]\n categories?: ProductCategory[] | null\n images: ProductImage[]\n}\n\n/** Per-sponsor commerce config sourced from Vio bootstrap. */\nexport interface SponsorCommerceBlock {\n apiKey: string\n channelId?: string | null\n paymentMethods?: string[]\n}\n\nexport interface Sponsor {\n id: number\n name: string\n description?: string | null\n avatarUrl?: string | null\n logoUrl?: string | null\n primaryColor?: string | null\n secondaryColor?: string | null\n commerce: SponsorCommerceBlock\n}\n\n/**\n * Response shape of `GET /v2/mobile/config` (and likely future `/v2/web/config`).\n * Matches the iOS SDK's `SdkBootstrapResponse` model.\n */\nexport interface BootstrapResponse {\n campaignId?: number\n primarySponsor?: Sponsor\n secondarySponsors?: Sponsor[]\n market?: {\n countryCode: string\n currencyCode: string\n }\n}\n\n/**\n * A placement component returned by `/v2/mobile/campaigns/:id/components`.\n * Used by `<vio-product-carousel campaign-id=\"...\">` to know which products\n * to render at a given slot.\n */\nexport interface PlacementComponent {\n id: number\n componentType: string\n locationId: string\n sponsorId?: number\n config: {\n productIds?: number[]\n [key: string]: unknown\n }\n}\n\n/** Helper: extract a useful display price from a Product. */\nexport function displayPrice(product: Product): string {\n const p = product.price\n const amount = p.amount_incl_taxes ?? p.amount\n return formatPrice(amount, p.currency_code)\n}\n\n/**\n * Active shipping/market country for the page. The host (e.g. the Vev Config\n * block) sets `globalThis.__VIO_COUNTRY__` / localStorage `vio.country`; falls\n * back to NO.\n */\nexport function getGlobalCountryCode(): string {\n const g = globalThis as { __VIO_COUNTRY__?: string }\n if (g.__VIO_COUNTRY__) return g.__VIO_COUNTRY__\n if (typeof localStorage !== 'undefined') {\n try {\n const v = localStorage.getItem('vio.country')\n if (v) return v\n } catch {\n /* privacy mode */\n }\n }\n return 'NO'\n}\n\n/**\n * Active display locale for the page (number formatting + payment sheets).\n * Host sets `globalThis.__VIO_LOCALE__` / localStorage `vio.locale`; falls\n * back to nb-NO.\n */\nexport function getGlobalLocale(): string {\n const g = globalThis as { __VIO_LOCALE__?: string }\n if (g.__VIO_LOCALE__) return g.__VIO_LOCALE__\n if (typeof localStorage !== 'undefined') {\n try {\n const v = localStorage.getItem('vio.locale')\n if (v) return v\n } catch {\n /* privacy mode */\n }\n }\n return 'nb-NO'\n}\n\n/**\n * Currency symbol for display. With no explicit currency, a host-set override\n * (`__VIO_SYMBOL__` / vio.symbol) wins; otherwise a small per-currency map.\n */\nexport function getGlobalSymbol(currency?: string): string {\n const activeCurrency = currency || getGlobalCurrency()\n const g = globalThis as { __VIO_SYMBOL__?: string }\n if (!currency && g.__VIO_SYMBOL__) return g.__VIO_SYMBOL__\n if (!currency && typeof localStorage !== 'undefined') {\n try {\n const v = localStorage.getItem('vio.symbol')\n if (v) return v\n } catch {\n /* privacy mode */\n }\n }\n const curr = String(activeCurrency).toUpperCase()\n if (curr === 'NOK' || curr === 'DKK') return 'Kr'\n if (curr === 'SEK') return 'SEK'\n if (curr === 'EUR') return '€'\n if (curr === 'USD' || curr === 'CAD') return '$'\n if (curr === 'GBP') return '£'\n if (curr === 'CHF') return 'CHF'\n return activeCurrency\n}\n\n/**\n * Active display currency for the page. The host (e.g. the Vev Config block)\n * sets `globalThis.__VIO_CURRENCY__` / localStorage `vio.currency`; falls back\n * to NOK.\n */\nexport function getGlobalCurrency(): string {\n const g = globalThis as { __VIO_CURRENCY__?: string }\n if (g.__VIO_CURRENCY__) return g.__VIO_CURRENCY__\n if (typeof localStorage !== 'undefined') {\n try {\n const v = localStorage.getItem('vio.currency')\n if (v) return v\n } catch {\n /* privacy mode */\n }\n }\n return 'NOK'\n}\n\n/** Cache of validated locales — hosts can feed anything into vio.locale. */\nconst validatedLocales = new Map<string, string>()\n\n/** Return the locale if Intl accepts it, else nb-NO (a host-set `nb_NO` with\n * an underscore makes toLocaleString throw and blanks the whole render). */\nfunction safeLocale(locale: string): string {\n const cached = validatedLocales.get(locale)\n if (cached) return cached\n let resolved = 'nb-NO'\n try {\n if (Intl.NumberFormat.supportedLocalesOf([locale]).length > 0) resolved = locale\n } catch {\n /* structurally invalid tag — keep the fallback */\n }\n validatedLocales.set(locale, resolved)\n return resolved\n}\n\n/** Format a numeric amount + currency using the page locale and symbol map. */\nexport function formatPrice(amount: number, currency?: string): string {\n const activeCurrency = currency || getGlobalCurrency()\n const activeLocale = safeLocale(getGlobalLocale())\n const activeSymbol = getGlobalSymbol(activeCurrency)\n const formatted = amount\n .toLocaleString(activeLocale, { minimumFractionDigits: 0, maximumFractionDigits: 2 })\n // Normalize non-breaking space to regular space for predictable rendering.\n .replace(/ /g, ' ')\n return `${formatted} ${activeSymbol}`\n}\n\n/**\n * Helper: pick the first image URL (variant first, then product). Defensive:\n * accepts loose shapes (backend cart rows, catalog rows) where images may be\n * plain strings or live under image / imageUrl / image_url / primaryImage.\n */\nexport function primaryImageUrl(product: Product): string | undefined {\n /* eslint-disable @typescript-eslint/no-explicit-any */\n const p = product as any\n if (!p || typeof p !== 'object') return undefined\n if (Array.isArray(p.variants) && p.variants.length > 0) {\n const vImages = p.variants[0]?.images\n if (Array.isArray(vImages) && vImages.length > 0) {\n const vUrl = typeof vImages[0] === 'string' ? vImages[0] : vImages[0]?.url\n if (vUrl) return vUrl\n }\n }\n if (Array.isArray(p.images) && p.images.length > 0) {\n const img0 = p.images[0]\n const url = typeof img0 === 'string' ? img0 : img0?.url\n if (url) return url\n }\n if (typeof p.image === 'string' && p.image) return p.image\n if (p.image && typeof p.image === 'object' && p.image.url) return p.image.url\n if (typeof p.imageUrl === 'string' && p.imageUrl) return p.imageUrl\n if (typeof p.image_url === 'string' && p.image_url) return p.image_url\n if (typeof p.primaryImage === 'string' && p.primaryImage) return p.primaryImage\n if (p.primaryImage && typeof p.primaryImage === 'object' && p.primaryImage.url) {\n return p.primaryImage.url\n }\n return undefined\n /* eslint-enable @typescript-eslint/no-explicit-any */\n}\n","/**\n * Commerce GraphQL client — talks to Vio Commerce.\n *\n * Mirrors the iOS SDK's `SdkClient.channel.product` surface, but uses\n * `graphql-request` (lightweight) instead of Apollo. Auth header: `Authorization: <apiKey>`\n * (per-sponsor commerce apiKey, NOT the top-level Vio apiKey).\n *\n * Usage:\n * const commerce = createCommerceClient({\n * endpoint: 'https://graph-ql-dev.vio.live',\n * apiKey: '<sponsor-commerce-apiKey>', // sponsor's commerce apiKey\n * })\n * const products = await commerce.channel.product.getByIds({\n * product_ids: [408895, 408896],\n * currency: 'NOK',\n * image_size: 'large',\n * })\n */\n\nimport { GraphQLClient } from 'graphql-request'\nimport { getGlobalCountryCode, getGlobalCurrency, type ImageSize, type Product } from '../types.js'\n\nexport interface CommerceClientOptions {\n /** Vio Commerce GraphQL endpoint, e.g. `https://graph-ql-dev.vio.live`. */\n endpoint: string\n /** Per-sponsor commerce apiKey (from bootstrap.primarySponsor.commerce.apiKey). */\n apiKey: string\n}\n\nconst GET_PRODUCTS_BY_IDS = /* GraphQL */ `\n query GetProductsByIds(\n $currency: String\n $imageSize: ImageSize\n $productIds: [Int!]\n $useCache: Boolean!\n $shippingCountryCode: String\n ) {\n Channel {\n GetProductsByIds(\n currency: $currency\n image_size: $imageSize\n product_ids: $productIds\n useCache: $useCache\n shipping_country_code: $shippingCountryCode\n ) {\n id\n brand\n title\n description\n tags\n sku\n quantity\n price {\n amount\n currency_code\n compare_at\n amount_incl_taxes\n compare_at_incl_taxes\n tax_amount\n tax_rate\n }\n variants {\n id\n barcode\n quantity\n sku\n title\n price {\n amount\n currency_code\n compare_at\n amount_incl_taxes\n compare_at_incl_taxes\n tax_amount\n tax_rate\n }\n images {\n id\n url\n width\n height\n order\n }\n }\n barcode\n options {\n id\n name\n order\n values\n }\n categories {\n id\n name\n }\n images {\n id\n url\n width\n height\n order\n }\n }\n }\n }\n`\n\nexport interface GetProductsByIdsOptions {\n product_ids: number[]\n currency?: string | null\n image_size?: ImageSize | null\n useCache?: boolean\n shipping_country_code?: string | null\n}\n\nclass ChannelProduct {\n constructor(private readonly client: GraphQLClient) {}\n\n /**\n * Fetch a batch of products by their numeric ids.\n * Returns an empty array if no ids are provided.\n */\n async getByIds(options: GetProductsByIdsOptions): Promise<Product[]> {\n if (!options.product_ids || options.product_ids.length === 0) return []\n\n const variables = {\n productIds: options.product_ids,\n // Page-level currency/country defaults (multi-market support).\n currency: options.currency ?? getGlobalCurrency(),\n imageSize: options.image_size ?? 'large',\n useCache: options.useCache ?? true,\n shippingCountryCode: options.shipping_country_code ?? getGlobalCountryCode(),\n }\n\n const data = await this.client.request<{\n Channel: { GetProductsByIds: Product[] }\n }>(GET_PRODUCTS_BY_IDS, variables)\n\n return data.Channel?.GetProductsByIds ?? []\n }\n}\n\nclass Channel {\n readonly product: ChannelProduct\n\n constructor(client: GraphQLClient) {\n this.product = new ChannelProduct(client)\n }\n}\n\n/** CommerceClient — namespaced facade, mirrors the iOS SdkClient. */\nexport class CommerceClient {\n readonly channel: Channel\n /** Underlying graphql-request client (escape hatch for custom queries). */\n readonly raw: GraphQLClient\n\n constructor(options: CommerceClientOptions) {\n if (!options.endpoint) throw new Error('[VioCommerce] endpoint is required')\n if (!options.apiKey) throw new Error('[VioCommerce] apiKey is required')\n\n this.raw = new GraphQLClient(options.endpoint, {\n headers: { Authorization: options.apiKey },\n })\n this.channel = new Channel(this.raw)\n }\n}\n\nexport function createCommerceClient(options: CommerceClientOptions): CommerceClient {\n return new CommerceClient(options)\n}\n","// GraphQL Queries and Mutations for VIO Cart & Checkout Services\n\nexport const CREATE_CART_MUTATION = `\nmutation CreateCart($customerSessionId: String!, $currency: String!, $shippingCountry: String) {\n Cart {\n CreateCart(customer_session_id: $customerSessionId, currency: $currency, shipping_country: $shippingCountry) {\n cart_id\n customer_session_id\n shipping_country\n line_items {\n id\n supplier\n image {\n id\n url\n width\n height\n }\n sku\n barcode\n brand\n product_id\n title\n variant_id\n variant_title\n variant {\n option\n value\n }\n quantity\n price {\n amount\n currency_code\n discount\n compare_at\n compare_at_incl_taxes\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n shipping {\n id\n name\n description\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n available_shippings {\n id\n name\n description\n country_code\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n }\n subtotal\n shipping\n currency\n available_shipping_countries\n }\n }\n}\n`;\n\nexport const ADD_ITEM_MUTATION = `\nmutation AddItem($cartId: String!, $lineItems: [LineItemInput!]!) {\n Cart {\n AddItem(cart_id: $cartId, line_items: $lineItems) {\n cart_id\n customer_session_id\n shipping_country\n line_items {\n id\n supplier\n image {\n id\n url\n width\n height\n }\n sku\n barcode\n brand\n product_id\n title\n variant_id\n variant_title\n variant {\n option\n value\n }\n quantity\n price {\n amount\n currency_code\n discount\n compare_at\n compare_at_incl_taxes\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n shipping {\n id\n name\n description\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n available_shippings {\n id\n name\n description\n country_code\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n }\n subtotal\n shipping\n currency\n available_shipping_countries\n }\n }\n}\n`;\n\nexport const DELETE_ITEM_MUTATION = `\nmutation DeleteItem($cartId: String!, $cartItemId: String!) {\n Cart {\n DeleteItem(cart_id: $cartId, cart_item_id: $cartItemId) {\n cart_id\n customer_session_id\n shipping_country\n line_items {\n id\n supplier\n image {\n id\n url\n width\n height\n }\n sku\n barcode\n brand\n product_id\n title\n variant_id\n variant_title\n variant {\n option\n value\n }\n quantity\n price {\n amount\n currency_code\n discount\n compare_at\n compare_at_incl_taxes\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n shipping {\n id\n name\n description\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n available_shippings {\n id\n name\n description\n country_code\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n }\n subtotal\n shipping\n currency\n available_shipping_countries\n }\n }\n}\n`;\n\nexport const UPDATE_ITEM_MUTATION = `\nmutation UpdateItem($cartId: String!, $cartItemId: String!, $shippingId: String, $qty: Int) {\n Cart {\n UpdateItem(cart_id: $cartId, cart_item_id: $cartItemId, shipping_id: $shippingId, qty: $qty) {\n cart_id\n customer_session_id\n shipping_country\n line_items {\n id\n supplier\n image {\n id\n url\n width\n height\n }\n sku\n barcode\n brand\n product_id\n title\n variant_id\n variant_title\n variant {\n option\n value\n }\n quantity\n price {\n amount\n currency_code\n discount\n compare_at\n compare_at_incl_taxes\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n shipping {\n id\n name\n description\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n available_shippings {\n id\n name\n description\n country_code\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n }\n subtotal\n shipping\n currency\n available_shipping_countries\n }\n }\n}\n`;\n\nexport const GET_CART_QUERY = `\nquery GetCart($cartId: String!) {\n Cart {\n GetCart(cart_id: $cartId) {\n cart_id\n customer_session_id\n shipping_country\n line_items {\n id\n supplier\n image {\n id\n url\n width\n height\n }\n sku\n barcode\n brand\n product_id\n title\n variant_id\n variant_title\n variant {\n option\n value\n }\n quantity\n price {\n amount\n currency_code\n discount\n compare_at\n compare_at_incl_taxes\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n shipping {\n id\n name\n description\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n available_shippings {\n id\n name\n description\n country_code\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n }\n subtotal\n shipping\n currency\n available_shipping_countries\n }\n }\n}\n`;\n\nexport const GET_LINE_ITEMS_BY_SUPPLIER_QUERY = `\nquery GetLineItemsBySupplier($cartId: String!) {\n Cart {\n GetLineItemsBySupplier(cart_id: $cartId) {\n supplier {\n id\n name\n }\n available_shippings {\n id\n name\n description\n country_code\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n line_items {\n id\n supplier\n image {\n id\n url\n width\n height\n }\n sku\n barcode\n brand\n product_id\n title\n variant_id\n variant_title\n variant {\n option\n value\n }\n quantity\n price {\n amount\n currency_code\n discount\n compare_at\n compare_at_incl_taxes\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n shipping {\n id\n name\n description\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n }\n }\n }\n}\n`;\n\nexport const UPDATE_SHIPPINGS_BY_SUPPLIER_MUTATION = `\nmutation UpdateShippingsBySupplier($cartId: String!, $data: [DataUpdateShippingsBySupplier!]!) {\n Cart {\n UpdateShippingsBySupplier(cart_id: $cartId, data: $data) {\n cart_id\n customer_session_id\n shipping_country\n line_items {\n id\n supplier\n image {\n id\n url\n width\n height\n }\n sku\n barcode\n brand\n product_id\n title\n variant_id\n variant_title\n variant {\n option\n value\n }\n quantity\n price {\n amount\n currency_code\n discount\n compare_at\n compare_at_incl_taxes\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n shipping {\n id\n name\n description\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n available_shippings {\n id\n name\n description\n country_code\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n }\n subtotal\n shipping\n currency\n available_shipping_countries\n }\n }\n}\n`;\n\nexport const CREATE_CHECKOUT_MUTATION = `\nmutation CreateCheckout($cartId: String!) {\n Checkout {\n CreateCheckout(cart_id: $cartId) {\n buyer_accepts_purchase_conditions\n buyer_accepts_terms_conditions\n created_at\n updated_at\n id\n deleted_at\n success_url\n cancel_url\n payment_method\n email\n status\n checkout_url\n origin_payment_id\n billing_address {\n id\n first_name\n last_name\n phone_code\n phone\n company\n address1\n address2\n city\n province\n province_code\n country\n country_code\n zip\n }\n shipping_address {\n id\n first_name\n last_name\n phone_code\n phone\n company\n address1\n address2\n city\n province\n province_code\n country\n country_code\n zip\n }\n available_payment_methods {\n name\n }\n discount_code\n cart {\n cart_id\n customer_session_id\n shipping_country\n line_items {\n id\n supplier\n image {\n id\n url\n width\n height\n }\n sku\n barcode\n brand\n product_id\n title\n variant_id\n variant_title\n variant {\n option\n value\n }\n quantity\n price {\n amount\n currency_code\n discount\n compare_at\n compare_at_incl_taxes\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n shipping {\n id\n name\n description\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n available_shippings {\n id\n name\n description\n country_code\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n }\n subtotal\n shipping\n currency\n available_shipping_countries\n }\n totals {\n currency_code\n subtotal\n shipping\n total\n taxes\n tax_rate\n discounts\n }\n }\n }\n}\n`;\n\nexport const UPDATE_CHECKOUT_MUTATION = `\nmutation UpdateCheckout($checkoutId: String!, $status: String, $successUrl: String, $email: String, $cancelUrl: String, $paymentMethod: String, $shippingAddress: AddressArgs, $billingAddress: AddressArgs, $buyerAcceptsPurchaseConditions: Boolean, $buyerAcceptsTermsConditions: Boolean) {\n Checkout {\n UpdateCheckout(checkout_id: $checkoutId, status: $status, success_url: $successUrl, email: $email, cancel_url: $cancelUrl, payment_method: $paymentMethod, shipping_address: $shippingAddress, billing_address: $billingAddress, buyer_accepts_purchase_conditions: $buyerAcceptsPurchaseConditions, buyer_accepts_terms_conditions: $buyerAcceptsTermsConditions) {\n buyer_accepts_purchase_conditions\n buyer_accepts_terms_conditions\n created_at\n updated_at\n id\n deleted_at\n success_url\n cancel_url\n payment_method\n email\n status\n checkout_url\n origin_payment_id\n billing_address {\n id\n first_name\n last_name\n phone_code\n phone\n company\n address1\n address2\n city\n province\n province_code\n country\n country_code\n zip\n }\n shipping_address {\n id\n first_name\n last_name\n phone_code\n phone\n company\n address1\n address2\n city\n province\n province_code\n country\n country_code\n zip\n }\n available_payment_methods {\n name\n }\n discount_code\n cart {\n cart_id\n customer_session_id\n shipping_country\n line_items {\n id\n supplier\n image {\n id\n url\n width\n height\n }\n sku\n barcode\n brand\n product_id\n title\n variant_id\n variant_title\n variant {\n option\n value\n }\n quantity\n price {\n amount\n currency_code\n discount\n compare_at\n compare_at_incl_taxes\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n shipping {\n id\n name\n description\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n available_shippings {\n id\n name\n description\n country_code\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n }\n subtotal\n shipping\n currency\n available_shipping_countries\n }\n totals {\n currency_code\n subtotal\n shipping\n total\n taxes\n tax_rate\n discounts\n }\n }\n }\n}\n`;\n\nexport const GET_CHECKOUT_QUERY = `\nquery GetCheckout($checkoutId: String!) {\n Checkout {\n GetCheckout(checkout_id: $checkoutId) {\n buyer_accepts_purchase_conditions\n buyer_accepts_terms_conditions\n created_at\n updated_at\n id\n deleted_at\n success_url\n cancel_url\n payment_method\n email\n status\n checkout_url\n origin_payment_id\n billing_address {\n id\n first_name\n last_name\n phone_code\n phone\n company\n address1\n address2\n city\n province\n province_code\n country\n country_code\n zip\n }\n shipping_address {\n id\n first_name\n last_name\n phone_code\n phone\n company\n address1\n address2\n city\n province\n province_code\n country\n country_code\n zip\n }\n available_payment_methods {\n name\n }\n discount_code\n cart {\n cart_id\n customer_session_id\n shipping_country\n line_items {\n id\n supplier\n image {\n id\n url\n width\n height\n }\n sku\n barcode\n brand\n product_id\n title\n variant_id\n variant_title\n variant {\n option\n value\n }\n quantity\n price {\n amount\n currency_code\n discount\n compare_at\n compare_at_incl_taxes\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n shipping {\n id\n name\n description\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n available_shippings {\n id\n name\n description\n country_code\n price {\n amount\n currency_code\n amount_incl_taxes\n tax_amount\n tax_rate\n }\n }\n }\n subtotal\n shipping\n currency\n available_shipping_countries\n }\n totals {\n currency_code\n subtotal\n shipping\n total\n taxes\n tax_rate\n discounts\n }\n }\n }\n}\n`;\n\nexport const GET_AVAILABLE_PAYMENT_METHODS_QUERY = `\nquery Config {\n Payment {\n GetAvailablePaymentMethods {\n config {\n name\n type\n value\n }\n name\n }\n }\n}\n`;\n\n\n/**\n * Server-side cart / checkout GraphQL client (Vio Commerce).\n *\n * Ported from the hand-edited Vev bundle (Alan, 2026-07-28/29) into the SDK\n * source so the vendored bundle stays a pure esbuild artifact.\n */\n\nimport { Configuration } from '../configuration.js'\nimport { getGlobalCountryCode, getGlobalCurrency } from '../types.js'\n\n/** Transport options for a cart/checkout GraphQL call. */\nexport interface CartQueryOptions {\n endpoint?: string\n apiKey?: string\n /** Sponsor commerce key — goes in the Authorization header. */\n commerceKey?: string\n /** True when the commerce key came from a resolved sponsor (bootstrap).\n * False = we fell back to the host apiKey — writes like CreateCart should\n * NOT proceed with the wrong key (the cart would be orphaned). */\n sponsorResolved?: boolean\n}\n\n/**\n * Resolve endpoint + keys for cart GraphQL calls. Awaits Vio.bootstrap() once\n * if it hasn't run yet (the sponsor commerce keys come from bootstrap), then\n * uses the sponsor's commerce apiKey (via the Vio facade on globalThis,\n * avoiding an import cycle); falls back to the host apiKey.\n */\nexport async function getCartGraphQLOptions(sponsorId?: number): Promise<CartQueryOptions> {\n const facade = (\n globalThis as {\n __VIO_FACADE__?: {\n findSponsor?: (id: number) => unknown\n bootstrap?: () => Promise<unknown>\n bootstrapCache?: unknown\n }\n }\n ).__VIO_FACADE__\n if (facade && typeof facade.bootstrap === 'function' && !facade.bootstrapCache) {\n try {\n await facade.bootstrap()\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[Vio] getCartGraphQLOptions bootstrap await failed:', err)\n }\n }\n }\n\n // Hosts that mount several independent components (Vev blocks mount in no\n // guaranteed order) may have one query the commerce API before another has\n // called Vio.init(). Give that race a brief window to resolve rather than\n // silently sending an unauthenticated request.\n if (!Configuration.isInitialized) {\n await Configuration.whenReady()\n }\n\n const cfg = Configuration.isInitialized\n ? Configuration.get()\n : { apiKey: undefined, graphQLBase: 'https://graph-ql-dev.vio.live' }\n const anyCfg = cfg as { apiKey?: string; graphQLBase?: string }\n let commerceKey = anyCfg.apiKey\n let sponsorResolved = false\n if (sponsorId && typeof facade?.findSponsor === 'function') {\n const sponsor = facade.findSponsor(sponsorId) as\n | { commerce?: { apiKey?: string } }\n | undefined\n if (sponsor?.commerce?.apiKey) {\n commerceKey = sponsor.commerce.apiKey\n sponsorResolved = true\n }\n }\n return {\n endpoint: anyCfg.graphQLBase || 'https://graph-ql-dev.vio.live',\n apiKey: anyCfg.apiKey,\n commerceKey,\n sponsorResolved,\n }\n}\n\nconst CUSTOMER_SESSION_KEY = 'vio.customer_session_id.v1'\n\n/** Stable per-browser customer session id (backend CreateCart requires one). */\nexport function getCustomerSessionId(): string {\n if (typeof localStorage === 'undefined') return 'cs_session_default'\n let id = localStorage.getItem(CUSTOMER_SESSION_KEY)\n if (!id) {\n id = 'cs_' + Math.random().toString(36).slice(2, 11) + Date.now().toString(36)\n localStorage.setItem(CUSTOMER_SESSION_KEY, id)\n }\n return id\n}\n\ninterface GraphQLEnvelope {\n data?: Record<string, Record<string, unknown>>\n errors?: Array<{ message?: string }>\n}\n\n/** Execute a GraphQL query/mutation against the configured commerce endpoint.\n * Callers that skip `getCartGraphQLOptions()` (or pass a bare sponsorId) get\n * it resolved here instead of silently sending an unauthenticated request. */\nexport async function executeCartGraphQL(\n query: string,\n variables: Record<string, unknown>,\n options: CartQueryOptions | number | undefined = {},\n): Promise<GraphQLEnvelope> {\n const resolvedOptions: CartQueryOptions =\n typeof options === 'number'\n ? await getCartGraphQLOptions(options)\n : !options.apiKey && !options.commerceKey\n ? { ...(await getCartGraphQLOptions()), ...options }\n : options\n const { endpoint = 'https://graph-ql-dev.vio.live', apiKey, commerceKey } = resolvedOptions\n\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (apiKey) headers['X-API-Key'] = apiKey\n if (commerceKey || apiKey) headers['Authorization'] = (commerceKey || apiKey) as string\n\n const res = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({ query, variables }),\n })\n\n const json = (await res.json().catch(() => ({}))) as GraphQLEnvelope\n if (!res.ok || json.errors) {\n const errMsg = json.errors?.[0]?.message || `GraphQL request failed (HTTP ${res.status})`\n throw new Error(errMsg)\n }\n return json\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport async function createCart(\n customerSessionId: string,\n currency: string,\n shippingCountry?: string | null,\n options?: CartQueryOptions,\n): Promise<any> {\n const json = await executeCartGraphQL(\n CREATE_CART_MUTATION,\n {\n customerSessionId,\n currency: currency || getGlobalCurrency(),\n shippingCountry: shippingCountry || getGlobalCountryCode(),\n },\n options,\n )\n return json?.data?.Cart?.CreateCart\n}\n\nexport async function addItem(\n cartId: string,\n lineItems: unknown[],\n options?: CartQueryOptions,\n): Promise<any> {\n const json = await executeCartGraphQL(ADD_ITEM_MUTATION, { cartId, lineItems }, options)\n return json?.data?.Cart?.AddItem\n}\n\nexport async function deleteItem(\n cartId: string,\n cartItemId: string,\n options?: CartQueryOptions,\n): Promise<any> {\n const json = await executeCartGraphQL(DELETE_ITEM_MUTATION, { cartId, cartItemId }, options)\n return json?.data?.Cart?.DeleteItem\n}\n\nexport async function updateItem(\n cartId: string,\n cartItemId: string,\n shippingId?: string | null,\n qty?: number | null,\n options?: CartQueryOptions,\n): Promise<any> {\n const json = await executeCartGraphQL(\n UPDATE_ITEM_MUTATION,\n { cartId, cartItemId, shippingId: shippingId || null, qty: qty != null ? qty : null },\n options,\n )\n return json?.data?.Cart?.UpdateItem\n}\n\nexport async function getCart(cartId: string, options?: CartQueryOptions): Promise<any> {\n const json = await executeCartGraphQL(GET_CART_QUERY, { cartId }, options)\n return json?.data?.Cart?.GetCart\n}\n\nexport async function getLineItemsBySupplier(\n cartId: string,\n options?: CartQueryOptions,\n): Promise<any> {\n const json = await executeCartGraphQL(GET_LINE_ITEMS_BY_SUPPLIER_QUERY, { cartId }, options)\n return json?.data?.Cart?.GetLineItemsBySupplier\n}\n\nexport async function updateShippingsBySupplier(\n cartId: string,\n data: unknown[],\n options?: CartQueryOptions,\n): Promise<any> {\n const json = await executeCartGraphQL(\n UPDATE_SHIPPINGS_BY_SUPPLIER_MUTATION,\n { cartId, data },\n options,\n )\n return json?.data?.Cart?.UpdateShippingsBySupplier\n}\n\nexport async function createCheckout(cartId: string, options?: CartQueryOptions): Promise<any> {\n const json = await executeCartGraphQL(CREATE_CHECKOUT_MUTATION, { cartId }, options)\n return json?.data?.Checkout?.CreateCheckout\n}\n\nexport async function updateCheckout(\n variables: Record<string, unknown>,\n options?: CartQueryOptions,\n): Promise<any> {\n const json = await executeCartGraphQL(UPDATE_CHECKOUT_MUTATION, variables, options)\n return json?.data?.Checkout?.UpdateCheckout\n}\n\nexport async function getCheckout(checkoutId: string, options?: CartQueryOptions): Promise<any> {\n const json = await executeCartGraphQL(GET_CHECKOUT_QUERY, { checkoutId }, options)\n return json?.data?.Checkout?.GetCheckout\n}\n\nexport async function getAvailablePaymentMethods(options?: CartQueryOptions): Promise<any> {\n const json = await executeCartGraphQL(GET_AVAILABLE_PAYMENT_METHODS_QUERY, {}, options)\n return json?.data?.Payment?.GetAvailablePaymentMethods\n}\n\nexport const CREATE_PAYMENT_STRIPE_MUTATION = `\nmutation CreatePaymentStripe($checkoutId: String!, $successUrl: String!, $paymentMethod: String!, $email: String!) {\n Payment {\n CreatePaymentStripe(checkout_id: $checkoutId, success_url: $successUrl, payment_method: $paymentMethod, email: $email) {\n order_id\n checkout_url\n }\n }\n}\n`\n\nexport async function createPaymentStripe(\n variables: Record<string, unknown>,\n options?: CartQueryOptions,\n): Promise<any> {\n const json = await executeCartGraphQL(CREATE_PAYMENT_STRIPE_MUTATION, variables, options)\n return json?.data?.Payment?.CreatePaymentStripe\n}\n\nexport const CREATE_PAYMENT_APPLE_PAY_MUTATION = `\nmutation CreatePaymentApplePay($checkoutId: String!) {\n Payment {\n CreatePaymentApplePay(checkout_id: $checkoutId) {\n gateway\n gateway_merchant_id\n }\n }\n}\n`\n\n/** Register the Apple Pay payment on the backend checkout. Returns the gateway\n * info (gateway + gateway_merchant_id) the sheet/session should use. */\nexport async function createPaymentApplePay(\n variables: Record<string, unknown>,\n options?: CartQueryOptions,\n): Promise<any> {\n const json = await executeCartGraphQL(CREATE_PAYMENT_APPLE_PAY_MUTATION, variables, options)\n return json?.data?.Payment?.CreatePaymentApplePay\n}\n\nexport const CONFIRM_PAYMENT_APPLE_PAY_MUTATION = `\nmutation ConfirmPaymentApplePay($checkoutId: String!, $applePayToken: String!, $email: String, $shippingAddress: ApplePayAddressInput) {\n Payment {\n ConfirmPaymentApplePay(checkout_id: $checkoutId, apple_pay_token: $applePayToken, email: $email, shipping_address: $shippingAddress) {\n order_id\n status\n }\n }\n}\n`\n\n/** Confirm (charge) the Apple Pay payment server-side. Called from the sheet's\n * authorize callback BEFORE completing it — the backend does the actual charge. */\nexport async function confirmPaymentApplePay(\n variables: Record<string, unknown>,\n options?: CartQueryOptions,\n): Promise<any> {\n const json = await executeCartGraphQL(CONFIRM_PAYMENT_APPLE_PAY_MUTATION, variables, options)\n return json?.data?.Payment?.ConfirmPaymentApplePay\n}\n\nexport {\n CREATE_PAYMENT_VIPPS_MUTATION,\n GET_VIPPS_STATUS_QUERY,\n createPaymentVipps,\n getVippsStatus,\n} from '../checkout/payments/vipps.js'\n\n","/**\n * Vipps MobilePay Payment Adapter — GraphQL Integration & Types.\n *\n * Vipps payment integration uses 2 GraphQL operations:\n *\n * 1. `CreatePaymentVipps` mutation:\n * Initiates a Vipps payment session for a checkout and returns `payment_url`.\n *\n * 2. `GetVippsStatus` query:\n * Queries Vipps payment state directly for a checkout (`state`).\n */\n\nimport { executeCartGraphQL, type CartQueryOptions } from '../../api/cart-queries.js'\n\n/**\n * GraphQL mutation to create a Vipps payment session.\n */\nexport const CREATE_PAYMENT_VIPPS_MUTATION = `\nmutation CreatePaymentVipps($checkoutId: String!, $email: String!, $returnUrl: String!) {\n Payment {\n CreatePaymentVipps(checkout_id: $checkoutId, email: $email, return_url: $returnUrl) {\n payment_url\n }\n }\n}\n`\n\n/**\n * GraphQL query to fetch current Vipps payment status.\n */\nexport const GET_VIPPS_STATUS_QUERY = `\nquery GetVippsStatus($checkoutId: String!) {\n Payment {\n GetVippsStatus(checkout_id: $checkoutId) {\n state\n }\n }\n}\n`\n\nexport interface CreatePaymentVippsVariables extends Record<string, unknown> {\n checkoutId: string\n email: string\n returnUrl: string\n}\n\nexport interface CreatePaymentVippsResponse {\n payment_url: string\n}\n\nexport interface GetVippsStatusVariables extends Record<string, unknown> {\n checkoutId: string\n}\n\nexport interface VippsStatusResult {\n state: string\n}\n\nexport type VippsPaymentState =\n | 'CREATED'\n | 'INITIATED'\n | 'AUTHORIZED'\n | 'TERMINATED'\n | 'EXPIRED'\n | string\n\n/**\n * Executes the `CreatePaymentVipps` GraphQL mutation.\n */\nexport async function createPaymentVipps(\n variables: CreatePaymentVippsVariables | Record<string, unknown>,\n options?: CartQueryOptions,\n): Promise<CreatePaymentVippsResponse | null> {\n const json = await executeCartGraphQL(CREATE_PAYMENT_VIPPS_MUTATION, variables, options)\n return (json?.data?.Payment?.CreatePaymentVipps as CreatePaymentVippsResponse) ?? null\n}\n\n/**\n * Executes the `GetVippsStatus` GraphQL query.\n */\nexport async function getVippsStatus(\n variables: GetVippsStatusVariables | Record<string, unknown>,\n options?: CartQueryOptions,\n): Promise<VippsStatusResult | null> {\n const json = await executeCartGraphQL(GET_VIPPS_STATUS_QUERY, variables, options)\n return (json?.data?.Payment?.GetVippsStatus as VippsStatusResult) ?? null\n}\n","/**\n * CartManager — multi-sponsor cart state.\n *\n * Mirrors iOS's `CartManager` + `cartsBySponsor`. Holds local state in\n * memory and persists to localStorage. Reactive: dispatches a `change`\n * CustomEvent that UI components subscribe to (Web Components react via\n * `requestUpdate()`).\n *\n * Server-side cart sync (Vio Commerce GraphQL CreateCart / AddToCart\n * mutations) is deferred to checkout time via the CheckoutManager —\n * this manager is purely client-side state for now.\n */\n\nimport {\n formatPrice,\n getGlobalCountryCode,\n getGlobalCurrency,\n primaryImageUrl,\n type Product,\n} from '../types.js'\nimport type { CartLineItem, SponsorCartState } from './types.js'\nimport {\n addItem as gqlAddItem,\n createCart as gqlCreateCart,\n deleteItem as gqlDeleteItem,\n getCart as gqlGetCart,\n getCartGraphQLOptions,\n getCustomerSessionId,\n getLineItemsBySupplier as gqlGetLineItemsBySupplier,\n updateItem as gqlUpdateItem,\n updateShippingsBySupplier as gqlUpdateShippingsBySupplier,\n} from '../api/cart-queries.js'\n\nconst STORAGE_KEY = 'vio.cart.v1'\n\nexport interface CartChangeDetail {\n cartsBySponsor: Map<number, SponsorCartState>\n itemCount: number\n}\n\nexport interface AddProductOptions {\n product: Product\n sponsorId: number\n sponsorName?: string\n quantity?: number\n variantId?: number\n}\n\n/** Minimal product shape — for callers who only have e.g. mock data, not a full Product. */\nexport interface AddManualOptions {\n productId: number\n sponsorId: number\n sponsorName?: string\n brand: string\n name: string\n unitPrice: number\n currency: string\n imageUrl: string\n quantity?: number\n variantId?: number\n}\n\nfunction lineId(): string {\n return 'li_' + Math.random().toString(36).slice(2, 10) + Date.now().toString(36)\n}\n\n/** Normalise an id-ish value for matching: null/0/'null' → '' (no id). */\nfunction normId(val: unknown): string {\n if (val === null || val === undefined || val === 0 || val === '0' || val === 'null' || val === 'undefined') {\n return ''\n }\n return String(val).trim()\n}\n\nexport class CartManager extends EventTarget {\n private cartsBySponsor: Map<number, SponsorCartState>\n /** In-flight CreateCart per sponsor — two quick adds must share ONE backend\n * cart (two CreateCarts split the items and one silently disappears). */\n private cartIdPromises = new Map<number, Promise<string | undefined>>()\n /** Monotonic mutation counter per sponsor + last applied response, so a\n * slow response can't overwrite the state of a newer one. */\n private mutationSeq = new Map<number, number>()\n private appliedSeq = new Map<number, number>()\n /** In-flight AddItem/UpdateItem/DeleteItem per sponsor. Callers that need\n * the backend cart to reflect a just-made change (e.g. fetching shippings\n * right after an add) should `await waitForCartMutations(sponsorId)` first\n * — otherwise they can race the mutation and see the cart from before it\n * landed (Alan, 2026-08-18: shippings queried before AddItem settled,\n * came back empty). */\n private inFlightMutations = new Map<number, Promise<unknown>>()\n\n constructor() {\n super()\n this.cartsBySponsor = this.loadFromStorage()\n }\n\n private nextSeq(sponsorId: number): number {\n const n = (this.mutationSeq.get(sponsorId) ?? 0) + 1\n this.mutationSeq.set(sponsorId, n)\n return n\n }\n\n /** Resolves once any in-flight AddItem/UpdateItem/DeleteItem for this\n * sponsor has settled (success or failure). No-op if nothing is pending. */\n async waitForCartMutations(sponsorId: number): Promise<void> {\n const p = this.inFlightMutations.get(sponsorId)\n if (!p) return\n try {\n await p\n } catch {\n /* the mutation's own catch already handled/reported the failure */\n }\n }\n\n /** Apply a backend response only if no newer response was applied already. */\n private applyBackendCart(sponsorId: number, backendCart: unknown, seq: number): void {\n if (seq < (this.appliedSeq.get(sponsorId) ?? 0)) return\n this.appliedSeq.set(sponsorId, seq)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.updateFromBackendCart(sponsorId, backendCart as any)\n }\n\n /** Surface a cart sync problem to hosts/UI (and the console). */\n private emitError(message: string, err?: unknown): void {\n if (typeof console !== 'undefined') console.warn('[CartManager]', message, err ?? '')\n this.dispatchEvent(new CustomEvent('error', { detail: { message } }))\n if (typeof document !== 'undefined') {\n document.dispatchEvent(\n new CustomEvent('vio:cart-error', { bubbles: true, detail: { message } }),\n )\n }\n }\n\n // MARK: - Backend cart sync (Vio Commerce GraphQL)\n\n /** Ensure the sponsor cart exists server-side; returns its backend cart id. */\n async ensureCartId(\n sponsorId: number,\n currency?: string,\n shippingCountry?: string,\n ): Promise<string | undefined> {\n const activeCurrency = currency || getGlobalCurrency()\n const activeCountry = shippingCountry || getGlobalCountryCode()\n let cart = this.cartsBySponsor.get(sponsorId)\n if (!cart) {\n cart = { sponsorId, items: [], currency: activeCurrency, shippingCountry: activeCountry }\n this.cartsBySponsor.set(sponsorId, cart)\n } else {\n cart.shippingCountry = activeCountry\n }\n if (cart.cartId) return cart.cartId\n\n // Dedupe: concurrent callers share ONE CreateCart per sponsor.\n const inFlight = this.cartIdPromises.get(sponsorId)\n if (inFlight) return inFlight\n\n const creation = (async (): Promise<string | undefined> => {\n const opts = await getCartGraphQLOptions(sponsorId)\n // Never create a backend cart with the wrong key — a cart signed with\n // the host apiKey is orphaned once the sponsor key resolves later.\n if (!opts.sponsorResolved) {\n this.emitError(`no commerce key resolved for sponsor ${sponsorId} — cart not synced`)\n return undefined\n }\n const customerSessionId = getCustomerSessionId()\n try {\n const backendCart = await gqlCreateCart(\n customerSessionId,\n activeCurrency,\n activeCountry,\n opts,\n )\n if (backendCart?.cart_id) {\n cart.cartId = backendCart.cart_id\n if (Array.isArray(backendCart.line_items) && backendCart.line_items.length > 0) {\n this.updateFromBackendCart(sponsorId, backendCart)\n } else {\n // Fresh backend cart (no lines yet) — adopt the meta only. Calling\n // updateFromBackendCart here would wipe the optimistic local items.\n if (backendCart.currency) cart.currency = backendCart.currency\n if (backendCart.shipping_country) cart.shippingCountry = backendCart.shipping_country\n if (backendCart.subtotal != null) cart.subtotal = backendCart.subtotal\n if (backendCart.shipping != null) cart.shipping = backendCart.shipping\n if (backendCart.available_shipping_countries) {\n cart.availableShippingCountries = backendCart.available_shipping_countries\n }\n this.persist()\n this.emit()\n }\n }\n } catch (err) {\n this.emitError('createCart failed', err)\n }\n return cart.cartId\n })().finally(() => {\n this.cartIdPromises.delete(sponsorId)\n })\n\n this.cartIdPromises.set(sponsorId, creation)\n return creation\n }\n\n /** Overwrite local cart state with the backend cart response (source of truth). */\n updateFromBackendCart(\n sponsorId: number,\n backendCart: {\n cart_id?: string\n currency?: string\n shipping_country?: string\n subtotal?: number\n shipping?: number\n available_shipping_countries?: string[]\n line_items?: Array<{\n id: string\n product_id: number\n variant_id?: number | string | null\n variant_title?: string | null\n brand?: string | null\n title?: string | null\n quantity: number\n image?: string | { url?: string } | null\n imageUrl?: string | null\n image_url?: string | null\n price?: {\n amount?: number\n amount_incl_taxes?: number | null\n currency_code?: string\n } | null\n shipping?: unknown\n available_shippings?: unknown[]\n }>\n },\n ): void {\n const cart = this.cartsBySponsor.get(sponsorId)\n if (!cart) return\n if (backendCart.cart_id) cart.cartId = backendCart.cart_id\n if (backendCart.currency) cart.currency = backendCart.currency\n if (backendCart.shipping_country) cart.shippingCountry = backendCart.shipping_country\n if (backendCart.subtotal != null) cart.subtotal = backendCart.subtotal\n if (backendCart.shipping != null) cart.shipping = backendCart.shipping\n if (backendCart.available_shipping_countries) {\n cart.availableShippingCountries = backendCart.available_shipping_countries\n }\n\n if (Array.isArray(backendCart.line_items)) {\n const existingItems = cart.items || []\n if (backendCart.line_items.length === 0 && existingItems.length > 0) {\n // Backend says empty while we have optimistic local lines (add still\n // in flight) — keep the local view; a later sync will reconcile.\n this.persist()\n this.emit()\n return\n }\n cart.items = backendCart.line_items.map((li): CartLineItem => {\n const urlFromBackend =\n (typeof li.image === 'string' ? li.image : li.image?.url) ||\n li.imageUrl ||\n li.image_url ||\n ''\n // Match the backend line to a local one to preserve display fields the\n // backend may omit (image, brand, name, price).\n const matchedLocal = existingItems.find((existing) => {\n const p1 = normId(existing.productId)\n const p2 = normId(li.product_id)\n const v1 = normId(existing.variantId)\n const v2 = normId(li.variant_id)\n if (p1 && p2 && p1 === p2 && v1 === v2) return true\n if (v1 && v2 && v1 === v2) return true\n if (p1 && p2 && p1 === p2 && !v1 && !v2) return true\n const n1 = (existing.name || '').trim().toLowerCase()\n const n2 = (li.title || '').trim().toLowerCase()\n if (n1 && n2 && n1 === n2 && v1 === v2) return true\n return false\n })\n const imageUrl = urlFromBackend || matchedLocal?.imageUrl || ''\n\n return {\n id: li.id,\n cartItemId: li.id,\n productId: li.product_id,\n sponsorId,\n variantId: li.variant_id != null ? Number(li.variant_id) : undefined,\n brand: li.brand || matchedLocal?.brand || '',\n name: li.title\n ? li.variant_title\n ? `${li.title} — ${li.variant_title}`\n : li.title\n : matchedLocal?.name || '',\n unitPrice: li.price?.amount_incl_taxes ?? li.price?.amount ?? matchedLocal?.unitPrice ?? 0,\n currency: li.price?.currency_code || backendCart.currency || matchedLocal?.currency || 'NOK',\n imageUrl,\n quantity: li.quantity,\n shipping: li.shipping,\n availableShippings: li.available_shippings,\n }\n })\n }\n this.persist()\n this.emit()\n\n // Replay quantity intents recorded while the line had no backend id yet.\n if (this.pendingQtyIntents.size > 0) {\n const currentCart = this.cartsBySponsor.get(sponsorId)\n for (const [key, qty] of [...this.pendingQtyIntents]) {\n const line = currentCart?.items.find(\n (i) => this.intentKey(i.productId, i.variantId) === key && i.cartItemId,\n )\n if (line) {\n this.pendingQtyIntents.delete(key)\n if (line.quantity !== qty) {\n this.updateQuantity(line.cartItemId!, sponsorId, qty)\n }\n }\n }\n }\n }\n\n // MARK: - Mutations\n\n /** Add a Product DTO to a sponsor's cart. Bumps quantity if already present.\n * When a variantId is given, the line uses the VARIANT's price / image / title\n * (not the product base), so different combinations are priced correctly. */\n addProduct(opts: AddProductOptions): CartLineItem {\n const variant =\n opts.variantId != null\n ? opts.product.variants?.find((v) => v.id === opts.variantId)\n : undefined\n const price = variant?.price ?? opts.product.price\n // Tax-inclusive is the consumer-facing price; `amount` is the fallback.\n const unitPrice = price.amount_incl_taxes ?? price.amount ?? 0\n const imageUrl = variant?.images?.[0]?.url || primaryImageUrl(opts.product) || ''\n const name = variant?.title\n ? `${opts.product.title} — ${variant.title}`\n : opts.product.title\n return this.addManual({\n productId: opts.product.id,\n sponsorId: opts.sponsorId,\n sponsorName: opts.sponsorName,\n brand: opts.product.brand ?? '',\n name,\n unitPrice,\n currency: price.currency_code,\n imageUrl,\n quantity: opts.quantity,\n variantId: opts.variantId,\n })\n }\n\n /** Add a manually-specified line item (no Product DTO). */\n addManual(opts: AddManualOptions): CartLineItem {\n const qty = Math.max(1, opts.quantity ?? 1)\n let cart = this.cartsBySponsor.get(opts.sponsorId)\n if (!cart) {\n cart = {\n sponsorId: opts.sponsorId,\n sponsorName: opts.sponsorName,\n items: [],\n currency: opts.currency,\n }\n this.cartsBySponsor.set(opts.sponsorId, cart)\n } else if (opts.sponsorName && !cart.sponsorName) {\n cart.sponsorName = opts.sponsorName\n }\n\n // Robust dedupe: backend-synced lines may carry ids as strings / omit\n // fields, so match on normalised product+variant ids with a name fallback.\n const existing = cart.items.find((i) => {\n const p1 = normId(i.productId)\n const p2 = normId(opts.productId)\n const v1 = normId(i.variantId)\n const v2 = normId(opts.variantId)\n if (p1 && p2 && p1 === p2 && v1 === v2) return true\n if (v1 && v2 && v1 === v2) return true\n if (p1 && p2 && p1 === p2 && !v1 && !v2) return true\n const n1 = (i.name || '').trim().toLowerCase()\n const n2 = (opts.name || '').trim().toLowerCase()\n if (n1 && n2 && n1 === n2 && v1 === v2) return true\n return false\n })\n if (existing) {\n existing.quantity += qty\n } else {\n const item: CartLineItem = {\n id: lineId(),\n productId: opts.productId,\n sponsorId: opts.sponsorId,\n variantId: opts.variantId,\n brand: opts.brand,\n name: opts.name,\n unitPrice: opts.unitPrice,\n currency: opts.currency,\n imageUrl: opts.imageUrl,\n quantity: qty,\n }\n cart.items.push(item)\n }\n this.persist()\n this.emit()\n\n const addedItem = existing ?? cart.items[cart.items.length - 1]!\n const addedLineId = addedItem.id\n\n // Async sync with the backend cart. Optimistic — but a REJECTED AddItem\n // reverts the local line (a ghost line means the UI total and the charged\n // total diverge silently).\n const seq = this.nextSeq(opts.sponsorId)\n const mutation = (async () => {\n try {\n const cartId = await this.ensureCartId(opts.sponsorId, opts.currency || undefined)\n if (cartId) {\n const gqlOpts = await getCartGraphQLOptions(opts.sponsorId)\n const lineItemsInput = [\n {\n product_id: Number(opts.productId || 0),\n quantity: qty,\n variant_id: opts.variantId != null ? Number(opts.variantId) : null,\n },\n ]\n const resCart = await gqlAddItem(cartId, lineItemsInput, gqlOpts)\n if (resCart && Array.isArray(resCart.line_items)) {\n this.applyBackendCart(opts.sponsorId, resCart, seq)\n }\n }\n // No cartId (no commerce key): the cart stays local-only; checkout is\n // blocked upstream, so no ghost-charge risk.\n } catch (err) {\n // Revert the optimistic add — subtract what THIS add contributed.\n const c = this.cartsBySponsor.get(opts.sponsorId)\n const line = c?.items.find((i) => i.id === addedLineId)\n if (c && line) {\n line.quantity -= qty\n if (line.quantity <= 0) c.items = c.items.filter((i) => i !== line)\n if (c.items.length === 0) this.cartsBySponsor.delete(opts.sponsorId)\n this.persist()\n this.emit()\n }\n this.emitError('AddItem rejected by the backend — item removed from the cart', err)\n }\n })()\n this.inFlightMutations.set(opts.sponsorId, mutation)\n void mutation.finally(() => {\n if (this.inFlightMutations.get(opts.sponsorId) === mutation) {\n this.inFlightMutations.delete(opts.sponsorId)\n }\n })\n\n return addedItem\n }\n\n /** Quantity intents for lines whose backend id hasn't arrived yet — replayed\n * when the AddItem response reconciles (keyed by product::variant). */\n private pendingQtyIntents = new Map<string, number>()\n\n private intentKey(productId: unknown, variantId: unknown): string {\n return `${normId(productId)}::${normId(variantId)}`\n }\n\n updateQuantity(lineItemId: string, sponsorId: number, quantity: number): void {\n const cart = this.cartsBySponsor.get(sponsorId)\n if (!cart) return\n const item = cart.items.find((i) => i.id === lineItemId || i.cartItemId === lineItemId)\n if (!item) return\n const targetItemId = item.cartItemId\n if (quantity <= 0) {\n cart.items = cart.items.filter((i) => i !== item)\n } else {\n item.quantity = quantity\n }\n if (cart.items.length === 0) this.cartsBySponsor.delete(sponsorId)\n this.persist()\n this.emit()\n\n if (!cart.cartId) return\n\n // The line hasn't been assigned its backend id yet (AddItem in flight):\n // sending the local id would 404. Record the intent — it's replayed as\n // soon as the reconcile lands.\n if (!targetItemId) {\n this.pendingQtyIntents.set(this.intentKey(item.productId, item.variantId), quantity)\n return\n }\n\n const backendCartId = cart.cartId\n const seq = this.nextSeq(sponsorId)\n const mutation = (async () => {\n try {\n const gqlOpts = await getCartGraphQLOptions(sponsorId)\n const resCart =\n quantity <= 0\n ? await gqlDeleteItem(backendCartId, targetItemId, gqlOpts)\n : await gqlUpdateItem(backendCartId, targetItemId, null, quantity, gqlOpts)\n if (resCart && Array.isArray(resCart.line_items)) {\n this.applyBackendCart(sponsorId, resCart, seq)\n }\n } catch (err) {\n this.emitError('Update/DeleteItem failed — cart re-synced from backend', err)\n void this.fetchCartFromBackend(sponsorId)\n }\n })()\n this.inFlightMutations.set(sponsorId, mutation)\n void mutation.finally(() => {\n if (this.inFlightMutations.get(sponsorId) === mutation) {\n this.inFlightMutations.delete(sponsorId)\n }\n })\n }\n\n removeItem(lineItemId: string, sponsorId: number): void {\n this.updateQuantity(lineItemId, sponsorId, 0)\n }\n\n clearSponsorCart(sponsorId: number): void {\n if (this.cartsBySponsor.delete(sponsorId)) {\n this.persist()\n this.emit()\n }\n }\n\n clearAllCarts(): void {\n if (this.cartsBySponsor.size === 0) return\n this.cartsBySponsor.clear()\n this.persist()\n this.emit()\n }\n\n /** Refresh the local cart from the backend (source of truth). */\n async fetchCartFromBackend(sponsorId: number): Promise<unknown> {\n const cart = this.cartsBySponsor.get(sponsorId)\n if (!cart?.cartId) return null\n const gqlOpts = await getCartGraphQLOptions(sponsorId)\n const resCart = await gqlGetCart(cart.cartId, gqlOpts)\n if (resCart) this.updateFromBackendCart(sponsorId, resCart)\n return resCart\n }\n\n /** Line items grouped by supplier (shipping is per-supplier server-side). */\n async fetchLineItemsBySupplier(sponsorId: number): Promise<unknown> {\n const cart = this.cartsBySponsor.get(sponsorId)\n if (!cart?.cartId) return null\n const gqlOpts = await getCartGraphQLOptions(sponsorId)\n return gqlGetLineItemsBySupplier(cart.cartId, gqlOpts)\n }\n\n /** Set the chosen shipping option per supplier on the backend cart. */\n async updateShippingsBySupplier(\n sponsorId: number,\n data: Array<{ shipping_id: string; supplier_id: number }>,\n ): Promise<unknown> {\n const cart = this.cartsBySponsor.get(sponsorId)\n if (!cart?.cartId) return null\n const gqlOpts = await getCartGraphQLOptions(sponsorId)\n const resCart = await gqlUpdateShippingsBySupplier(cart.cartId, data, gqlOpts)\n if (resCart && Array.isArray(resCart.line_items)) {\n this.updateFromBackendCart(sponsorId, resCart)\n }\n return resCart\n }\n\n // MARK: - Read accessors\n\n getAllCarts(): Map<number, SponsorCartState> {\n return new Map(this.cartsBySponsor)\n }\n\n getCart(sponsorId: number): SponsorCartState | undefined {\n return this.cartsBySponsor.get(sponsorId)\n }\n\n get itemCount(): number {\n let count = 0\n for (const cart of this.cartsBySponsor.values()) {\n for (const item of cart.items) count += item.quantity\n }\n return count\n }\n\n subtotalForSponsor(sponsorId: number): number {\n const cart = this.cartsBySponsor.get(sponsorId)\n if (!cart) return 0\n return cart.items.reduce((sum, i) => sum + i.unitPrice * i.quantity, 0)\n }\n\n get totalAcrossSponsors(): number {\n let sum = 0\n for (const cart of this.cartsBySponsor.values()) {\n for (const item of cart.items) sum += item.unitPrice * item.quantity\n }\n return sum\n }\n\n get primaryCurrency(): string {\n for (const cart of this.cartsBySponsor.values()) return cart.currency\n return 'NOK'\n }\n\n formatTotal(): string {\n return formatPrice(this.totalAcrossSponsors, this.primaryCurrency)\n }\n\n // MARK: - Persistence\n\n private persist(): void {\n if (typeof localStorage === 'undefined') return\n try {\n const obj: Record<string, SponsorCartState> = {}\n for (const [k, v] of this.cartsBySponsor) obj[String(k)] = v\n localStorage.setItem(STORAGE_KEY, JSON.stringify(obj))\n } catch {\n // Ignore quota / privacy errors.\n }\n }\n\n private loadFromStorage(): Map<number, SponsorCartState> {\n if (typeof localStorage === 'undefined') return new Map()\n try {\n const raw = localStorage.getItem(STORAGE_KEY)\n if (!raw) return new Map()\n const obj = JSON.parse(raw) as Record<string, SponsorCartState>\n const map = new Map<number, SponsorCartState>()\n for (const [k, v] of Object.entries(obj)) {\n const id = parseInt(k, 10)\n if (!Number.isNaN(id) && v && Array.isArray(v.items)) map.set(id, v)\n }\n return map\n } catch {\n return new Map()\n }\n }\n\n private emit(): void {\n const detail: CartChangeDetail = {\n cartsBySponsor: this.getAllCarts(),\n itemCount: this.itemCount,\n }\n this.dispatchEvent(new CustomEvent<CartChangeDetail>('change', { detail }))\n }\n}\n","/**\n * Apple Pay on the Web — via Stripe Payment Request API.\n *\n * Architecture decision (matches iOS Vio SDK pattern):\n * - One Stripe **publishable key** for the Vio platform (global, set\n * via `Vio.init({ stripePublishableKey })`).\n * - One **Stripe Connect account id** per sponsor — sourced from\n * `Vio.bootstrap()` response. Without it, the payment lands on the\n * platform account instead of the merchant.\n *\n * Apple Pay on the Web prerequisites (Stripe-managed for us):\n * - Stripe Connect account is enabled for Apple Pay\n * - Domain registration for Apple Pay (Stripe handles via Dashboard)\n * - Safari + macOS/iOS device with Apple Pay configured\n *\n * In Chrome / non-Apple browsers `canMakePayment()` returns null, so the\n * UI hides the Apple Pay button automatically.\n */\n\nconst STRIPE_JS_URL = 'https://js.stripe.com/v3'\n\nexport interface ApplePayConfig {\n /** Stripe platform publishable key (pk_live_xxx or pk_test_xxx). */\n publishableKey: string\n /** Sponsor's Stripe Connect account (acct_xxx). Optional but recommended. */\n connectedAccount?: string\n /** Amount in the smallest unit of the currency (e.g. øre for NOK, cents for USD). */\n amount: number\n /** ISO currency code, lowercased internally for Stripe. */\n currency: string\n /** Two-letter country code, e.g. \"NO\". */\n country: string\n /** Label shown in the Apple Pay sheet (merchant or order name). */\n label: string\n /** Whether to ask the user for payer name. */\n requestPayerName?: boolean\n /** Whether to ask the user for payer email. */\n requestPayerEmail?: boolean\n /** Whether to ask for shipping address. */\n requestShipping?: boolean\n /**\n * Shipping options shown natively in the Apple Pay sheet. `amount` is in the\n * smallest unit (øre). When set, `requestShipping` is forced on and the sheet\n * total = `amount` (items) + the selected option; switching options updates\n * the total live (Apple Pay native shipping).\n */\n shippingOptions?: Array<{ id: string; label: string; detail?: string; amount: number }>\n /**\n * Charge hook, run INSIDE the sheet's authorize event with the tokenized\n * payment. Must perform the real (backend) charge and throw on failure —\n * only then does the sheet close with success; a throw closes it with\n * failure. Its resolved value is surfaced as `ApplePayResult.confirmation`.\n */\n onAuthorize?: (result: ApplePayResult) => Promise<unknown>\n}\n\nexport interface ApplePayResult {\n /** Stripe PaymentMethod id (pm_xxx) — pass to backend to confirm the PaymentIntent. */\n paymentMethodId: string\n payerName?: string\n payerEmail?: string\n payerPhone?: string\n shippingAddress?: {\n line1?: string\n line2?: string\n city?: string\n postal_code?: string\n state?: string\n country?: string\n }\n /** Whatever `onAuthorize` resolved with (e.g. backend order_id/status). */\n confirmation?: unknown\n}\n\nlet stripeJsPromise: Promise<unknown> | null = null\n\n/** Warm the Stripe.js load ahead of time (safe to call anywhere, never throws). */\nexport function preloadStripeJs(): void {\n if (typeof window === 'undefined') return\n void loadStripeJs().catch(() => {})\n}\n\n/** Dynamically load Stripe.js exactly once. */\nfunction loadStripeJs(): Promise<unknown> {\n if (stripeJsPromise) return stripeJsPromise\n if (typeof document === 'undefined') {\n return Promise.reject(new Error('[VioApplePay] Stripe.js requires a browser environment'))\n }\n stripeJsPromise = new Promise<unknown>((resolve, reject) => {\n const w = window as unknown as { Stripe?: unknown }\n if (w.Stripe) {\n resolve(w.Stripe)\n return\n }\n const existing = document.querySelector(\n `script[src^=\"${STRIPE_JS_URL}\"]`,\n ) as HTMLScriptElement | null\n if (existing) {\n existing.addEventListener('load', () => resolve(w.Stripe))\n existing.addEventListener('error', () =>\n reject(new Error('[VioApplePay] Failed to load Stripe.js')),\n )\n return\n }\n const script = document.createElement('script')\n script.src = STRIPE_JS_URL\n script.async = true\n script.addEventListener('load', () => resolve(w.Stripe))\n script.addEventListener('error', () =>\n reject(new Error('[VioApplePay] Failed to load Stripe.js')),\n )\n document.head.appendChild(script)\n })\n return stripeJsPromise\n}\n\ninterface StripeCanMakePaymentResult {\n applePay?: boolean\n googlePay?: boolean\n link?: boolean\n}\n\ninterface StripePaymentRequest {\n canMakePayment(): Promise<StripeCanMakePaymentResult | null>\n show(): void\n on(event: string, handler: (ev: unknown) => void): void\n}\n\ninterface StripeInstance {\n paymentRequest(options: Record<string, unknown>): StripePaymentRequest\n}\n\ntype StripeFactory = (\n publishableKey: string,\n options?: { stripeAccount?: string },\n) => StripeInstance\n\nasync function getStripe(config: ApplePayConfig): Promise<StripeInstance> {\n const Stripe = (await loadStripeJs()) as StripeFactory\n return Stripe(\n config.publishableKey,\n config.connectedAccount ? { stripeAccount: config.connectedAccount } : undefined,\n )\n}\n\nfunction buildRequestOptions(config: ApplePayConfig): Record<string, unknown> {\n const ship = config.shippingOptions\n // With shipping options, the sheet's total = items + the (first/selected) option.\n const preselectedShipping = ship && ship.length > 0 ? ship[0]!.amount : 0\n return {\n country: config.country,\n currency: config.currency.toLowerCase(),\n total: { label: config.label, amount: config.amount + preselectedShipping },\n requestPayerName: config.requestPayerName ?? true,\n requestPayerEmail: config.requestPayerEmail ?? true,\n requestShipping: ship && ship.length > 0 ? true : (config.requestShipping ?? false),\n ...(ship && ship.length > 0 ? { shippingOptions: ship } : {}),\n disableWallets: ['link', 'googlePay'],\n }\n}\n\n/**\n * Check whether Apple Pay is available right now (Safari + supported device\n * + Stripe configured + domain registered).\n *\n * Returns false on any failure path — never throws.\n */\nexport async function checkApplePayAvailability(config: ApplePayConfig): Promise<boolean> {\n if (typeof window === 'undefined') return false\n // Quick precheck — Apple Pay is only on Safari + supported macOS/iOS devices.\n if (typeof (window as unknown as { ApplePaySession?: unknown }).ApplePaySession === 'undefined') {\n return false\n }\n if (!config.publishableKey) return false\n try {\n const stripe = await getStripe(config)\n const pr = stripe.paymentRequest(buildRequestOptions(config))\n const result = await pr.canMakePayment()\n return !!result?.applePay\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioApplePay] availability check failed:', err)\n }\n return false\n }\n}\n\n/**\n * Show the Apple Pay sheet. Resolves with the payment method id (`pm_xxx`)\n * after the user authorises, or rejects on cancel / error.\n *\n * The backend must then confirm a Stripe PaymentIntent with this\n * payment method id (server-side step, not handled here).\n */\nexport async function showApplePaySheet(config: ApplePayConfig): Promise<ApplePayResult | null> {\n if (!config.publishableKey) {\n throw new Error('[VioApplePay] publishableKey is required')\n }\n const stripe = await getStripe(config)\n const pr = stripe.paymentRequest(buildRequestOptions(config))\n const canMake = await pr.canMakePayment()\n if (!canMake?.applePay) {\n throw new Error('[VioApplePay] Apple Pay is not available on this device')\n }\n return new Promise<ApplePayResult | null>((resolve, reject) => {\n let settled = false\n // Apple requires the address-change event to be answered or the sheet stalls.\n pr.on('shippingaddresschange', (raw: unknown) => {\n const ev = raw as { updateWith: (u: Record<string, unknown>) => void }\n ev.updateWith({ status: 'success' })\n })\n pr.on('paymentmethod', (raw: unknown) => {\n const ev = raw as {\n paymentMethod: { id: string }\n payerName?: string\n payerEmail?: string\n payerPhone?: string\n shippingAddress?: ApplePayResult['shippingAddress']\n complete: (status: 'success' | 'fail') => void\n }\n settled = true\n const result: ApplePayResult = {\n paymentMethodId: ev.paymentMethod.id,\n payerName: ev.payerName,\n payerEmail: ev.payerEmail,\n payerPhone: ev.payerPhone,\n shippingAddress: ev.shippingAddress,\n }\n // Fail-closed: the backend charge (onAuthorize) runs BEFORE the sheet\n // closes. Success only if the charge succeeded.\n void (async () => {\n try {\n const confirmation = config.onAuthorize ? await config.onAuthorize(result) : undefined\n ev.complete('success')\n resolve({ ...result, confirmation })\n } catch (err) {\n ev.complete('fail')\n reject(err)\n }\n })()\n })\n pr.on('cancel', () => {\n // User closed the sheet — not an error.\n if (!settled) resolve(null)\n })\n pr.show()\n })\n}\n\nexport interface PreparedApplePay {\n /** True if Apple Pay can be shown (canMakePayment resolved with applePay). */\n available: boolean\n /**\n * Open the Apple Pay sheet. MUST be invoked synchronously from the click\n * handler — the async work (Stripe.js load + canMakePayment) already ran in\n * `prepareApplePay`, so this fires `pr.show()` inside the user gesture. Apple\n * blocks the sheet if `show()` is reached after an `await`.\n */\n show(): Promise<ApplePayResult>\n}\n\n/**\n * Pre-create the Apple Pay PaymentRequest and resolve `canMakePayment()` ahead\n * of the click. Express buttons should call this on load/render, then call the\n * returned `show()` synchronously on tap — preserving the user gesture that\n * Apple requires to open the sheet.\n */\nexport async function prepareApplePay(config: ApplePayConfig): Promise<PreparedApplePay> {\n const unavailable = (msg: string): PreparedApplePay => ({\n available: false,\n show: () => Promise.reject(new Error(msg)),\n })\n if (typeof window === 'undefined' || !config.publishableKey) {\n return unavailable('[VioApplePay] unavailable')\n }\n if (typeof (window as unknown as { ApplePaySession?: unknown }).ApplePaySession === 'undefined') {\n return unavailable('[VioApplePay] ApplePaySession not available')\n }\n try {\n const stripe = await getStripe(config)\n const pr = stripe.paymentRequest(buildRequestOptions(config))\n // Recompute the total live when the user switches shipping option in the\n // Apple Pay sheet: total = items (config.amount) + chosen option amount.\n if (config.shippingOptions && config.shippingOptions.length > 0) {\n pr.on('shippingoptionchange', (raw: unknown) => {\n const ev = raw as {\n shippingOption?: { id?: string }\n updateWith: (u: Record<string, unknown>) => void\n }\n const opt = config.shippingOptions?.find((o) => o.id === ev.shippingOption?.id)\n ev.updateWith({\n status: 'success',\n total: { label: config.label, amount: config.amount + (opt?.amount ?? 0) },\n })\n })\n }\n pr.on('shippingaddresschange', (raw: unknown) => {\n const ev = raw as { updateWith: (u: Record<string, unknown>) => void }\n ev.updateWith({ status: 'success' })\n })\n const result = await pr.canMakePayment()\n if (!result?.applePay) return unavailable('[VioApplePay] Apple Pay not available')\n return {\n available: true,\n show(): Promise<ApplePayResult> {\n return new Promise<ApplePayResult>((resolve, reject) => {\n let settled = false\n pr.on('paymentmethod', (raw: unknown) => {\n const ev = raw as {\n paymentMethod: { id: string }\n payerName?: string\n payerEmail?: string\n payerPhone?: string\n shippingAddress?: ApplePayResult['shippingAddress']\n complete: (status: 'success' | 'fail') => void\n }\n settled = true\n const res: ApplePayResult = {\n paymentMethodId: ev.paymentMethod.id,\n payerName: ev.payerName,\n payerEmail: ev.payerEmail,\n payerPhone: ev.payerPhone,\n shippingAddress: ev.shippingAddress,\n }\n void (async () => {\n try {\n const confirmation = config.onAuthorize ? await config.onAuthorize(res) : undefined\n ev.complete('success')\n resolve({ ...res, confirmation })\n } catch (err) {\n ev.complete('fail')\n reject(err)\n }\n })()\n })\n pr.on('cancel', () => {\n if (!settled) reject(new Error('[VioApplePay] User cancelled Apple Pay'))\n })\n pr.show() // synchronous — must run inside the click gesture\n })\n },\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioApplePay] prepare failed:', err)\n }\n return unavailable('[VioApplePay] prepare failed')\n }\n}\n","/**\n * Klarna Express Checkout (KEC) — via the Klarna Web SDK v2.\n *\n * Frontend half of the flow (the only half that runs client-side):\n * 1. Load the Klarna Web SDK ESM module from Klarna's CDN.\n * 2. `KlarnaSDK({ clientId, products: ['PAYMENT'] })` → SDK instance.\n * 3. `Klarna.Payment.button({ paymentRequest, initiationMode })` → button.\n * 4. `button.mount(container)` renders the express button.\n * 5. User taps it → Klarna popup → on success the SDK yields an\n * **authorization token**.\n *\n * The authorization token is NOT an order. The merchant **backend** must\n * exchange it for an order against the Klarna Payments API\n * (`POST /payments/v1/authorizations/{token}/order`, Basic auth with the\n * server-side Klarna API key). That step needs secret credentials and is\n * intentionally out of this client module — we surface the token via\n * `onAuthorize` and let the host (or, later, vio-backend) create the order.\n *\n * Verified against Klarna Web SDK v2 docs (module URL, KlarnaSDK init,\n * Payment.button().mount(), authorization-token result). The exact\n * authorize *event name* varies by SDK minor version, so the subscription\n * below is defensive — it normalises across the documented shapes.\n *\n * Prerequisites (merchant-configured, like Stripe domain reg for Apple Pay):\n * - Klarna merchant account + a **Client Identifier** (Merchant Portal →\n * Payment settings → Client Identifiers).\n * - The integration domain registered under \"Allowed Origins\".\n * - A server-side Klarna API key for the order-creation step (backend).\n */\n\nimport { getGlobalLocale } from '../../types.js'\n\n/** Klarna Web SDK v2 ESM module (loaded from Klarna's CDN at runtime). */\nexport const KLARNA_SDK_URL = 'https://js.klarna.com/web-sdk/v2/klarna.mjs'\n\n/** One line in the express button's purchase data. Amounts in MINOR units. */\nexport interface KlarnaLineItem {\n name: string\n quantity: number\n /** Line total (unitPrice × quantity), minor units (e.g. øre for NOK). */\n totalAmount: number\n /** Per-unit price, minor units. Optional. */\n unitPrice?: number\n /** Merchant SKU / product reference. Optional. */\n reference?: string\n /** Absolute image URL. Optional. */\n imageUrl?: string\n}\n\n/** Payment request handed to the KEC button. Amounts in MINOR units. */\nexport interface KlarnaPaymentRequestData {\n /** ISO currency code (e.g. \"NOK\"). */\n currency: string\n /** Order total in minor units. */\n amount: number\n /** Line items — shown in the Klarna sheet. */\n supplementaryPurchaseData?: { lineItems: KlarnaLineItem[] }\n}\n\nexport interface KlarnaConfig {\n /** Klarna Client Identifier (public-safe — fine in client bundles). */\n clientId: string\n /** Optional BCP-47 locale, e.g. \"nb-NO\". */\n locale?: string\n /**\n * Klarna environment. `playground` = sandbox (test orders, \"TEST DRIVE\"\n * badge, no real money). `production` = live. Defaults to the SDK's own\n * default when omitted. The clientId must be generated for the matching\n * environment in the Klarna Merchant Portal.\n */\n environment?: 'playground' | 'production'\n}\n\nexport interface KlarnaAuthorizeResult {\n /** Authorization token — backend exchanges it for an order. */\n authorizationToken: string\n /** Klarna may require a finalize step (multistep flows). */\n finalizeRequired?: boolean\n /** Raw payload from the SDK, for debugging / forward-compat. */\n raw?: unknown\n}\n\nexport interface KlarnaButtonHandle {\n unmount(): void\n}\n\n// ── Minimal structural typings for the runtime-loaded SDK ────────────────\n// We don't ship Klarna's .d.ts; the SDK is fetched at runtime, so these are\n// just enough to call it type-safely.\n\ninterface KlarnaButtonInstance {\n mount(container: string | HTMLElement): KlarnaButtonInstance\n unmount(): KlarnaButtonInstance\n on(event: string, cb: (...args: unknown[]) => unknown): KlarnaButtonInstance\n}\n\ninterface KlarnaPaymentNamespace {\n button(config: Record<string, unknown>): KlarnaButtonInstance\n /**\n * Opens the Klarna flow. Takes a callback that returns the payment-request\n * data (or a Promise of it). Must be invoked synchronously from the\n * button's `click` handler so the popup keeps the user gesture. Resolves\n * with the authorization result once the user completes the popup.\n */\n initiate(resolvePaymentRequest: () => unknown): Promise<unknown>\n on?(event: string, cb: (...args: unknown[]) => unknown): unknown\n}\n\ninterface KlarnaSdkInstance {\n Payment: KlarnaPaymentNamespace\n}\n\ntype KlarnaSdkFactory = (config: Record<string, unknown>) => Promise<KlarnaSdkInstance>\n\n// Memoise the SDK instance per clientId so re-opening checkout reuses it.\nconst sdkCache = new Map<string, Promise<KlarnaSdkInstance>>()\n\nfunction loadKlarnaSdk(config: KlarnaConfig): Promise<KlarnaSdkInstance> {\n if (typeof window === 'undefined') {\n return Promise.reject(new Error('[VioKlarna] requires a browser environment'))\n }\n if (!config.clientId) {\n return Promise.reject(new Error('[VioKlarna] clientId is required'))\n }\n // Key the cache by clientId + environment so switching env re-inits.\n const cacheKey = `${config.clientId}:${config.environment ?? 'default'}`\n const cached = sdkCache.get(cacheKey)\n if (cached) return cached\n\n // Dynamic import of an absolute CDN URL. `@vite-ignore` stops the bundler\n // from trying to resolve/inline it — it stays a runtime fetch.\n const url = KLARNA_SDK_URL\n const promise = import(/* @vite-ignore */ url)\n .then((mod: { KlarnaSDK?: KlarnaSdkFactory; default?: KlarnaSdkFactory }) => {\n const factory = mod.KlarnaSDK ?? mod.default\n if (typeof factory !== 'function') {\n throw new Error('[VioKlarna] KlarnaSDK factory not found in module')\n }\n return factory({\n clientId: config.clientId,\n products: ['PAYMENT'],\n ...(config.locale ? { locale: config.locale } : {}),\n ...(config.environment ? { environment: config.environment } : {}),\n })\n })\n .catch((err) => {\n // Don't poison the cache on failure — allow a later retry.\n sdkCache.delete(cacheKey)\n throw err\n })\n sdkCache.set(cacheKey, promise)\n return promise\n}\n\n/**\n * True if Klarna Express can be offered right now (clientId set + SDK loads).\n * Never throws — returns false on any failure path (mirrors Apple Pay).\n */\nexport async function isKlarnaAvailable(config: KlarnaConfig): Promise<boolean> {\n if (typeof window === 'undefined' || !config.clientId) return false\n try {\n await loadKlarnaSdk(config)\n return true\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioKlarna] availability check failed:', err)\n }\n return false\n }\n}\n\n/** Recursively search a result object for an authorization token. */\nfunction findAuthToken(value: unknown, depth = 0): string | undefined {\n if (!value || depth > 4 || typeof value !== 'object') return undefined\n const o = value as Record<string, unknown>\n for (const key of ['authorizationToken', 'authorization_token', 'authToken']) {\n if (typeof o[key] === 'string' && (o[key] as string).length > 0) return o[key] as string\n }\n for (const k of Object.keys(o)) {\n const found = findAuthToken(o[k], depth + 1)\n if (found) return found\n }\n return undefined\n}\n\n/**\n * Build + mount the Klarna Express button into `container`.\n *\n * Flow (Klarna Web SDK v2): the button's `click` handler **synchronously**\n * calls `Klarna.Payment.initiate(cb)` — `cb` returns the payment-request\n * data. That call opens the Klarna popup (the synchronous call preserves the\n * user gesture). The returned Promise resolves with the authorization result\n * once the user completes the popup; we pull the authorization token out and\n * hand it to `onAuthorize`. The token is NOT an order — the backend creates\n * the order from it.\n */\nexport async function mountKlarnaExpressButton(opts: {\n config: KlarnaConfig\n container: HTMLElement\n paymentRequest: KlarnaPaymentRequestData\n /** URL Klarna returns to after a redirect-based completion. Required by KEC. */\n returnUrl?: string\n /**\n * sessionStorage key + payload to persist BEFORE launching. On a redirect\n * completion the page reloads (the initiate() promise is lost), so the\n * resume handler reads this back to recreate the order. Survives the\n * cross-origin redirect because sessionStorage is per-tab.\n */\n pendingKey?: string\n pendingContext?: unknown\n onAuthorize: (result: KlarnaAuthorizeResult) => void\n onError?: (err: unknown) => void\n}): Promise<KlarnaButtonHandle> {\n const sdk = await loadKlarnaSdk(opts.config)\n\n const button = sdk.Payment.button({\n id: 'vio-klarna-express',\n // `PAY` = one-time purchase (vs BUY/SUBSCRIBE). Must be an array.\n intents: ['PAY'],\n // initiationMode belongs on the BUTTON config (per Klarna Web SDK docs),\n // NOT inside the initiate() data — when set only in initiate() the SDK\n // falls back to its default (DEVICE_BEST → desktop popup), which opened\n // and closed without completing. Forcing REDIRECT here makes the click do\n // a full-page navigation to Klarna's hosted journey, returning via\n // `returnUrl` (recovered by resumeKlarnaReturn()).\n initiationMode: 'REDIRECT',\n })\n\n // Clean origin+path (no existing query/hash) so Klarna's appended result\n // params land on a predictable URL the resume handler can parse.\n const returnUrl =\n opts.returnUrl ??\n (typeof window !== 'undefined'\n ? window.location.origin + window.location.pathname\n : '')\n\n let settled = false\n button.on('click', () => {\n // Persist the pending order so a REDIRECT completion (page reloads, this\n // promise never resolves) can be recovered on the return page.\n if (opts.pendingKey && opts.pendingContext && typeof sessionStorage !== 'undefined') {\n try {\n sessionStorage.setItem(opts.pendingKey, JSON.stringify(opts.pendingContext))\n } catch {\n /* storage unavailable — popup mode still works via the promise */\n }\n }\n // initiate() MUST be called synchronously here — going async first would\n // drop the user-gesture and the browser would block the popup.\n const promise = sdk.Payment.initiate(() => ({\n currency: opts.paymentRequest.currency,\n paymentAmount: opts.paymentRequest.amount,\n intents: ['PAY'],\n locale: getGlobalLocale(),\n // REDIRECT = full-page navigation to Klarna's hosted journey, then back\n // to `returnUrl` with the result. We force this (vs DEVICE_BEST's desktop\n // popup) because the popup proved unreliable here — it opened and closed\n // without completing. The redirect flow has no popup-blocker / window-\n // messaging failure modes; the return is recovered via resumeKlarnaReturn().\n initiationMode: 'REDIRECT',\n returnUrl,\n ...(opts.paymentRequest.supplementaryPurchaseData\n ? { supplementaryPurchaseData: opts.paymentRequest.supplementaryPurchaseData }\n : {}),\n }))\n\n Promise.resolve(promise)\n .then((result) => {\n if (settled) return\n const token = findAuthToken(result)\n if (token) {\n settled = true\n opts.onAuthorize({ authorizationToken: token, raw: result })\n } else if (typeof console !== 'undefined') {\n // Resolved without a recognisable token — log so we can map the\n // shape. Don't confirm the order on an ambiguous resolve.\n console.warn('[VioKlarna] authorize resolved without a token:', result)\n }\n })\n .catch((err) => {\n // Reject = user cancelled or a validation/auth error. Not a success.\n opts.onError?.(err)\n })\n\n // Hand the same promise back to the SDK (its contract for the handler).\n return promise\n })\n\n button.mount(opts.container)\n\n return {\n unmount: () => {\n try {\n button.unmount()\n } catch {\n /* already gone */\n }\n },\n }\n}\n\n/**\n * Read a Klarna authorization token from the current URL's query string.\n * Klarna's redirect completion appends it; param name varies, so check the\n * known variants. Returns the token + the param name found (to clean later).\n */\nexport function readKlarnaTokenFromUrl(): { token: string; param: string } | null {\n if (typeof window === 'undefined') return null\n const params = new URLSearchParams(window.location.search)\n for (const name of [\n 'authorization_token',\n 'authorizationToken',\n 'klarna_authorization_token',\n 'vio_klarna_token',\n ]) {\n const v = params.get(name)\n if (v && v.length > 0 && v !== '{klarna.authorization_token}') {\n return { token: v, param: name }\n }\n }\n return null\n}\n\n/** Strip the given query params from the URL without reloading. */\nexport function cleanUrlParams(params: string[]): void {\n if (typeof window === 'undefined' || !window.history?.replaceState) return\n const url = new URL(window.location.href)\n let changed = false\n for (const p of params) {\n if (url.searchParams.has(p)) {\n url.searchParams.delete(p)\n changed = true\n }\n }\n if (changed) window.history.replaceState({}, '', url.toString())\n}\n\n/**\n * Subscribe to the SDK's namespace-level `complete`/`error` events. On a\n * REDIRECT return the SDK resumes its persisted session and fires `complete`\n * with the authorization token — this is how we recover the token when the\n * page reloaded and the initiate() promise was lost.\n *\n * Never throws; logs and resolves even if the SDK can't load.\n */\nexport async function listenForKlarnaCompletion(opts: {\n config: KlarnaConfig\n onComplete: (result: KlarnaAuthorizeResult) => void\n onError?: (err: unknown) => void\n}): Promise<void> {\n let sdk: KlarnaSdkInstance\n try {\n sdk = await loadKlarnaSdk(opts.config)\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioKlarna] resume: SDK load failed:', err)\n }\n return\n }\n let settled = false\n const onComplete = (...args: unknown[]) => {\n if (settled) return\n for (const a of args) {\n const token = findAuthToken(a)\n if (token) {\n settled = true\n opts.onComplete({ authorizationToken: token, raw: a })\n return\n }\n }\n }\n try {\n sdk.Payment.on?.('complete', onComplete)\n } catch {\n /* unsupported */\n }\n try {\n sdk.Payment.on?.('error', (...a: unknown[]) => opts.onError?.(a[0]))\n } catch {\n /* unsupported */\n }\n}\n","/**\n * Klarna Payments — classic widget flow (`kp/lib/v1/api.js`).\n *\n * This is the alternative to KEC (Web SDK v2 button + `initiate` redirect).\n * Instead of a public `clientId` + origin handshake (which 403'd on the\n * `klarnaevt` bridge from localhost), it uses a **server-minted client_token**:\n *\n * 1. Backend creates a Payments session → `client_token` + categories\n * (POST /v2/commerce/klarna/sessions, server-side Basic-auth API key).\n * 2. We load Klarna's widget **inline** (an iframe) into a container via\n * `Klarna.Payments.init({ client_token })` + `Klarna.Payments.load(...)`.\n * 3. The customer picks/fills a method; `Klarna.Payments.authorize(...)`\n * yields an `authorization_token`.\n * 4. Backend exchanges the token for a real order (existing /orders route).\n *\n * No redirect, no popup, no public clientId — so the origin/handshake failure\n * mode simply doesn't apply here.\n */\n\n/** Klarna Payments JS library (classic). Loaded via <script>, sets window.Klarna. */\nexport const KLARNA_KP_LIB_URL = 'https://x.klarnacdn.net/kp/lib/v1/api.js'\n\nexport interface KlarnaPaymentsCategory {\n identifier: string\n name: string\n asset_urls?: { descriptive?: string; standard?: string }\n}\n\n// ── Minimal runtime typings for the <script>-loaded global ────────────────\ninterface KpLoadResult {\n show_form?: boolean\n error?: unknown\n}\ninterface KpAuthorizeResult {\n approved?: boolean\n show_form?: boolean\n authorization_token?: string\n finalize_required?: boolean\n error?: unknown\n}\ninterface KlarnaPaymentsApi {\n init(opts: { client_token: string }): void\n load(\n opts: { container: string | HTMLElement; payment_method_category?: string },\n data: Record<string, unknown>,\n cb?: (res: KpLoadResult) => void,\n ): void\n authorize(\n opts: { payment_method_category?: string; auto_finalize?: boolean },\n data: Record<string, unknown>,\n cb?: (res: KpAuthorizeResult) => void,\n ): void\n /** Debug/lifecycle events — e.g. 'fullscreenOverlayShown'/'fullscreenOverlayHidden'. */\n on?(event: string, cb: () => void): void\n}\ninterface KlarnaGlobal {\n Payments: KlarnaPaymentsApi\n}\n\ndeclare global {\n interface Window {\n Klarna?: KlarnaGlobal\n klarnaAsyncCallback?: () => void\n }\n}\n\nlet kpLoad: Promise<KlarnaGlobal> | null = null\n\n/** Load kp/lib/v1/api.js once; resolves when window.Klarna.Payments is ready. */\nfunction loadKpLib(): Promise<KlarnaGlobal> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return Promise.reject(new Error('[VioKlarnaKP] requires a browser environment'))\n }\n if (window.Klarna?.Payments) return Promise.resolve(window.Klarna)\n if (kpLoad) return kpLoad\n\n kpLoad = new Promise<KlarnaGlobal>((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new Error('[VioKlarnaKP] kp/lib/v1/api.js load timed out')),\n 12000,\n )\n const ready = () => {\n clearTimeout(timer)\n if (window.Klarna?.Payments) resolve(window.Klarna)\n else reject(new Error('[VioKlarnaKP] Klarna global missing after ready'))\n }\n // Klarna invokes window.klarnaAsyncCallback once the lib is initialised.\n const prev = window.klarnaAsyncCallback\n window.klarnaAsyncCallback = () => {\n if (typeof prev === 'function') {\n try {\n prev()\n } catch {\n /* host callback threw — ignore */\n }\n }\n ready()\n }\n\n const existing = document.querySelector<HTMLScriptElement>(\n `script[src=\"${KLARNA_KP_LIB_URL}\"]`,\n )\n if (existing) {\n // Script already in the DOM (e.g. re-open). If Klarna is up, resolve now;\n // otherwise our klarnaAsyncCallback above will fire.\n if (window.Klarna?.Payments) ready()\n } else {\n const s = document.createElement('script')\n s.src = KLARNA_KP_LIB_URL\n s.async = true\n s.onerror = () => {\n clearTimeout(timer)\n kpLoad = null\n reject(new Error('[VioKlarnaKP] failed to load kp/lib/v1/api.js'))\n }\n document.head.appendChild(s)\n }\n }).catch((err) => {\n kpLoad = null // allow retry\n throw err\n })\n\n return kpLoad\n}\n\nexport interface KlarnaPaymentsWidgetInput {\n clientToken: string\n /** Klarna session id (native GraphQL flow) — informational, for callers/logs. */\n sessionId?: string\n categories: KlarnaPaymentsCategory[]\n container: HTMLElement\n /** Category to load first. Defaults to the first available. */\n category?: string\n}\n\nexport interface KlarnaPaymentsWidget {\n /** Categories offered by the session (pay_now / pay_later / pay_over_time). */\n categories: KlarnaPaymentsCategory[]\n /** Currently selected payment_method_category. */\n selected: string\n /** (Re)load the widget for a category into the container. */\n load(category?: string): Promise<{ showForm: boolean }>\n /**\n * Authorize a category. Resolves with the authorization token, rejects on\n * decline/cancel/error. `category` overrides `selected` for this call (and\n * reloads the widget first if it differs) — pass it explicitly rather than\n * relying on `selected` alone, since a caller UI's own state and the\n * widget's internal `selected` can drift. `data` is an optional order-data\n * update (the session already carries the lines; pass billing/extra if\n * available).\n */\n authorize(category?: string, data?: Record<string, unknown>): Promise<string>\n}\n\n/** True if the Klarna Payments lib can load in this environment. */\nexport async function isKlarnaPaymentsAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') return false\n try {\n await loadKpLib()\n return true\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioKlarnaKP] availability check failed:', err)\n }\n return false\n }\n}\n\n/**\n * Init Klarna Payments with a server-minted client_token and mount the widget.\n * Returns a handle to (re)load categories and to authorize.\n */\n/** Pick the direct-payment category (\"Betal nå\") when the session offers one —\n * the demo sells physical goods paid up front, not financing. Ported from\n * Alan's round-5 improvement. */\nexport function findPayNowCategory(categories: KlarnaPaymentsCategory[]): string | null {\n if (!Array.isArray(categories) || categories.length === 0) return null\n const byId = (re: RegExp) => categories.find((c) => c?.identifier && re.test(c.identifier))\n const byName = (re: RegExp) => categories.find((c) => c?.name && re.test(c.name))\n const cat =\n categories.find((c) => c?.identifier === 'pay_now') ??\n byName(/betal\\s*n[åa]|pay\\s*now/i) ??\n byId(/pay_now|direct_debit|direct_bank_transfer|pay_in_full|klarna_pay_now/i) ??\n byName(/direkte|bank|kort|straks|sofort/i) ??\n categories.find((c) => c?.identifier && !/pay_later|pay_over_time|slice_it/.test(c.identifier))\n console.log('findPayNowCategory - Selected: ', cat)\n return cat?.identifier ?? null\n}\n\nexport async function createKlarnaPaymentsWidget(\n input: KlarnaPaymentsWidgetInput,\n): Promise<KlarnaPaymentsWidget> {\n const Klarna = await loadKpLib()\n console.log('[DEBUG Klarna] Initializing Klarna Payments')\n Klarna.Payments.init({ client_token: input.clientToken })\n console.log('[DEBUG Klarna] Klarna Payments initialized')\n Klarna.Payments.on?.('fullscreenOverlayShown', () => {\n console.log('[DEBUG Klarna] FULLSCREEN OVERLAY SHOWN')\n })\n Klarna.Payments.on?.('fullscreenOverlayHidden', () => {\n console.log('[DEBUG Klarna] FULLSCREEN OVERLAY HIDDEN')\n })\n\n let selected =\n input.category ??\n findPayNowCategory(input.categories) ??\n input.categories[0]?.identifier ??\n 'pay_now'\n if (typeof console !== 'undefined') {\n console.log('[VioKlarna] Received payment_method_categories from backend:', input.categories)\n console.log('[VioKlarna] Selected initial payment_method_category:', selected)\n }\n\n const load = (category?: string): Promise<{ showForm: boolean }> => {\n if (category) selected = category\n if (typeof console !== 'undefined') {\n console.log(\n '[VioKlarna] Klarna.Payments.load calling with payment_method_category:',\n selected,\n 'container:',\n input.container,\n )\n }\n // Clear any previously-rendered iframe before reloading a different\n // category — Klarna's widget doesn't always replace its own markup\n // cleanly on a second load() into the same container.\n if (input.container && 'innerHTML' in input.container) {\n input.container.innerHTML = ''\n }\n return new Promise((resolve, reject) => {\n try {\n // 3-arg form per Klarna docs: (options, data, callback). The empty\n // data object is required — a 2-arg call risks the SDK treating the\n // callback as `data` and never invoking it.\n Klarna.Payments.load(\n { container: input.container, payment_method_category: selected },\n {},\n (res) => {\n if (typeof console !== 'undefined') {\n console.log(\n '[VioKlarna] Klarna.Payments.load response for payment_method_category:',\n selected,\n res,\n )\n }\n if (res?.error) reject(res.error)\n else resolve({ showForm: res?.show_form !== false })\n },\n )\n } catch (err) {\n reject(err)\n }\n })\n }\n\n return {\n categories: input.categories,\n get selected() {\n return selected\n },\n load,\n async authorize(category?: string, data?: Record<string, unknown>): Promise<string> {\n const cat = category || selected\n if (typeof console !== 'undefined') {\n console.log('[DEBUG Klarna] BEFORE AUTHORIZE', {\n argumentCategory: category,\n argumentData: data,\n selected,\n resolvedCategory: cat,\n })\n }\n // If the caller asked for a category different from what's currently\n // loaded, reload the widget first — authorizing against a stale\n // `selected` would charge/confirm the wrong payment method category.\n if (cat && cat !== selected) {\n await load(cat)\n }\n const finalData = { payment_method_category: cat, ...(data ?? {}) }\n if (typeof console !== 'undefined') {\n console.log('[DEBUG Klarna] FINAL AUTHORIZE', { cat, selected, finalData })\n }\n return new Promise<string>((resolve, reject) => {\n try {\n if (typeof console !== 'undefined') {\n console.log('[DEBUG Klarna] ABOUT TO CALL AUTHORIZE')\n }\n Klarna.Payments.authorize(\n { payment_method_category: cat, auto_finalize: true },\n finalData,\n (res) => {\n if (typeof console !== 'undefined') {\n console.log('[DEBUG Klarna] RAW AUTHORIZE RESPONSE:', JSON.stringify(res, null, 2))\n }\n if (res?.approved && res.authorization_token) {\n resolve(res.authorization_token)\n } else if (res?.error) {\n reject(res.error)\n } else if (res?.finalize_required) {\n reject(new Error('Klarna requires a finalize step (multistep)'))\n } else {\n // approved:false without an error == user cancelled / declined.\n reject(new Error('Klarna authorization was not approved'))\n }\n },\n )\n if (typeof console !== 'undefined') {\n console.log('[DEBUG Klarna] AUTHORIZE CALL RETURNED')\n }\n } catch (err) {\n reject(err)\n }\n })\n },\n }\n}\n","/**\n * CheckoutManager — orchestrates the checkout flow.\n *\n * Stable contract: open / setAddress / selectPaymentMethod / close.\n * Per-vendor payment integrations plug into the corresponding method:\n * - Apple Pay → `startApplePay()` (Stripe Payment Request, this iteration)\n * - Klarna / Vipps / Card → land in subsequent iterations\n *\n * Dispatches `change` (state changes) and `payment-select` (user picked\n * a method) and `payment-complete` (vendor sheet completed successfully).\n */\n\nimport type { CartLineItem } from '../cart/types.js'\nimport type { CartManager } from '../cart/cart-manager.js'\nimport { Configuration } from '../configuration.js'\nimport {\n checkApplePayAvailability,\n prepareApplePay,\n preloadStripeJs,\n showApplePaySheet,\n type ApplePayResult,\n} from './payments/apple-pay.js'\nimport {\n cleanUrlParams,\n isKlarnaAvailable,\n listenForKlarnaCompletion,\n mountKlarnaExpressButton,\n readKlarnaTokenFromUrl,\n type KlarnaAuthorizeResult,\n type KlarnaButtonHandle,\n type KlarnaLineItem,\n type KlarnaPaymentRequestData,\n} from './payments/klarna.js'\nimport {\n createKlarnaPaymentsWidget,\n isKlarnaPaymentsAvailable,\n type KlarnaPaymentsCategory,\n} from './payments/klarna-payments.js'\nimport {\n createPaymentVipps as gqlCreatePaymentVipps,\n getVippsStatus as gqlGetVippsStatus,\n} from './payments/vipps.js'\nimport {\n confirmPaymentApplePay as gqlConfirmPaymentApplePay,\n createCheckout as gqlCreateCheckout,\n createPaymentApplePay as gqlCreatePaymentApplePay,\n createPaymentStripe as gqlCreatePaymentStripe,\n executeCartGraphQL,\n getAvailablePaymentMethods as gqlGetAvailablePaymentMethods,\n getCartGraphQLOptions,\n getCheckout as gqlGetCheckout,\n getLineItemsBySupplier as gqlGetLineItemsBySupplier,\n updateCheckout as gqlUpdateCheckout,\n updateShippingsBySupplier as gqlUpdateShippingsBySupplier,\n type CartQueryOptions,\n} from '../api/cart-queries.js'\nimport { getGlobalCountryCode, getGlobalCurrency, getGlobalLocale } from '../types.js'\n\n/**\n * Best-effort human-readable string for an unknown thrown/rejected value.\n * Klarna's SDK rejects with plain objects, so `String(err)` would collapse to\n * \"[object Object]\"; we pull a known message field or JSON-serialise so the\n * real reason stays visible.\n */\nfunction describeError(err: unknown): string {\n if (err instanceof Error) return err.message\n if (typeof err === 'string') return err\n if (err && typeof err === 'object') {\n const o = err as Record<string, unknown>\n for (const k of ['message', 'error', 'reason', 'description']) {\n if (typeof o[k] === 'string' && o[k]) return o[k] as string\n }\n try {\n return JSON.stringify(err)\n } catch {\n return String(err)\n }\n }\n return String(err)\n}\n\n/** sessionStorage key for a pending Klarna purchase (survives redirect). */\nconst KLARNA_PENDING_KEY = 'vio.klarna.pending.v1'\n\ninterface KlarnaPendingContext {\n sponsorId: number\n currency: string\n orderAmount: number\n orderLines: Array<{\n name: string\n quantity: number\n unit_price: number\n total_amount: number\n reference?: string\n /** Klarna line type, e.g. \"shipping_fee\". */\n type?: string\n }>\n /** Backend checkout id (native GraphQL flow). */\n checkoutId?: string\n /** Klarna Payments session id (native GraphQL flow). */\n sessionId?: string\n /** Klarna Payments client token (native GraphQL flow). */\n clientToken?: string\n}\n\n/** A shipping option offered in the checkout. `price` in minor units (øre). */\nexport interface KlarnaShippingOption {\n id: string\n method: string\n description: string\n price: number\n tax_amount: number\n tax_rate: number\n preselected: boolean\n /** Backend supplier the option belongs to (server-side shippings). */\n supplierId?: string\n /** Display name from the backend (mirror of `method`). */\n name?: string\n country_code?: string\n /** Price in MAJOR units, as delivered by the backend. */\n priceMajor?: number\n currency?: string\n}\n\n/**\n * Shipping options offered for express purchases. Amounts in minor units (øre).\n * The chosen one is added to the order total + as a `shipping_fee` line so the\n * Klarna order reconciles. (Klarna Payments doesn't render a shipping picker —\n * KCO/KSA would, but the account isn't provisioned — so the picker is ours.)\n */\nexport const KLARNA_SHIPPING_OPTIONS: KlarnaShippingOption[] = [\n {\n id: 'standard',\n method: 'Standard',\n description: '3–5 virkedager',\n price: 4900,\n tax_amount: 0,\n tax_rate: 0,\n preselected: true,\n },\n {\n id: 'express',\n method: 'Express',\n description: '1–2 virkedager',\n price: 9900,\n tax_amount: 0,\n tax_rate: 0,\n preselected: false,\n },\n]\nimport type { CheckoutAddress, CheckoutState, PaymentMethod } from './types.js'\n\n// MARK: - Klarna native (Vio Commerce GraphQL Payment mutations)\n\nconst CREATE_PAYMENT_KLARNA_NATIVE_MUTATION = `\nmutation CreatePaymentKlarnaNative($checkoutId: String!, $countryCode: String, $currency: String, $locale: String, $returnUrl: String, $intent: String, $customer: KlarnaNativeCustomerInput, $billingAddress: KlarnaNativeAddressInput, $shippingAddress: KlarnaNativeAddressInput, $autoCapture: Boolean) {\n Payment {\n CreatePaymentKlarnaNative(checkout_id: $checkoutId, country_code: $countryCode, currency: $currency, locale: $locale, return_url: $returnUrl, intent: $intent, customer: $customer, billing_address: $billingAddress, shipping_address: $shippingAddress, auto_capture: $autoCapture) {\n client_token\n session_id\n purchase_country\n purchase_currency\n cart_id\n checkout_id\n payment_method_categories {\n identifier\n name\n asset_urls {\n descriptive\n standard\n }\n }\n }\n }\n}\n`\n\nconst CONFIRM_PAYMENT_KLARNA_NATIVE_MUTATION = `\nmutation ConfirmPaymentKlarnaNative($checkoutId: String!, $authorizationToken: String!, $autoCapture: Boolean, $billingAddress: KlarnaNativeAddressInput, $shippingAddress: KlarnaNativeAddressInput, $customer: KlarnaNativeCustomerInput) {\n Payment {\n ConfirmPaymentKlarnaNative(checkout_id: $checkoutId, authorization_token: $authorizationToken, auto_capture: $autoCapture, billing_address: $billingAddress, shipping_address: $shippingAddress, customer: $customer) {\n order_id\n checkout_id\n fraud_status\n order {\n order_id\n status\n purchase_country\n purchase_currency\n locale\n billing_address {\n given_name\n family_name\n email\n street_address\n postal_code\n city\n country\n }\n shipping_address {\n given_name\n family_name\n email\n street_address\n postal_code\n city\n country\n }\n order_amount\n order_tax_amount\n total_line_items_price\n order_lines {\n type\n name\n quantity\n unit_price\n tax_rate\n total_amount\n total_discount_amount\n total_tax_amount\n merchant_data\n }\n merchant_urls {\n terms\n checkout\n confirmation\n push\n }\n html_snippet\n started_at\n last_modified_at\n options {\n allow_separate_shipping_address\n date_of_birth_mandatory\n require_validate_callback_success\n phone_mandatory\n auto_capture\n }\n shipping_options {\n id\n name\n price\n tax_amount\n tax_rate\n preselected\n }\n merchant_data\n selected_shipping_option {\n id\n name\n price\n tax_amount\n tax_rate\n preselected\n }\n }\n }\n }\n}\n`\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nfunction buildKlarnaCustomer(address: any): Record<string, unknown> | null {\n if (!address) return null\n return {\n dob: address.dob || address.date_of_birth || null,\n email: address.email || null,\n organization_registration_id:\n address.organization_registration_id || address.org_id || null,\n phone: address.phone || address.telephone || null,\n type: address.type || 'person',\n }\n}\n\nfunction buildKlarnaAddress(address: any): Record<string, unknown> | null {\n if (!address) return null\n return {\n city: address.city || null,\n country: address.country || address.countryCode || getGlobalCountryCode(),\n email: address.email || null,\n family_name:\n address.familyName || address.family_name || address.last_name || address.lastName || null,\n given_name:\n address.givenName || address.given_name || address.first_name || address.firstName || null,\n phone: address.phone || null,\n postal_code: address.postalCode || address.postal_code || address.zip || null,\n region: address.region || address.state || null,\n street_address:\n address.streetAddress ||\n address.street_address ||\n address.address1 ||\n address.street ||\n address.address || // CheckoutAddress uses plain `address` for the street\n null,\n // street_address2 intentionally omitted — the KlarnaNativeAddressInput\n // backend type rejects it.\n }\n}\n\n/** Map any address-ish object to the backend checkout address input shape. */\nfunction buildCheckoutAddress(address: any): Record<string, unknown> | null {\n if (!address) return null\n const firstName =\n address.firstName || address.first_name || address.givenName || address.given_name || null\n const lastName =\n address.lastName || address.last_name || address.familyName || address.family_name || null\n const address1 =\n address.address || address.address1 || address.street || address.street_address || null\n const city = address.city || null\n const zip = address.postalCode || address.postal_code || address.zip || null\n const country_code = address.countryCode || address.country_code || address.country || getGlobalCountryCode()\n\n if (!firstName && !lastName && !address1 && !city && !zip) return null\n\n return {\n first_name: firstName,\n last_name: lastName,\n address1: address1,\n city: city,\n zip: zip,\n country_code: country_code,\n }\n}\n\n/**\n * Klarna/Stripe/Vipps require an https return_url — normalise whatever the\n * page has, optionally appending query params (used to detect the redirect\n * return and show the confirmation).\n */\nfunction resolveHttpsReturnUrl(\n overrideUrl?: string | null,\n params: Record<string, unknown> | null = null,\n): string {\n let url = overrideUrl ?? undefined\n if (!url && typeof window !== 'undefined' && window.location) {\n url = window.location.href\n }\n if (!url || typeof url !== 'string' || url.startsWith('about:') || url.startsWith('file:')) {\n url = 'https://vev.design/checkout/confirmation'\n }\n if (url.startsWith('http://')) {\n url = 'https://' + url.slice(7)\n } else if (!url.startsWith('https://')) {\n url = 'https://' + url.replace(/^[a-zA-Z]+:\\/\\//, '')\n }\n\n if (params && typeof params === 'object') {\n try {\n const parsed = new URL(url)\n Object.keys(params).forEach((k) => {\n if (params[k] !== undefined && params[k] !== null) {\n parsed.searchParams.set(k, String(params[k]))\n }\n })\n return parsed.toString()\n } catch {\n const queryStr = Object.keys(params)\n .filter((k) => params[k] !== undefined && params[k] !== null)\n .map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(String(params[k]))}`)\n .join('&')\n if (queryStr) {\n url += (url.includes('?') ? '&' : '?') + queryStr\n }\n }\n }\n\n return url\n}\n\n/** Execute a Payment.* mutation with the sponsor's commerce key. */\nasync function executeKlarnaGraphQL(\n query: string,\n variables: Record<string, unknown>,\n sponsorId?: number,\n): Promise<any> {\n return executeCartGraphQL(query, variables, await getCartGraphQLOptions(sponsorId))\n}\n\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nexport interface CheckoutChangeDetail {\n state: CheckoutState | null\n}\n\nexport interface PaymentSelectDetail {\n method: PaymentMethod\n state: CheckoutState\n}\n\nexport interface PaymentCompleteDetail {\n method: PaymentMethod\n state: CheckoutState\n result: ApplePayResult | KlarnaAuthorizeResult | unknown\n}\n\nexport interface PaymentErrorDetail {\n method: PaymentMethod\n error: string\n}\n\n/** Handle for the Klarna Payments (classic widget) flow. */\nexport interface KlarnaPaymentsHandle {\n /** Categories offered by the session (pay_now / pay_later / pay_over_time). */\n categories: KlarnaPaymentsCategory[]\n /** Shipping options in effect (backend per-supplier, or the static fallback). */\n shippings: KlarnaShippingOption[]\n /** Currently selected category. */\n readonly selected: string\n /** (Re)load the widget for a category. */\n load(category?: string): Promise<{ showForm: boolean }>\n /** Authorize a category (defaults to whatever's currently selected) and,\n * on approval, create the order. */\n authorize(category?: string): Promise<void>\n /** Tear down the mounted widget. */\n unmount(): void\n}\n\nexport class CheckoutManager extends EventTarget {\n private state: CheckoutState | null = null\n private applePayAvailableCache: boolean | null = null\n\n /** Gateway hints learned from CreatePaymentApplePay (per session). The\n * backend's gateway_merchant_id may be a publishable key (pk_…) or a Stripe\n * Connect account (acct_…) — stored defensively by prefix. */\n private applePayPublishableKey: string | null = null\n private applePayConnectedAccount: string | null = null\n private klarnaAvailableCache: boolean | null = null\n private klarnaOrderInFlight = false\n /** Last backend shippings fetched (per-supplier), for UI reuse. */\n private lastFetchedShippings: KlarnaShippingOption[] = []\n /** Per-sponsor payment methods cache + in-flight dedupe. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private paymentMethodsCache = new Map<number, any>()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private paymentMethodsPromises = new Map<number, Promise<any>>()\n\n constructor(private readonly cartManager: CartManager) {\n super()\n // Warm Stripe.js early: Apple Pay's sheet must open synchronously inside\n // the tap gesture, so the library can't be lazy-loaded at click time.\n preloadStripeJs()\n }\n\n open(sponsorId: number): CheckoutState {\n const cart = this.cartManager.getCart(sponsorId)\n if (!cart || cart.items.length === 0) {\n throw new Error(`[VioCheckout] sponsor ${sponsorId} has no cart items`)\n }\n this.state = {\n sponsorId,\n subtotal: this.cartManager.subtotalForSponsor(sponsorId),\n // Page-level currency wins over whatever the persisted cart carries —\n // the host may have switched currency since the cart was created.\n currency: getGlobalCurrency(),\n }\n this.emit()\n return this.state\n }\n\n close(): void {\n this.state = null\n this.applePayAvailableCache = null\n this.klarnaAvailableCache = null\n this.emit()\n }\n\n // MARK: - Backend checkout (Vio Commerce GraphQL)\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n\n /** Create the backend checkout for the sponsor's cart (auto-accepts terms). */\n async createCheckout(sponsorId: number): Promise<any> {\n const cart = this.cartManager.getCart(sponsorId)\n let cartId = cart?.cartId\n if (!cartId) {\n cartId = await this.cartManager.ensureCartId(sponsorId, cart?.currency)\n if (!cartId) {\n throw new Error(`[CheckoutManager] Failed to obtain cart_id for sponsor ${sponsorId}`)\n }\n }\n const opts = await getCartGraphQLOptions(sponsorId)\n const checkout = await gqlCreateCheckout(cartId, opts)\n if (checkout?.id) {\n this.state = {\n ...(this.state ?? { sponsorId, subtotal: 0, currency: getGlobalCurrency() }),\n sponsorId,\n checkoutId: checkout.id,\n checkout,\n }\n this.emit()\n try {\n const updated = await gqlUpdateCheckout(\n {\n checkoutId: checkout.id,\n buyerAcceptsPurchaseConditions: true,\n buyerAcceptsTermsConditions: true,\n },\n opts,\n )\n if (updated?.id) {\n this.state = { ...this.state, checkout: updated }\n this.emit()\n return updated\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[CheckoutManager] Failed to auto-accept terms & purchase conditions:', err)\n }\n }\n }\n return checkout\n }\n\n /** Update the backend checkout (terms are re-asserted unless overridden). */\n async updateCheckout(variables: Record<string, unknown>, sponsorId?: number): Promise<any> {\n const opts = await getCartGraphQLOptions(sponsorId ?? this.state?.sponsorId)\n const fullVars = {\n buyerAcceptsPurchaseConditions: true,\n buyerAcceptsTermsConditions: true,\n ...variables,\n }\n const updated = await gqlUpdateCheckout(fullVars, opts)\n if (updated?.id && this.state) {\n this.state = { ...this.state, checkoutId: updated.id, checkout: updated }\n this.emit()\n }\n return updated\n }\n\n async getCheckout(checkoutId: string, sponsorId?: number): Promise<any> {\n const opts = await getCartGraphQLOptions(sponsorId ?? this.state?.sponsorId)\n return gqlGetCheckout(checkoutId, opts)\n }\n\n /**\n * Payment methods enabled for the sponsor (backend-configured). Memoised per\n * sponsor with in-flight dedupe — several UI components ask on every open.\n */\n async getAvailablePaymentMethods(sponsorId?: number): Promise<any> {\n const spId = sponsorId ?? this.state?.sponsorId\n if (!spId) return null\n\n if (this.paymentMethodsCache.has(spId)) {\n return this.paymentMethodsCache.get(spId)\n }\n const inFlight = this.paymentMethodsPromises.get(spId)\n if (inFlight) return inFlight\n\n const promise = (async () => {\n try {\n const opts = await getCartGraphQLOptions(spId)\n const res = await gqlGetAvailablePaymentMethods(opts)\n // Never cache empty/failed responses — a transient blip would freeze\n // the payment grid for the whole page session.\n if (res) this.paymentMethodsCache.set(spId, res)\n return res\n } finally {\n this.paymentMethodsPromises.delete(spId)\n }\n })()\n\n this.paymentMethodsPromises.set(spId, promise)\n return promise\n }\n\n clearPaymentMethodsCache(): void {\n this.paymentMethodsCache.clear()\n this.paymentMethodsPromises.clear()\n }\n\n /**\n * Real shipping options from the backend cart (per supplier), mapped to the\n * KlarnaShippingOption shape (minor units). Empty array on failure/no\n * options — Klarna callers use that as-is (no static fallback anymore, see\n * 2026-08-18: it only ever papered over a race, now fixed via\n * `waitForCartMutations`). `KLARNA_SHIPPING_OPTIONS` is still used\n * separately by Apple Pay's synchronous sheet setup, which can't await\n * this at all.\n */\n async fetchAvailableShippings(sponsorId?: number): Promise<KlarnaShippingOption[]> {\n try {\n const spId = sponsorId ?? this.state?.sponsorId\n if (!spId) return []\n // A quick add-then-checkout can race an in-flight AddItem — wait for it\n // to settle so this reads the cart it actually produced, not a stale\n // pre-add snapshot (Alan, 2026-08-18: shippings came back empty this way).\n await this.cartManager.waitForCartMutations(spId)\n const cart = this.cartManager.getCart(spId)\n let cartId = cart?.cartId\n if (!cartId) {\n cartId = await this.cartManager.ensureCartId(spId)\n }\n if (!cartId) return []\n const opts = await getCartGraphQLOptions(spId)\n const supplierGroups = await gqlGetLineItemsBySupplier(cartId, opts)\n const firstGroup = Array.isArray(supplierGroups) ? supplierGroups[0] : null\n const shippings = firstGroup?.available_shippings ?? []\n if (Array.isArray(shippings) && shippings.length > 0) {\n const supplierId = firstGroup?.supplier?.id\n const mapped: KlarnaShippingOption[] = shippings.map((s: any, idx: number) => {\n const priceObj = s.price ?? {}\n const amount =\n typeof priceObj.amount_incl_taxes === 'number'\n ? priceObj.amount_incl_taxes\n : typeof priceObj.amount === 'number'\n ? priceObj.amount\n : 0\n return {\n id: String(s.id),\n supplierId: supplierId != null ? String(supplierId) : undefined,\n method: s.name || 'Default Shipping',\n name: s.name || 'Default Shipping',\n description: s.description || '',\n country_code: s.country_code || 'NO',\n price: Math.round(amount * 100),\n priceMajor: amount,\n currency: priceObj.currency_code || getGlobalCurrency(),\n tax_amount: Math.round((priceObj.tax_amount ?? 0) * 100),\n tax_rate: Math.round((priceObj.tax_rate ?? 0) * 100),\n preselected: idx === 0,\n }\n })\n this.lastFetchedShippings = mapped\n return mapped\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[CheckoutManager] fetchAvailableShippings failed:', err)\n }\n }\n return []\n }\n\n /** Set the chosen shipping per supplier on the backend cart. */\n async updateShippingsBySupplier(\n data: Array<{ shipping_id: string; supplier_id: number }>,\n sponsorId?: number,\n ): Promise<any> {\n const spId = sponsorId ?? this.state?.sponsorId\n if (!spId) return null\n const cart = this.cartManager.getCart(spId)\n if (!cart?.cartId) return null\n const opts = await getCartGraphQLOptions(spId)\n const updated = await gqlUpdateShippingsBySupplier(cart.cartId, data, opts)\n if (updated) {\n this.cartManager.updateFromBackendCart(spId, updated)\n }\n return updated\n }\n\n /**\n * Shared setup for the redirect payment links (Stripe / Vipps): ensure the\n * backend cart + checkout exist, push email/address onto the checkout, and\n * return everything the payment mutation needs.\n */\n private async prepareRedirectPayment(\n sponsorId: number | undefined,\n formData: unknown,\n extraUpdateVars: Record<string, unknown> = {},\n ): Promise<{ spId: number; checkoutId: string; emailVal: string; opts: CartQueryOptions }> {\n const spId = sponsorId ?? this.state?.sponsorId\n if (!spId) throw new Error('[CheckoutManager] no sponsor for payment')\n const cart = this.cartManager.getCart(spId)\n let cartId = cart?.cartId\n if (!cartId) {\n cartId = await this.cartManager.ensureCartId(spId)\n }\n if (!cartId) {\n throw new Error(`[CheckoutManager] Failed to obtain cart_id for sponsor ${spId}`)\n }\n\n const opts = await getCartGraphQLOptions(spId)\n let checkoutId = this.state?.checkoutId\n if (!checkoutId) {\n const checkoutRes = await gqlCreateCheckout(cartId, opts)\n checkoutId = checkoutRes?.id\n }\n if (!checkoutId) {\n throw new Error('[CheckoutManager] no backend checkout — cannot start the payment')\n }\n\n // Vipps collects the address in its own flow — never push one onto the\n // checkout for it (the backend rejects partial Vipps addresses).\n const isVipps = extraUpdateVars?.paymentMethod === 'Vipps'\n const addr =\n typeof formData === 'object' && formData !== null ? formData : this.state?.address\n const addressObj = !isVipps ? buildCheckoutAddress(addr) : null\n const emailVal =\n (typeof formData === 'string'\n ? formData\n : (formData as { email?: string } | undefined)?.email) ||\n this.state?.address?.email ||\n ''\n if (!emailVal || !emailVal.includes('@')) {\n // Never mint a payment link with a fabricated email — the order's\n // receipt/contact would be wrong forever.\n throw new Error('[CheckoutManager] email is required to start the payment')\n }\n\n const updateVars: Record<string, unknown> = {\n checkoutId,\n email: emailVal,\n buyerAcceptsPurchaseConditions: true,\n buyerAcceptsTermsConditions: true,\n ...extraUpdateVars,\n }\n if (addressObj) {\n updateVars.shippingAddress = addressObj\n updateVars.billingAddress = addressObj\n }\n\n try {\n const updated = await gqlUpdateCheckout(updateVars, opts)\n if (updated?.id) {\n this.state = {\n ...(this.state ?? { sponsorId: spId, subtotal: 0, currency: getGlobalCurrency() }),\n sponsorId: spId,\n checkoutId: updated.id,\n checkout: updated,\n }\n this.emit()\n checkoutId = updated.id\n }\n } catch (err) {\n // Redirecting after a failed UpdateCheckout would charge with a stale\n // (or missing) address/email — abort instead.\n throw new Error(\n `[CheckoutManager] could not persist checkout details: ${describeError(err)}`,\n )\n }\n\n // (Narrowing: the assignment inside the try widens the type again.)\n if (!checkoutId) {\n throw new Error('[CheckoutManager] no backend checkout — cannot start the payment')\n }\n return { spId, checkoutId, emailVal, opts }\n }\n\n /** Redirect the top window to a payment provider URL. */\n private static redirectTo(url: string): void {\n if (typeof window === 'undefined') return\n try {\n if (window.top && window.top !== window) {\n window.top.location.href = url\n } else {\n window.location.href = url\n }\n } catch {\n window.open(url, '_top') || window.open(url, '_blank')\n }\n }\n\n /**\n * Stripe payment link: create/refresh the backend checkout, mint the Stripe\n * Checkout URL (CreatePaymentStripe) and redirect. The return URL carries\n * vio_payment/vio_method/checkout_id so the page can show the confirmation.\n */\n async startStripePayment(sponsorId?: number, formData?: unknown): Promise<any> {\n const { spId, checkoutId, emailVal, opts } = await this.prepareRedirectPayment(\n sponsorId,\n formData,\n { paymentMethod: 'Stripe' },\n )\n const successUrl = resolveHttpsReturnUrl(null, {\n vio_payment: 'success',\n vio_method: 'stripe',\n vio_sponsor: spId,\n checkout_id: checkoutId,\n })\n const stripeRes = await gqlCreatePaymentStripe(\n { checkoutId, successUrl, paymentMethod: 'Stripe', email: emailVal },\n opts,\n )\n if (stripeRes?.checkout_url) {\n CheckoutManager.redirectTo(stripeRes.checkout_url)\n return stripeRes\n }\n throw new Error('Stripe payment link generation failed: missing checkout_url')\n }\n\n /**\n * Vipps payment link: same flow as Stripe — CreatePaymentVipps → redirect to\n * payment_url.\n */\n async startVippsPayment(sponsorId?: number, formData?: unknown): Promise<any> {\n const { spId, checkoutId, emailVal, opts } = await this.prepareRedirectPayment(\n sponsorId,\n formData,\n { paymentMethod: 'Vipps' },\n )\n const returnUrl = resolveHttpsReturnUrl(null, {\n vio_payment: 'success',\n vio_method: 'vipps',\n vio_sponsor: spId,\n checkout_id: checkoutId,\n })\n const vippsRes = await gqlCreatePaymentVipps(\n { checkoutId, email: emailVal, returnUrl },\n opts,\n )\n if (vippsRes?.payment_url) {\n CheckoutManager.redirectTo(vippsRes.payment_url)\n return vippsRes\n }\n throw new Error('Vipps payment link generation failed: missing payment_url')\n }\n\n /** Vipps' own payment state for the checkout — see getVippsStatus in\n * cart-queries.ts for why this exists instead of trusting GetCheckout. */\n async getVippsStatus(checkoutId: string, sponsorId?: number): Promise<{ state?: string } | null> {\n const opts = await getCartGraphQLOptions(sponsorId ?? this.state?.sponsorId)\n return gqlGetVippsStatus({ checkoutId }, opts)\n }\n\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n setAddress(address: CheckoutAddress): void {\n if (!this.state) return\n // Immutable update — a fresh object reference so reactive UIs (Lit\n // `@state`, which compares by identity) actually re-render.\n this.state = { ...this.state, address }\n this.emit()\n }\n\n selectPaymentMethod(method: PaymentMethod): void {\n if (!this.state) return\n // New reference (see setAddress) so the selection re-renders.\n this.state = { ...this.state, paymentMethod: method }\n this.emit()\n this.dispatchEvent(\n new CustomEvent<PaymentSelectDetail>('payment-select', {\n detail: { method, state: this.state },\n }),\n )\n }\n\n // MARK: - Apple Pay (Stripe Payment Request)\n\n /**\n * Returns true if Apple Pay can be shown on this device + Stripe config.\n * Result is memoised — call `clearApplePayCache()` if config changes.\n */\n async isApplePayAvailable(country = 'NO'): Promise<boolean> {\n if (this.applePayAvailableCache !== null) return this.applePayAvailableCache\n const cfg = Configuration.isInitialized ? Configuration.get() : null\n const publishableKey = cfg?.stripePublishableKey ?? ''\n if (!publishableKey || !this.state) {\n this.applePayAvailableCache = false\n return false\n }\n const amount = toSmallestUnit(this.state.subtotal, this.state.currency)\n const available = await checkApplePayAvailability({\n publishableKey,\n connectedAccount: this.findStripeConnectAccount() ?? undefined,\n amount,\n currency: this.state.currency,\n country,\n label: 'Vio',\n })\n this.applePayAvailableCache = available\n return available\n }\n\n clearApplePayCache(): void {\n this.applePayAvailableCache = null\n }\n\n /**\n * Prepare Apple Pay for the product-page express button (no active checkout\n * needed). Pre-creates the Stripe PaymentRequest + resolves canMakePayment so\n * the returned `show()` can fire synchronously inside the tap (Apple blocks\n * the sheet if `show()` is reached after an await). `show()` resolves the\n * sheet, then dispatches `payment-complete` (→ confirmation) or\n * `payment-error`. `available` is true only when Apple Pay will actually work.\n */\n async prepareApplePayFor(\n amount: number,\n currency: string,\n country = 'NO',\n ): Promise<{ available: boolean; show: () => Promise<void> }> {\n const cfg = Configuration.isInitialized ? Configuration.get() : null\n const publishableKey = this.applePayPublishableKey || cfg?.stripePublishableKey || ''\n if (!publishableKey) return { available: false, show: async () => {} }\n const prepared = await prepareApplePay({\n publishableKey,\n connectedAccount:\n this.applePayConnectedAccount ?? this.findStripeConnectAccount() ?? undefined,\n amount: toSmallestUnit(amount, currency),\n currency,\n country,\n label: 'Vio',\n // Native Apple Pay shipping — same Standard/Express options as Klarna.\n shippingOptions: KLARNA_SHIPPING_OPTIONS.map((o) => ({\n id: o.id,\n label: o.method,\n detail: o.description,\n amount: o.price,\n })),\n // The real backend charge — sponsor resolved at authorize-time (the\n // product-detail button calls checkout.open() before show()).\n onAuthorize: (raw) => {\n const spId =\n this.state?.sponsorId ?? [...this.cartManager.getAllCarts().keys()][0]\n if (spId == null) {\n return Promise.reject(new Error('[VioCheckout] no sponsor for Apple Pay'))\n }\n return this.buildApplePayAuthorize(spId)(raw)\n },\n })\n return {\n available: prepared.available,\n show: async (): Promise<void> => {\n try {\n const result = await prepared.show()\n this.selectPaymentMethod('apple-pay')\n const state: CheckoutState =\n this.state ?? { sponsorId: 0, subtotal: amount, currency }\n this.dispatchEvent(\n new CustomEvent<PaymentCompleteDetail>('payment-complete', {\n detail: { method: 'apple-pay', state, result },\n }),\n )\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Apple Pay express failed:', err)\n }\n this.dispatchEvent(\n new CustomEvent<PaymentErrorDetail>('payment-error', {\n detail: { method: 'apple-pay', error: describeError(err) },\n }),\n )\n }\n },\n }\n }\n\n /**\n * Prepare an Apple Pay express charge for an arbitrary amount (e.g. the whole\n * cart) with NO active checkout. Unlike `prepareApplePayFor`, the returned\n * `show()` RESOLVES with the result (or `null` on cancel/failure) and does\n * NOT dispatch the global `payment-complete` — so no checkout overlay appears.\n * The caller (the cart drawer) renders its own confirmation. `show()` must be\n * called synchronously inside the tap (Apple's user-gesture rule).\n */\n async prepareApplePayExpress(\n amount: number,\n currency: string,\n country = 'NO',\n sponsorId?: number,\n ): Promise<{ available: boolean; show: () => Promise<ApplePayResult | null> }> {\n const cfg = Configuration.isInitialized ? Configuration.get() : null\n const publishableKey = this.applePayPublishableKey || cfg?.stripePublishableKey || ''\n if (!publishableKey) return { available: false, show: async () => null }\n const spId =\n sponsorId ?? this.state?.sponsorId ?? [...this.cartManager.getAllCarts().keys()][0]\n const prepared = await prepareApplePay({\n publishableKey,\n connectedAccount:\n this.applePayConnectedAccount ?? this.findStripeConnectAccount() ?? undefined,\n amount: toSmallestUnit(amount, currency),\n currency,\n country,\n label: 'Vio',\n // Native Apple Pay shipping (same Standard/Express options as Klarna) —\n // selected inside the sheet, so it's not a separate checkout step.\n shippingOptions: KLARNA_SHIPPING_OPTIONS.map((o) => ({\n id: o.id,\n label: o.method,\n detail: o.description,\n amount: o.price,\n })),\n // The real backend charge, run inside the sheet's authorize event.\n ...(spId != null ? { onAuthorize: this.buildApplePayAuthorize(spId) } : {}),\n })\n return {\n available: prepared.available,\n show: async (): Promise<ApplePayResult | null> => {\n try {\n return await prepared.show()\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] cart Apple Pay express failed:', err)\n }\n return null\n }\n },\n }\n }\n\n /** The charge closure run inside the Apple Pay sheet's authorize event —\n * shared by the checkout button and the cart's express button. Fail-closed:\n * any failure throws and the sheet closes with failure, nothing confirmed. */\n private buildApplePayAuthorize(spId: number): (raw: ApplePayResult) => Promise<unknown> {\n return async (raw: ApplePayResult): Promise<unknown> => {\n let checkoutId = this.state?.checkoutId\n if (!checkoutId) {\n const created = await this.createCheckout(spId)\n checkoutId = created?.id ?? this.state?.checkoutId\n }\n if (!checkoutId) {\n throw new Error('[VioCheckout] could not obtain a checkout for Apple Pay')\n }\n const email = raw.payerEmail || this.state?.address?.email || ''\n // Record the method (+ email) on the checkout. Non-fatal: Confirm carries\n // the email too, and the charge is what decides the outcome.\n try {\n await this.updateCheckout(\n { checkoutId, paymentMethod: 'Apple Pay', ...(email ? { email } : {}) },\n spId,\n )\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] updateCheckout before Apple Pay confirm failed:', err)\n }\n }\n const gqlOpts = await getCartGraphQLOptions(spId)\n const createRes = await gqlCreatePaymentApplePay({ checkoutId }, gqlOpts)\n const gatewayId = String(createRes?.gateway_merchant_id ?? '')\n if (gatewayId.startsWith('pk_')) this.applePayPublishableKey = gatewayId\n else if (gatewayId.startsWith('acct_')) this.applePayConnectedAccount = gatewayId\n\n const addr = (raw.shippingAddress ?? {}) as Record<string, unknown>\n const str = (v: unknown): string => (typeof v === 'string' ? v : '')\n const lines = Array.isArray(addr.addressLine) ? (addr.addressLine as string[]) : []\n const fullName = str(addr.name) || raw.payerName || ''\n const shippingAddress = {\n address1: lines[0] || str(addr.line1) || '',\n address2: lines[1] || str(addr.line2) || '',\n city: str(addr.locality) || str(addr.city) || '',\n company: '',\n country: str(addr.country) || '',\n country_code: str(addr.countryCode) || getGlobalCountryCode(),\n first_name: str(addr.givenName) || fullName.split(' ')[0] || '',\n last_name: str(addr.familyName) || fullName.split(' ').slice(1).join(' ') || '',\n phone: str(addr.phone) || str(addr.phoneNumber) || raw.payerPhone || '',\n phone_code: '',\n province: str(addr.administrativeArea) || str(addr.state) || '',\n province_code: '',\n zip: str(addr.postalCode) || str(addr.postal_code) || '',\n }\n\n const confirmRes = await gqlConfirmPaymentApplePay(\n { checkoutId, applePayToken: raw.paymentMethodId, email, shippingAddress },\n gqlOpts,\n )\n const status = String(confirmRes?.status ?? '').toLowerCase()\n if (!confirmRes || CheckoutManager.APPLE_PAY_FAILED_STATUSES.has(status)) {\n throw new Error(\n `[VioCheckout] Apple Pay confirmation failed (status: ${confirmRes?.status ?? 'none'})`,\n )\n }\n return { orderId: confirmRes?.order_id, status: confirmRes?.status }\n }\n }\n\n /** Backend statuses from ConfirmPaymentApplePay that mean the charge did\n * NOT go through — anything here fails the sheet (fail-closed). */\n private static readonly APPLE_PAY_FAILED_STATUSES = new Set([\n 'failed', 'declined', 'rejected', 'cancelled', 'canceled', 'error', 'expired',\n ])\n\n /**\n * Launches the Apple Pay sheet and charges server-side INSIDE the sheet's\n * authorize event (round-5 wiring, contract from the commerce backend):\n * 1. ensure a backend checkout exists (create if missing)\n * 2. UpdateCheckout(paymentMethod: \"Apple Pay\" + payer email)\n * 3. CreatePaymentApplePay → gateway hints (pk_/acct_ stored by prefix)\n * 4. ConfirmPaymentApplePay(token, email, shipping) → the REAL charge;\n * a failed/absent confirmation throws → the sheet closes with failure\n * Resolves null if the user closes the sheet. On success, dispatches\n * `payment-complete` with the backend order id in `result.confirmation`.\n */\n async startApplePay(options: {\n country?: string\n label?: string\n sponsorId?: number\n } = {}): Promise<ApplePayResult | null> {\n if (!this.state) throw new Error('[VioCheckout] no active checkout — call open() first')\n const spId = options.sponsorId ?? this.state.sponsorId\n const cfg = Configuration.isInitialized ? Configuration.get() : null\n const publishableKey = this.applePayPublishableKey || cfg?.stripePublishableKey || ''\n if (!publishableKey) {\n throw new Error(\n '[VioCheckout] No Stripe publishable key configured. Pass `stripePublishableKey` to Vio.init({ ... }).',\n )\n }\n const amount = toSmallestUnit(this.state.subtotal, this.state.currency)\n const onAuthorize = this.buildApplePayAuthorize(spId)\n\n const result = await showApplePaySheet({\n publishableKey,\n connectedAccount:\n this.applePayConnectedAccount ?? this.findStripeConnectAccount() ?? undefined,\n amount,\n currency: this.state.currency,\n country: options.country ?? 'NO',\n label: options.label ?? 'Vio',\n onAuthorize,\n })\n if (!result) return null // user closed the sheet — no event, nothing charged\n\n this.selectPaymentMethod('apple-pay')\n this.dispatchEvent(\n new CustomEvent<PaymentCompleteDetail>('payment-complete', {\n detail: { method: 'apple-pay', state: this.state, result },\n }),\n )\n return result\n }\n\n // MARK: - Klarna Express Checkout (Klarna Web SDK v2)\n\n /**\n * True if the Klarna Express button can be offered (clientId configured +\n * SDK loads). Memoised per active checkout. Never throws.\n */\n async isKlarnaExpressAvailable(): Promise<boolean> {\n if (this.klarnaAvailableCache !== null) return this.klarnaAvailableCache\n const cfg = Configuration.isInitialized ? Configuration.get() : null\n const clientId = cfg?.klarnaClientId ?? ''\n if (!clientId || !this.state) {\n this.klarnaAvailableCache = false\n return false\n }\n const available = await isKlarnaAvailable({\n clientId,\n locale: getGlobalLocale(),\n environment: cfg?.klarnaEnvironment,\n })\n this.klarnaAvailableCache = available\n return available\n }\n\n clearKlarnaCache(): void {\n this.klarnaAvailableCache = null\n }\n\n /**\n * Build the Klarna payment request from the active cart — amounts in the\n * currency's minor unit (øre/cents), one line item per cart line.\n */\n buildKlarnaPaymentRequest(): KlarnaPaymentRequestData {\n if (!this.state) throw new Error('[VioCheckout] no active checkout — call open() first')\n const currency = this.state.currency\n const lineItems: KlarnaLineItem[] = this.items.map((item) => {\n const unitPrice = toSmallestUnit(item.unitPrice, currency)\n return {\n name: item.name || item.brand || 'Produkt',\n quantity: item.quantity,\n unitPrice,\n totalAmount: unitPrice * item.quantity,\n reference: String(item.productId),\n ...(item.imageUrl ? { imageUrl: item.imageUrl } : {}),\n }\n })\n return {\n currency,\n amount: toSmallestUnit(this.state.subtotal, currency),\n supplementaryPurchaseData: { lineItems },\n }\n }\n\n /**\n * Mount the Klarna Express button into `container`. On a successful\n * authorization, fires `payment-complete` with the authorization token —\n * the host (or vio-backend) then creates the Klarna order server-side.\n *\n * Returns the button handle so the UI can unmount on teardown.\n */\n async mountKlarnaExpress(container: HTMLElement): Promise<KlarnaButtonHandle> {\n if (!this.state) throw new Error('[VioCheckout] no active checkout — call open() first')\n const cfg = Configuration.get()\n if (!cfg.klarnaClientId) {\n throw new Error(\n '[VioCheckout] No Klarna client id configured. Pass `klarnaClientId` to Vio.init({ ... }).',\n )\n }\n const pendingContext = this.buildKlarnaPendingContext()\n return mountKlarnaExpressButton({\n config: {\n clientId: cfg.klarnaClientId,\n locale: getGlobalLocale(),\n environment: cfg.klarnaEnvironment,\n },\n container,\n paymentRequest: this.buildKlarnaPaymentRequest(),\n pendingKey: KLARNA_PENDING_KEY,\n pendingContext,\n // POPUP path: the initiate() promise resolves in-page with the token.\n onAuthorize: (result) => {\n void this.completeKlarnaOrder(result.authorizationToken, pendingContext, result)\n },\n onError: (err) => {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Klarna Express cancelled/error:', err)\n }\n // Surface the error in the UI (not just the console). Klarna's reject\n // payload is often a plain object, so serialise it instead of letting\n // String(err) collapse to \"[object Object]\" — we need the real reason\n // (e.g. validation field, unsupported initiationMode, blocked origin)\n // visible on screen while we stabilise the flow.\n this.dispatchEvent(\n new CustomEvent<PaymentErrorDetail>('payment-error', {\n detail: { method: 'klarna', error: describeError(err) },\n }),\n )\n },\n })\n }\n\n /**\n * Klarna Payments — classic widget flow (server client_token). Creates a\n * session on vio-backend, then mounts Klarna's inline widget into\n * `container`. Returns a handle to switch category and to authorize → which\n * on approval creates the order via the same backend /orders route as KEC.\n *\n * Unlike `mountKlarnaExpress`, this needs no public `klarnaClientId` and no\n * origin handshake — auth is the server-side API key.\n */\n async mountKlarnaPayments(\n container: HTMLElement,\n opts?: { withShipping?: boolean; shippingId?: string; category?: string },\n ): Promise<KlarnaPaymentsHandle> {\n if (!this.state) throw new Error('[VioCheckout] no active checkout — call open() first')\n const sponsorId = this.state.sponsorId\n\n // 1. Real per-supplier shippings from the backend cart. No static\n // fallback for Klarna anymore — fetchAvailableShippings now waits for\n // any in-flight cart mutation, so an empty result means the backend\n // genuinely has nothing, not a race; falling back to stale hardcoded\n // prices would be worse than surfacing that honestly.\n const shippings = await this.fetchAvailableShippings(sponsorId)\n\n // With shipping: add the CHOSEN shipping option as a shipping_fee line +\n // bump the total. (Klarna Payments doesn't render a picker; ours lives in\n // the checkout UI and re-mounts this widget with the new total on change.)\n const { ctx } = opts?.withShipping\n ? this.buildKlarnaInstantContext(opts.shippingId, shippings)\n : { ctx: this.buildKlarnaPendingContext() }\n\n // 2. Persist the chosen shipping on the backend cart.\n const selectedOpt = shippings.find((s) => s.id === opts?.shippingId) ?? shippings[0]\n if (selectedOpt?.id && selectedOpt?.supplierId) {\n try {\n await this.updateShippingsBySupplier(\n [{ shipping_id: selectedOpt.id, supplier_id: Number(selectedOpt.supplierId) }],\n sponsorId,\n )\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[CheckoutManager] updateShippingsBySupplier failed during mount:', err)\n }\n }\n }\n\n // 3. Backend checkout (CreatePaymentKlarnaNative requires a checkout_id).\n let checkoutId = ctx.checkoutId ?? this.state.checkoutId\n try {\n const checkoutRes = await this.createCheckout(sponsorId)\n if (checkoutRes?.id) {\n checkoutId = checkoutRes.id\n ctx.checkoutId = checkoutRes.id\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[CheckoutManager] CreateCheckout before Klarna init failed:', err)\n }\n }\n if (!checkoutId) {\n throw new Error('[CheckoutManager] no backend checkout for the Klarna session')\n }\n\n // 4. Klarna Payments session via the commerce GraphQL (native flow).\n const address = this.state.address\n const activeCurrency = getGlobalCurrency()\n if (this.state) this.state = { ...this.state, currency: activeCurrency }\n ctx.currency = activeCurrency\n const variables = {\n checkoutId,\n countryCode: getGlobalCountryCode(),\n currency: activeCurrency,\n locale: getGlobalLocale(),\n returnUrl: resolveHttpsReturnUrl(null, {\n vio_payment: 'success',\n vio_method: 'klarna',\n vio_sponsor: sponsorId,\n checkout_id: checkoutId,\n }),\n intent: 'buy',\n customer: buildKlarnaCustomer(address),\n billingAddress: buildKlarnaAddress(address),\n shippingAddress: buildKlarnaAddress(address),\n autoCapture: true,\n }\n\n const json = await executeKlarnaGraphQL(\n CREATE_PAYMENT_KLARNA_NATIVE_MUTATION,\n variables,\n sponsorId,\n )\n const nativeRes = json?.data?.Payment?.CreatePaymentKlarnaNative\n if (!nativeRes || !nativeRes.client_token) {\n throw new Error('Klarna session creation failed: missing client_token')\n }\n if (typeof console !== 'undefined') {\n console.log(\n '[VioCheckout] CreatePaymentKlarnaNative payment_method_categories:',\n nativeRes.payment_method_categories,\n )\n }\n if (nativeRes.checkout_id) {\n ctx.checkoutId = nativeRes.checkout_id\n this.state = { ...this.state, checkoutId: nativeRes.checkout_id }\n }\n if (nativeRes.session_id) {\n ctx.sessionId = nativeRes.session_id\n this.state = { ...this.state, sessionId: nativeRes.session_id }\n }\n ctx.clientToken = nativeRes.client_token\n this.state = { ...this.state, clientToken: nativeRes.client_token }\n\n // 5. Mount the inline widget and load the first category.\n const widget = await createKlarnaPaymentsWidget({\n clientToken: nativeRes.client_token,\n sessionId: nativeRes.session_id,\n categories: nativeRes.payment_method_categories ?? [],\n category: opts?.category,\n container,\n })\n await widget.load()\n\n return {\n categories: widget.categories,\n shippings,\n get selected() {\n return widget.selected\n },\n load: (category?: string) => widget.load(category),\n authorize: async (category?: string): Promise<void> => {\n try {\n // The session already carries the order (country/currency/lines);\n // Klarna collects customer details in its widget. Address/customer\n // are passed as a best-effort supplement when we already have them\n // from the checkout form — Klarna's own widget can still fill gaps.\n const addr = buildKlarnaAddress(this.state?.address)\n const customer = buildKlarnaCustomer(this.state?.address)\n const authData = {\n ...(addr ? { billing_address: addr, shipping_address: addr } : {}),\n ...(customer ? { customer } : {}),\n }\n const token = await widget.authorize(category, authData)\n await this.completeKlarnaOrder(token, ctx, { authorizationToken: token })\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Klarna Payments authorize failed:', err)\n }\n this.dispatchEvent(\n new CustomEvent<PaymentErrorDetail>('payment-error', {\n detail: { method: 'klarna', error: describeError(err) },\n }),\n )\n }\n },\n unmount: () => {\n try {\n container.innerHTML = ''\n } catch {\n /* already gone */\n }\n },\n }\n }\n\n /** True if the Klarna Payments widget lib can load (UI gate). */\n async klarnaPaymentsAvailable(): Promise<boolean> {\n return isKlarnaPaymentsAvailable()\n }\n\n /** Cart snapshot + chosen shipping line/amount, for express purchases. */\n private buildKlarnaInstantContext(\n shippingId?: string,\n availableShippings: KlarnaShippingOption[] = [],\n ): {\n ctx: KlarnaPendingContext\n shippingOptions: KlarnaShippingOption[]\n } {\n const base = this.buildKlarnaPendingContext()\n const options = availableShippings\n const shipping =\n (shippingId ? options.find((o) => o.id === shippingId) : undefined) ??\n options.find((o) => o.preselected) ??\n options[0]\n const orderLines = [...base.orderLines]\n if (shipping) {\n orderLines.push({\n name: `Frakt – ${shipping.method || shipping.name}`,\n quantity: 1,\n unit_price: shipping.price,\n total_amount: shipping.price,\n reference: `shipping:${shipping.id}`,\n type: 'shipping_fee',\n })\n }\n return {\n ctx: {\n ...base,\n orderLines,\n orderAmount: base.orderAmount + (shipping?.price ?? 0),\n },\n shippingOptions: options,\n }\n }\n\n /**\n * Express instant purchase — go straight to Klarna's own modal, no checkout\n * overlay. Creates a session (with shipping options), loads the widget into a\n * hidden container, then authorizes (which opens Klarna's confirm modal). On\n * approval creates the order → `payment-complete` (host shows confirmation);\n * on failure → `payment-error`. Call `open(sponsorId)` first.\n */\n async startKlarnaInstant(): Promise<void> {\n if (!this.state) throw new Error('[VioCheckout] no active checkout — call open() first')\n const sponsorId = this.state.sponsorId\n const shippings = await this.fetchAvailableShippings(sponsorId)\n const { ctx } = this.buildKlarnaInstantContext(undefined, shippings)\n\n // 1. Backend checkout + Klarna Payments session via commerce GraphQL.\n let clientToken: string\n let categories: KlarnaPaymentsCategory[]\n try {\n let checkoutId = ctx.checkoutId ?? this.state.checkoutId\n try {\n const checkoutRes = await this.createCheckout(sponsorId)\n if (checkoutRes?.id) {\n checkoutId = checkoutRes.id\n ctx.checkoutId = checkoutRes.id\n }\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[CheckoutManager] CreateCheckout before Klarna instant failed:', err)\n }\n }\n if (!checkoutId) {\n throw new Error('[CheckoutManager] no backend checkout for the Klarna session')\n }\n\n const address = this.state.address\n const activeCurrency = getGlobalCurrency()\n this.state = { ...this.state, currency: activeCurrency }\n ctx.currency = activeCurrency\n const variables = {\n checkoutId,\n countryCode: getGlobalCountryCode(),\n currency: activeCurrency,\n locale: getGlobalLocale(),\n returnUrl: resolveHttpsReturnUrl(null, {\n vio_payment: 'success',\n vio_method: 'klarna',\n vio_sponsor: sponsorId,\n checkout_id: checkoutId,\n }),\n intent: 'buy',\n customer: buildKlarnaCustomer(address),\n billingAddress: buildKlarnaAddress(address),\n shippingAddress: buildKlarnaAddress(address),\n autoCapture: true,\n }\n\n const json = await executeKlarnaGraphQL(\n CREATE_PAYMENT_KLARNA_NATIVE_MUTATION,\n variables,\n sponsorId,\n )\n const nativeRes = json?.data?.Payment?.CreatePaymentKlarnaNative\n if (!nativeRes || !nativeRes.client_token) {\n throw new Error('Klarna instant session failed: missing client_token')\n }\n if (nativeRes.checkout_id) {\n ctx.checkoutId = nativeRes.checkout_id\n this.state = { ...this.state, checkoutId: nativeRes.checkout_id }\n }\n if (nativeRes.session_id) {\n ctx.sessionId = nativeRes.session_id\n this.state = { ...this.state, sessionId: nativeRes.session_id }\n }\n ctx.clientToken = nativeRes.client_token\n this.state = { ...this.state, clientToken: nativeRes.client_token }\n clientToken = nativeRes.client_token\n categories = nativeRes.payment_method_categories ?? []\n } catch (err) {\n this.dispatchEvent(\n new CustomEvent<PaymentErrorDetail>('payment-error', {\n detail: { method: 'klarna', error: describeError(err) },\n }),\n )\n return\n }\n\n // 2. Hidden container → load → authorize (opens Klarna's own modal).\n const container = document.createElement('div')\n container.setAttribute('aria-hidden', 'true')\n container.style.cssText =\n 'position:fixed;left:-9999px;top:0;width:1px;height:1px;overflow:hidden;'\n document.body.appendChild(container)\n try {\n const widget = await createKlarnaPaymentsWidget({\n clientToken,\n sessionId: ctx.sessionId,\n categories,\n container,\n })\n await widget.load()\n const token = await widget.authorize()\n await this.completeKlarnaOrder(token, ctx, { authorizationToken: token })\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Klarna instant failed:', err)\n }\n this.dispatchEvent(\n new CustomEvent<PaymentErrorDetail>('payment-error', {\n detail: { method: 'klarna', error: describeError(err) },\n }),\n )\n } finally {\n try {\n container.remove()\n } catch {\n /* already gone */\n }\n }\n }\n\n /**\n * REDIRECT path: call once on app load. If a Klarna purchase was launched\n * (pending context persisted) and we're back with a token — from the URL or\n * the SDK's resumed `complete` event — finish creating the order + confirm.\n */\n async resumeKlarnaReturn(): Promise<void> {\n if (typeof sessionStorage === 'undefined') return\n const raw = sessionStorage.getItem(KLARNA_PENDING_KEY)\n if (!raw) return\n let pending: KlarnaPendingContext\n try {\n pending = JSON.parse(raw) as KlarnaPendingContext\n } catch {\n sessionStorage.removeItem(KLARNA_PENDING_KEY)\n return\n }\n\n // 1) Token already in the URL (most redirect flows append it).\n const fromUrl = readKlarnaTokenFromUrl()\n if (fromUrl) {\n cleanUrlParams([fromUrl.param])\n await this.completeKlarnaOrder(fromUrl.token, pending, { authorizationToken: fromUrl.token })\n return\n }\n\n // No recognised token param — log what Klarna actually returned so the\n // param name can be mapped if the SDK `complete` event doesn't fire.\n if (typeof window !== 'undefined' && typeof console !== 'undefined' && window.location.search) {\n console.warn(\n '[VioCheckout] Klarna return: no known token param. URL was:',\n window.location.search,\n )\n }\n\n // 2) Otherwise let the SDK resume its session and fire `complete`.\n const cfg = Configuration.isInitialized ? Configuration.get() : null\n if (!cfg?.klarnaClientId) return\n await listenForKlarnaCompletion({\n config: { clientId: cfg.klarnaClientId, locale: getGlobalLocale(), environment: cfg.klarnaEnvironment },\n onComplete: (result) => {\n void this.completeKlarnaOrder(result.authorizationToken, pending, result)\n },\n onError: (err) => {\n if (typeof console !== 'undefined') {\n console.warn('[VioCheckout] Klarna resume error:', err)\n }\n },\n })\n }\n\n /** Snapshot of the active cart for redirect recovery (minor units). */\n private buildKlarnaPendingContext(): KlarnaPendingContext {\n if (!this.state) throw new Error('[VioCheckout] no active checkout')\n const currency = this.state.currency\n return {\n sponsorId: this.state.sponsorId,\n currency,\n orderAmount: toSmallestUnit(this.state.subtotal, currency),\n orderLines: this.items.map((item) => {\n const unitPrice = toSmallestUnit(item.unitPrice, currency)\n return {\n name: item.name || item.brand || 'Produkt',\n quantity: item.quantity,\n unit_price: unitPrice,\n total_amount: unitPrice * item.quantity,\n reference: String(item.productId),\n }\n }),\n }\n }\n\n /**\n * POST the token + order lines to vio-backend (it holds the secret API key\n * and creates the real Klarna order). On success → `payment-complete`; on\n * failure → `payment-error`. Idempotent: clears the pending key so the\n * popup and redirect paths can't double-fire.\n */\n private async completeKlarnaOrder(\n authorizationToken: string,\n ctx: KlarnaPendingContext,\n result: KlarnaAuthorizeResult,\n ): Promise<void> {\n // Idempotency guard — first caller wins (also without sessionStorage).\n if (this.klarnaOrderInFlight) return\n this.klarnaOrderInFlight = true\n // A token can only be confirmed once — a retry with an already-confirmed\n // token (network blip after a successful confirm) would create a second\n // order with autoCapture: double charge.\n if (\n typeof sessionStorage !== 'undefined' &&\n sessionStorage.getItem('vio.klarna.confirmed.v1') === authorizationToken\n ) {\n this.klarnaOrderInFlight = false\n return\n }\n try {\n const checkoutId =\n ctx?.checkoutId ?? this.state?.checkoutId ?? String(ctx?.sponsorId ?? this.state?.sponsorId ?? '')\n const address = this.state?.address\n const variables = {\n checkoutId,\n authorizationToken,\n autoCapture: true,\n billingAddress: buildKlarnaAddress(address),\n shippingAddress: buildKlarnaAddress(address),\n customer: buildKlarnaCustomer(address),\n }\n\n const json = await executeKlarnaGraphQL(\n CONFIRM_PAYMENT_KLARNA_NATIVE_MUTATION,\n variables,\n ctx?.sponsorId ?? this.state?.sponsorId,\n )\n const confirmRes = json?.data?.Payment?.ConfirmPaymentKlarnaNative\n if (!confirmRes) {\n throw new Error('Klarna order confirmation failed: missing response data')\n }\n const orderData = confirmRes.order || confirmRes\n\n // Success: only NOW is the pending context consumed (keeping it until\n // here lets the redirect path retry a confirm that never ran).\n if (typeof sessionStorage !== 'undefined') {\n sessionStorage.setItem('vio.klarna.confirmed.v1', authorizationToken)\n sessionStorage.removeItem(KLARNA_PENDING_KEY)\n }\n\n // Synthesize a checkout state for the confirmation if the live one was\n // lost to a redirect reload.\n const state: CheckoutState =\n this.state ?? { sponsorId: ctx.sponsorId, subtotal: ctx.orderAmount, currency: ctx.currency }\n this.dispatchEvent(\n new CustomEvent<PaymentCompleteDetail>('payment-complete', {\n detail: {\n method: 'klarna',\n state,\n // chargedTotal in MAJOR units (incl. shipping for express) for the\n // confirmation screen. ctx.orderAmount is minor (øre) → /100.\n // Prefer the amount Klarna actually charged (includes shipping in\n // every flow); the local ctx misses shipping outside express.\n result: {\n ...result,\n order: orderData,\n chargedTotal:\n typeof orderData?.order_amount === 'number'\n ? orderData.order_amount / 100\n : ctx.orderAmount / 100,\n },\n },\n }),\n )\n } catch (err) {\n if (typeof console !== 'undefined') {\n console.error('[VioCheckout] Klarna order creation failed:', err)\n }\n this.dispatchEvent(\n new CustomEvent<PaymentErrorDetail>('payment-error', {\n detail: { method: 'klarna', error: err instanceof Error ? err.message : String(err) },\n }),\n )\n } finally {\n this.klarnaOrderInFlight = false\n }\n }\n\n // MARK: - Accessors\n\n get currentState(): CheckoutState | null {\n return this.state\n }\n\n get items(): CartLineItem[] {\n if (!this.state) return []\n return this.cartManager.getCart(this.state.sponsorId)?.items ?? []\n }\n\n // MARK: - Internals\n\n /**\n * Resolve the Stripe Connect account for the active sponsor — for now\n * pulled from bootstrap cache if present. Returns undefined if not set\n * (Stripe will route to the platform account in that case).\n */\n private findStripeConnectAccount(): string | undefined {\n // Placeholder hook — when bootstrap exposes per-sponsor stripeAccount\n // we'll wire it here. For now returns undefined.\n return undefined\n }\n\n private emit(): void {\n this.dispatchEvent(\n new CustomEvent<CheckoutChangeDetail>('change', { detail: { state: this.state } }),\n )\n }\n}\n\n/**\n * Stripe expects amounts in the smallest currency unit. NOK/SEK/DKK/EUR/USD\n * are all hundredths (øre, öre, øre, cents, cents). JPY is the exception\n * (no fractional unit).\n */\nfunction toSmallestUnit(amount: number, currency: string): number {\n const zeroDecimal = new Set(['JPY', 'KRW', 'VND'])\n if (zeroDecimal.has(currency.toUpperCase())) return Math.round(amount)\n return Math.round(amount * 100)\n}\n","/**\n * Vio — public SDK entry point + facade.\n *\n * Usage:\n * import { Vio } from 'vio'\n * Vio.init({ apiKey: 'xxx' }) // backend-bound calls require this\n * await Vio.bootstrap() // GET /v2/mobile/config\n *\n * // Client-side primitives — no init needed:\n * Vio.cart.addProduct({ product, sponsorId: 3 })\n * Vio.checkout.open(3)\n *\n * // Backend-bound:\n * const products = await Vio.commerceFor(3).channel.product.getByIds({\n * product_ids: [408895],\n * })\n */\n\nimport { Configuration, type VioConfig } from './configuration.js'\nimport { createVioApi, type VioApi } from './api/vio.js'\nimport { createCommerceClient, type CommerceClient } from './api/commerce.js'\nimport { CartManager } from './cart/cart-manager.js'\nimport { CheckoutManager } from './checkout/checkout-manager.js'\nimport type { BootstrapResponse, Sponsor } from './types.js'\n\nclass VioFacade {\n private apiInstance: VioApi | null = null\n private commerceClients = new Map<number, CommerceClient>()\n private bootstrapPromise: Promise<BootstrapResponse> | null = null\n private cachedBootstrap: BootstrapResponse | null = null\n /** Last bootstrap failure — short backoff so cart mutations don't hammer a\n * dead endpoint on every call. */\n private bootstrapFailedAt = 0\n\n // Client-side managers — created lazily on first access. They don't\n // need Vio.init() to work (state is purely local).\n private cartManager: CartManager | null = null\n private checkoutManager: CheckoutManager | null = null\n\n init(config: VioConfig): void {\n Configuration.init(config)\n // Reset cached backend instances so a re-init picks up the new config.\n this.apiInstance = null\n this.commerceClients.clear()\n this.bootstrapPromise = null\n this.cachedBootstrap = null\n this.bootstrapFailedAt = 0\n // A new key/environment invalidates the per-sponsor payment methods too.\n this.checkoutManager?.clearPaymentMethodsCache()\n // NOTE: cart / checkout managers are NOT reset — user cart state is\n // independent of SDK re-config.\n }\n\n get isInitialized(): boolean { return Configuration.isInitialized }\n get config() { return Configuration.get() }\n\n // MARK: - Client-side managers (no init required)\n\n /** Multi-sponsor cart manager. Reactive — listen via addEventListener('change', ...). */\n get cart(): CartManager {\n if (!this.cartManager) this.cartManager = new CartManager()\n return this.cartManager\n }\n\n /** Checkout flow manager. Subscribes to cart state via the CartManager. */\n get checkout(): CheckoutManager {\n if (!this.checkoutManager) this.checkoutManager = new CheckoutManager(this.cart)\n return this.checkoutManager\n }\n\n // MARK: - Backend-bound\n\n /** Lazy VioApi for REST endpoints on `api-dev.vio.live`. */\n get api(): VioApi {\n if (!this.apiInstance) {\n const cfg = Configuration.get()\n this.apiInstance = createVioApi({ apiBase: cfg.apiBase, apiKey: cfg.apiKey })\n }\n return this.apiInstance\n }\n\n /**\n * Bootstrap — fetches client config and caches it. Dedupes in-flight\n * concurrent requests.\n */\n async bootstrap(): Promise<BootstrapResponse> {\n if (this.cachedBootstrap) return this.cachedBootstrap\n if (this.bootstrapPromise) return this.bootstrapPromise\n // Failure backoff: don't re-fire a request for 5s after a failure —\n // every cart mutation awaits bootstrap, so a dead endpoint would\n // otherwise add a failed round-trip per click.\n if (this.bootstrapFailedAt && Date.now() - this.bootstrapFailedAt < 5_000) {\n throw new Error('[Vio] bootstrap recently failed — backing off')\n }\n this.bootstrapPromise = this.api\n .bootstrap()\n .then((res) => {\n this.cachedBootstrap = res\n this.bootstrapFailedAt = 0\n return res\n })\n .catch((err) => {\n this.bootstrapFailedAt = Date.now()\n throw err\n })\n .finally(() => {\n this.bootstrapPromise = null\n })\n return this.bootstrapPromise\n }\n\n get bootstrapCache(): BootstrapResponse | null {\n return this.cachedBootstrap\n }\n\n /**\n * Get a CommerceClient scoped to a specific sponsor (via bootstrap).\n * Throws if bootstrap hasn't been called or the sponsor is unknown.\n */\n commerceFor(sponsorId: number): CommerceClient {\n // Coacción a número: los web-components pasan sponsorId como string\n // (atributo), y findSponsor compara con `===` contra el id numérico.\n sponsorId = Number(sponsorId) as number\n const existing = this.commerceClients.get(sponsorId)\n if (existing) return existing\n const sponsor = this.findSponsor(sponsorId)\n if (!sponsor) {\n throw new Error(\n `[Vio] Sponsor ${sponsorId} not found in bootstrap. Call Vio.bootstrap() first or pass commerce-key directly.`,\n )\n }\n const cfg = Configuration.get()\n const client = createCommerceClient({ endpoint: cfg.graphQLBase, apiKey: sponsor.commerce.apiKey })\n this.commerceClients.set(sponsorId, client)\n return client\n }\n\n /** Get a CommerceClient using an explicit commerce apiKey (skip bootstrap). */\n commerceWithKey(commerceApiKey: string): CommerceClient {\n const cfg = Configuration.get()\n return createCommerceClient({ endpoint: cfg.graphQLBase, apiKey: commerceApiKey })\n }\n\n private findSponsor(sponsorId: number): Sponsor | undefined {\n const boot = this.cachedBootstrap\n if (!boot) return undefined\n const id = Number(sponsorId)\n if (Number(boot.primarySponsor?.id) === id) return boot.primarySponsor\n return boot.secondarySponsors?.find((s) => Number(s.id) === id)\n }\n}\n\n// Cross-bundle singleton. Some hosts (e.g. Vev) bundle each component into its\n// own chunk, so a plain module-level instance would give EACH chunk its own\n// `Vio` — separate cart + bootstrap cache. That breaks shared state (one chunk\n// bootstraps, another reads an empty cache → \"Sponsor not found\"). Anchoring the\n// facade on `globalThis` means every copy resolves to the SAME instance within a\n// page. SSR-safe: `globalThis` exists in Node too.\nconst _vioGlobal = globalThis as unknown as { __VIO_FACADE__?: VioFacade }\nexport const Vio: VioFacade =\n _vioGlobal.__VIO_FACADE__ ?? (_vioGlobal.__VIO_FACADE__ = new VioFacade())\n"]}