{"version":3,"sources":["../../src/webhooks/index.ts","../../src/webhooks/orders.ts","../../src/stripe/client.ts","../../src/webhooks/payment-method.ts","../../src/webhooks/handler.ts"],"sourcesContent":["export {\n  buildOrderFromCheckoutSession,\n  type BuildOrderInput,\n} from './orders';\nexport {\n  createStripeWebhookHandler,\n  type WebhookHandlerOptions,\n  type OnOrderPaidArgs,\n} from './handler';\nexport { formatPaymentMethod } from './payment-method';\n","/**\n * F136 Phase 1 — Order document factory.\n *\n * Pure function that takes a Stripe Checkout Session + the cart it\n * referenced and produces a `ShopOrder` data object ready for the host\n * to persist. The host owns \"where orders live\" (filesystem JSON,\n * GitHub adapter, external DB) so we don't write here — we return the\n * doc shape and let the host call its CMS write path.\n */\nimport type Stripe from 'stripe';\nimport type {\n  ShopAddress,\n  ShopCart,\n  ShopOrder,\n} from '../types';\n\nfunction nextOrderNumber(prefix = 'WH'): string {\n  const year = new Date().getUTCFullYear();\n  const rand = Math.floor(Math.random() * 0xfff_fff)\n    .toString(16)\n    .padStart(6, '0')\n    .toUpperCase();\n  return `${prefix}-${year}-${rand}`;\n}\n\nfunction stripeAddrToShop(\n  addr: Stripe.Address | null | undefined,\n  fallbackName: string,\n  phone?: string | null,\n): ShopAddress | undefined {\n  if (!addr || !addr.line1 || !addr.country) return undefined;\n  return {\n    name: fallbackName,\n    line1: addr.line1,\n    ...(addr.line2 ? { line2: addr.line2 } : {}),\n    postalCode: addr.postal_code ?? '',\n    city: addr.city ?? '',\n    country: addr.country,\n    ...(addr.state ? { region: addr.state } : {}),\n    ...(phone ? { phone } : {}),\n  };\n}\n\nexport interface BuildOrderInput {\n  session: Stripe.Checkout.Session;\n  cart: ShopCart;\n  /** Slug prefix for the order number — default \"WH\". */\n  orderNumberPrefix?: string;\n}\n\nexport function buildOrderFromCheckoutSession(\n  input: BuildOrderInput,\n): { id: string; slug: string; data: ShopOrder['data'] } {\n  const { session, cart } = input;\n  const slug = nextOrderNumber(input.orderNumberPrefix);\n  const placedAt = new Date().toISOString();\n  const paid = session.payment_status === 'paid';\n\n  const shipping = session.collected_information?.shipping_details;\n  const customerDetails = session.customer_details;\n\n  const shippingAddress = stripeAddrToShop(\n    shipping?.address ?? null,\n    shipping?.name ?? customerDetails?.name ?? cart.email ?? 'Customer',\n    customerDetails?.phone,\n  );\n  const billingAddress = stripeAddrToShop(\n    customerDetails?.address ?? null,\n    customerDetails?.name ?? cart.email ?? 'Customer',\n    customerDetails?.phone,\n  );\n\n  const data: ShopOrder['data'] = {\n    status: paid ? 'paid' : 'pending',\n    email:\n      session.customer_details?.email ??\n      session.customer_email ??\n      cart.email ??\n      '',\n    currency: cart.currency,\n    items: cart.items,\n    subtotal: cart.subtotal,\n    discountTotal: cart.discountTotal,\n    shippingTotal: cart.shippingTotal,\n    taxTotal: cart.taxTotal,\n    total: cart.total,\n    stripeCheckoutSessionId: session.id,\n    ...(typeof session.payment_intent === 'string'\n      ? { stripePaymentIntentId: session.payment_intent }\n      : session.payment_intent && 'id' in session.payment_intent\n        ? { stripePaymentIntentId: session.payment_intent.id }\n        : {}),\n    ...(shippingAddress ? { shippingAddress } : {}),\n    ...(billingAddress ? { billingAddress } : {}),\n    ...(cart.shippingRateId ? { shippingMethod: cart.shippingRateId } : {}),\n    ...(cart.locale ? { locale: cart.locale } : {}),\n    ...(cart.discountCode ? { discountCode: cart.discountCode } : {}),\n    placedAt,\n    ...(paid ? { paidAt: placedAt } : {}),\n  };\n\n  return { id: slug.toLowerCase(), slug, data };\n}\n","/**\n * F136 Phase 1 — Stripe SDK wrapper.\n *\n * Lazy-init: the Stripe client is constructed the first time it's needed,\n * not at import time. Two reasons:\n *   1. Tests can run without STRIPE_SECRET_KEY (calls are mocked elsewhere).\n *   2. Sites that don't actually use Stripe (free-tier marketing sites\n *      that only consume product collections) won't crash on missing env.\n *\n * Mode: per-site. Each site loads its own STRIPE_SECRET_KEY from env;\n * `getStripe(secretKey?)` accepts an explicit key for multi-tenant cms-admin\n * where the key lives in the site config rather than process.env.\n */\nimport Stripe from 'stripe';\n\nconst cache = new Map<string, Stripe>();\n\n/**\n * Get a memoized Stripe client.\n *\n * @param secretKey — explicit key (e.g. site.stripeSecretKey from cms-admin\n *                    site config). Falls back to process.env.STRIPE_SECRET_KEY.\n */\nexport function getStripe(secretKey?: string): Stripe {\n  const key = secretKey ?? process.env.STRIPE_SECRET_KEY;\n  if (!key) {\n    throw new Error(\n      '[cms-shop] STRIPE_SECRET_KEY is not set. ' +\n      'Set it as an env var on this site (or pass secretKey explicitly to getStripe).',\n    );\n  }\n  let client = cache.get(key);\n  if (!client) {\n    client = new Stripe(key, {\n      // Pin the API version so future Stripe upgrades don't silently\n      // change response shapes mid-deploy. We use the SDK's own\n      // pinned literal (`Stripe.API_VERSION`) so the value always\n      // matches the version the installed types were built against.\n      apiVersion: Stripe.API_VERSION,\n      typescript: true,\n      // Identify the integration in Stripe's logs — easier debugging\n      // when multiple webhouse sites share a Stripe account.\n      appInfo: {\n        name: '@webhouse/cms-shop',\n        version: '0.3.0',\n        url: 'https://docs.webhouse.app',\n      },\n    });\n    cache.set(key, client);\n  }\n  return client;\n}\n\n/** Test/cleanup hook — clears the memoized client cache. */\nexport function resetStripeClientCache(): void {\n  cache.clear();\n}\n","/**\n * F136 Phase 1 — Format Stripe payment_method_details into a human label.\n *\n * Lifted from the proven sanneandersen-site implementation\n * (verified on real Stripe transactions). Examples:\n *   - \"Visa •••• 4242\"\n *   - \"Mastercard •••• 1234\"\n *   - \"Apple Pay\"\n *   - \"Google Pay\"\n *   - \"MobilePay\"\n *   - \"Klarna\"\n */\nimport type Stripe from 'stripe';\n\nexport function formatPaymentMethod(\n  pm: Stripe.Charge.PaymentMethodDetails | null | undefined,\n): string | null {\n  if (!pm) return null;\n\n  // Apple Pay / Google Pay are reported as `card` with a wallet sub-type.\n  if (pm.card?.wallet?.type === 'apple_pay') return 'Apple Pay';\n  if (pm.card?.wallet?.type === 'google_pay') return 'Google Pay';\n\n  if (pm.card) {\n    const brand = pm.card.brand?.replace(/^\\w/, (c) => c.toUpperCase()) ?? 'Card';\n    const last4 = pm.card.last4 ? ` •••• ${pm.card.last4}` : '';\n    return `${brand}${last4}`;\n  }\n\n  if (pm.mobilepay) return 'MobilePay';\n\n  // Fallback: prettify the type string (sepa_debit → Sepa debit, klarna → Klarna).\n  return pm.type\n    ? pm.type.replace(/_/g, ' ').replace(/^\\w/, (c) => c.toUpperCase())\n    : null;\n}\n","/**\n * F136 Phase 1 — POST /api/shop/webhooks Stripe webhook handler.\n *\n * Verifies the Stripe signature header, dispatches events to the host's\n * `onOrderPaid` / `onOrderFailed` / `onOrderRefunded` callbacks. Order\n * persistence is the host's responsibility — this module only reshapes\n * Stripe payloads into CMS-friendly objects.\n *\n * Important: Stripe webhook signature verification needs the *raw*\n * request body. In Next.js Route Handlers and Hono, that means reading\n * `req.text()` directly. Frameworks that JSON-parse the body before our\n * handler runs will break signature verification.\n *\n * Connect mode: events about activity ON a connected account arrive\n * with `event.account = 'acct_xxx'` set. We pass that through to the\n * `onOrderPaid` callback so the host can route the order to the right\n * tenant. The pattern matches sanneandersen-site (proven on real\n * Stripe transactions).\n *\n * Idempotency: Stripe re-delivers the same event up to 10 times if the\n * receiver returns non-2xx. The host's `onOrderPaid` MUST be idempotent\n * — it is called per Stripe delivery, not per logical \"this charge\n * succeeded\" boundary. The recommended pattern: store the\n * `session.id` (or `event.id`) on first write and no-op on later\n * deliveries.\n */\nimport type Stripe from 'stripe';\nimport { getStripe } from '../stripe/client';\nimport type { CartStore } from '../cart/store';\nimport { buildOrderFromCheckoutSession } from './orders';\nimport { formatPaymentMethod } from './payment-method';\n\nexport interface OnOrderPaidArgs {\n  order: ReturnType<typeof buildOrderFromCheckoutSession>;\n  session: Stripe.Checkout.Session;\n  /** `acct_xxx` if this is a Connect event for a connected account, else null. */\n  connectedAccountId: string | null;\n  /** Discriminator from `session.metadata.kind` (default 'order'). */\n  kind: string;\n  /** Human label for the payment method (\"Visa •••• 4242\", \"MobilePay\"…) when expanded. */\n  paymentMethodLabel: string | null;\n  /** Stripe Event id — useful for the host's idempotency key. */\n  eventId: string;\n}\n\nexport interface WebhookHandlerOptions {\n  /** `whsec_…` from Stripe Dashboard. */\n  webhookSecret: string;\n  /** Stripe secret key — same one used elsewhere. */\n  secretKey?: string;\n  /** Cart store so we can look up the cart that produced the session. */\n  cartStore: CartStore;\n  /** Called when checkout.session.completed arrives with payment_status='paid'. */\n  onOrderPaid(args: OnOrderPaidArgs): Promise<void>;\n  /** Called on checkout.session.async_payment_failed or payment_intent.payment_failed. */\n  onOrderFailed?(args: {\n    sessionId?: string;\n    paymentIntentId?: string;\n    reason?: string;\n    connectedAccountId: string | null;\n    eventId: string;\n  }): Promise<void>;\n  /** Called on charge.refunded. */\n  onOrderRefunded?(args: {\n    paymentIntentId: string;\n    amountRefunded: number;\n    fullyRefunded: boolean;\n    connectedAccountId: string | null;\n    eventId: string;\n  }): Promise<void>;\n  /** Slug prefix for order numbers — default \"WH\". */\n  orderNumberPrefix?: string;\n  /** Called after a successful checkout to clear the cart. Default: true. */\n  clearCartOnPaid?: boolean;\n  /**\n   * Expand `payment_intent.latest_charge.payment_method_details` so we\n   * can label the payment method. Default: true. Disable for sites that\n   * don't need this and want to save one API call per webhook.\n   */\n  expandPaymentMethod?: boolean;\n}\n\nasync function expandPaymentMethodLabel(\n  stripe: Stripe,\n  session: Stripe.Checkout.Session,\n  connectedAccountId: string | null,\n): Promise<string | null> {\n  const paymentIntentId =\n    typeof session.payment_intent === 'string'\n      ? session.payment_intent\n      : session.payment_intent?.id;\n  if (!paymentIntentId) return null;\n  try {\n    const requestOpts = connectedAccountId\n      ? { stripeAccount: connectedAccountId }\n      : undefined;\n    const intent = await stripe.paymentIntents.retrieve(\n      paymentIntentId,\n      { expand: ['latest_charge.payment_method_details'] },\n      requestOpts,\n    );\n    const charge =\n      typeof intent.latest_charge === 'object' && intent.latest_charge\n        ? intent.latest_charge\n        : null;\n    return formatPaymentMethod(charge?.payment_method_details);\n  } catch {\n    return null;\n  }\n}\n\nexport function createStripeWebhookHandler(opts: WebhookHandlerOptions) {\n  const stripe = getStripe(opts.secretKey);\n  const clearCart = opts.clearCartOnPaid ?? true;\n  const expandPaymentMethod = opts.expandPaymentMethod ?? true;\n\n  return async function handle(req: Request): Promise<Response> {\n    const signature = req.headers.get('stripe-signature');\n    if (!signature) {\n      return new Response('missing stripe-signature', { status: 400 });\n    }\n\n    const rawBody = await req.text();\n\n    let event: Stripe.Event;\n    try {\n      event = stripe.webhooks.constructEvent(\n        rawBody,\n        signature,\n        opts.webhookSecret,\n      );\n    } catch (err) {\n      const message = err instanceof Error ? err.message : 'invalid signature';\n      // eslint-disable-next-line no-console\n      console.warn('[cms-shop] webhook signature failed:', message);\n      return new Response(`signature verification failed: ${message}`, {\n        status: 400,\n      });\n    }\n\n    const connectedAccountId = event.account ?? null;\n\n    try {\n      switch (event.type) {\n        case 'checkout.session.completed':\n        case 'checkout.session.async_payment_succeeded': {\n          const session = event.data.object as Stripe.Checkout.Session;\n          if (session.payment_status !== 'paid') {\n            // Async payment still pending — wait for the success event.\n            return new Response('pending', { status: 200 });\n          }\n          const cartId = session.metadata?.cms_cart_id;\n          if (!cartId) {\n            // eslint-disable-next-line no-console\n            console.warn(\n              '[cms-shop] checkout.session.completed missing cms_cart_id metadata',\n              session.id,\n            );\n            return new Response('ok', { status: 200 });\n          }\n          const cart = await opts.cartStore.get(cartId);\n          if (!cart) {\n            // eslint-disable-next-line no-console\n            console.warn(\n              `[cms-shop] cart ${cartId} not found for session ${session.id} — ` +\n                'cart may have been swept; the host should fall back to session line items',\n            );\n            return new Response('ok', { status: 200 });\n          }\n          const order = buildOrderFromCheckoutSession({\n            session,\n            cart,\n            ...(opts.orderNumberPrefix\n              ? { orderNumberPrefix: opts.orderNumberPrefix }\n              : {}),\n          });\n          const paymentMethodLabel = expandPaymentMethod\n            ? await expandPaymentMethodLabel(stripe, session, connectedAccountId)\n            : null;\n          await opts.onOrderPaid({\n            order,\n            session,\n            connectedAccountId,\n            kind: session.metadata?.kind ?? 'order',\n            paymentMethodLabel,\n            eventId: event.id,\n          });\n          if (clearCart) await opts.cartStore.delete(cartId);\n          return new Response('ok', { status: 200 });\n        }\n\n        case 'checkout.session.async_payment_failed':\n        case 'payment_intent.payment_failed': {\n          if (!opts.onOrderFailed) return new Response('ok', { status: 200 });\n          const obj = event.data.object as\n            | Stripe.Checkout.Session\n            | Stripe.PaymentIntent;\n          await opts.onOrderFailed({\n            ...('id' in obj && obj.object === 'checkout.session'\n              ? { sessionId: obj.id }\n              : {}),\n            ...('payment_intent' in obj && typeof obj.payment_intent === 'string'\n              ? { paymentIntentId: obj.payment_intent }\n              : 'object' in obj && obj.object === 'payment_intent'\n                ? { paymentIntentId: obj.id }\n                : {}),\n            ...('last_payment_error' in obj && obj.last_payment_error\n              ? { reason: obj.last_payment_error.message ?? 'failed' }\n              : {}),\n            connectedAccountId,\n            eventId: event.id,\n          });\n          return new Response('ok', { status: 200 });\n        }\n\n        case 'charge.refunded': {\n          if (!opts.onOrderRefunded) return new Response('ok', { status: 200 });\n          const charge = event.data.object as Stripe.Charge;\n          const paymentIntentId =\n            typeof charge.payment_intent === 'string'\n              ? charge.payment_intent\n              : charge.payment_intent?.id;\n          if (!paymentIntentId) return new Response('ok', { status: 200 });\n          await opts.onOrderRefunded({\n            paymentIntentId,\n            amountRefunded: charge.amount_refunded,\n            fullyRefunded: charge.amount_refunded >= charge.amount,\n            connectedAccountId,\n            eventId: event.id,\n          });\n          return new Response('ok', { status: 200 });\n        }\n\n        default:\n          return new Response('ignored', { status: 200 });\n      }\n    } catch (err) {\n      // eslint-disable-next-line no-console\n      console.error('[cms-shop] webhook handler error:', err);\n      // Return 500 so Stripe retries — better than swallowing failures.\n      return new Response('handler failed', { status: 500 });\n    }\n  };\n}\n"],"mappings":"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","names":["Stripe"]}